首页 文章 精选 留言 我的

精选列表

搜索[扩展层],共10000篇文章
优秀的个人博客,低调大师

扩展AlertManager集成钉钉助力Istio on ACK可观测性监控能力

阿里云容器服务Kubernetes(简称ACK)支持一键部署Istio,可以参考文档在ACK上部署使用Isito。Istio on ACK提供了丰富的监控能力,为网格中的服务收集遥测数据,其中Mixer是负责提供策略控制和遥测收集的Istio组件。使用Prometheus进行监控是Istio提供的监控能力之一。 告警能力在Prometheus的架构中被划分成两个独立的部分:Prometheus负责产生告警,而Alertmanager负责告警产生后的后续处理。如下所示,通过在Prometheus中定义告警规则,Prometheus会周期性的对告警规则进行计算,如果满足告警触发条件就会向Alertmanager发送告警信息。 Alertmanager作为一个独立的组件,负责接收并处理来自Prometheus Server(也可以是其它的客

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

mica 中验证码扩展 mica-captcha 验证码组件

验证码效果 保证了验证码的安全性的同时尽量做到了美观,欢迎试用,更多使用方式可以查看 mica 示例项目。 依赖坐标 Maven <dependency> <groupId>net.dreamlu</groupId> <artifactId>mica-captcha</artifactId> </dependency> Gradle implementation "net.dreamlu:mica-captcha" 配置项 配置项 默认值 说明 mica.captcha.cache-name micaCaptchaCache 验证码cache名,默认:micaCaptchaCache mica.captcha.cookie-name mica-captcha 验证码cookie名,默认:mica-captcha mica.captcha.enabled true 是否开启验证码,默认:true. 注意:结合 mica-pro 的 mica-cache-redis 组件实现cache name 使用 # 号自动配置超时时间。 使用 首先需要配置 Spring cache,如 ehcache、redis等,然后给micaCaptchaCache 配置一个超时时间。 Servlet 生成验证码 @Autowired private MicaCaptchaServlet micaCaptcha; /** * 图形验证码 */ @GetMapping(value = "/captcha.jpg", produces = MediaType.IMAGE_JPEG_VALUE) @ResponseBody public ResponseEntity<Resource> captcha(HttpServletResponse response) { return micaCaptcha.generate(response); } 校验验证码 boolean validated = micaCaptcha.validate(response, userInputCaptcha); WebFlux 生成验证码 @Autowired private MicaCaptchaReactive micaCaptcha; /** * 图形验证码 */ @GetMapping(value = "/captcha.jpg", produces = MediaType.IMAGE_JPEG_VALUE) @ResponseBody public Mono<ResponseEntity<Resource>> captcha(ServerWebExchange exchange) { return Mono.just(micaCaptcha.generate(exchange)); } 校验验证码 boolean validated = micaCaptcha.validate(exchange, userInputCaptcha); 生成其他类型验证码 micaCaptcha.generateBase64 生成 base64 图片验证码(主要为 App 或者前后端分离设计)。 micaCaptcha.validateBase64 校验 base64 图片验证码。 开源推荐 Spring boot 微服务高效开发mica工具集:https://gitee.com/596392912/mica Avue一款基于vue可配置化的神奇框架:https://gitee.com/smallweigit/avue pig宇宙最强微服务(架构师必备):https://gitee.com/log4j/pig SpringBlade完整的线上解决方案(企业开发必备):https://gitee.com/smallc/SpringBlade IJPay 支付SDK让支付触手可及:https://gitee.com/javen205/IJPay

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

Unity C#基础之 多线程的前世今生(下) 扩展篇

在前面两篇Unity C#基础之 多线程的前世今生(上) 科普篇和Unity C#基础之 多线程的前世今生(中) 进阶篇中,相信大家对多线程有了一定的了解,这篇再详细的聊一聊在使用多线程中需要注意的地方~ 示例工程下载Unity 2017.3.0 P4 .NET版本4.6 本篇知识点 异常处理 线程取消 CancellationTokenSource 多线程临时变量 线程安全 lock 语法糖 await async 异常处理 首先我们先执行下面一段代码 循环20次用Task线程执行以下Code,当执行循环 i=11 或 i=12时抛出异常 打印信息中没有 11、12的打印信息,也没有抛出异常的信息,这是因为主线程的Trycatch已经跳过 然后我们在try块中添加 Task.WaitAll(taskList.ToArray()); 打印信息如下 出现抛出异常信息 然后我们去掉try块中的 Task.WaitAll(taskList.ToArray()); 在每个线程中添加Try Catch 打印结果可以捕捉到异常 所以要想捕捉到异常且不卡界面,捕捉异常最好在每个自己的线程中捕捉 相应的全部Code private void TryCatchOnClick() { System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); watch.Start(); Debug.Log($"TryCatchOnClick Start {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}"); try { TaskFactory taskFactory = new TaskFactory(); List<Task> taskList = new List<Task>(); #region 异常处理 //多线程里的异常是会被吞掉,除非waitall // 建议 多线程里面,是不允许异常的,也就是内部try catch,自己处理好 for (int i = 0; i < 20; i++) { string name = string.Format($"TryCatchOnClick{i}"); Action<object> act = t => { try { Thread.Sleep(2000); if (t.ToString().Equals("TryCatchOnClick11")) { throw new Exception(string.Format($"{t} 执行失败")); } if (t.ToString().Equals("TryCatchOnClick12")) { throw new Exception(string.Format($"{t} 执行失败")); } Debug.Log($"{t} 执行成功"); } catch (Exception ex) { Debug.Log(ex.Message); } }; taskList.Add(taskFactory.StartNew(act, name)); } //Task.WaitAll(taskList.ToArray()); #endregion } catch (AggregateException aex) { foreach (var item in aex.InnerExceptions) { Debug.Log(item.Message); } } catch (Exception ex) { Debug.Log(ex.Message); } watch.Stop(); Debug.Log($"TryCatchOnClick End {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}"); } 线程取消 某个线程达到预期效果后需要取消其他的线程,我们可以用 CancellationTokenSource,当然可以用一个共享的bool变量,但是CancellationTokenSource的好处是可以让没来的及启动的线程直接取消,从根本上取消启动 private void TaskCancel() { System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); watch.Start(); Debug.Log($"TaskCancel Start {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}TaskCancel"); try { TaskFactory taskFactory = new TaskFactory(); List<Task> taskList = new List<Task>(); //线程取消不是操作线程,而是操作信号量(共享变量,多个线程都能访问到的东西,变量/数据库的数据/硬盘数据) //每个线程在执行的过程中,经常去查看下这个信号量,然后自己结束自己 //线程不能别人终止,只能自己干掉自己,延迟是少不了的 //CancellationTokenSource可以在cancel后,取消没有启动的任务 CancellationTokenSource cts = new CancellationTokenSource();//bool值 for (int i = 0; i < 200; i++) { string name = string.Format("btnThreadCore_Click{0}", i); Action<object> act = t => { try { Thread.Sleep(2000); if (t.ToString().Equals("btnThreadCore_Click11")) { throw new Exception(string.Format("{0} 执行失败", t)); } if (t.ToString().Equals("btnThreadCore_Click12")) { throw new Exception(string.Format("{0} 执行失败", t)); } if (cts.IsCancellationRequested)//检查信号量 { Debug.Log($"{t} 放弃执行"); return; } else { Debug.Log($"{t} 执行成功"); } } catch (Exception ex) { cts.Cancel(); Debug.Log(ex.Message); } }; taskList.Add(taskFactory.StartNew(act, name, cts.Token)); } Task.WaitAll(taskList.ToArray()); } catch (AggregateException aex) { foreach (var item in aex.InnerExceptions) { Debug.Log(item.Message); } } catch (Exception ex) { Debug.Log(ex.Message); } watch.Stop(); Debug.Log($"TaskCancel End {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}"); } 打印结果如下 多线程临时变量 这个就比较简单了,直接上Code private void TaskTempVariable() { System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); watch.Start(); Debug.Log($"TaskTempVariable Start {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}"); try { TaskFactory taskFactory = new TaskFactory(); List<Task> taskList = new List<Task>(); ////i 只有一个,真实实行的时候,已经是5了, ////k 多个k,每次是独立的k,跟i没关系 ////int k; for (int i = 0; i < 5; i++) { int k = i; new Action(() => { Thread.Sleep(1000); Debug.Log($"对应的数值K:{k}"); Debug.Log($"对应的数值I:{i}"); }).BeginInvoke(null, null); } Task.WaitAll(taskList.ToArray()); } catch (AggregateException aex) { foreach (var item in aex.InnerExceptions) { Debug.Log(item.Message); } } catch (Exception ex) { Debug.Log(ex.Message); } watch.Stop(); Debug.Log($"TaskTempVariable End {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}"); } 打印结果 线程安全 lock ConcurrentDictionary多线程版字典 多线程1000次操作一个int和List private static readonly object StaticAsyncLock = new object(); private int TotalCount = 0;// private List<int> IntList = new List<int>(20000); private void TaskSafe() { System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); watch.Start(); Debug.Log($"TaskSafe Start {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}"); try { TaskFactory taskFactory = new TaskFactory(); List<Task> taskList = new List<Task>(); //共有变量:都能访问局部变量/全局变量/数据库的一个值/硬盘文件 //线程内部不共享的是安全 //解决多线程冲突第一个办法:lock ,lock的方法块儿里面是单线程的,所以将整个方法Lock多线程将变得毫无意义;lock里面的代码要尽量的少 //解决多线程冲突第二个办法:没有冲突,从数据上隔离开 for (int i = 0; i < 10000; i++) { int TempI = i; taskList.Add(taskFactory.StartNew(() => { lock (StaticAsyncLock)//lock后的方法块,任意时刻只有一个线程可以进入语法糖 lock(StaticAsyncLock) 编译后等于 Monitor.Enter(StaticAsyncLock) { //这里就是单线程 this.TotalCount += 1;//多个线程同时操作,有时候操作被覆盖了 IntList.Add(TempI); } })); //语法糖 lock(StaticAsyncLock) 编译后等于 Monitor.Enter(StaticAsyncLock) Monitor.Exit(StaticAsyncLock) //检查下这个变量(引用) 有没有被lock 有就等着,没有就占用,然后进去执行,执行完了释放 //lock(this) 锁定当前实例,别的地方如果要使用这个实力里面的其他变量,则都被锁定了无法使用(不推荐这么写) //如果每个实例想要单独的锁定 private object //string a="123456" lock(a) string b="123456" 享元模式的内存分配,字符串值是唯一的,会锁定别的变量b //private static readonly object StaticAsyncLock = new object(); } Task.WaitAll(taskList.ToArray()); Debug.Log(this.TotalCount); Debug.Log(IntList.Count); } catch (AggregateException aex) { foreach (var item in aex.InnerExceptions) { Debug.Log(item.Message); } } catch (Exception ex) { Debug.Log(ex.Message); } watch.Stop(); Debug.Log($"TaskSafe End {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}"); } 添加Lock锁前后打印结果 语法糖 await async (C#5.0 .NET 4.5 CLR 4.0) 如果用一句话简单概括await async,那就是:多线程版的协程 先来一个简单的示例,做一个大象装冰箱,最后咱们再详细的分析 打印结果 是不是很有趣?这种书写逻辑基本上和原来的协程一样,而且是真正的多线程,但是依据不能运行UnityEngine中的组件(例如:GameObject),下面我们详细的说一说 await async 第一个示例 在基础的方法上添加关键字 async 根据提示只有aysnc没有await 会有一个警告,跟普通方法没有区别(不得不说VS2017还是很不错的,提示、自动修补都很友好) 打印结果 第二个是示例 在第一个示例的基础上添加await关键字,这时当主线程到达await task时就返回了,继续执行方法外部的函数,可以理解为unity协程中的yeild reture,当task的线程块执行完毕后再回调 awati task后面的函数部分,这个回调的线程是不确定的:可能是主线程 可能是子线程 也可能是其他线程 /// <summary> /// async/await /// 不能单独await /// await 只能放在task前面 /// 不推荐void返回值,使用Task来代替 /// Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用。Async Void 不行 /// </summary> private async void NoReturn() { //主线程执行 Debug.Log($"NoReturn Sleep before await,线程ID:{Thread.CurrentThread.ManagedThreadId}"); TaskFactory taskFactory = new TaskFactory(); Task task = taskFactory.StartNew(() => { Debug.Log($"多线程 Sleep before,线程ID:{Thread.CurrentThread.ManagedThreadId}"); Thread.Sleep(3000); Debug.Log($"多线程 Sleep after,线程ID:{Thread.CurrentThread.ManagedThreadId}"); }); await task;//主线程到这里就返回了,执行主线程任务 //子线程执行 其实是封装成委托,在task之后成为回调(编译器功能 状态机实现) //task.ContinueWith() //这个回调的线程是不确定的:可能是主线程 可能是子线程 也可能是其他线程 Debug.Log($"NoReturn Sleep after await,线程ID:{Thread.CurrentThread.ManagedThreadId}"); } 打印结果 第三个示例,如果需要获取这个返回的线程怎么办呢?直接把void 换成Task /// <summary> /// 无返回值 async Task == async void /// Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用。Async Void 不行 /// </summary> /// <returns></returns> private async Task NoReturnTask() { //这里还是主线程的id Debug.Log($"NoReturnTask Sleep before await,线程ID:{Thread.CurrentThread.ManagedThreadId}"); await Task.Run(() => { Debug.Log($"多线程 Sleep before,线程ID:{Thread.CurrentThread.ManagedThreadId}"); Thread.Sleep(9000); Debug.Log($"多线程 Sleep after,线程ID:{Thread.CurrentThread.ManagedThreadId}"); }); Debug.Log($"NoReturnTask Sleep after await,线程ID:{Thread.CurrentThread.ManagedThreadId}"); //return new TaskFactory().StartNew(() => { }); //不能return 没有async才行 } 然后执行 打印结果 第四个示例,也是最终版的示例 返回线程+返回数值 ,获取一个Task<T> ,其中T就是返回值的类型 /// <summary> /// 带返回值的Task /// 要使用返回值就一定要等子线程计算完毕 卡线程 /// </summary> /// <returns>async 就只返回long</returns> private async Task<long> FinallyAsync() { Debug.Log($"SumAsync start 线程ID:{Thread.CurrentThread.ManagedThreadId}"); long result = 0; await Task.Run(() => { Debug.Log($"SumAsync await Task.Run 线程ID:{Thread.CurrentThread.ManagedThreadId}"); Thread.Sleep(1000); for (long i = 0; i < 999999999; i++) { result += i; } }); return result; } 然后执行 打印结果 非await版返回值 这种主线程获取result不会卡死 /// <summary> /// 真的返回Task 不是async /// /// 要使用返回值就一定要等子线程计算完毕 /// </summary> /// <returns>没有async Task</returns> private Task<int> TaskReturn() { Debug.Log($"TaskReturn start 线程ID:{Thread.CurrentThread.ManagedThreadId}"); TaskFactory taskFactory = new TaskFactory(); Task<int> iResult = taskFactory.StartNew<int>(() => { Thread.Sleep(3000); Debug.Log($"TaskReturn Task.Run 线程ID:{Thread.CurrentThread.ManagedThreadId}"); return 123; }); Debug.Log($"TaskReturn end 线程ID:{Thread.CurrentThread.ManagedThreadId}"); return iResult; } 执行函数 打印结果 以上就是await async 的相关内容,有需要补充的东西欢迎留言

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

解决Centos7 下安装PHP7 phpredis扩展报错办法

heckingwhether-lcshouldbeexplicitlylinkedin...no checkingdynamiclinkercharacteristics...GNU/Linuxld.so checkinghowtohardcodelibrarypathsintoprograms...immediate checkingwhetherstrippinglibrariesispossible...yes checkingiflibtoolsupportssharedlibraries...yes checkingwhethertobuildsharedlibraries...yes checkingwhethertobuildstaticlibraries...no creatinglibtool appendingconfigurationtag"CXX"tolibtool configure:creating./config.status config.status:creatingconfig.h [root@iZ236oj5mp5Zphpredis-master]#make&&makeinstall /bin/sh/usr/local/src/redis-stable/phpredis-master/libtool--mode=compilecc-I.-I/usr/local/src/redis-stable/phpredis-master-DPHP_ATOM_INC-I/usr/local/src/redis-stable/phpredis-master/include-I/usr/local/src/redis-stable/phpredis-master/main-I/usr/local/src/redis-stable/phpredis-master-I/usr/local/php/include/php-I/usr/local/php/include/php/main-I/usr/local/php/include/php/TSRM-I/usr/local/php/include/php/Zend-I/usr/local/php/include/php/ext-I/usr/local/php/include/php/ext/date/lib-DHAVE_CONFIG_H-g-O2-c/usr/local/src/redis-stable/phpredis-master/redis.c-oredis.lo mkdir.libs cc-I.-I/usr/local/src/redis-stable/phpredis-master-DPHP_ATOM_INC-I/usr/local/src/redis-stable/phpredis-master/include-I/usr/local/src/redis-stable/phpredis-master/main-I/usr/local/src/redis-stable/phpredis-master-I/usr/local/php/include/php-I/usr/local/php/include/php/main-I/usr/local/php/include/php/TSRM-I/usr/local/php/include/php/Zend-I/usr/local/php/include/php/ext-I/usr/local/php/include/php/ext/date/lib-DHAVE_CONFIG_H-g-O2-c/usr/local/src/redis-stable/phpredis-master/redis.c-fPIC-DPIC-o.libs/redis.o Infileincludedfrom/usr/local/src/redis-stable/phpredis-master/redis.c:27:0: /usr/local/src/redis-stable/phpredis-master/common.h:3:40:致命错误:ext/standard/php_smart_str.h:没有那个文件或目录 #include<ext/standard/php_smart_str.h> ^ 编译中断。 make:***[redis.lo]错误1 解决办法,因为最新的 phpredis 分了几大分支,针对最新的PHP稳定发行版 php7 有专门为php7的分支,所以我们从github拉下phpredis 源码 需要切换到 PHP7的分支 首先git clone phpredis : git clone https://github.com/nicolasff/phpredis git checkout php7 /usr/local/php7/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install 然后看到了等字样,就说明安装成功了

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

centos6.5环境 安装php5.5.30的redis扩展

1、下载软件包 wget http://pecl.php.net/get/redis-2.2.5.tgz 2、解压 tar zxvf redis-2.2.5.tgz 3、进入安装目录 cd redis-2.2.5 4、用phpize生成configure配置文件 /usr/local/php/bin/phpize 5、配置(填写php的配置文件路径) ./configure --with-php-config=/usr/local/php/bin/php-config 6、编译 make 7、安装 make install 安装完成之后,出现下面的安装路径 /usr/local/php-5.5.30/lib/php/extensions/no-debug-non-zts-20121212/ ls一下,可以看到.so的文件 然后组装一下地址: /usr/local/php-5.5.30/lib/php/extensions/no-debug-non-zts-20121212/redis.so 8、配置php支持 vi /usr/local/php/etc/php.ini 添加 extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/redis.so 9、开启php、redis、nginx 10、测试 $redis=new Redis(); $redis->connect("192.168.1.128",6379); $redis->set("username","zhangsan"); echo $redis->get("user:userid:10:username"); $redis->lpush("list","helloWorld"); $redis->lpush("list","goodMorning"); $redis->lpush("list","what"); $list=$redis->lrange("list",0,-1); print_r($list); 测试正常

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

服务器架构之性能扩展-第八章(9)

第八章:Sphinx全文检索 8.1检索简介 生活中总会和数据打交道,数据一般分为结构化数据(具有自动固定格式或有限长度数据)和非结构化数据,非结构化数据又称全文数据。 全文索引的扫描大致分为索引的创建和搜索索引两个过程。 索引创建:将现实世界的所有结构化数据和非结构化数据提取信息,建立索引的过程。 索引搜索:就是得到用户的查询请求,搜索创建的索引,返回结果的过程。 创建索引具体过程: 1、首先创建需要索引的文档 2、将源文档传给分词词组(tokenizer)。分词词组会将文档分成一个一个的单独单词,去掉标点,去掉停词(的,这等) 3、将的得到的词元(token)传给语言处理组件(linguistic processor)。它主要进行单词变为小写,复数改为单数(cars->car),过去式转给原始等。 4、将得到的词(term)传给索引组件(indexer)。它进行创建一个字典,并按字母排序。 索引搜索具体过程: 1、用户输入查询语句 2、对查询语句进行语法分析,语言处理 3、搜索索引,得到合法树的文档 4、根据得到的文档和查询语句的相关性,进行排序 8.2sphinx入门 Sphinx是SQL phrase index(查询词组索引)的缩写,sphinx是一个基于SQL的全文检索引擎。Coreseek是支持中文的全文检索引擎。 用处:当数据的量增大对搜索有更高要求时;当用户放映搜索慢时;当需要设计千万级亿级别的架构时 Sphinx优点:检索速度快,对于2-4G数据只要0.1秒,提供分布式搜索,可以为mysql提供检索,支持多个检索字段 缺点:必须有主键,主键为整形,不负责数据存储,配置不灵活 Sphinx全文索引工作在php和mysql之间,完成数据的检索。 8.3 sphinx的部署 8.3.1 sphinx的安装 Wgethttp://www.sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz Tar zxvf sphinx-0.9.9.tar.gz Cd sphinx-0.9.9 ./configure –prefix=/usr/local/sphinx –with-mysql=/usr/local/mysql Make && make install 这时在sphinx/bin目录下会有三个命令。Indexer:创建索引;seachd:启动进程;seach:搜索命令。 我们创建一个主键为整形的表,添加数据。 8.3.2配置sphinx 安装完毕会在sphinx/etc目录下生成一个sphinx.conf.disk的示例配置,修改即可。这个配置文件包括朱数据源文件,增量数据文件,主索引,增量索引,所引器和服务进程组成的。 1、主数据源是源数据,后期添加数据为增量数据源 Source src1改为source main作为主数据源,然后配置数据库信息 指定socket位置 设置mysql字符集,关闭缓存 指定数据sql语句 注释掉这些默认的信息 更改查询的数据库 注释主数据索引 指定字符集 注释增量索引。 :494,525s/^/#/g//批量注释分布式索引 索引器设置内存,默认32MB 服务器进程设置端口,默认即可 8.3.3测试 /usr/local/sphinx/bin/bin/indexer –c /usr/local/sphinx/etc/sphinx.conf –all -c指定配置文件,--all对所有索引重新编译 Cp /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /usr/lib ./search linux//测试 新插入数据后直接搜索还是搜不到,只有重新索引后才可。 insert into saisai values(5,”spider”,”斯百德”); //插入中文,测试中文索引 测试不通过 8.4coreseek中文索引部署 8.4.1安装coreseek Sphinx默认是不支持中文的,我们需要引入coreseek进行中文索引,因为它包含了mmseg中文分词组件。 Wgethttp://www.coreseek.cn/uploads/csft/4.0/coreseek-4.1-beta.tar.gz Tar zxvf coreseek-3.2.14.tar.gz 解压后,分别是sphinx文件csft和中文字符文件mmseg,说明文件和链接文件 Cd coreseek-3.2.14/mmseg//先安装中文分词,然后整合进去 ./configure –prefix=/usr/local/mmseg 会报错:config.status: error: cannot find input file: src/Makefile.in automake//执行automake,自动配置环境 接下来sphinx和mmseg结合 Cd coreseek-3.2.14/csft-3.2.14/ ./configure --prefix=/usr/local/coreseek --with-mysql=/usr/local/mysql --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/ 最后:Make && make install 8.4.2配置coreseek Cp /usr/local/csft/etc/sphinx.conf.disk/usr/local/csft/ect/csft.conf 与sphinx其他都一样,只要在main主数据文件“#charset_type=sbcs” 后增加“charset_type=zh_cn.utf-8”和“charset_dictpath=/usr/local/mmseg/etc”指定字符集和mmseg安装目录即可 然后重新刷新索引进行测试即可,还可以看到他还识别词组 8.5中文分词 对于英文字符间有空格比较直观,而中文却不行。并且中文拥有一些容易歧义的语句,更是增加了难度。 分词的算法: 1、基于字符串匹配的分词方法:它是基于词典的分词方法。有正向,逆向和双向的顺序,又有最大,最小,逐词和最佳。 2、基于理解的分词方法:人机模拟,目前测试阶段 3、基于统计的分词方法:根据概率来的 8.6php使用sphinx技术 Sphinx集成到php需要两种方式: 1.sphinx php模块 2.sphinxapi类 8.6.1sphinx模块 到/csf-3.12.12/api下可以看到sphinxapi.php模块 要想在php程序中开启sphinx必须启动sphinx服务,到/usr/local/coreseek/bin下有searchd命令,可以控制sphinx。 参数:-c指定配置文件,--stop停止服务,--pidfile指定pid文件,-p指定端口 Wgethttp://pec1.php.net/get/sphinx-1.1.0.tgz Tar zxvf sphin-1.1.0.tgz Cd sphin-1.1.0 /usr/local/php/bin/phpize//加载模块 ./configure –with-php-config=/usr/local/php/bin/php-config//报错 我们先安装cd core-3.2.14/csf-3.214/api/libclient ./configure Make && make install 然后cd sphinx-1.1.0 ./configure –with-php-config=/usr/local/php/bin/php-config Make && make install cd/usr/local/php5/lib/php/extensions/no-debug-zts-20090626/ Vi /etc/php.ini//加载sphinx.so模块 /usr/local/apache2/bin/apachectl restart//重启apache 192.168.211.128/info.php//看到sphinx模块 8.6.2sphinx类方法 Cp coreseek-3.2.14/csf-3.2.14/api/sphinxapi.php /usr/local/apache2/htdocs/include/sphinxapi.php//加载类 8.6.3搭建windows的linux编程环境 Yum install samba* 配置samba 复制home的选项,新建一个web的目录,重启服务 创建一个smb用户 开始-》运行-》\\192.168.211.128\web 创建磁盘映射,计算机->映射网络驱动器 确定即可创立一个映射磁盘 插入数据拒绝 我们知道apache使用apache用户,我们最好让映射磁盘也使用apache用户,这样可以保证windows下创建的文件可以直接访问。 Net usr /delete *//删除磁盘映射 创建新的用户,我们使用新的apache用户登录 创建文件可以看到是apache用户 这样就实现了windows和linux的同步。 传一个数据过来,建立一个新的sphinx客户端,连接到9312端口,any和all两种,any这里选择是任意的,all是指只包含,通过query搜索关键词,*任意索引,至此得到文档id。 本文转自zsaisai 51CTO博客,原文链接:http://blog.51cto.com/3402313/989242

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

服务器架构之性能扩展-第六章(7)

第六章 nagios网络监控和shell邮件报警 对于nagios比较感兴趣的朋友,对于nagios警报的部分可以参考我的网络监控漫谈系列。 6.1网络管理概念 网络管理:监督、组织和控制网络通信服务和信息处理所必须的各种活动的总称。 常见的监控设备有交换机、路由器,windows或linux主机,它一般包含监控端和被监控端,监控端定时检测叫轮训,被监控端的紧急情况的主动报告叫中断。 监控协议:SNMP(simple network manager protocol) 6.1.1windows部署snmp 开始-》控制面板-》添加删除windows组件-》管理和监视工具-》详细信息-》简单网络管理协议 6.2postfix邮件报警 6.2.1postfix的部署 Postfix是一款比sendmail速度更快的邮件服务器,我们这里选择centos服务器上搭建postfix和dovecat邮件服务,然后通过windows8的outlook进行访问。 1. 关闭 sendmail 邮件服务 Service sendmail stop Chkconfig sendmail off 2. 安装 postfix Postfix是发送服务,使用25端口,dovecat完成邮件的接收,使用110端口,共同完成邮件的收发。 Yum install postfix* Yum install dovecat* 3. 修改配置文件 Vi /etc/postfix/main.cf Myhostname指定邮件主机域名 Mydomain指定邮件域名后缀 Myorigin指定发件人后缀 Inet_interface指定all,注释localhost,这样允许所有客户端的使用 Mydestination指定目标主机 myNetworks指定服务器的网段 Relay_domains允许中继转发 Service postfix restart Chkconfig postfix on Vi /etc/dovecot.conf 取消protocal的注释,开启110端口 4. 更改默认邮件服务器 Alternative –config mta然后选择2,即postfix 5 、新建账户 即可使用user1@saisai.com和user2@saisai.com邮箱 Vi /etc/hosts//解析域名 2. 测试 首先服务器和客户机可以ping通 打开outlook-》工具-》创建用户 输入账户信息,本地测试,选择”手动配置服务器或其他服务器类型”,输入服务器ip和用户名和密码即可。设置完毕,然后单击“测试账户设置”进行测试。 然后通过发送/接收选项,进行选择账户,然后进行“新建”,进行邮件发送测试。 选择账户2,进行查看是否可以接收邮件 命令方式测试: telnet 192.168.211.128 25 Telnet发邮件,ip+端口,然后写mail from:设置发送方,rcpt to:设置接收方,data:写数据,以点结束邮件内容,以quit退出。 登陆用户查看邮件 回复邮件,回复给root用户 Root用户邮件,用Mail 命令查看,输入id号查看内容 Mail命令发送邮件 Echo为内容,-s为主机,mail后接邮箱 实验一:测试test.sh脚本 建立一个sh命令,然后赋予写的权限,执行即可。 主题test shell,内容shell test 执行之后,到邮箱进行查看 实验二:apache服务脚本Apache.sh Nc -w2 localhost 80 该命令执行成功后两秒自动退出,然后使用$?判断端口是否开放,如果上条命令成功则结果为0,否则为1。 于是通过检测80端口是否正常,不正常则重启apache 到邮箱进行检测 实验三:mysql数据库脚本mysql.sh 通过检测3306端口,如果不正常则重启mysql 到邮箱进行检测 实验四:磁盘检测disk.sh 通过awk来检测磁盘使用情况,awk ‘NR==3{print $4}’它可以抠取第三行第四列的值,然后利用它来判断磁盘的大小。 用dd命令,增加一个大文件,进行测试 打开邮件进行验证 实验五:建立Crontab计划任务 Crontab –e 本文转自zsaisai 51CTO博客,原文链接:http://blog.51cto.com/3402313/967782

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

服务器架构之性能扩展-第十二章(13)

十二章、LAMP环境搭建的自动化搭建 所谓自动化搭建当然是实现一定的自动化部署了,并且可以承受一定的大型的网站点击量,LAMP环境的部署完全可以使用自动化脚本实现,这样便达到了无人值守的安装方式。 1、准备下列软件 httpd-2.2.14.tar.gz mysql-5.1.41.tar.gz gd-2.0.35.tar.gz php-5.2.11.tar.gz freetype-2.3.10.tar.gz jpegsrc.v7.tar.gz libpng-1.2.41.tar.gz 下载好,上传到/root/apmg_install. 2、编写一个安装指南install放在/root/apmg_install 下载后,tar zxvf apmg_install.tar.gz ; cd apmg_install; ./setup.sh自动完成安装,时间大概10多分钟 3、编写httpd.sed文件放在/root/apmg_install 目的是为了在apache的httpd.conf中加入相关的行。 文件httpd.sed内容:/application\/x-compress .Z/a\ \ AddType application/x-httpd-php .php 4、编写test.php放在/root/apmg_install <?php phpinfo(); ?> 5、编写测试脚本放在/root/apmg_install/setup.sh 这个脚本基于linux和freebsd,可能要经过多次测试才成功。 #!/bin/sh #this is a script about *nix installing apache,php with gd2.write by sery(sery@163.com),in 2009-12-03 #define some variables http_prefix=/usr/local/apache2 php_prefix=/usr/local/php #need root install is_root=`id |awk ‘{print $1}’|awk -F’[=(]‘ ‘{print $2}’` if [ $is_root != 0 ] then echo“please use root install this program!!!” exit 1 fi #Os is ? Os_is=`uname` if [ "$Os_is" = "FreeBSD" ] then ## install apache if [ ! -d "$http_prefix" ] then tar zxvf httpd-2.2.14.tar.gz cd httpd-2.2.14 ./configure --prefix=$http_prefix --enable-so --enable-write --with-mpm=worker make make install cd .. if [ ! -f "$http_prefix/htdocs/test.php" ] then cp test.php $http_prefix/htdocs fi rm -rf httpd-2.2.14 echo“apache install is ok!” sleep 2 fi #install mysql client is_inst_mysql=`find /usr/local/bin -name mysql | wc -l` if [ "$is_inst_mysql" = 0 ] then tar zxvf mysql-5.0.41.tar.gz cd mysql-5.0.41 ./configure --without-server --with-extra-charsets=gbk,gb2312,utf8 --enable-thread-safe-client make make install cd .. echo“/usr/local/lib”>>/etc/ld.so.conf ldconfig rm -rf mysql-5.0.41 echo“mysql client install ok!” sleep 2 fi #install gd2 if [ ! -d /usr/local/gd2 ] then tar zxvf gd-2.0.35.tar.gz cd gd-2.0.35 ./configure --prefix=/usr/local/gd2 make make install cd .. rm -rf gd-2.0.35 echo“gd2 install is ok!” sleep 2 fi #install php.apache must be installed in /usr/local/apache2 if [ ! -d /usr/local/php ] then tar zxvf php-5.3.6.tar.gz cd php-5.3.6 ./configure --prefix=$php_prefix --with-gd=/usr/local/gd2 --with-apxs2=$http_prefix/bin/apxs --enable-mbregex --enable-bcmath --with-mysql --with-zlib-dir --enable-mbstring=all --with-freetype-dir --with-pdo-mysql make make install cp php.ini-dist $php_prefix/lib/php.ini cd .. rm -rf php-5.3.6 echo“php with gd2 install is ok!” sleep 2 fi # setting apache configuration file sed -f httpd.sed $http_prefix/conf/httpd.conf>$http_prefix/conf/httpd.conf.temp cd $http_prefix/conf mv httpd.conf httpd.conf.old cat httpd.conf.temp>httpd.conf $http_prefix/bin/apachectl -t cd echo“It is very ok!” elif [ "$Os_is" = "Linux" ] then echo“this linux” ## install apache if [ ! -d "$http_prefix" ] then tar zxvf httpd-2.2.14.tar.gz cd httpd-2.2.14 ./configure --prefix=$http_prefix --enable-so–enable-write --with-mpm=worker make make install cd .. if [ ! -f "$http_prefix/htdocs/test.php" ] then cp test.php $http_prefix/htdocs fi rm -rf httpd-2.2.14 echo“apache install is ok!” sleep 2 fi #install mysql client is_inst_mysql=`find /usr/local/bin -name mysql | wc -l` if [ "$is_inst_mysql" = 0 ] then tar zxvf mysql-5.0.41.tar.gz cd mysql-5.0.41 ./configure --without-server --with-extra-charsets=gbk,gb2312,utf8 --enable-thread-safe-client make make install cd .. echo“/usr/local/lib”>>/etc/ld.so.conf ldconfig rm -rf mysql-5.0.41 echo“mysql client install ok!” sleep 2 fi #install freetype if [ ! -d /usr/local/freetype ] then tar zxvf freetype-2.3.5.tar.gz cd freetype-2.3.5 ./configure --prefix=/usr/local/freetype make make install cd .. rm -rf freetype-2.3.5 echo“freetype install is ok!” sleep 2 fi #install jpeg if [ ! -d /usr/local/jpeg ] then tar zxvf jpegsrc.v6.tar.gz cd jpeg-6 ./configure --prefix=/usr/local/jpeg make make install cd .. rm -rf jpeg-6 echo“gpeg install is ok!” fi #install libpng if [ ! -d /usr/local/libpng ] then tar zxvf libpng-1.2.31.tar.gz cd libpng-1.2.31 ./configure --prefix=/usr/local/libpng make make install cd .. rm -rf libpng-1.2.31 echo“libpng install is ok!” sleep 5 fi #link header file if [ ! -f /usr/include/pngconf.h ] then ln -s /usr/local/libpng/include/pngconf.h /usr/include fi if [ ! -f /usr/include/png.h ] then ln -s /usr/local/libpng/include/png.h /usr/include fi #install gd2 if [ ! -d /usr/local/gd2 ] then tar zxvf gd-2.0.35.tar.gz cd gd-2.0.35 ./configure --prefix=/usr/local/gd2 --with-freetype=/usr/local/freetype --with-png=/usr/local/libpng --with-jpeg=/usr/local/ jpeg make make install cd .. rm -rf gd-2.0.35 echo“gd2 install is ok!” sleep 2 fi #install php.apache must be installed in /usr/local/apache2 if [ ! -d /usr/local/php ] then tar zxvf php-5.3.6.tar.gz cd php-5.3.6 ./configure --prefix=$php_prefix --with-gd=/usr/local/gd2 --with-apxs2=$http_prefix/bin/apxs --enable-mbregex --enable-bcmath --with-mysql --with-zlib-dir --enable-mbstring=all --with-pdo-mysql --with-freetype=/usr/local/freetype make make install cp php.ini-dist $php_prefix/lib/php.ini cd .. rm -rf php-5.3.6 echo“php with gd2 install is ok!” sleep 2 fi # setting apache configuration file sed -f httpd.sed $http_prefix/conf/httpd.conf>$http_prefix/conf/httpd.conf.temp cd $http_prefix/conf mv httpd.conf httpd.conf.old cat httpd.conf.temp>httpd.conf $http_prefix/bin/apachectl -t cd echo“It is very ok!” else echo“this is other os,please modify the script” exit 1 fi 6、以上准备工作做好以后,执行setup.sh 执行完毕后,启动apache,然后运行test.php测试 然后执行,setup权限不够赋予权限。 遇到下面的错误提示,如果sh目录存在且脚本无误,最可能是原因是在windows下写的脚本是dos格式的,放在Linux下编码不识别,解决方法是使用dos2unix命令转一下,即输入:dos2unix文件名 我们可以看到,飞快的执行程序呢?结果我们拭目以待。 还有一点特别提醒,我们编写脚本文件的时候是在window条件下,虽然执行了转换,但难免会有乱码,所以一定要vi setup.sh文件查看,还要留心标点符号也要符合linux环境才行。如windows下的‘’“”要转换为linux下的' '和" "。 编译遇到了php5模块没加载正确。查文档需要关闭selinux。 Vi /etc/sysconfig/selinux 把SELINUX=enforcing注释掉:#SELINUX=enforcing,然后新加一行为: SELINUX=disabled然后重启从新编译。 我们然后在编译这次出现 几乎都是ok啦,我们执行/usr/local/apache2/bin/apachectl start 编译完毕我们测试一下:http://192.168.22.132/test.php 7、打包归档 cd /root切换到root tar zcvf apmg_install.tar.gz apmg_install 这样将打包好保存起来,下次可以解包直接使用 本文转自zsaisai 51CTO博客,原文链接:http://blog.51cto.com/3402313/1036233

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

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

用户登录
用户注册