-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsearch.json
More file actions
1 lines (1 loc) · 186 KB
/
search.json
File metadata and controls
1 lines (1 loc) · 186 KB
1
[{"title":"Maven的一些知识点","url":"https://www.hyhcoder.com/2018/02/20/Maven的一些知识点/","content":"<h3 id=\"约定目录结构\"><a href=\"#约定目录结构\" class=\"headerlink\" title=\"约定目录结构\"></a>约定目录结构</h3><p>Maven项目有约定好的目录结构</p>\n<ul>\n<li>一般认定项目主代码位于src/main/java 目录</li>\n<li>资源, 配置文件放在src/main/resources下</li>\n<li>测试代码在src/test/java</li>\n<li>这里没有webapp, Web项目会有webapp目录, webapp下存放Web应用相关代码</li>\n</ul>\n<a id=\"more\"></a> \n<h3 id=\"pom-xml\"><a href=\"#pom-xml\" class=\"headerlink\" title=\"pom.xml\"></a>pom.xml</h3><p>一般pom的结构如下:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div><div class=\"line\">12</div><div class=\"line\">13</div></pre></td><td class=\"code\"><pre><div class=\"line\"><?xml version="1.0" encoding="UTF-8"?></div><div class=\"line\"><project xmlns="http://maven.apache.org/POM/4.0.0"</div><div class=\"line\"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</div><div class=\"line\"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"></div><div class=\"line\"> <modelVersion>4.0.0</modelVersion></div><div class=\"line\"> <groupId>com.hyhcoder</groupId></div><div class=\"line\"> <artifactId>chapter18</artifactId></div><div class=\"line\"> <packaging>jar</packaging></div><div class=\"line\"> <version>1.0</version></div><div class=\"line\"> <name>bbs论坛</name></div><div class=\"line\"> <scope>test</scope></div><div class=\"line\"> </div><div class=\"line\"> </project></div></pre></td></tr></table></figure></p>\n<ol>\n<li>第一行一般是XML头, 指定版本和编码方式;</li>\n<li>紧接着是project元素, project是所有的pom.xml的根元素; (还可以声明一些xsd属性, 非必须, 可以让ide识别罢了)</li>\n<li>modelVersion指定了POM模型版本, 目前只能是4.0.0</li>\n<li>groupId, artifactId, version, 三个元素<strong>生成了一个Maven项目的基本坐标</strong>;</li>\n<li>name只是一个辅助记录字段;</li>\n<li>packing; 项目打包类型, 可以使用jar, war, rar, pom, 默认为jar</li>\n<li>scope; 依赖范围;(compile, test, providde, runtime, system)</li>\n<li>optional; 标记依赖是否可选;</li>\n<li>exclusions; 用来排除传递性依赖的;(这个用于排除里面的依赖性project, 然后自己可以显性的引入, 避免不可控性)<ul>\n<li>dependency:list</li>\n<li>dependency:tree</li>\n<li>dependency:analyze</li>\n</ul>\n</li>\n</ol>\n<h4 id=\"其他属性\"><a href=\"#其他属性\" class=\"headerlink\" title=\"其他属性\"></a>其他属性</h4><p><strong>dependencies和dependency</strong></p>\n<ol>\n<li>前者包含后者, 依赖的jar包, 在maven中, 被称为dependency</li>\n<li>例如这样配置(若使用MyBatis)<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div></pre></td><td class=\"code\"><pre><div class=\"line\"><dependencies></div><div class=\"line\"> <dependency></div><div class=\"line\"> <groupId>org.mybatis</groupId></div><div class=\"line\"> <artifactId>mybatis</artifactId></div><div class=\"line\"> <version>3.2.5</version></div><div class=\"line\"> </dependency></div><div class=\"line\"></dependencies></div><div class=\"line\"></pre></div></pre></td></tr></table></figure>\n</li>\n</ol>\n<p><strong>properties</strong><br>properties是用来定义一些配置属性的, 例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级, 统一管理版本;</p>\n<p><strong>build</strong><br>build表示与构建相关的配置,比如build下有finalName,表示的就是最终构建之后的名称。</p>\n<h4 id=\"生命周期\"><a href=\"#生命周期\" class=\"headerlink\" title=\"生命周期\"></a>生命周期</h4><ol>\n<li>clean生命周期<ul>\n<li>pre-clean;</li>\n<li>clean;</li>\n<li>post-clean;</li>\n</ul>\n</li>\n<li>default生命周期;<ul>\n<li>validate;</li>\n<li>initialize;</li>\n<li>generate-sources;</li>\n<li>process-sources 处理项目主资源文件;</li>\n<li>generate-resources;</li>\n<li>process-resources;</li>\n<li>compile 编译项目的主源码;</li>\n<li>process-classes;</li>\n<li>generate-test-sources;</li>\n<li>process-test-sources 处理项目测试资源文件;</li>\n<li>generate-test-resources;</li>\n<li>process-test-resources;</li>\n<li>test-compile 编译项目的测试代码;</li>\n<li>process-test-classes;</li>\n<li>test 使用单元测试框架进行测试;</li>\n<li>prepare-package</li>\n<li>package 接受编译好的代码, 打包可发布的格式;</li>\n<li>pre-integration-test;</li>\n<li>integration-test;</li>\n<li>post-integration-test;</li>\n<li>verify;</li>\n<li>install; 将包安装到本地仓库, 供本地其他项目使用;</li>\n<li>deploy; 将最后的包复制到远程仓库;</li>\n</ul>\n</li>\n<li>site生命周期<ul>\n<li>pre-site</li>\n<li>site</li>\n<li>post-site</li>\n<li>site-deploy 将生成的项目站点发布到服务器</li>\n</ul>\n</li>\n<li>插件可以和生命周期绑定;</li>\n</ol>\n<h4 id=\"聚合和继承POM-父子\"><a href=\"#聚合和继承POM-父子\" class=\"headerlink\" title=\"聚合和继承POM(父子)\"></a>聚合和继承POM(父子)</h4><ol>\n<li>使用如下来保存聚合的pom;</li>\n</ol>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div></pre></td><td class=\"code\"><pre><div class=\"line\">## 下面对于父项目的来说都是相对路径的名字</div><div class=\"line\"><packaging>pom</packaging> #这里一定要是pom</div><div class=\"line\"><modules></div><div class=\"line\"> <module>account-email</module></div><div class=\"line\"> <module>account-persist</module></div><div class=\"line\"></modules></div></pre></td></tr></table></figure>\n<ol>\n<li>使用如下来继承pom</li>\n</ol>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div></pre></td><td class=\"code\"><pre><div class=\"line\"><parent></div><div class=\"line\"> <groupId></groupId></div><div class=\"line\"> <artifactId></artifactId></div><div class=\"line\"> <version></version></div><div class=\"line\"> <relativePath>../xx.pom</relativePath></div><div class=\"line\"></parent></div></pre></td></tr></table></figure>\n<ol>\n<li><p>建议父Pom使用dependencyManagement来管理dependency这样的好处在于不会导致子pom一定引入父pom的东西;(子pom不声明即可)</p>\n</li>\n<li><p>父Pom使用pluginManagement来管理插件;</p>\n</li>\n</ol>\n","categories":[],"tags":[]},{"title":"JavaWeb(一)网络分层结构及HTTP协议","url":"https://www.hyhcoder.com/2018/01/21/JavaWeb(一)网络分层结构及HTTP协议/","content":"<p>学习Java web的第一步, 肯定要先了解的是当今网络的运行情况; 以及弄懂当今最流行的Http协议究竟是什么?</p>\n<h3 id=\"网络分层\"><a href=\"#网络分层\" class=\"headerlink\" title=\"网络分层\"></a>网络分层</h3><p>首先说下网络分层, 如果现在让你去从头开发一个web通信工具, 你需要考虑什么? 首先你需要考虑把数据怎么分成一个个数据包, 然后要考虑这些数据包要怎么传输, 怎么到达你想要它去的那个地方, 然后还要考虑接收端如何接收这些数据, 解码出来要的数据, 最后还原成想要的最终效果。</p>\n<p>这些会让你觉得很繁琐, 你不外乎可能只是想要发送一句话过去其他客户端, 就要一下子考虑怎么多事情, 还有就是网络的传输什么都非常复杂, 万一哪里有了变动, 就全部程序都要重写, 因此, 出现了分层参考模型, 就像面向对象一样, 把每一层都封装好, 然后对每一层开发接口就可以了, 这样每一层只要负责好自己的事情就可以了, 不用每次都全部考虑。</p>\n<p>基于此, ISO指定了一个OSI参考模型(七层) , 这可以说是一个理想化的模型,里面把每个层次都分了出来,虽清晰, 但太多层会导致复杂化,也不便于管理,因此后面又由技术人员开发了TCP/IP参考模型(四层),大大简化了层次,这也使得TCP/IP协议得到广泛的应用。</p>\n<ul>\n<li>对于OSI参考模型:(用维基百科的图片说明)<br><img src=\"http://img.hyhcoder.top/18-1-21/66496673.jpg\" alt=\"\"></li>\n</ul>\n<a id=\"more\"></a>\n<ul>\n<li>而TCP/IP就大大简化了层次, 对比关系如下:(我们平时用的最多的Http是在应用层)<br><img src=\"http://img.hyhcoder.top/18-1-21/61282413.jpg\" alt=\"\"></li>\n</ul>\n<p>从上面我们就可以看出整个网络模型分层后, 我们只要按照各自的协议考虑各自当前层的问题就可以愉快的编程了;<br>比如一开始的发送例子, 我们只是想编写在应用层的程序,所以根本无需考虑下面其他分层传输数据包等的事情,只要遵循好协议发送数据即可,其他都交给其他层的程序考虑,而在应用层我们所用的协议最多的就是Http协议了, 至于http协议怎么和传输层进行协助, 我们可以不用关心, 有兴趣的可以去读<<tcp ip详解(卷一)=\"\">>;</tcp></p>\n<p>如果要通俗的去讲就是我们首先发送的是HTTP协议报文, 然后会转换成TCP/IP协议的数据包, 然后根据IP地址进行传输, 到客户端又重新变成TCP/IP协议的数据包, 再变成HTTP协议报文, 返回到客户端。如下, 每过一层会加一层首部,接收时再逐个去掉。<br><img src=\"http://img.hyhcoder.top/18-1-21/18937008.jpg\" alt=\"\"></p>\n<h3 id=\"HTTP协议\"><a href=\"#HTTP协议\" class=\"headerlink\" title=\"HTTP协议\"></a>HTTP协议</h3><p>因为Java web的编程很少接触到底层的协议实现,所以我们把关注点放在掌握应用层协议会更好,而当今基本上我们接触到的应用层协议最多的就是HTTP协议, 你打开一个网站,基本都是HTTP开头的;</p>\n<p>那掌握HTTP协议(Hyper Text Transfer Protocol 超文本传输协议)对于我们编写web程序非常关键。</p>\n<h4 id=\"本质:-基于TCP-IP通信协议来传递数据的协议\"><a href=\"#本质:-基于TCP-IP通信协议来传递数据的协议\" class=\"headerlink\" title=\"本质: 基于TCP/IP通信协议来传递数据的协议;\"></a>本质: 基于TCP/IP通信协议来传递数据的协议;</h4><h4 id=\"特点\"><a href=\"#特点\" class=\"headerlink\" title=\"特点:\"></a>特点:</h4><ol>\n<li>简单快捷: 客户端向服务端请求服务时, 只要传送请求方法和路径。</li>\n<li>灵活: 允许传输任意类型的数据对象。(用Content-Type加以标记)</li>\n<li>无连接:无连接的含义是限制每次连接只处理一个请求。</li>\n<li>无状态:HTTP协议为无状态协议。</li>\n</ol>\n<h4 id=\"消息格式:(具体的可以自己打开浏览器,按F12进行查看)\"><a href=\"#消息格式:(具体的可以自己打开浏览器,按F12进行查看)\" class=\"headerlink\" title=\"消息格式:(具体的可以自己打开浏览器,按F12进行查看)\"></a>消息格式:(具体的可以自己打开浏览器,按F12进行查看)</h4><ol>\n<li><p>发送一个HTTP请求时(Request), 需要包含下面的格式(请求行,请求头部,空号,和请求数据)(get,post用得最多)<br><img src=\"http://img.hyhcoder.top/18-1-21/23259117.jpg\" alt=\"\"></p>\n</li>\n<li><p>接收一个HTTP请求时(Response),需要包含下面格式(状态行,消息报头,空号,响应正文)<br><img src=\"http://img.hyhcoder.top/18-1-21/7995488.jpg\" alt=\"\"></p>\n</li>\n</ol>\n<h4 id=\"HTTP工作原理\"><a href=\"#HTTP工作原理\" class=\"headerlink\" title=\"HTTP工作原理\"></a>HTTP工作原理</h4><p>HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传输给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送了一个请求报文,请求报文包含了请求的方法,URL,协议版本,请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本,成功和错误代码,服务器信息,响应头部和响应数据。<br>过程如下:</p>\n<ol>\n<li>客户端连接Web服务器:<br>一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。</li>\n<li>发送HTTP请求:<br>通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。</li>\n<li>服务器接受请求并返回HTTP响应:<br>Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。</li>\n<li>释放连接TCP连接;<br>若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;</li>\n<li>客户端浏览器解析HTML内容<br>客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。</li>\n</ol>\n<h3 id=\"总结:\"><a href=\"#总结:\" class=\"headerlink\" title=\"总结:\"></a>总结:</h3><p>网络的分层使得网络编程变得十分的便捷,Java Web的编程可以说是作用与应用层的,所以我们必须要了解掌握应用层应用最广的HTTP协议,所有的网络请求基本都是基于HTTP请求。</p>\n<p>参考文章:</p>\n<ol>\n<li><a href=\"https://zh.wikipedia.org/wiki/OSI%E6%A8%A1%E5%9E%8B\" target=\"_blank\" rel=\"external\">OSI模型–维基百科</a></li>\n<li><a href=\"https://zh.wikipedia.org/wiki/TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F\" target=\"_blank\" rel=\"external\">TCP/IP模型–维基百科</a></li>\n<li><a href=\"https://baike.baidu.com/item/OSI%E6%A8%A1%E5%9E%8B\" target=\"_blank\" rel=\"external\">OSI模型–百度百科</a></li>\n<li><a href=\"https://baike.baidu.com/item/TCP%2FIP%E5%8F%82%E8%80%83%E6%A8%A1%E5%9E%8B\" target=\"_blank\" rel=\"external\">TCP/IP模型–百度百科</a></li>\n</ol>\n","categories":[],"tags":["JavaWeb"]},{"title":"2018新年开始第一篇","url":"https://www.hyhcoder.com/2018/01/07/2018新年开始第一篇/","content":"<p><img src=\"http://img.hyhcoder.top/18-1-7/26089060.jpg\" alt=\"\"></p>\n<p> 2018过了几天了,本应先回顾下2017再说,但过去还是让他过去吧,就像之前朋友圈里流行的晒18岁的照片,其实有这个时间,倒不如多想一想现在,想一想未来还比较好。</p>\n<p> 之前中兴程序员跳楼事件传的沸沸扬扬,还不是反映了其实处处有危机, 处处有焦虑感, 我们可以做的就只有怎么让自己在这些危机面前更加坦然, 减少焦虑感,这一切都是要让自己有所准备。<br><a id=\"more\"></a><br> 其实这个公众号很早就存在了,但也是一直比较懒,跟博客一样,已很久没更新打理了。</p>\n<p> 这个时代产生内容的人很多,什么自媒体,什么app,其实大家也早已被这些信息覆盖,但其实信息虽多, 却很多只是重复的复制粘贴罢了,还有很多都把知识零碎化了,还美曰其名碎片化阅读,但对于技术来说,其实碎片化其实并不是好事,很容易看不清整个体系,或者其实只是知其然不知所以然。</p>\n<p> 这些作为一个初级程序员来说,可能可以,毕竟会用,会写出业务代码,跑起来了,可能就够了,但这样可能当你想要再踏进一步的时候,却发现根本没有路,或者很难,或者当某些bug发生的时候,你发现根本发现不了,因为这个错误其实是发生在你写代码的更底层,或者是由全局所导致的崩溃,这个时候,就很需要有可能分析全局或者是分析底层的能力了;这些是碎片化带不来的知识,都需要整个系统的去学习。</p>\n<p> 这些系统的学习最有效的方法就是先看书,一本讲某某技术的书一开始就可以给你带来一个整体的认识,让你对某某技术有一个整体入门,接着要深入了解就是看源码,记得侯捷在分析STL的时候就说过: 源码面前了无秘密。</p>\n<h3 id=\"因此今年给自己定了几个目标:\"><a href=\"#因此今年给自己定了几个目标:\" class=\"headerlink\" title=\"因此今年给自己定了几个目标:\"></a>因此今年给自己定了几个目标:</h3><ol>\n<li>把Java web的整个流程完全搞清楚,从一个http请求到tomcat的处理,完整了解,而不仅仅限制于Spring的封装;</li>\n<li>研究下中间件redis,redis之前看了一些源码,还是很好懂的,所以把整块看了应该没什么问题;</li>\n<li>研究下TensorFlow,研究下机器学习等新事物(这个还要去再复习下图论知识)。</li>\n</ol>\n<h3 id=\"下面是之前看到关于此不错的书籍:\"><a href=\"#下面是之前看到关于此不错的书籍:\" class=\"headerlink\" title=\"下面是之前看到关于此不错的书籍:\"></a>下面是之前看到关于此不错的书籍:</h3><p><strong>JavaWeb的:</strong></p>\n<ul>\n<li>《深入分析Java Web技术内幕》</li>\n<li>《精通Spring 4.x企业应用开发实战》</li>\n<li>《Spring 源码深度解析》</li>\n<li>《Tomcat 架构解析》</li>\n<li>《深入理解Java虚拟机: JVM高级特性与最佳实践》</li>\n</ul>\n<p><strong>Redis的:</strong></p>\n<ul>\n<li>《Redis设计与实现》</li>\n<li>《Redis开发与运维》</li>\n</ul>\n<p><strong>前沿技术的:</strong></p>\n<ul>\n<li>《机器学习》</li>\n</ul>\n","categories":[],"tags":["杂聊"]},{"title":"小程序wx.uploadFile踩坑","url":"https://www.hyhcoder.com/2017/04/01/小程序wx-uploadFile踩坑/","content":"<h3 id=\"前端实现\"><a href=\"#前端实现\" class=\"headerlink\" title=\"前端实现\"></a>前端实现</h3><p>小程序目前可以上传文件了,比如最常用到的会是图片的上传:</p>\n<p>我们可以使用wx.chooseImage(OBJECT)实现</p>\n<p>官方示例如下:<br><figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div></pre></td><td class=\"code\"><pre><div class=\"line\">wx.chooseImage({</div><div class=\"line\"> count: <span class=\"number\">1</span>, <span class=\"comment\">// 默认9</span></div><div class=\"line\"> sizeType: [<span class=\"string\">'original'</span>, <span class=\"string\">'compressed'</span>], <span class=\"comment\">// 可以指定是原图还是压缩图,默认二者都有</span></div><div class=\"line\"> sourceType: [<span class=\"string\">'album'</span>, <span class=\"string\">'camera'</span>], <span class=\"comment\">// 可以指定来源是相册还是相机,默认二者都有</span></div><div class=\"line\"> success: function (res) {</div><div class=\"line\"> <span class=\"comment\">// 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片</span></div><div class=\"line\"> var tempFilePaths = res.tempFilePaths</div><div class=\"line\"> }</div><div class=\"line\">})</div></pre></td></tr></table></figure></p>\n<a id=\"more\"></a>\n<p>小程序目前一次只能上传一张图片;</p>\n<p>上传后通过wx.uploadFile(OBJECT) 可以将本地资源文件上传到服务器。</p>\n<p>官方示例如下:<br><figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div><div class=\"line\">12</div><div class=\"line\">13</div><div class=\"line\">14</div><div class=\"line\">15</div><div class=\"line\">16</div><div class=\"line\">17</div></pre></td><td class=\"code\"><pre><div class=\"line\">wx.chooseImage({</div><div class=\"line\"> success: function(res) {</div><div class=\"line\"> var tempFilePaths = res.tempFilePaths</div><div class=\"line\"> wx.uploadFile({</div><div class=\"line\"> url: <span class=\"string\">'http://example.weixin.qq.com/upload'</span>, <span class=\"comment\">//仅为示例,非真实的接口地址</span></div><div class=\"line\"> filePath: tempFilePaths[<span class=\"number\">0</span>],</div><div class=\"line\"> name: <span class=\"string\">'file'</span>,</div><div class=\"line\"> formData:{</div><div class=\"line\"> <span class=\"string\">'user'</span>: <span class=\"string\">'test'</span></div><div class=\"line\"> },</div><div class=\"line\"> success: function(res){</div><div class=\"line\"> var data = res.data</div><div class=\"line\"> <span class=\"comment\">//do something</span></div><div class=\"line\"> }</div><div class=\"line\"> })</div><div class=\"line\"> }</div><div class=\"line\">})</div></pre></td></tr></table></figure></p>\n<h3 id=\"后端实现\"><a href=\"#后端实现\" class=\"headerlink\" title=\"后端实现\"></a>后端实现</h3><p>后端的实现我们使用最基本的Servlet进行基本的post和get操作就可以把文件存储下来;</p>\n<p>核心代码如下,具体捕获到再进行其他处理:<br><figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div><div class=\"line\">12</div><div class=\"line\">13</div><div class=\"line\">14</div><div class=\"line\">15</div><div class=\"line\">16</div><div class=\"line\">17</div><div class=\"line\">18</div><div class=\"line\">19</div><div class=\"line\">20</div><div class=\"line\">21</div><div class=\"line\">22</div><div class=\"line\">23</div><div class=\"line\">24</div><div class=\"line\">25</div><div class=\"line\">26</div><div class=\"line\">27</div><div class=\"line\">28</div><div class=\"line\">29</div><div class=\"line\">30</div><div class=\"line\">31</div><div class=\"line\">32</div><div class=\"line\">33</div><div class=\"line\">34</div><div class=\"line\">35</div><div class=\"line\">36</div><div class=\"line\">37</div><div class=\"line\">38</div><div class=\"line\">39</div><div class=\"line\">40</div><div class=\"line\">41</div><div class=\"line\">42</div><div class=\"line\">43</div><div class=\"line\">44</div><div class=\"line\">45</div><div class=\"line\">46</div><div class=\"line\">47</div><div class=\"line\">48</div><div class=\"line\">49</div><div class=\"line\">50</div><div class=\"line\">51</div><div class=\"line\">52</div><div class=\"line\">53</div><div class=\"line\">54</div><div class=\"line\">55</div><div class=\"line\">56</div><div class=\"line\">57</div><div class=\"line\">58</div><div class=\"line\">59</div><div class=\"line\">60</div><div class=\"line\">61</div><div class=\"line\">62</div><div class=\"line\">63</div></pre></td><td class=\"code\"><pre><div class=\"line\"><span class=\"keyword\">public</span> <span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">FileUploadServlet</span> <span class=\"keyword\">extends</span> <span class=\"title\">HttpServlet</span> </span>{</div><div class=\"line\"> <span class=\"keyword\">private</span> <span class=\"keyword\">static</span> <span class=\"keyword\">final</span> <span class=\"keyword\">long</span> serialVersionUID = <span class=\"number\">1L</span>;</div><div class=\"line\"> <span class=\"keyword\">private</span> <span class=\"keyword\">static</span> Logger logger = LoggerFactory.getLogger(FileUploadServlet.class);</div><div class=\"line\"> <span class=\"function\"><span class=\"keyword\">public</span> <span class=\"title\">FileUploadServlet</span><span class=\"params\">()</span> </span>{</div><div class=\"line\"> <span class=\"keyword\">super</span>();</div><div class=\"line\"> }</div><div class=\"line\"> <span class=\"function\"><span class=\"keyword\">protected</span> <span class=\"keyword\">void</span> <span class=\"title\">doGet</span><span class=\"params\">(HttpServletRequest request, HttpServletResponse response)</span> <span class=\"keyword\">throws</span> ServletException, IOException </span>{</div><div class=\"line\"> JsonMessage<Object> message = <span class=\"keyword\">new</span> JsonMessage<Object>();</div><div class=\"line\"> EOSResponse eosResponse = <span class=\"keyword\">null</span>;</div><div class=\"line\"> String sessionToken = <span class=\"keyword\">null</span>;</div><div class=\"line\"> FileItem file = <span class=\"keyword\">null</span>;</div><div class=\"line\"> InputStream in = <span class=\"keyword\">null</span>;</div><div class=\"line\"> ByteArrayOutputStream swapStream1 = <span class=\"keyword\">null</span>;</div><div class=\"line\"> <span class=\"keyword\">try</span> {</div><div class=\"line\"> request.setCharacterEncoding(<span class=\"string\">\"UTF-8\"</span>); </div><div class=\"line\"> <span class=\"comment\">//1、创建一个DiskFileItemFactory工厂 </span></div><div class=\"line\"> DiskFileItemFactory factory = <span class=\"keyword\">new</span> DiskFileItemFactory(); </div><div class=\"line\"> <span class=\"comment\">//2、创建一个文件上传解析器 </span></div><div class=\"line\"> ServletFileUpload upload = <span class=\"keyword\">new</span> ServletFileUpload(factory);</div><div class=\"line\"> <span class=\"comment\">//解决上传文件名的中文乱码 </span></div><div class=\"line\"> upload.setHeaderEncoding(<span class=\"string\">\"UTF-8\"</span>); </div><div class=\"line\"> <span class=\"comment\">// 1. 得到 FileItem 的集合 items </span></div><div class=\"line\"> List<FileItem> items = upload.parseRequest(request);</div><div class=\"line\"> logger.info(<span class=\"string\">\"items:{}\"</span>, items.size());</div><div class=\"line\"> <span class=\"comment\">// 2. 遍历 items: </span></div><div class=\"line\"> <span class=\"keyword\">for</span> (FileItem item : items) { </div><div class=\"line\"> String name = item.getFieldName(); </div><div class=\"line\"> logger.info(<span class=\"string\">\"fieldName:{}\"</span>, name);</div><div class=\"line\"> <span class=\"comment\">// 若是一个一般的表单域, 打印信息 </span></div><div class=\"line\"> <span class=\"keyword\">if</span> (item.isFormField()) { </div><div class=\"line\"> String value = item.getString(<span class=\"string\">\"utf-8\"</span>); </div><div class=\"line\">\t\t\t\t\t<span class=\"comment\">//进行业务处理...</span></div><div class=\"line\"> }<span class=\"keyword\">else</span> {</div><div class=\"line\"> <span class=\"keyword\">if</span>(<span class=\"string\">\"file\"</span>.equals(name)){</div><div class=\"line\"> <span class=\"comment\">//进行文件存储....</span></div><div class=\"line\"> }</div><div class=\"line\"> } </div><div class=\"line\"> }</div><div class=\"line\"> } <span class=\"keyword\">catch</span> (Exception e) {</div><div class=\"line\"> e.printStackTrace();</div><div class=\"line\"> } <span class=\"keyword\">finally</span>{</div><div class=\"line\"> <span class=\"keyword\">try</span> {</div><div class=\"line\"> <span class=\"keyword\">if</span>(swapStream1 != <span class=\"keyword\">null</span>){</div><div class=\"line\"> swapStream1.close();</div><div class=\"line\"> }</div><div class=\"line\"> } <span class=\"keyword\">catch</span> (IOException e) {</div><div class=\"line\"> e.printStackTrace();</div><div class=\"line\"> }</div><div class=\"line\"> <span class=\"keyword\">try</span> {</div><div class=\"line\"> <span class=\"keyword\">if</span>(in != <span class=\"keyword\">null</span>){</div><div class=\"line\"> in.close();</div><div class=\"line\"> }</div><div class=\"line\"> } <span class=\"keyword\">catch</span> (IOException e) {</div><div class=\"line\"> e.printStackTrace();</div><div class=\"line\"> }</div><div class=\"line\"> }</div><div class=\"line\"> PrintWriter out = response.getWriter(); </div><div class=\"line\"> out.write(JSONObject.toJSONString(message)); </div><div class=\"line\"> }</div><div class=\"line\"> <span class=\"function\"><span class=\"keyword\">protected</span> <span class=\"keyword\">void</span> <span class=\"title\">doPost</span><span class=\"params\">(HttpServletRequest request, HttpServletResponse response)</span> <span class=\"keyword\">throws</span> ServletException, IOException </span>{</div><div class=\"line\"> doGet(request, response);</div><div class=\"line\"> }</div><div class=\"line\">}</div></pre></td></tr></table></figure></p>\n<h3 id=\"真机无法通过问题\"><a href=\"#真机无法通过问题\" class=\"headerlink\" title=\"真机无法通过问题\"></a>真机无法通过问题</h3><p>用上面的方法调试后, 会发现在本机的开发者工具是可以通过的, 但一弄到真机上面去调试, 就会发现无法通过, 这大概会有两个原因:</p>\n<ol>\n<li>没有使用真实的地址去调试, 真机调试需要用到https连接才可以通过, 因此需要先搭建一台服务器进行模拟, 不能使用本地的地址;</li>\n<li>服务器不支持TSL1.2, ios对于加密策略比较谨慎, 需要对https服务的支持TSL1.2才可以, 可以使用这个地址来测试服务器支不支持TSL1.2,地址如下:<a href=\"https://www.ssllabs.com/ssltest/index.html\" target=\"_blank\" rel=\"external\">https://www.ssllabs.com/ssltest/index.html</a></li>\n</ol>\n<p><strong>PS:</strong>上面的写法也可以改为servlet的getParameter</p>\n","categories":[],"tags":["Java"]},{"title":"最近折腾的redis的总结","url":"https://www.hyhcoder.com/2017/03/20/最近折腾的redis的总结/","content":"<h3 id=\"redis介绍\"><a href=\"#redis介绍\" class=\"headerlink\" title=\"redis介绍\"></a>redis介绍</h3><ul>\n<li>redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。</li>\n<li>还有另外一个与Memcached不同的是, 他可以支持持久化,redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步;因此支持分布式架构;</li>\n<li>redis在部分场合可以对关系型数据库起到了很好的补充作用。</li>\n<li>提供了对众多的语言支持, 比如java,c/c++,c#,php,Python等客户端,基本都可以满足;</li>\n</ul>\n<a id=\"more\"></a>\n<h3 id=\"redis安装\"><a href=\"#redis安装\" class=\"headerlink\" title=\"redis安装\"></a>redis安装</h3><p>redis的安装非常简单;<br>首先去<a href=\"https://redis.io/\" target=\"_blank\" rel=\"external\">官网</a>下载安装包;<br>然后使用如下命令,即可进行编译安装:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\">make</div><div class=\"line\">make install</div></pre></td></tr></table></figure></p>\n<h3 id=\"redis连接\"><a href=\"#redis连接\" class=\"headerlink\" title=\"redis连接\"></a>redis连接</h3><p>安装完redis后,运行<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">redis-server</div></pre></td></tr></table></figure></p>\n<p>就可以启动redis服务, 默认端口为6379</p>\n<p>可以更改根目录下的redis.conf来更改默认端口及其他设置;</p>\n<p>运行下面命令可以启动客户端</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">redis-cli</div></pre></td></tr></table></figure>\n<p>默认redis-server的启动是以前台方式启动的, 需要更改配置文件中的,改为yes<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\"># 默认Rdis不会作为守护进程运行。如果需要的话配置成'yes'</div><div class=\"line\">daemonize no</div></pre></td></tr></table></figure></p>\n<p>还有默认的redis-server只允许本地访问, 你会在配置文件中看到<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\">#指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求</div><div class=\"line\">bind 127.0.0.1</div></pre></td></tr></table></figure></p>\n<p>将其注释掉外网即可无限制访问, <strong>强烈不推荐,</strong> 有非常大的漏洞,导致主机变肉鸡, 不要问我为啥会知道,╮(╯﹏╰)╭<br>可以选择绑定特定地址, 或者使用密码认证:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\">#requirepass配置可以让用户使用AUTH命令来认证密码,才能使用其他命令。这让redis可以使用在不受信任的网络中。为了保持向后的兼容性,可以注释该命令,因为大部分用户也不需要认证。使用requirepass的时候需要注意,因为redis太快了,每秒可以认证15w次密码,简单的密码很容易被攻破,所以最好使用一个更复杂的密码。</div><div class=\"line\"># requirepass foobared</div></pre></td></tr></table></figure></p>\n<p>以上就是redis-server的一些关键的配置点, 通过这里的配置我们就可以从外网或内网访问到服务器的redis-server了</p>\n<p>至于redis客户端的基本命令:<br>可以看下这里:<a href=\"http://www.runoob.com/redis/redis-connection.html\" target=\"_blank\" rel=\"external\">http://www.runoob.com/redis/redis-connection.html</a></p>\n<h3 id=\"redis的java客户端jedis\"><a href=\"#redis的java客户端jedis\" class=\"headerlink\" title=\"redis的java客户端jedis\"></a>redis的java客户端jedis</h3><p>在linux里面, 我们使用了redis-cli这个客户端来连接redis, 但是如何通过程序来控制redis了, 这就需要使用另外一个客户端了, redis对于各种语言的支持非常丰富, 基本上都有相应的客户端,我是使用java的, 就使用了java里面最火的一个客户端jedis;</p>\n<p>jedis也是一个开源项目, 目前对于redis的各种操作已经封装得基本完美了, 各种数据结构的操作,连接池, 都有一系列的api支持;</p>\n<h4 id=\"jedis的实现\"><a href=\"#jedis的实现\" class=\"headerlink\" title=\"jedis的实现\"></a>jedis的实现</h4><p>下面是我用jedis的一些核心实现, 也是非常简单的;</p>\n<p>配置文件:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div><div class=\"line\">12</div><div class=\"line\">13</div><div class=\"line\">14</div><div class=\"line\">15</div><div class=\"line\">16</div><div class=\"line\">17</div><div class=\"line\">18</div><div class=\"line\">19</div><div class=\"line\">20</div><div class=\"line\">21</div><div class=\"line\">22</div></pre></td><td class=\"code\"><pre><div class=\"line\">#最大活动对象数 </div><div class=\"line\">redis.pool.maxTotal=1000 </div><div class=\"line\">#最大能够保持idel状态的对象数 </div><div class=\"line\">redis.pool.maxIdle=100 </div><div class=\"line\">#最小能够保持idel状态的对象数 </div><div class=\"line\">redis.pool.minIdle=50 </div><div class=\"line\">#当池内没有返回对象时,最大等待时间 </div><div class=\"line\">redis.pool.maxWaitMillis=10000 </div><div class=\"line\">#当调用borrow Object方法时,是否进行有效性检查 </div><div class=\"line\">redis.pool.testOnBorrow=true </div><div class=\"line\">#当调用return Object方法时,是否进行有效性检查 </div><div class=\"line\">redis.pool.testOnReturn=true </div><div class=\"line\">#“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1. </div><div class=\"line\">redis.pool.timeBetweenEvictionRunsMillis=30000 </div><div class=\"line\">#向调用者输出“链接”对象时,是否检测它的空闲超时; </div><div class=\"line\">redis.pool.testWhileIdle=true </div><div class=\"line\"># 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3. </div><div class=\"line\">redis.pool.numTestsPerEvictionRun=50 </div><div class=\"line\">#redis服务器的IP </div><div class=\"line\">redis.ip=xxxxxx </div><div class=\"line\">#redis服务器的Port </div><div class=\"line\">redis.port=6379</div></pre></td></tr></table></figure>\n<p>连接池</p>\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div><div class=\"line\">12</div><div class=\"line\">13</div><div class=\"line\">14</div><div class=\"line\">15</div><div class=\"line\">16</div><div class=\"line\">17</div><div class=\"line\">18</div><div class=\"line\">19</div><div class=\"line\">20</div><div class=\"line\">21</div><div class=\"line\">22</div><div class=\"line\">23</div><div class=\"line\">24</div><div class=\"line\">25</div><div class=\"line\">26</div><div class=\"line\">27</div><div class=\"line\">28</div><div class=\"line\">29</div><div class=\"line\">30</div><div class=\"line\">31</div><div class=\"line\">32</div><div class=\"line\">33</div><div class=\"line\">34</div><div class=\"line\">35</div><div class=\"line\">36</div><div class=\"line\">37</div><div class=\"line\">38</div><div class=\"line\">39</div><div class=\"line\">40</div><div class=\"line\">41</div><div class=\"line\">42</div><div class=\"line\">43</div><div class=\"line\">44</div><div class=\"line\">45</div><div class=\"line\">46</div><div class=\"line\">47</div><div class=\"line\">48</div><div class=\"line\">49</div><div class=\"line\">50</div><div class=\"line\">51</div><div class=\"line\">52</div><div class=\"line\">53</div><div class=\"line\">54</div><div class=\"line\">55</div><div class=\"line\">56</div><div class=\"line\">57</div><div class=\"line\">58</div><div class=\"line\">59</div><div class=\"line\">60</div><div class=\"line\">61</div><div class=\"line\">62</div><div class=\"line\">63</div><div class=\"line\">64</div><div class=\"line\">65</div><div class=\"line\">66</div><div class=\"line\">67</div><div class=\"line\">68</div><div class=\"line\">69</div><div class=\"line\">70</div><div class=\"line\">71</div><div class=\"line\">72</div><div class=\"line\">73</div><div class=\"line\">74</div><div class=\"line\">75</div><div class=\"line\">76</div><div class=\"line\">77</div><div class=\"line\">78</div><div class=\"line\">79</div><div class=\"line\">80</div><div class=\"line\">81</div><div class=\"line\">82</div><div class=\"line\">83</div><div class=\"line\">84</div><div class=\"line\">85</div><div class=\"line\">86</div><div class=\"line\">87</div><div class=\"line\">88</div></pre></td><td class=\"code\"><pre><div class=\"line\"><span class=\"keyword\">public</span> <span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">RedisClient</span> </span>{</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 链接池</div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"keyword\">private</span> <span class=\"keyword\">static</span> JedisPool jedisPool = <span class=\"keyword\">null</span>;</div><div class=\"line\">\t<span class=\"keyword\">private</span> <span class=\"keyword\">static</span> Logger logger = LoggerFactory.getLogger(RedisClient.class);</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 链接池初始化</div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"keyword\">static</span> {</div><div class=\"line\">\t\t<span class=\"keyword\">try</span> {</div><div class=\"line\">\t\t\t<span class=\"comment\">// 池基本配置</span></div><div class=\"line\">\t\t\tJedisPoolConfig config = <span class=\"keyword\">new</span> JedisPoolConfig();</div><div class=\"line\">\t\t\t<span class=\"comment\">// 预设置参数</span></div><div class=\"line\">\t\t\t<span class=\"comment\">// 最大链接数</span></div><div class=\"line\">\t\t\t<span class=\"keyword\">int</span> maxTotal = NumberUtils.toInt(Config.get(<span class=\"string\">\"redis.pool.maxTotal\"</span>), <span class=\"number\">0</span>);</div><div class=\"line\">\t\t\t<span class=\"keyword\">if</span> (maxTotal > <span class=\"number\">0</span>) {</div><div class=\"line\">\t\t\t\tlogger.info(<span class=\"string\">\"设置最大连接数为{}\"</span>, Config.get(<span class=\"string\">\"redis.pool.maxTotal\"</span>));</div><div class=\"line\">\t\t\t\tconfig.setMaxTotal(maxTotal);</div><div class=\"line\">\t\t\t}</div><div class=\"line\">\t\t\t<span class=\"comment\">// 最大空闲资源数</span></div><div class=\"line\">\t\t\t<span class=\"keyword\">int</span> maxIdle = NumberUtils.toInt(Config.get(<span class=\"string\">\"redis.pool.maxIdle\"</span>), <span class=\"number\">0</span>);</div><div class=\"line\">\t\t\t<span class=\"keyword\">if</span> (maxIdle > <span class=\"number\">0</span>) {</div><div class=\"line\">\t\t\t\tlogger.info(<span class=\"string\">\"设置最大空闲资源数为{}\"</span>, Config.get(<span class=\"string\">\"redis.pool.maxIdle\"</span>));</div><div class=\"line\">\t\t\t\tconfig.setMaxIdle(maxIdle);</div><div class=\"line\">\t\t\t}</div><div class=\"line\">\t\t\t<span class=\"comment\">// 最小空闲资源数</span></div><div class=\"line\">\t\t\t<span class=\"keyword\">int</span> minIdle = NumberUtils.toInt(Config.get(<span class=\"string\">\"redis.pool.minIdle\"</span>), <span class=\"number\">0</span>);</div><div class=\"line\">\t\t\t<span class=\"keyword\">if</span> (minIdle > <span class=\"number\">0</span>) {</div><div class=\"line\">\t\t\t\tlogger.info(<span class=\"string\">\"设置最小空闲资源数为{}\"</span>, Config.get(<span class=\"string\">\"redis.pool.minIdle\"</span>));</div><div class=\"line\">\t\t\t\tconfig.setMinIdle(minIdle);</div><div class=\"line\">\t\t\t}</div><div class=\"line\">\t\t\t<span class=\"comment\">// 最大等待时间</span></div><div class=\"line\">\t\t\t<span class=\"keyword\">int</span> maxWaitMillis = NumberUtils.toInt(Config.get(<span class=\"string\">\"redis.pool.maxWaitMillis\"</span>), <span class=\"number\">0</span>);</div><div class=\"line\">\t\t\t<span class=\"keyword\">if</span> (maxWaitMillis > <span class=\"number\">0</span>) {</div><div class=\"line\">\t\t\t\tlogger.info(<span class=\"string\">\"设置最大等待时间为{}\"</span>, Config.get(<span class=\"string\">\"redis.pool.maxWaitMillis\"</span>));</div><div class=\"line\">\t\t\t\tconfig.setMaxWaitMillis(maxWaitMillis);</div><div class=\"line\">\t\t\t}</div><div class=\"line\">\t\t\t<span class=\"comment\">// 是否提前进行validate操作(默认否)</span></div><div class=\"line\">\t\t\tBoolean testOnBorrow = Boolean.valueOf(Config.get(<span class=\"string\">\"redis.pool.testOnBorrow\"</span>, <span class=\"string\">\"false\"</span>));</div><div class=\"line\">\t\t\t<span class=\"keyword\">if</span> (testOnBorrow) {</div><div class=\"line\">\t\t\t\tlogger.info(<span class=\"string\">\"设置是否提前进行validate操作为{}\"</span>, Config.get(<span class=\"string\">\"redis.pool.testOnBorrow\"</span>, <span class=\"string\">\"false\"</span>));</div><div class=\"line\">\t\t\t\tconfig.setTestOnBorrow(testOnBorrow);</div><div class=\"line\">\t\t\t}</div><div class=\"line\">\t\t\t<span class=\"comment\">// 当调用return Object方法时,是否进行有效性检查(默认否)</span></div><div class=\"line\">\t\t\tBoolean testOnReturn = Boolean.valueOf(Config.get(<span class=\"string\">\"redis.pool.testOnReturn\"</span>, <span class=\"string\">\"false\"</span>));</div><div class=\"line\">\t\t\t<span class=\"keyword\">if</span> (testOnReturn) {</div><div class=\"line\">\t\t\t\tlogger.info(<span class=\"string\">\"当调用return Object方法时,是否进行有效性检查{}\"</span>, Config.get(<span class=\"string\">\"redis.pool.testOnReturn\"</span>, <span class=\"string\">\"false\"</span>));</div><div class=\"line\">\t\t\t\tconfig.setTestOnReturn(testOnReturn);</div><div class=\"line\">\t\t\t}</div><div class=\"line\">\t\t\t<span class=\"keyword\">if</span> (Config.get(<span class=\"string\">\"redis.ip\"</span>).isEmpty()) {</div><div class=\"line\">\t\t\t\tlogger.warn(<span class=\"string\">\"没有设置redis服务器IP,无法连接\"</span>);</div><div class=\"line\">\t\t\t} <span class=\"keyword\">else</span> {</div><div class=\"line\">\t\t\t\tString ip = (String) Config.get(<span class=\"string\">\"redis.ip\"</span>);</div><div class=\"line\">\t\t\t\t<span class=\"keyword\">int</span> port = Integer.parseInt(Config.get(<span class=\"string\">\"redis.port\"</span>, <span class=\"string\">\"6379\"</span>));</div><div class=\"line\">\t\t\t\tlogger.info(<span class=\"string\">\"设置ip为{},port为{}\"</span>, ip, port);</div><div class=\"line\">\t\t\t\t<span class=\"comment\">// 构建链接池</span></div><div class=\"line\">\t\t\t\tjedisPool = <span class=\"keyword\">new</span> JedisPool(config, ip, port);</div><div class=\"line\">\t\t\t\tlogger.info(<span class=\"string\">\"redis连接成功\"</span>);</div><div class=\"line\">\t\t\t}</div><div class=\"line\">\t\t} <span class=\"keyword\">catch</span> (Exception e) {</div><div class=\"line\">\t\t\tlogger.error(<span class=\"string\">\"初始化redis失败\"</span>, e);</div><div class=\"line\">\t\t}</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">synchronized</span> <span class=\"keyword\">static</span> Jedis <span class=\"title\">getJedis</span><span class=\"params\">()</span> </span>{</div><div class=\"line\">\t\t<span class=\"keyword\">try</span> {</div><div class=\"line\">\t\t\t<span class=\"keyword\">if</span> (jedisPool != <span class=\"keyword\">null</span>) {</div><div class=\"line\">\t\t\t\tJedis resource = jedisPool.getResource();</div><div class=\"line\">\t\t\t\t<span class=\"keyword\">return</span> resource;</div><div class=\"line\">\t\t\t} <span class=\"keyword\">else</span> {</div><div class=\"line\">\t\t\t\t<span class=\"keyword\">return</span> <span class=\"keyword\">null</span>;</div><div class=\"line\">\t\t\t}</div><div class=\"line\">\t\t} <span class=\"keyword\">catch</span> (Exception e) {</div><div class=\"line\">\t\t\te.printStackTrace();</div><div class=\"line\">\t\t\t<span class=\"keyword\">return</span> <span class=\"keyword\">null</span>;</div><div class=\"line\">\t\t}</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 释放jedis资源</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@param</span> jedis</div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">static</span> <span class=\"keyword\">void</span> <span class=\"title\">releaseResource</span><span class=\"params\">(<span class=\"keyword\">final</span> Jedis jedis)</span> </span>{</div><div class=\"line\">\t\t<span class=\"keyword\">if</span> (jedis != <span class=\"keyword\">null</span>) {</div><div class=\"line\">\t\t\tjedis.close();</div><div class=\"line\">\t\t}</div><div class=\"line\">\t}</div><div class=\"line\">}</div></pre></td></tr></table></figure>\n<p>调用库</p>\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div><div class=\"line\">12</div><div class=\"line\">13</div><div class=\"line\">14</div><div class=\"line\">15</div><div class=\"line\">16</div><div class=\"line\">17</div><div class=\"line\">18</div><div class=\"line\">19</div><div class=\"line\">20</div><div class=\"line\">21</div><div class=\"line\">22</div><div class=\"line\">23</div><div class=\"line\">24</div><div class=\"line\">25</div><div class=\"line\">26</div><div class=\"line\">27</div><div class=\"line\">28</div><div class=\"line\">29</div><div class=\"line\">30</div><div class=\"line\">31</div><div class=\"line\">32</div><div class=\"line\">33</div><div class=\"line\">34</div><div class=\"line\">35</div><div class=\"line\">36</div><div class=\"line\">37</div><div class=\"line\">38</div><div class=\"line\">39</div><div class=\"line\">40</div><div class=\"line\">41</div><div class=\"line\">42</div><div class=\"line\">43</div><div class=\"line\">44</div><div class=\"line\">45</div><div class=\"line\">46</div><div class=\"line\">47</div><div class=\"line\">48</div><div class=\"line\">49</div><div class=\"line\">50</div><div class=\"line\">51</div><div class=\"line\">52</div><div class=\"line\">53</div><div class=\"line\">54</div><div class=\"line\">55</div><div class=\"line\">56</div><div class=\"line\">57</div><div class=\"line\">58</div><div class=\"line\">59</div><div class=\"line\">60</div><div class=\"line\">61</div><div class=\"line\">62</div><div class=\"line\">63</div><div class=\"line\">64</div><div class=\"line\">65</div><div class=\"line\">66</div><div class=\"line\">67</div><div class=\"line\">68</div><div class=\"line\">69</div><div class=\"line\">70</div><div class=\"line\">71</div><div class=\"line\">72</div><div class=\"line\">73</div><div class=\"line\">74</div><div class=\"line\">75</div><div class=\"line\">76</div><div class=\"line\">77</div><div class=\"line\">78</div><div class=\"line\">79</div><div class=\"line\">80</div><div class=\"line\">81</div><div class=\"line\">82</div><div class=\"line\">83</div><div class=\"line\">84</div><div class=\"line\">85</div><div class=\"line\">86</div><div class=\"line\">87</div><div class=\"line\">88</div><div class=\"line\">89</div><div class=\"line\">90</div><div class=\"line\">91</div><div class=\"line\">92</div><div class=\"line\">93</div><div class=\"line\">94</div><div class=\"line\">95</div><div class=\"line\">96</div><div class=\"line\">97</div><div class=\"line\">98</div><div class=\"line\">99</div><div class=\"line\">100</div><div class=\"line\">101</div><div class=\"line\">102</div><div class=\"line\">103</div><div class=\"line\">104</div><div class=\"line\">105</div><div class=\"line\">106</div><div class=\"line\">107</div><div class=\"line\">108</div><div class=\"line\">109</div><div class=\"line\">110</div><div class=\"line\">111</div><div class=\"line\">112</div><div class=\"line\">113</div><div class=\"line\">114</div><div class=\"line\">115</div><div class=\"line\">116</div><div class=\"line\">117</div><div class=\"line\">118</div><div class=\"line\">119</div><div class=\"line\">120</div><div class=\"line\">121</div><div class=\"line\">122</div><div class=\"line\">123</div><div class=\"line\">124</div><div class=\"line\">125</div><div class=\"line\">126</div><div class=\"line\">127</div><div class=\"line\">128</div><div class=\"line\">129</div><div class=\"line\">130</div><div class=\"line\">131</div><div class=\"line\">132</div><div class=\"line\">133</div><div class=\"line\">134</div><div class=\"line\">135</div><div class=\"line\">136</div><div class=\"line\">137</div><div class=\"line\">138</div><div class=\"line\">139</div><div class=\"line\">140</div><div class=\"line\">141</div><div class=\"line\">142</div><div class=\"line\">143</div><div class=\"line\">144</div><div class=\"line\">145</div><div class=\"line\">146</div><div class=\"line\">147</div><div class=\"line\">148</div><div class=\"line\">149</div><div class=\"line\">150</div><div class=\"line\">151</div><div class=\"line\">152</div><div class=\"line\">153</div><div class=\"line\">154</div><div class=\"line\">155</div><div class=\"line\">156</div><div class=\"line\">157</div><div class=\"line\">158</div><div class=\"line\">159</div><div class=\"line\">160</div><div class=\"line\">161</div><div class=\"line\">162</div><div class=\"line\">163</div><div class=\"line\">164</div><div class=\"line\">165</div><div class=\"line\">166</div><div class=\"line\">167</div><div class=\"line\">168</div><div class=\"line\">169</div><div class=\"line\">170</div><div class=\"line\">171</div><div class=\"line\">172</div><div class=\"line\">173</div><div class=\"line\">174</div><div class=\"line\">175</div><div class=\"line\">176</div><div class=\"line\">177</div><div class=\"line\">178</div><div class=\"line\">179</div><div class=\"line\">180</div><div class=\"line\">181</div><div class=\"line\">182</div><div class=\"line\">183</div><div class=\"line\">184</div><div class=\"line\">185</div><div class=\"line\">186</div><div class=\"line\">187</div><div class=\"line\">188</div><div class=\"line\">189</div><div class=\"line\">190</div><div class=\"line\">191</div><div class=\"line\">192</div><div class=\"line\">193</div><div class=\"line\">194</div><div class=\"line\">195</div><div class=\"line\">196</div><div class=\"line\">197</div><div class=\"line\">198</div><div class=\"line\">199</div><div class=\"line\">200</div><div class=\"line\">201</div><div class=\"line\">202</div><div class=\"line\">203</div><div class=\"line\">204</div><div class=\"line\">205</div><div class=\"line\">206</div><div class=\"line\">207</div><div class=\"line\">208</div><div class=\"line\">209</div><div class=\"line\">210</div><div class=\"line\">211</div><div class=\"line\">212</div><div class=\"line\">213</div><div class=\"line\">214</div><div class=\"line\">215</div><div class=\"line\">216</div><div class=\"line\">217</div><div class=\"line\">218</div><div class=\"line\">219</div><div class=\"line\">220</div><div class=\"line\">221</div><div class=\"line\">222</div><div class=\"line\">223</div><div class=\"line\">224</div><div class=\"line\">225</div><div class=\"line\">226</div><div class=\"line\">227</div><div class=\"line\">228</div><div class=\"line\">229</div><div class=\"line\">230</div><div class=\"line\">231</div><div class=\"line\">232</div><div class=\"line\">233</div><div class=\"line\">234</div><div class=\"line\">235</div><div class=\"line\">236</div><div class=\"line\">237</div><div class=\"line\">238</div><div class=\"line\">239</div><div class=\"line\">240</div><div class=\"line\">241</div><div class=\"line\">242</div><div class=\"line\">243</div><div class=\"line\">244</div><div class=\"line\">245</div><div class=\"line\">246</div><div class=\"line\">247</div><div class=\"line\">248</div><div class=\"line\">249</div><div class=\"line\">250</div><div class=\"line\">251</div><div class=\"line\">252</div></pre></td><td class=\"code\"><pre><div class=\"line\"><span class=\"comment\">/**</span></div><div class=\"line\"> * redis 调用库</div><div class=\"line\"> * </div><div class=\"line\"> * <span class=\"doctag\">@author</span> Chris</div><div class=\"line\"> *</div><div class=\"line\"> */</div><div class=\"line\">ScriptSupport(<span class=\"string\">\"cache\"</span>)</div><div class=\"line\"><span class=\"keyword\">public</span> <span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">CacheHelper</span> </span>{</div><div class=\"line\">\t<span class=\"keyword\">private</span> <span class=\"keyword\">static</span> Logger logger = LoggerFactory.getLogger(CacheHelper.class);</div><div class=\"line\">\t<span class=\"comment\">// 序列化</span></div><div class=\"line\">\t<span class=\"keyword\">private</span> <span class=\"keyword\">static</span> <span class=\"keyword\">byte</span>[] serialize(Object obj) {</div><div class=\"line\">\t\tObjectOutputStream obi = <span class=\"keyword\">null</span>;</div><div class=\"line\">\t\tByteArrayOutputStream bai = <span class=\"keyword\">null</span>;</div><div class=\"line\">\t\t<span class=\"keyword\">try</span> {</div><div class=\"line\">\t\t\tbai = <span class=\"keyword\">new</span> ByteArrayOutputStream();</div><div class=\"line\">\t\t\tobi = <span class=\"keyword\">new</span> ObjectOutputStream(bai);</div><div class=\"line\">\t\t\tobi.writeObject(obj);</div><div class=\"line\">\t\t\t<span class=\"keyword\">byte</span>[] byt = bai.toByteArray();</div><div class=\"line\">\t\t\t<span class=\"keyword\">return</span> byt;</div><div class=\"line\">\t\t} <span class=\"keyword\">catch</span> (IOException e) {</div><div class=\"line\">\t\t\te.printStackTrace();</div><div class=\"line\">\t\t}</div><div class=\"line\">\t\t<span class=\"keyword\">return</span> <span class=\"keyword\">null</span>;</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">// 反序列化</span></div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">private</span> <span class=\"keyword\">static</span> Object <span class=\"title\">unserizlize</span><span class=\"params\">(<span class=\"keyword\">byte</span>[] byt)</span> </span>{</div><div class=\"line\">\t\tObjectInputStream oii = <span class=\"keyword\">null</span>;</div><div class=\"line\">\t\tByteArrayInputStream bis = <span class=\"keyword\">null</span>;</div><div class=\"line\">\t\tbis = <span class=\"keyword\">new</span> ByteArrayInputStream(byt);</div><div class=\"line\">\t\t<span class=\"keyword\">try</span> {</div><div class=\"line\">\t\t\toii = <span class=\"keyword\">new</span> ObjectInputStream(bis);</div><div class=\"line\">\t\t\tObject obj = oii.readObject();</div><div class=\"line\">\t\t\t<span class=\"keyword\">return</span> obj;</div><div class=\"line\">\t\t} <span class=\"keyword\">catch</span> (Exception e) {</div><div class=\"line\">\t\t\te.printStackTrace();</div><div class=\"line\">\t\t}</div><div class=\"line\">\t\t<span class=\"keyword\">return</span> <span class=\"keyword\">null</span>;</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 通过key删除(字节)</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@param</span> key</div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">void</span> <span class=\"title\">del</span><span class=\"params\">(<span class=\"keyword\">byte</span>[] key)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tjedis.del(key);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 通过key删除</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@param</span> key</div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">void</span> <span class=\"title\">del</span><span class=\"params\">(String key)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tjedis.del(key);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 添加key value 并且设置存活时间(byte)</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@param</span> key</div><div class=\"line\">\t * <span class=\"doctag\">@param</span> value</div><div class=\"line\">\t * <span class=\"doctag\">@param</span> liveTime</div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">void</span> <span class=\"title\">set</span><span class=\"params\">(<span class=\"keyword\">byte</span>[] key, <span class=\"keyword\">byte</span>[] value, <span class=\"keyword\">int</span> liveTime)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tjedis.set(key, value);</div><div class=\"line\">\t\tjedis.expire(key, liveTime);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 添加key value 并且设置存活时间</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@param</span> key</div><div class=\"line\">\t * <span class=\"doctag\">@param</span> value</div><div class=\"line\">\t * <span class=\"doctag\">@param</span> liveTime</div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">void</span> <span class=\"title\">set</span><span class=\"params\">(String key, String value, <span class=\"keyword\">int</span> liveTime)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tjedis.set(key, value);</div><div class=\"line\">\t\tjedis.expire(key, liveTime);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 添加key value</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@param</span> key</div><div class=\"line\">\t * <span class=\"doctag\">@param</span> value</div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">void</span> <span class=\"title\">set</span><span class=\"params\">(String key, String value)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tjedis.set(key, value);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 添加key value (字节)(序列化)</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@param</span> key</div><div class=\"line\">\t * <span class=\"doctag\">@param</span> value</div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">void</span> <span class=\"title\">set</span><span class=\"params\">(<span class=\"keyword\">byte</span>[] key, <span class=\"keyword\">byte</span>[] value)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tjedis.set(key, value);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">void</span> <span class=\"title\">setClass</span><span class=\"params\">(String key, Object value)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tjedis.set(key.getBytes(), serialize(value));</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> Object <span class=\"title\">getClass</span><span class=\"params\">(String key)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tObject value = unserizlize(jedis.get(key.getBytes()));</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t\t<span class=\"keyword\">return</span> value;</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 获取redis value (String)</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@param</span> key</div><div class=\"line\">\t * <span class=\"doctag\">@return</span></div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> String <span class=\"title\">get</span><span class=\"params\">(String key)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tString value = jedis.get(key);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t\t<span class=\"keyword\">return</span> value;</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 获取redis value (byte [] )(反序列化)</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@param</span> key</div><div class=\"line\">\t * <span class=\"doctag\">@return</span></div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"keyword\">public</span> <span class=\"keyword\">byte</span>[] get(<span class=\"keyword\">byte</span>[] key) {</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\t<span class=\"keyword\">byte</span>[] value = jedis.get(key);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t\t<span class=\"keyword\">return</span> value;</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 通过正则匹配keys</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@param</span> pattern</div><div class=\"line\">\t * <span class=\"doctag\">@return</span></div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> Set<String> <span class=\"title\">keys</span><span class=\"params\">(String pattern)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tSet<String> value = jedis.keys(pattern);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t\t<span class=\"keyword\">return</span> value;</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 检查key是否已经存在</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@param</span> key</div><div class=\"line\">\t * <span class=\"doctag\">@return</span></div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">boolean</span> <span class=\"title\">exists</span><span class=\"params\">(String key)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\t<span class=\"keyword\">boolean</span> value = jedis.exists(key);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t\t<span class=\"keyword\">return</span> value;</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/******************* redis list操作 ************************/</span></div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 往list中添加元素</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@param</span> key</div><div class=\"line\">\t * <span class=\"doctag\">@param</span> value</div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">void</span> <span class=\"title\">lpush</span><span class=\"params\">(String key, String value)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tjedis.lpush(key, value);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">void</span> <span class=\"title\">rpush</span><span class=\"params\">(String key, String value)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tjedis.rpush(key, value);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 数组长度</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@param</span> key</div><div class=\"line\">\t * <span class=\"doctag\">@return</span></div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> Long <span class=\"title\">llen</span><span class=\"params\">(String key)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tLong len = jedis.llen(key);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t\t<span class=\"keyword\">return</span> len;</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 获取下标为index的value</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@param</span> key</div><div class=\"line\">\t * <span class=\"doctag\">@param</span> index</div><div class=\"line\">\t * <span class=\"doctag\">@return</span></div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> String <span class=\"title\">lindex</span><span class=\"params\">(String key, Long index)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tString str = jedis.lindex(key, index);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t\t<span class=\"keyword\">return</span> str;</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> String <span class=\"title\">lpop</span><span class=\"params\">(String key)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tString str = jedis.lpop(key);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t\t<span class=\"keyword\">return</span> str;</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> List<String> <span class=\"title\">lrange</span><span class=\"params\">(String key, <span class=\"keyword\">long</span> start, <span class=\"keyword\">long</span> end)</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tList<String> str = jedis.lrange(key, start, end);</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t\t<span class=\"keyword\">return</span> str;</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/********************* redis list操作结束 **************************/</span></div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 清空redis 所有数据</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@return</span></div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> String <span class=\"title\">flushDB</span><span class=\"params\">()</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tString str = jedis.flushDB();</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t\t<span class=\"keyword\">return</span> str;</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 查看redis里有多少数据</div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">long</span> <span class=\"title\">dbSize</span><span class=\"params\">()</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\t<span class=\"keyword\">long</span> len = jedis.dbSize();</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t\t<span class=\"keyword\">return</span> len;</div><div class=\"line\">\t}</div><div class=\"line\">\t<span class=\"comment\">/**</span></div><div class=\"line\">\t * 检查是否连接成功</div><div class=\"line\">\t * </div><div class=\"line\">\t * <span class=\"doctag\">@return</span></div><div class=\"line\">\t */</div><div class=\"line\">\t<span class=\"function\"><span class=\"keyword\">public</span> String <span class=\"title\">ping</span><span class=\"params\">()</span> </span>{</div><div class=\"line\">\t\tJedis jedis = RedisClient.getJedis();</div><div class=\"line\">\t\tString str = jedis.ping();</div><div class=\"line\">\t\tRedisClient.releaseResource(jedis);</div><div class=\"line\">\t\t<span class=\"keyword\">return</span> str;</div><div class=\"line\">\t}</div><div class=\"line\">}</div></pre></td></tr></table></figure>\n","categories":[],"tags":["Java","中间件"]},{"title":"一个奇怪的bug,tomcat卡在deploying","url":"https://www.hyhcoder.com/2017/02/26/一个奇怪的bug-tomcat卡在deploying/","content":"<p>今天在部署一个新的开发环境, 然后启动tomcat的时候, 发现居然启动卡住了, tomcat启动以后卡在INFO: Deploying web application directory ……反反复复尝试, 未果, 于是上google爬了下文, 发现是jdk的一个bug导致的;附下<a href=\"https://docs.oracle.com/cd/E13209_01/wlcp/wlss30/configwlss/jvmrand.html\" target=\"_blank\" rel=\"external\">官网的解释</a></p>\n<a id=\"more\"></a>\n<p>原因在于centos7的随机数获取机制问题, 和jdk7的不兼容, 重启服务器的第一次启动可以, 再启动tomcat就会卡住了;</p>\n<p>若要尝试下哪种系统会卡住, 可以通过下面的命令在linux系统下测试是否会卡这个bug;<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">head -n 1 /devrandom</div></pre></td></tr></table></figure></p>\n<p>会发现第一次很快返回一个随机数, 第二次就一直卡住了;</p>\n<h3 id=\"解决方案\"><a href=\"#解决方案\" class=\"headerlink\" title=\"解决方案\"></a>解决方案</h3><p>更改~/jre/lib/security/java.security里面的<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">securerandom.source=file:/dev/urandom</div></pre></td></tr></table></figure></p>\n<p>改为</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">securerandom.source=file:/dev/./urandom</div></pre></td></tr></table></figure>\n<p>这里很奇怪的是官网的文档是叫人改为/dev/urandom,就是调用urandom, 不要调用random;而实际上中间还要加个/./才可以成功启动tomcat</p>\n<p>这是为什么呢? 最后被我找到了一遍详细的文章; 好奇的可以再继续探究探究;</p>\n<h3 id=\"相关文章\"><a href=\"#相关文章\" class=\"headerlink\" title=\"相关文章\"></a>相关文章</h3><p><a href=\"http://calvin1978.blogcn.com/articles/securerandom.html\" target=\"_blank\" rel=\"external\">SecureRandom的江湖偏方与真实效果</a></p>\n","categories":[],"tags":[]},{"title":"如何申请免费的HTTPS证书","url":"https://www.hyhcoder.com/2017/01/26/如何申请免费的HTTPS证书/","content":"<p>前面折腾了下github pages的https的开启, 对https证书也开始感兴趣;毕竟自己搭服务器的话, 就需要自己去弄https证书, 已达到开启https的目的; 搜索了一下现在流行的免费https证书(收费的就不用说了, 大把), 大致分下面两种, 就逐一介绍下, 并给自己做个备忘;</p>\n<a id=\"more\"></a>\n<h2 id=\"阿里云-腾讯云等\"><a href=\"#阿里云-腾讯云等\" class=\"headerlink\" title=\"阿里云,腾讯云等\"></a>阿里云,腾讯云等</h2><p>第一种https免费证书比较容易获得, 应该说服务器端比较容易弄, 就是现在各种国内的云服务商所提供的免费https证书, 以阿里云和腾讯云为主;<br>下面以阿里云举例, 腾讯云类似;都可以看官网的说明, 大同小异;</p>\n<ol>\n<li><p>登陆阿里云的账号, 进入证书服务;<br><img src=\"http://img.hyhcoder.top/17-4-9/92345068-file_1491733095779_357f.png\" alt=\"enter image description here\"></p>\n</li>\n<li><p>点击右侧的购买证书;选择免费型的DV SSL证书;<br><img src=\"http://img.hyhcoder.top/17-4-9/22394895-file_1491733185721_11303.png\" alt=\"enter image description here\"></p>\n</li>\n<li><p>然后对证书进行补全;<br><img src=\"http://img.hyhcoder.top/17-4-9/65891661-file_1491733270480_740f.png\" alt=\"enter image description here\"></p>\n</li>\n<li><p>最后参照阿里云的指引在原域名解析加上一项CNAME解析,完成认证;证书就可以发放了;</p>\n</li>\n<li><p>下载证书, 根据不同的服务器来进行部署;<br><img src=\"http://img.hyhcoder.top/17-4-9/6871841-file_1491733529771_1996.png\" alt=\"enter image description here\"></p>\n</li>\n<li><p>附上自己nginx的设置;以供参考;</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div><div class=\"line\">12</div><div class=\"line\">13</div><div class=\"line\">14</div><div class=\"line\">15</div><div class=\"line\">16</div><div class=\"line\">17</div><div class=\"line\">18</div><div class=\"line\">19</div><div class=\"line\">20</div><div class=\"line\">21</div><div class=\"line\">22</div></pre></td><td class=\"code\"><pre><div class=\"line\">server {</div><div class=\"line\"> listen 443;</div><div class=\"line\">\tlisten 80;</div><div class=\"line\"> server_name demo.xxx.com; #域名</div><div class=\"line\"> ssl on;</div><div class=\"line\"> ssl_certificate /etc/nginx/cert/xxx.pem; #pem的位置</div><div class=\"line\"> ssl_certificate_key /etc/nginx/cert/xxx.key;#key的位置</div><div class=\"line\"> ssl_session_timeout 5m;</div><div class=\"line\"> ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;</div><div class=\"line\"> ssl_protocols TLSv1 TLSv1.1 TLSv1.2;</div><div class=\"line\"> ssl_prefer_server_ciphers on;</div><div class=\"line\"> location / {</div><div class=\"line\"> proxy_pass http://127.0.0.1:8080/; # 服务端口</div><div class=\"line\"> proxy_set_header Host $host;</div><div class=\"line\"> proxy_set_header X-Real-IP $remote_addr;</div><div class=\"line\"> proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for;</div><div class=\"line\"> proxy_set_header X-Forwarded-Proto $scheme;</div><div class=\"line\"> }</div><div class=\"line\"> if ($scheme = http) {</div><div class=\"line\"> return 301 https://$server_name$request_uri;</div><div class=\"line\"> }</div><div class=\"line\">}</div></pre></td></tr></table></figure>\n</li>\n</ol>\n<h2 id=\"Let’s-Encrypt\"><a href=\"#Let’s-Encrypt\" class=\"headerlink\" title=\"Let’s Encrypt\"></a>Let’s Encrypt</h2><p>Let’s Encrypt是一个很火的免费SSL证书开源项目, 可以实现自动化发布证书, 但有限期只有90天, 不过可以通过脚本来进行自动续签, 这也是官方给出的解决方案, 是一个免费好用的证书.</p>\n<p>Let’s Encrypt官方发布一个安装工具,certbot,可以通过官方的地址来获取安装的步骤,下面我以nginx+centos7的组合来说明如何安装部署,具体其他系统可以参考官网,大同小异;</p>\n<h3 id=\"安装证书\"><a href=\"#安装证书\" class=\"headerlink\" title=\"安装证书\"></a>安装证书</h3><ol>\n<li><p>先执行以下命令进行环境的安装;</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">yum install epel-release</div></pre></td></tr></table></figure>\n</li>\n<li><p>执行以下命令安装certbot</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">sudo yum install certbot</div></pre></td></tr></table></figure>\n</li>\n<li><p>申请证书</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">certbot certonly --standalone -d example.com -d www.example.com</div></pre></td></tr></table></figure>\n</li>\n<li><p>按照提示输入邮箱, 点击几次确认,会得到以下信息:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div><div class=\"line\">12</div><div class=\"line\">13</div><div class=\"line\">14</div><div class=\"line\">15</div><div class=\"line\">16</div></pre></td><td class=\"code\"><pre><div class=\"line\">Output:</div><div class=\"line\">IMPORTANT NOTES:</div><div class=\"line\"> - If you lose your account credentials, you can recover through</div><div class=\"line\"> e-mails sent to xxx@gmail.com</div><div class=\"line\"> - Congratulations! Your certificate and chain have been saved at</div><div class=\"line\"> /etc/letsencrypt/live/www.example.com/fullchain.pem. Your</div><div class=\"line\"> cert will expire on 2017-02-02. To obtain a new version of the</div><div class=\"line\"> certificate in the future, simply run Let's Encrypt again.</div><div class=\"line\"> - Your account credentials have been saved in your Let's Encrypt</div><div class=\"line\"> configuration directory at /etc/letsencrypt. You should make a</div><div class=\"line\"> secure backup of this folder now. This configuration directory will</div><div class=\"line\"> also contain certificates and private keys obtained by Let's</div><div class=\"line\"> Encrypt so making regular backups of this folder is ideal.</div><div class=\"line\"> - If like Let's Encrypt, please consider supporting our work by:</div><div class=\"line\"> Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate</div><div class=\"line\"> Donating to EFF: https://eff.org/donate-le</div></pre></td></tr></table></figure>\n</li>\n<li><p>至此,证书申请完毕;</p>\n</li>\n<li><p>对nginx进行设置,然后重启nginx;</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div><div class=\"line\">12</div><div class=\"line\">13</div><div class=\"line\">14</div><div class=\"line\">15</div><div class=\"line\">16</div><div class=\"line\">17</div><div class=\"line\">18</div><div class=\"line\">19</div><div class=\"line\">20</div><div class=\"line\">21</div><div class=\"line\">22</div><div class=\"line\">23</div><div class=\"line\">24</div><div class=\"line\">25</div><div class=\"line\">26</div></pre></td><td class=\"code\"><pre><div class=\"line\">server {</div><div class=\"line\"> listen 443 ssl;</div><div class=\"line\"> listen 80;</div><div class=\"line\"> server_name www.example.cn; ##域名</div><div class=\"line\"> ssl_certificate /etc/letsencrypt/live/example.cn/fullchain.pem; #pem位置</div><div class=\"line\"> ssl_certificate_key /etc/letsencrypt/live/example.cn/privkey.pem; #key位置</div><div class=\"line\"> ssl_dhparam /etc/ssl/certs/dhparam.pem;</div><div class=\"line\"> ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';</div><div class=\"line\"> ssl_prefer_server_ciphers on;</div><div class=\"line\"> ssl_protocols TLSv1 TLSv1.1 TLSv1.2;</div><div class=\"line\"> ssl_session_timeout 1d;</div><div class=\"line\"> ssl_session_cache shared:SSL:50m;</div><div class=\"line\"> ssl_stapling on;</div><div class=\"line\"> ssl_stapling_verify on;</div><div class=\"line\"> add_header Strict-Transport-Security max-age=15768000;</div><div class=\"line\"> location / {</div><div class=\"line\"> proxy_pass http://127.0.0.1:8400/; ##服务端口</div><div class=\"line\"> proxy_set_header Host $host;</div><div class=\"line\"> proxy_set_header X-Real-IP $remote_addr;</div><div class=\"line\"> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</div><div class=\"line\"> proxy_set_header X-Forwarded-Proto $scheme;</div><div class=\"line\"> }</div><div class=\"line\"> if ($scheme = http) {</div><div class=\"line\"> return 301 https://$server_name$request_uri;</div><div class=\"line\"> }</div><div class=\"line\"> }</div></pre></td></tr></table></figure>\n</li>\n</ol>\n<h3 id=\"自动更新\"><a href=\"#自动更新\" class=\"headerlink\" title=\"自动更新\"></a>自动更新</h3><p>Let’s Encrypt最大的不足就是只有90天的有效性, 所以需要我们配合计划任务来周期性更新证书;<br>在计划任务中加入以下命令:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">0 0 5 1 * /usr/bin/certbot renew >> /var/log/le-renew.log</div></pre></td></tr></table></figure>\n<p>每月1号的5点便会更新一遍证书, 可以自己设定周期, 不过不要太频繁;因为有请求次数的限制.</p>\n","categories":[],"tags":[]},{"title":"让Github Pages自定义域名开启HTTPS","url":"https://www.hyhcoder.com/2017/01/25/让Github Pages自定义域名开启HTTPS/","content":"<p>放假在家,闲着无聊,于是乎又想着折腾下github pages的blog了, 最近github的国内连接速度不行,国内连接速度间歇性断网,导致blog也体验不佳, 还有最近https化的网站越来越多, google也在力推全面普及https, 年前刮起的小程序风也要求连接一定要是https, 导致也想折腾下给blog挂个小绿标(https).</p>\n<h2 id=\"HTTPS\"><a href=\"#HTTPS\" class=\"headerlink\" title=\"HTTPS\"></a>HTTPS</h2><p>HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。可以有效防止运营商劫持和保护用户输入内容。</p>\n<p>github pages其实在上一年就支持https了,当用户用xxx.github.io访问时, 就会自动切换为https访问,但是,很可惜的是, 这个当你开启自定义域名的时候, 就失效了, 所以这个方案就不完美了.</p>\n<a id=\"more\"></a>\n<h2 id=\"解决方案\"><a href=\"#解决方案\" class=\"headerlink\" title=\"解决方案\"></a>解决方案</h2><p>既然github自己提供的方案不完美, 那么对于我们还有什么好选择呢? 遍寻资料后, 我找到了两个方案:</p>\n<ol>\n<li>使用Cloudflare对你的自定义域名进行DNS解析, 缺点是Cloudflare没有国内的解析点,会导致国内访问变慢, 这点我无法接受, 因此这个方法又放弃了,毕竟这个blog会访问的大多也是国内而已, 若要使用这个方法,可以参考这篇文章: 开启githubpage的https</li>\n<li>使用coding自带的功能, 让coding page做为github page的完美备胎; coding page不仅自带开启https功能, 还可以让国内节点访问加快非常多, 这点对我非常诱惑, 而对我平时的使用也没什么区别, 下面好好讲解这个方法;</li>\n</ol>\n<h2 id=\"coding-pages的搭建\"><a href=\"#coding-pages的搭建\" class=\"headerlink\" title=\"coding pages的搭建\"></a>coding pages的搭建</h2><ol>\n<li>首先注册coding的账号: <a href=\"https://coding.net/\" target=\"_blank\" rel=\"external\">https://coding.net/</a></li>\n<li><p>登陆后建立自己的第一个项目;<br><img src=\"http://img.hyhcoder.top/17-3-28/24716316-file_1490712481173_f1ab.png\" alt=\"enter image description here\"></p>\n</li>\n<li><p>注意项目名称要与用户名一致,这点跟github一样;</p>\n</li>\n<li><p>然后用本机和coding建立ssh密钥连接;<br><img src=\"http://img.hyhcoder.top/17-3-28/65028105-file_1490712723046_1367c.png\" alt=\"enter image description here\"></p>\n</li>\n<li><p>更改hexo的_config.yml,为了能同时同步两个地方;加上coding的项目地址;<br><img src=\"http://img.hyhcoder.top/17-3-28/2234812-file_1490712828190_2809.png\" alt=\"enter image description here\"></p>\n</li>\n<li><p>注意type和repo前有一个空格; github前面有一个tab;</p>\n</li>\n<li>执行hexo d; 开始同步;</li>\n<li>然后在coding上面开启pages服务;以及绑定自己的域名;<br><img src=\"http://img.hyhcoder.top/17-3-28/16638333-file_1490713066345_5ee9.png\" alt=\"enter image description here\"></li>\n<li>绑定自己的域名需要在自己的域名解析中绑定国内访问coding, 国外访问github;类似下面;<br><img src=\"http://img.hyhcoder.top/17-3-28/15468715-file_1490713454842_161d5.png\" alt=\"enter image description here\"></li>\n<li>默认的解析到pages.coding.me,海外解析到github;</li>\n<li>然后在下面申请https证书和开启强制https访问;<br><img src=\"http://img.hyhcoder.top/17-3-28/12336386-file_1490713119922_b7af.png\" alt=\"enter image description here\"></li>\n</ol>\n<h2 id=\"结尾\"><a href=\"#结尾\" class=\"headerlink\" title=\"结尾\"></a>结尾</h2><p>至此,github pages的两个问题都解决了, 不仅解决了https的问题, 还顺带了把github pages国内访问慢的问题解决了, 达到海内外双线的效果, 不过国外访问就没有小绿标了, 这点就没那么完美了, 想要完美的解决还是需要自己部署一台服务器, 然后自己申请https证书来部署, 这样才是最完美, 下次整理下比较火的免费https证书和部署。</p>\n","categories":[],"tags":["部署"]},{"title":"解决getpwnam(“nginx”) failed","url":"https://www.hyhcoder.com/2016/11/05/解决getpwnam-“nginx”-failed/","content":"<p>有时在编译安装完nginx后, 启动nginx时, 会出现报错:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">nginx: [emerg] getpwnam("nginx") failed</div></pre></td></tr></table></figure></p>\n<h3 id=\"原因及解决\"><a href=\"#原因及解决\" class=\"headerlink\" title=\"原因及解决\"></a>原因及解决</h3><p>这种报错一般是编译安装后没有加入nginx用户导致的;<br>执行如下命令:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\">useradd -s /sbin/nologin -M nginx</div><div class=\"line\">id nginx</div></pre></td></tr></table></figure></p>\n<p>最后重启启动, 即可解决:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\">service nginx restart</div><div class=\"line\">service nginx status</div></pre></td></tr></table></figure></p>\n","categories":[],"tags":["nginx"]},{"title":"编译安装nginx,使其支持sticky模块","url":"https://www.hyhcoder.com/2016/11/05/编译安装nginx-使其支持sticky模块/","content":"<h2 id=\"普通安装\"><a href=\"#普通安装\" class=\"headerlink\" title=\"普通安装\"></a>普通安装</h2><p>nginx的普通安装非常简单:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\">sudo yum install epel-release</div><div class=\"line\">sudo yum install nginx</div></pre></td></tr></table></figure></p>\n<p>开机启动:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">sudo systemctl start nginx.service</div></pre></td></tr></table></figure></p>\n<p>查看状态:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">service nginx status</div></pre></td></tr></table></figure></p>\n<p>手工启动:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">service nginx start</div></pre></td></tr></table></figure></p>\n<a id=\"more\"></a>\n<h2 id=\"编译安装\"><a href=\"#编译安装\" class=\"headerlink\" title=\"编译安装\"></a>编译安装</h2><p>普通安装虽然方便, 但是不支持sticky模块,因此需要对nginx进行编译安装来支持;</p>\n<p>下载nginx源码:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">wget http://nginx.org/download/nginx-1.8.0.tar.gz</div></pre></td></tr></table></figure></p>\n<p>下载nginx session sticky模块<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/1e96371de59f.zip</div></pre></td></tr></table></figure></p>\n<p>解压以上的安装包:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div></pre></td><td class=\"code\"><pre><div class=\"line\">//如目录: </div><div class=\"line\">/tmp/nginx-1.8.0</div><div class=\"line\">/tmp/nginx-goodies-nginx-sticky-module-ng-bd312d586752</div></pre></td></tr></table></figure></p>\n<p>编译前配置(注意目录的配置)<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-pcre --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E' --add-module=/tmp/nginx-goodies-nginx-sticky-module-ng-bd312d586752</div></pre></td></tr></table></figure></p>\n<p>然后编译并安装:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\">make</div><div class=\"line\">make install</div></pre></td></tr></table></figure></p>\n<p>设置开机启动:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div><div class=\"line\">12</div><div class=\"line\">13</div><div class=\"line\">14</div><div class=\"line\">15</div><div class=\"line\">16</div><div class=\"line\">17</div><div class=\"line\">18</div><div class=\"line\">19</div><div class=\"line\">20</div><div class=\"line\">21</div><div class=\"line\">22</div><div class=\"line\">23</div><div class=\"line\">24</div><div class=\"line\">25</div><div class=\"line\">26</div><div class=\"line\">27</div><div class=\"line\">28</div><div class=\"line\">29</div><div class=\"line\">30</div><div class=\"line\">31</div><div class=\"line\">32</div><div class=\"line\">33</div><div class=\"line\">34</div><div class=\"line\">35</div><div class=\"line\">36</div><div class=\"line\">37</div><div class=\"line\">38</div><div class=\"line\">39</div><div class=\"line\">40</div><div class=\"line\">41</div><div class=\"line\">42</div><div class=\"line\">43</div><div class=\"line\">44</div><div class=\"line\">45</div><div class=\"line\">46</div><div class=\"line\">47</div><div class=\"line\">48</div><div class=\"line\">49</div><div class=\"line\">50</div><div class=\"line\">51</div><div class=\"line\">52</div><div class=\"line\">53</div><div class=\"line\">54</div><div class=\"line\">55</div><div class=\"line\">56</div><div class=\"line\">57</div><div class=\"line\">58</div><div class=\"line\">59</div><div class=\"line\">60</div><div class=\"line\">61</div><div class=\"line\">62</div><div class=\"line\">63</div><div class=\"line\">64</div><div class=\"line\">65</div><div class=\"line\">66</div><div class=\"line\">67</div><div class=\"line\">68</div><div class=\"line\">69</div><div class=\"line\">70</div><div class=\"line\">71</div><div class=\"line\">72</div><div class=\"line\">73</div><div class=\"line\">74</div><div class=\"line\">75</div><div class=\"line\">76</div><div class=\"line\">77</div><div class=\"line\">78</div><div class=\"line\">79</div><div class=\"line\">80</div><div class=\"line\">81</div><div class=\"line\">82</div><div class=\"line\">83</div><div class=\"line\">84</div><div class=\"line\">85</div><div class=\"line\">86</div><div class=\"line\">87</div><div class=\"line\">88</div><div class=\"line\">89</div><div class=\"line\">90</div><div class=\"line\">91</div><div class=\"line\">92</div><div class=\"line\">93</div></pre></td><td class=\"code\"><pre><div class=\"line\">新增文件 /etc/init.d/nginx,内容如下:</div><div class=\"line\">#!/bin/sh</div><div class=\"line\">#</div><div class=\"line\"># nginx - this script starts and stops the nginx daemon</div><div class=\"line\">#</div><div class=\"line\"># chkconfig: - 85 15</div><div class=\"line\"># description: Nginx is an HTTP(S) server, HTTP(S) reverse \\</div><div class=\"line\"># proxy and IMAP/POP3 proxy server</div><div class=\"line\"># processname: nginx</div><div class=\"line\"># config: /etc/nginx/nginx.conf</div><div class=\"line\"># pidfile: /var/run/nginx.pid</div><div class=\"line\"># user: nginx</div><div class=\"line\"># Source function library.</div><div class=\"line\">. /etc/rc.d/init.d/functions</div><div class=\"line\"># Source networking configuration.</div><div class=\"line\">. /etc/sysconfig/network</div><div class=\"line\"># Check that networking is up.</div><div class=\"line\">[ "$NETWORKING" = "no" ] && exit 0</div><div class=\"line\">nginx="/usr/sbin/nginx"</div><div class=\"line\">prog=$(basename $nginx)</div><div class=\"line\">NGINX_CONF_FILE="/etc/nginx/nginx.conf"</div><div class=\"line\">lockfile=/var/run/nginx.lock</div><div class=\"line\">start() {</div><div class=\"line\"> [ -x $nginx ] || exit 5</div><div class=\"line\"> [ -f $NGINX_CONF_FILE ] || exit 6</div><div class=\"line\"> echo -n $"Starting $prog: "</div><div class=\"line\"> daemon $nginx -c $NGINX_CONF_FILE</div><div class=\"line\"> retval=$?</div><div class=\"line\"> echo</div><div class=\"line\"> [ $retval -eq 0 ] && touch $lockfile</div><div class=\"line\"> return $retval</div><div class=\"line\">}</div><div class=\"line\">stop() {</div><div class=\"line\"> echo -n $"Stopping $prog: "</div><div class=\"line\"> killproc $prog -QUIT</div><div class=\"line\"> retval=$?</div><div class=\"line\"> echo</div><div class=\"line\"> [ $retval -eq 0 ] && rm -f $lockfile</div><div class=\"line\"> return $retval</div><div class=\"line\">}</div><div class=\"line\">restart() {</div><div class=\"line\"> configtest || return $?</div><div class=\"line\"> stop</div><div class=\"line\"> start</div><div class=\"line\">}</div><div class=\"line\">reload() {</div><div class=\"line\"> configtest || return $?</div><div class=\"line\"> echo -n $"Reloading $prog: "</div><div class=\"line\"> killproc $nginx -HUP</div><div class=\"line\"> RETVAL=$?</div><div class=\"line\"> echo</div><div class=\"line\">}</div><div class=\"line\">force_reload() {</div><div class=\"line\"> restart</div><div class=\"line\">}</div><div class=\"line\">configtest() {</div><div class=\"line\"> $nginx -t -c $NGINX_CONF_FILE</div><div class=\"line\">}</div><div class=\"line\">rh_status() {</div><div class=\"line\"> status $prog</div><div class=\"line\">}</div><div class=\"line\">rh_status_q() {</div><div class=\"line\"> rh_status >/dev/null 2>&1</div><div class=\"line\">}</div><div class=\"line\">case "$1" in</div><div class=\"line\"> start)</div><div class=\"line\"> rh_status_q && exit 0</div><div class=\"line\"> $1</div><div class=\"line\"> ;;</div><div class=\"line\"> stop)</div><div class=\"line\"> rh_status_q || exit 0</div><div class=\"line\"> $1</div><div class=\"line\"> ;;</div><div class=\"line\"> restart|configtest)</div><div class=\"line\"> $1</div><div class=\"line\"> ;;</div><div class=\"line\"> reload)</div><div class=\"line\"> rh_status_q || exit 7</div><div class=\"line\"> $1</div><div class=\"line\"> ;;</div><div class=\"line\"> force-reload)</div><div class=\"line\"> force_reload</div><div class=\"line\"> ;;</div><div class=\"line\"> status)</div><div class=\"line\"> rh_status</div><div class=\"line\"> ;;</div><div class=\"line\"> condrestart|try-restart)</div><div class=\"line\"> rh_status_q || exit 0</div><div class=\"line\"> ;;</div><div class=\"line\"> *)</div><div class=\"line\"> echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"</div><div class=\"line\"> exit 2</div><div class=\"line\">esac</div></pre></td></tr></table></figure></p>\n<p>增加执行权限<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">chmod +x /etc/init.d/nginx</div></pre></td></tr></table></figure></p>\n<p>加入开机启动<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">chkconfig nginx on</div></pre></td></tr></table></figure></p>\n<h2 id=\"Session-Sticky配置\"><a href=\"#Session-Sticky配置\" class=\"headerlink\" title=\"Session Sticky配置\"></a>Session Sticky配置</h2><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div><div class=\"line\">12</div><div class=\"line\">13</div><div class=\"line\">14</div><div class=\"line\">15</div><div class=\"line\">16</div><div class=\"line\">17</div></pre></td><td class=\"code\"><pre><div class=\"line\">upstream session-pool {</div><div class=\"line\"> sticky;</div><div class=\"line\"> server (转发的服务器地址加端口,如下);</div><div class=\"line\"> server 192.168.1.11:8082;</div><div class=\"line\"> server 192.168.1.12:8080;</div><div class=\"line\"> }</div><div class=\"line\">server {</div><div class=\"line\"> listen 80(监听端口);</div><div class=\"line\"> server_name (服务器ip);</div><div class=\"line\"> location / {</div><div class=\"line\"> client_max_body_size 100M;</div><div class=\"line\"> proxy_pass http://session-pool;</div><div class=\"line\"> proxy_set_header Host $host;</div><div class=\"line\"> proxy_set_header X-Real-IP $remote_addr;</div><div class=\"line\"> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</div><div class=\"line\"> }</div><div class=\"line\">}</div></pre></td></tr></table></figure>","categories":[],"tags":["nginx"]},{"title":"Mysql的主从备份搭建","url":"https://www.hyhcoder.com/2016/10/26/Mysql的主从备份搭建/","content":"<h1 id=\"Mysql的主从备份搭建\"><a href=\"#Mysql的主从备份搭建\" class=\"headerlink\" title=\"Mysql的主从备份搭建\"></a>Mysql的主从备份搭建</h1><h3 id=\"设置server-id,打开binlog\"><a href=\"#设置server-id,打开binlog\" class=\"headerlink\" title=\"设置server-id,打开binlog\"></a>设置server-id,打开binlog</h3><ol>\n<li><p>修改master节点的/etc/my.cnf, 在[mysqld] 下面加入:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div></pre></td><td class=\"code\"><pre><div class=\"line\">log-bin=mysql-bin</div><div class=\"line\">activiti在主从复制模式下需要设置format为mixed</div><div class=\"line\">binlog_format=MIXED</div><div class=\"line\">server-id=1</div><div class=\"line\">注意主从的server-id一定要不同即可</div></pre></td></tr></table></figure>\n</li>\n<li><p>重启master:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">service mysqld restart</div></pre></td></tr></table></figure>\n</li>\n<li><p>修改slave节点的/etc/my.cnf, 在[mysqld] 下面加入:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">server-id=2</div></pre></td></tr></table></figure>\n</li>\n<li><p>重启slave:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">service mysqld restart</div></pre></td></tr></table></figure>\n</li>\n</ol>\n<h3 id=\"创建数据库复制用户\"><a href=\"#创建数据库复制用户\" class=\"headerlink\" title=\"创建数据库复制用户\"></a>创建数据库复制用户</h3><ul>\n<li>master节点执行:<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\">CREATE USER 'repluser'@'%' IDENTIFIED BY 'replpass';</div><div class=\"line\">GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%';</div></pre></td></tr></table></figure>\n</li>\n</ul>\n<h3 id=\"设置初始复制点\"><a href=\"#设置初始复制点\" class=\"headerlink\" title=\"设置初始复制点\"></a>设置初始复制点</h3><ol>\n<li><p>对master节点进行锁表</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">FLUSH TABLES WITH READ LOCK;</div></pre></td></tr></table></figure>\n</li>\n<li><p>master节点执行:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div></pre></td><td class=\"code\"><pre><div class=\"line\">mysql> show master status;</div><div class=\"line\">+------------------+----------+--------------+------------------+-------------------+</div><div class=\"line\">| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |</div><div class=\"line\">+------------------+----------+--------------+------------------+-------------------+</div><div class=\"line\">| mysql-bin.000001 | 419 | | | |</div><div class=\"line\">+------------------+----------+--------------+------------------+-------------------+</div><div class=\"line\">1 row in set (0.00 sec)</div></pre></td></tr></table></figure>\n</li>\n</ol>\n<p>记下<strong>mysql-bin.000001 和 419</strong></p>\n<ol>\n<li><p>slave节点执行</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">CHANGE MASTER TO MASTER_HOST='192.168.1.1', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=419</div></pre></td></tr></table></figure>\n</li>\n<li><p>启动slave:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">start slave</div></pre></td></tr></table></figure>\n</li>\n<li><p>看是否正常工作, 在slave上面执行:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\">show slave status /G;</div><div class=\"line\">#看到Slave_IO_Running和Slave_SQL_Running状态均为YES即可</div></pre></td></tr></table></figure>\n</li>\n<li><p>对master节点进行解锁</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">unlock tables;</div></pre></td></tr></table></figure>\n</li>\n</ol>\n<h3 id=\"打开防火墙\"><a href=\"#打开防火墙\" class=\"headerlink\" title=\"打开防火墙\"></a>打开防火墙</h3><p>要注意的是可能需要打开防火墙:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">iptables -I INPUT -p tcp --dport 3306 -j ACCEPT</div></pre></td></tr></table></figure></p>\n","categories":[],"tags":[]},{"title":"samba服务器可以访问,无法写入故障","url":"https://www.hyhcoder.com/2016/10/26/samba服务器可以访问-无法写入故障/","content":"<h1 id=\"samba服务器可以访问-无法写入故障\"><a href=\"#samba服务器可以访问-无法写入故障\" class=\"headerlink\" title=\"samba服务器可以访问,无法写入故障\"></a>samba服务器可以访问,无法写入故障</h1><h2 id=\"现象\"><a href=\"#现象\" class=\"headerlink\" title=\"现象\"></a>现象</h2><p>今天尝试了部署下samba文件服务器, 部署完毕后发现A机器可以访问B机器的共享目录, 但无法写入和看到里面的文件;</p>\n<h2 id=\"解决方法\"><a href=\"#解决方法\" class=\"headerlink\" title=\"解决方法\"></a>解决方法</h2><ol>\n<li>起初以为是访问的权限问题, 但将文件全改改为777也无果, 于是放弃该方向;</li>\n<li>使用指定ip及用户名直接访问<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">subclient -L 192.168.1.113 -U test</div></pre></td></tr></table></figure>\n</li>\n</ol>\n<p>系统提示错误:NT_STATUS_ACCESS_DENIED<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\">Server requested LANMAN password (share-level security) but 'client lanman auth' is disabled</div><div class=\"line\">tree connect failed: NT_STATUS_ACCESS_DENIED</div></pre></td></tr></table></figure></p>\n<p>原因是被被SELINUX阻挡了,只要关闭SELINUX便可以了</p>\n<h2 id=\"SELINUX\"><a href=\"#SELINUX\" class=\"headerlink\" title=\"SELINUX\"></a>SELINUX</h2><p>SELINUX几种状态表示:</p>\n<ul>\n<li>enforcing:强制模式,代表 SELinux 运行中,且已经正确的开始限制 domain/type 了;</li>\n<li>permissive:宽容模式:代表 SELinux 运行中,不过仅会有警告信息并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;</li>\n<li>disabled:关闭,SELinux 并没有实际运行。</li>\n</ul>\n<p>关闭SELINUX即可:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\">getenforce //获取当前服务器的SELINUX状态, 看是否enforcing</div><div class=\"line\">setenforce 0 //临时更改SELINUX状态为permissive,重启失效</div></pre></td></tr></table></figure></p>\n<p>若要永久更改SELINUX状态<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">vim /etc/sysconfig/selinux //将里面的enforing改为permissive</div></pre></td></tr></table></figure></p>\n","categories":[],"tags":[]},{"title":"CRON表达式详解","url":"https://www.hyhcoder.com/2016/07/22/CRON表达式详解/","content":"<h1 id=\"CRON表达式详解\"><a href=\"#CRON表达式详解\" class=\"headerlink\" title=\"CRON表达式详解\"></a>CRON表达式详解</h1><h3 id=\"格式解释\"><a href=\"#格式解释\" class=\"headerlink\" title=\"格式解释\"></a>格式解释</h3><p>Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:</p>\n<ul>\n<li>Seconds Minutes Hours DayofMonth Month DayofWeek Year</li>\n<li>Seconds Minutes Hours DayofMonth Month DayofWeek</li>\n</ul>\n<p>Cron常用于linux的计划任务中,每个域可以出现的字符如下:</p>\n<ul>\n<li>Seconds: 可出现”, - * /“四个字符,有效范围为0-59的整数</li>\n<li>Minutes: 可出现”, - * /“四个字符,有效范围为0-59的整数</li>\n<li>Hours: 可出现”, - * /“四个字符,有效范围为0-23的整数</li>\n<li>DayofMonth: 可出现”, - * / ? L W C”八个字符,有效范围为0-31的整数</li>\n<li>Month: 可出现”, - * /“四个字符,有效范围为1-12的整数或JAN-DEc</li>\n<li>DayofWeek: 可出现”, - * / ? L C #”四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推</li>\n<li><p>Year: 可出现”, - * /“四个字符,有效范围为1970-2099年<br>每个域一般都是使用数字,但也可以使用特殊符号,具体如下:</p>\n</li>\n<li><p>* : 表示匹配该域的任意值,假如在Minutes域使用*, 即表示每分钟都会触发事件。</p>\n</li>\n<li><p>? : 只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和 DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 <em> ?, 其中最后一位只能用?,而不能使用</em>,如果使用*表示不管星期几都会触发,实际上并不是这样。</p>\n</li>\n<li><p>- : 表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次</p>\n</li>\n<li><p>/ : 表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.</p>\n</li>\n<li><p>, : 表示列出枚举值值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。</p>\n</li>\n<li><p>L : 表示最后,只能出现在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。</p>\n</li>\n<li><p>W : 表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一 到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份</p>\n</li>\n<li><p>LW : 这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。</p>\n</li>\n<li><p># : 用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。</p>\n</li>\n</ul>\n<h3 id=\"范例\"><a href=\"#范例\" class=\"headerlink\" title=\"范例\"></a>范例</h3><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div><div class=\"line\">12</div><div class=\"line\">13</div><div class=\"line\">14</div><div class=\"line\">15</div><div class=\"line\">16</div><div class=\"line\">17</div><div class=\"line\">18</div><div class=\"line\">19</div></pre></td><td class=\"code\"><pre><div class=\"line\">0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 </div><div class=\"line\">0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时 </div><div class=\"line\">0 0 12 ? * WED 表示每个星期三中午12点 </div><div class=\"line\">0 0 12 * * ? 每天中午12点触发 </div><div class=\"line\">0 15 10 ? * * 每天上午10:15触发 </div><div class=\"line\">0 15 10 * * ? 每天上午10:15触发 </div><div class=\"line\">0 15 10 * * ? * 每天上午10:15触发 </div><div class=\"line\">0 15 10 * * ? 2005 2005年的每天上午10:15触发 </div><div class=\"line\">0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 </div><div class=\"line\">0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发 </div><div class=\"line\">0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 </div><div class=\"line\">0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发 </div><div class=\"line\">0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发 </div><div class=\"line\">0 15 10 ? * MON-FRI 周一至周五的上午10:15触发 </div><div class=\"line\">0 15 10 15 * ? 每月15日上午10:15触发 </div><div class=\"line\">0 15 10 L * ? 每月最后一日的上午10:15触发 </div><div class=\"line\">0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发 </div><div class=\"line\">0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发 </div><div class=\"line\">0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发</div></pre></td></tr></table></figure>\n<h3 id=\"相关网站\"><a href=\"#相关网站\" class=\"headerlink\" title=\"相关网站\"></a>相关网站</h3><p>若还觉得混乱, 还有相关的在线网站可以测试生成;</p>\n<ul>\n<li><a href=\"http://cron.qqe2.com/\" target=\"_blank\" rel=\"external\">在线cron表达式生成器</a></li>\n</ul>\n","categories":[],"tags":[]},{"title":"记录一些markdown的使用技巧","url":"https://www.hyhcoder.com/2016/05/27/记录一些markdown的使用技巧/","content":"<h1 id=\"记录一些markdown的使用技巧\"><a href=\"#记录一些markdown的使用技巧\" class=\"headerlink\" title=\"记录一些markdown的使用技巧\"></a>记录一些markdown的使用技巧</h1><p>markdown这个工具用得越来越多, 也踩了一些坑, 开一篇文档记录下一些坑和技巧;</p>\n<ol>\n<li>在对代码引用的时候, 三点后面不能有空行或空格, 不然会导致读取错乱;</li>\n<li>#后面跟着标题时, 要留个空格, 不然有些解析器会读不出来;</li>\n<li>markdown表格是最麻烦的一块之一; 推荐个网站,轻松搞定表格:表格格式化;</li>\n<li>markdown插入图片也是一个麻烦点,推荐七牛云搭配图床网站,比如这个: 极简图床;</li>\n<li>对markdown语法用到的关键字引用, 比如#,*等, 要加\\转义;</li>\n<li>首行缩进, 可以在前面插入一个全角的空格或者加入 </li>\n<li>添加空行可以结束前面的格式状态;</li>\n<li>若要使图片居中或者限制大小, 可用html语言来写, 记住markdown其实也是一种标志性语言;</li>\n</ol>\n","categories":[],"tags":[]},{"title":"Git代理设置,加速clone","url":"https://www.hyhcoder.com/2016/04/15/Git代理设置,加速clone/","content":"<h1 id=\"Git代理设置,加速clone\"><a href=\"#Git代理设置,加速clone\" class=\"headerlink\" title=\"Git代理设置,加速clone\"></a>Git代理设置,加速clone</h1><p>由于经常用到github看开源项目, 但是经常clone的速度确实不敢说;</p>\n<p>想到之前部署了一台服务器, 可以用ss代理来进行加速;</p>\n<p>步骤:</p>\n<ol>\n<li>确保ss客户端连接;</li>\n<li>打开命令行输入以下代码:<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\">git config --global http.proxy 'socks5://127.0.0.1:1090' </div><div class=\"line\">git config --global https.proxy 'socks5://127.0.0.1:1090'</div></pre></td></tr></table></figure>\n</li>\n</ol>\n<p>1090为ss的本地端口,这个要根据自己的设置来更改;</p>\n<p>这样就可以完成代理;再clone一个项目, 发现速度再也不卡了;尽情享受吧!</p>\n","categories":[],"tags":[]},{"title":"JSON,JSONArray,Map一些总结","url":"https://www.hyhcoder.com/2016/01/09/JSON-JSONArray-Map一些总结/","content":"<p>JSON是目前前后端交互非常常用的一种格式, JSON其实是个总称,里面最小单元是JSONObject,就是由一连串键值对所组成的;而JSONArray则是由一连串JSONObject所组成的数组; Map也是一个键值对,但跟JSONObject有点不同, 下面再说说;</p>\n<p>我们先来看比较复杂的一个JSONArray:<br><img src=\"http://img.hyhcoder.top/17-4-9/4877941-file_1491745216641_1063b.png\" alt=\"enter image description here\"></p>\n<a id=\"more\"></a>\n<h3 id=\"我们可以看出\"><a href=\"#我们可以看出\" class=\"headerlink\" title=\"我们可以看出\"></a>我们可以看出</h3><ol>\n<li>这是一个数组, 最外面是由[ ]所组成的;</li>\n<li>里面包含了两个JSONObject,每个JSONObject最外面是由{ }组成的,里面的键值对由冒号:连接;</li>\n<li>第一个JSONObject是由几个JSONObject连环嵌套而成;</li>\n</ol>\n<h3 id=\"取数\"><a href=\"#取数\" class=\"headerlink\" title=\"取数\"></a>取数</h3><p>若我们要把name4的值取出来;</p>\n<ol>\n<li>将以上字符串转换为JSONArray对象;</li>\n<li>取出对象的第一项,JSONObject对象;</li>\n<li>取出name1的值JSONObject对象;</li>\n<li>取出name2的值JSONObject对象;</li>\n<li>取出name4的值value2。<br><strong>PS:</strong> 若要将示例的字符串转为JSONArray的格式可用:JSONArray.fromObject(String)</li>\n</ol>\n<h3 id=\"总结\"><a href=\"#总结\" class=\"headerlink\" title=\"总结\"></a>总结</h3><ol>\n<li><p>JSONObject<br>json对象,就是一个键对应一个值,使用的是大括号{ },如:{key:value}</p>\n</li>\n<li><p>JSONArray<br>json数组,使用中括号[ ],只不过数组里面的项也是json键值对格式的</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div></pre></td><td class=\"code\"><pre><div class=\"line\">JSONObject Json = new JSONObject(); </div><div class=\"line\">JSONArray JsonArray = new JSONArray(); </div><div class=\"line\">Json.put("key", "value");//JSONObject对象中添加键值对 </div><div class=\"line\">JsonArray.put(Json);//将JSONObject对象添加到Json数组中</div></pre></td></tr></table></figure>\n</li>\n<li><p>Map<br>map和json都是键值对,不同的是map中的每一对键值对是用等号对应起来的,如:userName=”LiMing”, 而json中的每一对键值对是用冒号对应起来的,如:userAge:18, 其实json就是一种特殊形式的map。</p>\n</li>\n</ol>\n","categories":[],"tags":[]},{"title":"解决/bin/bash^M: bad interpreter: No such file or directory","url":"https://www.hyhcoder.com/2015/09/09/解决-bin-bash-M-bad-interpreter-No-such-file-or-directory/","content":"<p>今天编译了一个程序,然后上传到服务器运行时,居然报了以下错误<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">/bin/bash^M: bad interpreter: No such file or directory'</div></pre></td></tr></table></figure></p>\n<p>查阅资料, 可以得知是因为linux和windows对换行符理解的不同所导致的,解决很简单;</p>\n<a id=\"more\"></a>\n<h3 id=\"解决方法\"><a href=\"#解决方法\" class=\"headerlink\" title=\"解决方法\"></a>解决方法</h3><ol>\n<li><p>使用sed命令,即可顺利转换;</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">sed -i 's/\\r$//' /mnt/www/xxx.sh</div></pre></td></tr></table></figure>\n</li>\n<li><p>或者使用dos2unix命令,也可以顺利转换;</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div></pre></td><td class=\"code\"><pre><div class=\"line\">dos2unix /mnt/www/xxx.sh</div><div class=\"line\">//不过要注意的是dos2unix这个有些系统没安装,可通过下面命令安装</div><div class=\"line\">yum install dos2unix</div></pre></td></tr></table></figure>\n</li>\n</ol>\n<h3 id=\"从根本解决\"><a href=\"#从根本解决\" class=\"headerlink\" title=\"从根本解决\"></a>从根本解决</h3><p>使用上面的命令的确解决了该脚本无法运行的错误, 但是不可能让我每次编译后再在linux上执行转换命令吧, 这个不科学;</p>\n<p>继续探究, 发现我们可以在Eclipse上设置换行符的模式为unix, 这就可以避免我们的文件在unix运行的尴尬了;</p>\n<ol>\n<li><p>设置<br><img src=\"http://img.hyhcoder.top/17-4-9/99388935-file_1491743658921_72a3.png\" alt=\"enter image description here\"></p>\n</li>\n<li><p>该设置只是对新建的文件有效, 还需要对之前的文件进行转换;<br><img src=\"http://img.hyhcoder.top/17-4-9/44570419-file_1491743952413_246c.png\" alt=\"enter image description here\"></p>\n</li>\n<li><p>至此,该问题全部解决</p>\n</li>\n</ol>\n","categories":[],"tags":[]},{"title":"oracle11g导出一些表缺失问题","url":"https://www.hyhcoder.com/2015/05/20/oracle11g导出一些表缺失问题/","content":"<h1 id=\"oracle11g导出一些表缺失问题\"><a href=\"#oracle11g导出一些表缺失问题\" class=\"headerlink\" title=\"oracle11g导出一些表缺失问题\"></a>oracle11g导出一些表缺失问题</h1><p>oracle11g的新特性,数据条数是0时不分配segment,所以就不能被导出。</p>\n<h3 id=\"解决方法:\"><a href=\"#解决方法:\" class=\"headerlink\" title=\"解决方法:\"></a>解决方法:</h3><ol>\n<li>插入一条数据(或者再删除),浪费时间,有时几百张表会累死的。</li>\n<li>在创建数据库之前</li>\n</ol>\n<ul>\n<li>使用代码:然后再建表就不会有问题了;<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">alter system set deferred_segment_creation=false;</div></pre></td></tr></table></figure>\n</li>\n</ul>\n<p>这两种方法都不是非常好;</p>\n<h3 id=\"下面是终极方法:\"><a href=\"#下面是终极方法:\" class=\"headerlink\" title=\"下面是终极方法:\"></a>下面是终极方法:</h3><p>1 . 先查询一下哪些表是空的:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">select table_name from user_tables where NUM_ROWS=0;</div></pre></td></tr></table></figure></p>\n<p>2 . 然后通过select 来生成修改语句:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">Select 'alter table'||table_name||'allocate extent;' from user_tables where num_rows=0 or num_rows is null;</div></pre></td></tr></table></figure></p>\n<p>3 . 最后生成了下面那些东西:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div><div class=\"line\">12</div><div class=\"line\">13</div><div class=\"line\">14</div><div class=\"line\">15</div><div class=\"line\">16</div><div class=\"line\">17</div><div class=\"line\">18</div><div class=\"line\">19</div><div class=\"line\">20</div><div class=\"line\">21</div><div class=\"line\">22</div><div class=\"line\">23</div><div class=\"line\">24</div><div class=\"line\">25</div><div class=\"line\">26</div><div class=\"line\">27</div><div class=\"line\">28</div><div class=\"line\">29</div><div class=\"line\">30</div><div class=\"line\">31</div><div class=\"line\">32</div><div class=\"line\">33</div><div class=\"line\">34</div><div class=\"line\">35</div></pre></td><td class=\"code\"><pre><div class=\"line\">alter table E2USER_STATE allocate extent; </div><div class=\"line\">alter table ENTERPRISE_E2USER allocate extent; </div><div class=\"line\">alter table ENTERPRISE_INFO_TYPE allocate extent; </div><div class=\"line\">alter table ENTERPRISE_MAPMARK allocate extent; </div><div class=\"line\">alter table ENTERPRISE_NEEDTASK allocate extent; </div><div class=\"line\">alter table ENTERPRISE_PICTURE allocate extent; </div><div class=\"line\">alter table ENTERPRISE_REPORT allocate extent; </div><div class=\"line\">alter table ENTERPRISE_REPORT_TYPE allocate extent; </div><div class=\"line\">alter table ENTERPRISE_TEAM allocate extent; </div><div class=\"line\">alter table FROMUSER_ADJUNCT_TARGET allocate extent; </div><div class=\"line\">alter table FROMUSER_OFFER allocate extent; </div><div class=\"line\">alter table NEEDTASK_TYPE allocate extent; </div><div class=\"line\">alter table SYS_PRIVILEGE allocate extent; </div><div class=\"line\">alter table SYS_RELEVANCE_RESOURCE allocate extent; </div><div class=\"line\">alter table SYS_RELEVANCE_TARGET allocate extent; </div><div class=\"line\">alter table SYS_RESOURCE_TYPE allocate extent; </div><div class=\"line\">alter table TASK_FEEDBACK allocate extent; </div><div class=\"line\">alter table TASK_MYTASKTYPE allocate extent; </div><div class=\"line\">alter table TOUSER_MESSAGE allocate extent; </div><div class=\"line\">alter table ABOUTUSER_POINT allocate extent; </div><div class=\"line\">alter table ABOUTUSER_POINT_MARK allocate extent; </div><div class=\"line\">alter table ABOUTUSER_QUERYKEY allocate extent; </div><div class=\"line\">alter table ABOUTUSER_REPORT_HISTORY allocate extent; </div><div class=\"line\">alter table DICT_COMMENT_TYPE allocate extent; </div><div class=\"line\">alter table DICT_INDUSTRY_TYPE allocate extent; </div><div class=\"line\">alter table DICT_POST allocate extent; </div><div class=\"line\">alter table DICT_REGION allocate extent; </div><div class=\"line\">alter table ENTERPRISE_COMMENT allocate extent; </div><div class=\"line\">alter table ENTERPRISE_COMMENT_C allocate extent; </div><div class=\"line\">alter table ENTERPRISE_INFO allocate extent; </div><div class=\"line\">alter table ENTERPRISE_INFO_C allocate extent; </div><div class=\"line\">alter table ENTERPRISE_INFO_STATE allocate extent; </div><div class=\"line\">alter table CALENDAR_CREATETYPE allocate extent; </div><div class=\"line\">alter table CALENDAR_MY allocate extent; </div><div class=\"line\">alter table CALENDAR_TYPE allocate extent;</div></pre></td></tr></table></figure></p>\n<p>ok 执行上面那些sql,之后再exp吧,那就是见证奇迹的时刻。</p>\n","categories":[],"tags":[]},{"title":"随记","url":"https://www.hyhcoder.com/2015/03/16/Android 随记/","content":"<h1 id=\"Android-随记\"><a href=\"#Android-随记\" class=\"headerlink\" title=\"Android 随记\"></a>Android 随记</h1><p>1 . Android 四大组件</p>\n<ul>\n<li>活动(Activity)</li>\n<li>服务(Service)</li>\n<li>广播接收器(Broadcast Receiver)</li>\n<li>内容提供器(Context Provider)</li>\n</ul>\n<p>2 . Android 分成五层架构 (硬件层)</p>\n<ul>\n<li>Linux 内核层 (提供底层驱动)</li>\n<li>系统运行库层(通过 C/C++库)(Sqlite , webkit)(虚拟机)</li>\n<li>应用框架层 (API)</li>\n<li>应用层</li>\n</ul>\n<p>3 . Android 设计讲究逻辑和视图分离</p>\n<ul>\n<li>在代码中通过R.string.hello_world 获得该字符串引用</li>\n<li>在xml中通过@string/hello_world 获得该字符串</li>\n</ul>\n<p>4 . 活动状态</p>\n<ul>\n<li>运行状态</li>\n<li>暂停状态</li>\n<li>停止状态</li>\n<li>销毁状态</li>\n</ul>\n<p>5 . 7个函数</p>\n<ul>\n<li>OnCreate() — > OnDestroy()</li>\n<li>OnStart() — > OnStop()</li>\n<li>OnResume() — > OnPause()</li>\n<li>OnRestart()</li>\n</ul>\n<p>6 . 活动启动模式</p>\n<ul>\n<li>standard</li>\n<li>singleTask</li>\n<li>singleTop</li>\n<li>singleInstance</li>\n</ul>\n<p>7 . 四种布局</p>\n<ul>\n<li>LinearLayout</li>\n<li>RelativeLayout</li>\n<li>FrameLayout</li>\n<li>TableLayout</li>\n</ul>\n<p>8 . 单位和尺寸<br>*Px为像素 ,pt为磅数</p>\n<ul>\n<li>dp为密度无关像素, sp为可伸缩像素(文字)</li>\n</ul>\n<p>9 . 碎片的几个回调方法</p>\n<ul>\n<li>onAttach() : 当碎片和活动建立关联时调用</li>\n<li>onCreateView() : 为碎片创建视图(加载布局)时调用</li>\n<li>onActivityCreated() : 确保与碎片关联的活动一定已创建完毕时调用.</li>\n<li>onDestroyView() : 当与碎片关联的视图被移除的时候调用;</li>\n<li>onDetach() : 当碎片和活动解除关联时调用;</li>\n</ul>\n<p>10 . 发送广播可用Intent, 接收用BroadcastReceiver</p>\n<ul>\n<li>标准广播 (完全异步执行)</li>\n<li>有序广播 (同步执行)</li>\n</ul>\n<p>11 . 数据持久化功能 :</p>\n<ul>\n<li>文件存储</li>\n<li>SharedPreference存储</li>\n<li>数据库存储</li>\n</ul>\n<p>12 . 获取其他程序的数据: 获得该应用程序的内容URI(借助contentResolver进行操作);</p>\n<p>13 . Android 异步消息处理:</p>\n<ul>\n<li>Message (线程之间传递的消息)</li>\n<li>Handler (处理者, 用于发送和处理消息的)</li>\n<li>MessageQueue (消息队列)</li>\n<li>Looper (每个线程中的MessageQueue管家)</li>\n</ul>\n<p>14 . AsyncTask</p>\n<p>15 . 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务;</p>\n<p>16 . Android 中定时任务一般两种实现方式:</p>\n<ul>\n<li>使用Java API 里提供的Timer类</li>\n<li>使用Android的Alarm机制</li>\n</ul>\n<p>17 . Xml两种解析方式:</p>\n<ul>\n<li>pull解析</li>\n<li>SAX解析</li>\n</ul>\n<p>18 . JSON格式解析;</p>\n<ul>\n<li>JSONObject 解析</li>\n<li>使用GSON开源库来解析</li>\n</ul>\n<p>19 . 全局context, 编写一个类,用类静态参数;</p>\n<p>20 . 常用viewPager + fragment方式开发侧滑动;(有开源项目)</p>\n<p>21 . Android ANR错误 (“Application Not Responding”)</p>\n<ul>\n<li>主线程(“事件处理线程”/ “UI线程”) 在5秒内没响应输入;</li>\n<li>BroadCastReceiver 没有在10秒内完成返回;</li>\n</ul>\n<p>22 . NDK为了方便调用第三方的C/C++的库;</p>\n","categories":[],"tags":[]},{"title":"Java与C++在面向对象基本概念上的区分","url":"https://www.hyhcoder.com/2015/03/03/Java与C++在面向对象基本概念上的区分/","content":"<h1 id=\"Java与C-在面向对象基本概念上的区分\"><a href=\"#Java与C-在面向对象基本概念上的区分\" class=\"headerlink\" title=\"Java与C++在面向对象基本概念上的区分\"></a>Java与C++在面向对象基本概念上的区分</h1><p>今天在面试的时候,被问到了Java和C++在面向对象上的区别, 居然一时不知道怎么回到, 平时一般都只知道面向对象, 然后了解到C是面向结构的, C++和Java是面向对象, 都没怎么去留意两者之间的差别;特此回来整理下, 然后以此备忘;</p>\n<h2 id=\"最基本区别\"><a href=\"#最基本区别\" class=\"headerlink\" title=\"最基本区别\"></a>最基本区别</h2><ul>\n<li>Java是一个完全面向对象的语言, C++是一个面向对象和面向过程的杂合体; 这是为了兼容C而导致的;</li>\n<li>Java中的所有东西都必须置入一个类。不存在全局函数、全局数据,也没有像结构、枚举或者联合这种东西,一切只有“类”!</li>\n<li>然而C++则不同,比如C++的main方法是置于所有的类之外的,除此之外还可以在类外定义其它的函数。在C++中,全局变量、结构、枚举、联合等一些列源于C的概念仍然存在。对于在这个问题上的区别,不同的人会有不同的看法,C++的优点是灵活机动,而且比较利于C程序员接受,因为在C中成立的事情在C++中基本上不会出现差错,他们只需要了解C++多了哪些东西便可以了,然而也正因为如此,C++杂糅了面向对象和面向过程的双重概念,由此产生出的很多机制在强化某部分功能的同时破坏了程序的整体结构。</li>\n<li>与此相比,Java语言去除了C++中为了兼容C语言而保留的非面向对象的内容,对于对C比较习惯的人来说不是十分友好,在很多问题的处理上也显得有些弃简就繁,但是它以此换来了严谨和可靠的结构,以及在维护和管理上的方便。</li>\n<li><strong>因此对两种语言的总体比较可以得出的结论是:C++更加灵活而Java更加严谨。</strong></li>\n</ul>\n<h2 id=\"类定义和类方法的定义上的区别\"><a href=\"#类定义和类方法的定义上的区别\" class=\"headerlink\" title=\"类定义和类方法的定义上的区别\"></a>类定义和类方法的定义上的区别</h2><p>Java中没有独立的类声明,只有类定义。在定义类和类的方法(C++中称为成员函数)上,让我们用一个C++的典型类定义的片段来说明两者的不同:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div></pre></td><td class=\"code\"><pre><div class=\"line\">class score</div><div class=\"line\">{</div><div class=\"line\">score(int);</div><div class=\"line\">};</div><div class=\"line\">score::score(int x)</div><div class=\"line\">{</div><div class=\"line\">//写下构造函数的具体定义</div><div class=\"line\">}</div></pre></td></tr></table></figure></p>\n<p>这个例子反映了C++和Java的三个不同之处:</p>\n<ol>\n<li>在Java中,类定义采取几乎和C++一样的形式,只不过没有标志结束的分号。</li>\n<li>Java中的所有方法都是在类的主体定义的而C++并非如此。在Java中我们必须将函数的定义置于类的内部,这种禁止在类外对方法定义的规定和Java的完全面向对象特性是吻合的。</li>\n<li>Java中没有作用域范围运算符“::”。Java利用“.”做所有的事情,但可以不用考虑它,因为只能在一个类里定义元素。即使那些方法定义,也必须在一个类的内部,所以根本没有必要指定作用域的范围。而对于static方法的调用,也是通过使用ClassName.methodName()就可以了。</li>\n</ol>\n<h2 id=\"类和对象的建立与回收机制上的区别\"><a href=\"#类和对象的建立与回收机制上的区别\" class=\"headerlink\" title=\"类和对象的建立与回收机制上的区别\"></a>类和对象的建立与回收机制上的区别</h2><ul>\n<li>Java提供了与C++类似的构造函数。如果不自己定义一个,就会获得一个默认构造函数。而如果定义了一个非默认的构造函数,就不会为我们自动定义默认构造函数。这和C++是一样的。但是在Java中没有拷贝构造函数,因为所有自变量都是按引用传递的。</li>\n<li>静态初始化器是Java的一个独特概念,与构造函数对每个新建的对象初始化相对的,静态初始化器对每个类进行初始化,它不是方法,没有方法名、返回值和参数列表,在系统向内存加载时自动完成。</li>\n<li>另一方面,在C++中,对象的释放和回收是通过编程人员执行某种特殊的操作来实现的,像利用new运算符创建对象一样,利用delete运算符可以回收对象。但在Java语言中,为方便、简化编程并减少错误,对象的回收是由系统的垃圾回收机制自动完成的。Java的垃圾回收机制是一个系统后台线程,它与用户的程序共存,能够检测用户程序中各对象的状态。当它发现一个对象已经不能继续被程序利用时,就把这个对象记录下来,这种不能再使用的对象被称为内存垃圾。当垃圾达到一定数目且系统不是很忙时,垃圾回收线程会自动完成所有垃圾对象的内存释放工作,在这个过程中,在回收每个垃圾对象的同时,系统将自动调用执行它的终结器(finalize)方法。</li>\n<li>finalize()方法与C++中的析构函数(Destructor)有类似的地方,但是finalize()是由垃圾收集器调用的,而且只负责释放“资源”(如打开的文件、套接字、端口、URL等等)。如需在一个特定的地点做某样事情,必须创建一个特殊的方法,并调用它,不能依赖finalize()。而在另一方面,C++中的所有对象都会(或者说“应该”)破坏,但并非Java中的所有对象都会被当作“垃圾”收集掉。由于Java不支持析构函数的概念,所以在必要的时候,必须谨慎地创建一个清除方法。而且针对类内的基础类以及成员对象,需要明确调用所有清除方法。</li>\n</ul>\n<h2 id=\"重载方面的区别——Java没有运算符重载\"><a href=\"#重载方面的区别——Java没有运算符重载\" class=\"headerlink\" title=\"重载方面的区别——Java没有运算符重载\"></a>重载方面的区别——Java没有运算符重载</h2><p>多态是面向对象程序设计的一个特殊特性,重载则是它的重要体现。在C++中,同时支持函数重载和运算符重载,而Java具有方法重载的能力,但不允许运算符重载。</p>\n<h2 id=\"继承方面的区别——关于访问权限\"><a href=\"#继承方面的区别——关于访问权限\" class=\"headerlink\" title=\"继承方面的区别——关于访问权限\"></a>继承方面的区别——关于访问权限</h2><ul>\n<li>在C++中存在三种继承模式——公有继承、私有继承和保护继承。其中公有继承使基类中的非私有成员在派生类中的访问属性保持不变,保护继承使基类中的非私有成员在派生类中的访问属性都降一级,而私有继承使基类中的非私有成员都成为派生类中的私有成员。</li>\n<li>在Java中,只有公有继承被保留了下来,Java中的继承不会改变基础类成员的保护级别。我们不能在Java中指定public,private或者protected继承,这一点与C++是不同的。此外,在衍生类中的优先方法不能减少对基础类方法的访问。例如,假设一个成员在基础类中属于public,而我们用另一个方法代替了它,那么用于替换的方法也必须属于public(编译器会自动检查)。<br>继承方面的区别——关于多继承</li>\n</ul>\n<p>所谓多重继承,是指一个子类可以有一个以上的直接父类。</p>\n<ul>\n<li>C++在语法上直接支持多继承,其格式为:class 派生类名:访问控制关键字 1 基类名1,访问控制关键字 2 基类名2,…</li>\n<li>Java出于简化程序结构的考虑,取消了语法上对多继承的直接支持,而是用接口来实现多重继承功能的结构。</li>\n</ul>\n<p>这样一来,对于仅仅设计成一个接口的东西,以及对于用extends关键字在现有功能基础上的扩展,两者之间便产生了一个明显的差异。不值得用abstract关键字产生一种类似的效果,因为我们不能创建属于那个类的一个对象。一个abstract(抽象)类可包含抽象方法(尽管并不要求在它里面包含什么东西),但它也能包含用于具体实现的代码。因此,它被限制成一个单一的继承。通过与接口联合使用,这一方案避免了对类似于C++虚基类那样的一些机制的需要。由此而来的,Java中没有virtual关键字。</p>\n<h2 id=\"其他方面的区别\"><a href=\"#其他方面的区别\" class=\"headerlink\" title=\"其他方面的区别\"></a>其他方面的区别</h2><p>除此之外, 还有一些区别, 比如指针与引用的问题,异常机制的问题,流程控制的问题等等。通过两种语言在种种方面的差异我们可以很明显地感觉两者在风格上的差异。</p>\n","categories":[],"tags":[]},{"title":"mysqldump命令一点总结","url":"https://www.hyhcoder.com/2015/02/09/mysqldump命令一点总结/","content":"<h1 id=\"mysqldump命令一点总结\"><a href=\"#mysqldump命令一点总结\" class=\"headerlink\" title=\"mysqldump命令一点总结\"></a>mysqldump命令一点总结</h1><h3 id=\"常见的几种导出方式\"><a href=\"#常见的几种导出方式\" class=\"headerlink\" title=\"常见的几种导出方式\"></a>常见的几种导出方式</h3><ol>\n<li><p>导出结构不导出数据</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">mysqldump -d 数据库名 -uroot -p > xxx.sql</div></pre></td></tr></table></figure>\n</li>\n<li><p>导出数据不导出结构</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">mysqldump -t 数据库名 -uroot -p > xxx.sql</div></pre></td></tr></table></figure>\n</li>\n<li><p>导出数据和表结构</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">mysqldump 数据库名 -uroot -p > xxx.sql</div></pre></td></tr></table></figure>\n</li>\n<li><p>导出特定表的结构</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">mysqldump -uroot -p -B数据库名 --table 表名 > xxx.sql</div></pre></td></tr></table></figure>\n</li>\n</ol>\n<h3 id=\"支持的选项\"><a href=\"#支持的选项\" class=\"headerlink\" title=\"支持的选项\"></a>支持的选项</h3><p><strong>mysqldump [OPTIONS] database [tables]</strong></p>\n<p>mysqldump支持下列选项:<br>–add-locks<br>在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。</p>\n<p>–add-drop-table<br>在每个create语句之前增加一个drop table。</p>\n<p>–allow-keywords<br>允许创建是关键词的列名字。这由表名前缀于每个列名做到。</p>\n<p>-c, –complete-insert<br>使用完整的insert语句(用列名字)。</p>\n<p>-C, –compress<br>如果客户和服务器均支持压缩,压缩两者间所有的信息。</p>\n<p>–delayed<br>用INSERT DELAYED命令插入行。</p>\n<p>-e, –extended-insert<br>使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句)</p>\n<p>-#, –debug[=option_string]<br>跟踪程序的使用(为了调试)。</p>\n<p>–help<br>显示一条帮助消息并且退出。</p>\n<p>-F, –flush-logs<br>在开始导出前,洗掉在MySQL服务器中的日志文件。</p>\n<p>-f, –force,<br>即使我们在一个表导出期间得到一个SQL错误,继续。</p>\n<p>-h, –host=..<br>从命名的主机上的MySQL服务器导出数据。缺省主机是localhost。</p>\n<p>-l, –lock-tables.<br>为开始导出锁定所有表。</p>\n<p>-t, –no-create-info<br>不写入表创建信息(CREATE TABLE语句)</p>\n<p>-d, –no-data<br>不写入表的任何行信息。如果你只想得到一个表的结构的导出,这是很有用的!</p>\n<p>–opt<br>同–quick –add-drop-table –add-locks –extended-insert –lock-tables。<br>应该给你为读入一个MySQL服务器的尽可能最快的导出。</p>\n<p>-pyour_pass, –password[=your_pass]<br>与服务器连接时使用的口令。如果你不指定“=your_pass”部分,mysqldump需要来自终端的口令。</p>\n<p>-P port_num, –port=port_num<br>与一台主机连接时使用的TCP/IP端口号。(这用于连接到localhost以外的主机,因为它使用 Unix套接字。)</p>\n<p>-q, –quick<br>不缓冲查询,直接导出至stdout;使用mysql_use_result()做它。</p>\n<p>-S /path/to/socket, –socket=/path/to/socket<br>与localhost连接时(它是缺省主机)使用的套接字文件。</p>\n<p>-T, –tab=path-to-some-directory<br>对于每个给定的表,创建一个table_name.sql文件,它包含SQL CREATE 命令,和一个table_name.txt文件,它包含数据。 注意:这只有在mysqldump运行在mysqld守护进程运行的同一台机器上的时候才工作。.txt文件的格式根据–fields-xxx和–lines–xxx选项来定。</p>\n<p>-u user_name, –user=user_name<br>与服务器连接时,MySQL使用的用户名。缺省值是你的Unix登录名。</p>\n<p>-O var=option, –set-variable var=option设置一个变量的值。可能的变量被列在下面。</p>\n<p>-v, –verbose<br>冗长模式。打印出程序所做的更多的信息。</p>\n<p>-V, –version<br>打印版本信息并且退出。</p>\n<p>-w, –where=’where-condition’<br>只导出被选择了的记录;注意引号是强制的!</p>\n","categories":[],"tags":[]},{"title":"关于android环境搭建时sdk和adt下载慢的解决方法","url":"https://www.hyhcoder.com/2014/12/11/关于android环境搭建时sdk和adt下载慢的解决方法/","content":"<h1 id=\"关于android环境搭建时sdk和adt下载慢的解决方法\"><a href=\"#关于android环境搭建时sdk和adt下载慢的解决方法\" class=\"headerlink\" title=\"关于android环境搭建时sdk和adt下载慢的解决方法\"></a>关于android环境搭建时sdk和adt下载慢的解决方法</h1><p>在下载sdk或adt插件时有时可能无法下载或者慢,因为各种我们知道的原因。</p>\n<p>我们可以通过修改hosts文件来解决。</p>\n<p>在Ubuntu中,输入下面的命令:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div></pre></td><td class=\"code\"><pre><div class=\"line\">sudo gedit /etc/hosts</div></pre></td></tr></table></figure></p>\n<p>然后在里面加入:<br><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\">203.208.46.146 dl.google.com </div><div class=\"line\">203.208.46.146 dl-ssl.google.com</div></pre></td></tr></table></figure></p>\n","categories":[],"tags":["android"]},{"title":"ubuntu安装后鼠标闪烁和卡顿问题","url":"https://www.hyhcoder.com/2014/12/10/ubuntu安装后鼠标闪烁和卡顿问题/","content":"<h1 id=\"win7下安装ubuntu14-04双系统\"><a href=\"#win7下安装ubuntu14-04双系统\" class=\"headerlink\" title=\"win7下安装ubuntu14.04双系统\"></a>win7下安装ubuntu14.04双系统</h1><p>之前的ubuntu卸载掉了,最近想组建个linux下的android开发环境,因此把一些内容整理一下。</p>\n<ol>\n<li>我们首先需要在win7下把硬盘的一些空间压缩出来,比如选择F盘,进行压缩卷,然后把压缩出来的部分删除卷,使其变成黑色未分配状态,这样就为ubuntu的安装提供了空间,一般需要50G以上比较充足;</li>\n<li>ubuntu现在是14.04,去官网下载相关的iso文件,然后下载esayBCD安装,用于引导启动;</li>\n<li>打开easyBCD,添加新条目,然后在NEOgrup选项中点击安装,然后点配置,出现一个txt的文件,用下面的内容将其覆盖;<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div></pre></td><td class=\"code\"><pre><div class=\"line\">title Install Ubuntu</div><div class=\"line\">root (hd0,0)</div><div class=\"line\">kernel (hd0,0)/vmlinuz boot=casper iso-scan/filename=/ubuntu-14.04-desktop-am64.iso ro quiet splash locale=zh_CN.UTF-8</div><div class=\"line\">initrd (hd0,0)/initrd.lz</div></pre></td></tr></table></figure>\n</li>\n</ol>\n<p><strong>注意:</strong><br>ubuntu-14.04-desktop-am64.iso是你的iso的名字,别写成我的了,这个要改成你的。<br>对于有的电脑上你的第一个盘符并不是C盘,在磁盘管理中可以看出,所以安装时需将(hd0,0)改为(hd0,1)【假设为第二个】。</p>\n<ol>\n<li><p>把下载后iso镜像文件用压缩软件或者虚拟光驱打开,找到casper文件夹,把里面的initrd.lz和vmlinuz解压到C盘,把.disk文件夹也解压到C盘,然后在把整个iso文件复制到C盘;</p>\n</li>\n<li><p>重启,会多了一个neogrup的启动项,进去,就会进入ubuntu的试用界面;</p>\n</li>\n<li><p>这一步很重要,不然可能会失败,按Ctrl+Alt+T 打开终端,输入代码:sudo umount -l /isodevice这一命令取消掉对光盘所在 驱动器的挂载(注意,这里的-l是L的小写,-l 与 /isodevice 有一个空格。),否则分区界面找不到分区;</p>\n</li>\n<li><p>做完上面的步骤,就可以点击桌面的安装进行安装了,这里除了分区没什么需要注意的。<br>(说下分区,一般分 / 50g ext4格式 , /home 30G ext4格式 ,swap分区 8g)<br>这是我自己的,其他可以按比例分,并且只有/分区也就是根分区是必须的,其他看硬盘大小;</p>\n</li>\n<li><p>等待安装完重启便可以了;</p>\n</li>\n<li><p>最后进入Windows 7,打开EasyBCD删除安装时改的menu.lst文件,按Remove即可。<br>然后去我们的c盘 删除vmlinuz,initrd.lz和系统的iso文件。<br>利用EasyBCD可以更改启动项菜单按Edit Boot Menu按钮,可以选择将Windows7设为默认开机选项.</p>\n</li>\n</ol>\n","categories":[],"tags":["部署"]},{"title":"win7下安装ubuntu14.04双系统","url":"https://www.hyhcoder.com/2014/12/09/win7下安装ubuntu14-04双系统/","content":"<h1 id=\"win7下安装ubuntu14-04双系统\"><a href=\"#win7下安装ubuntu14-04双系统\" class=\"headerlink\" title=\"win7下安装ubuntu14.04双系统\"></a>win7下安装ubuntu14.04双系统</h1><p>之前的ubuntu卸载掉了,最近想组建个linux下的android开发环境,因此把一些内容整理一下。</p>\n<ol>\n<li>我们首先需要在win7下把硬盘的一些空间压缩出来,比如选择F盘,进行压缩卷,然后把压缩出来的部分删除卷,使其变成黑色未分配状态,这样就为ubuntu的安装提供了空间,一般需要50G以上比较充足;</li>\n<li>ubuntu现在是14.04,去官网下载相关的iso文件,然后下载esayBCD安装,用于引导启动;</li>\n<li>打开easyBCD,添加新条目,然后在NEOgrup选项中点击安装,然后点配置,出现一个txt的文件,用下面的内容将其覆盖;<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div></pre></td><td class=\"code\"><pre><div class=\"line\">title Install Ubuntu</div><div class=\"line\">root (hd0,0)</div><div class=\"line\">kernel (hd0,0)/vmlinuz boot=casper iso-scan/filename=/ubuntu-14.04-desktop-am64.iso ro quiet splash locale=zh_CN.UTF-8</div><div class=\"line\">initrd (hd0,0)/initrd.lz</div></pre></td></tr></table></figure>\n</li>\n</ol>\n<p><strong>注意:</strong><br>ubuntu-14.04-desktop-am64.iso是你的iso的名字,别写成我的了,这个要改成你的。<br>对于有的电脑上你的第一个盘符并不是C盘,在磁盘管理中可以看出,所以安装时需将(hd0,0)改为(hd0,1)【假设为第二个】。</p>\n<ol>\n<li><p>把下载后iso镜像文件用压缩软件或者虚拟光驱打开,找到casper文件夹,把里面的initrd.lz和vmlinuz解压到C盘,把.disk文件夹也解压到C盘,然后在把整个iso文件复制到C盘;</p>\n</li>\n<li><p>重启,会多了一个neogrup的启动项,进去,就会进入ubuntu的试用界面;</p>\n</li>\n<li><p>这一步很重要,不然可能会失败,按Ctrl+Alt+T 打开终端,输入代码:sudo umount -l /isodevice这一命令取消掉对光盘所在 驱动器的挂载(注意,这里的-l是L的小写,-l 与 /isodevice 有一个空格。),否则分区界面找不到分区;</p>\n</li>\n<li><p>做完上面的步骤,就可以点击桌面的安装进行安装了,这里除了分区没什么需要注意的。<br>(说下分区,一般分 / 50g ext4格式 , /home 30G ext4格式 ,swap分区 8g)<br>这是我自己的,其他可以按比例分,并且只有/分区也就是根分区是必须的,其他看硬盘大小;</p>\n</li>\n<li><p>等待安装完重启便可以了;</p>\n</li>\n<li><p>最后进入Windows 7,打开EasyBCD删除安装时改的menu.lst文件,按Remove即可。<br>然后去我们的c盘 删除vmlinuz,initrd.lz和系统的iso文件。<br>利用EasyBCD可以更改启动项菜单按Edit Boot Menu按钮,可以选择将Windows7设为默认开机选项.</p>\n</li>\n</ol>\n","categories":[],"tags":["部署"]},{"title":"关于Java中转换机制整理","url":"https://www.hyhcoder.com/2014/10/28/关于Java中转换机制整理/","content":"<h1 id=\"关于Java中转换机制整理\"><a href=\"#关于Java中转换机制整理\" class=\"headerlink\" title=\"关于Java中转换机制整理\"></a>关于Java中转换机制整理</h1><p>这两天在会看think in java, 顺便整理一些东西;</p>\n<p>下面是最基本的数据类型比较:<br><img src=\"http://img.hyhcoder.top/17-3-26/94101325-file_1490513405075_15bf5.gif\" alt=\"\"></p>\n<p>说明几点:<br>1 . 也可以分为两大类:boolean类型和数值类型(主要为了数据转换时用)</p>\n<ul>\n<li>注意boolean不能与其他类型转换,把boolean赋予一个int等类型是不可以的</li>\n</ul>\n<p>2 . String字符串并不是基本数据类型,字符串是一个类,就是说是一个引用数据类型。<br>3 . 若还需要用更高精度的浮点数,可以考虑使用BigDecimal类。<br>4 . Java提供了三个特殊的浮点数值:正无穷大、负无穷大和非数,用于表示溢出和出错。<br>5 . 例如使用一个正浮点数除以0将得到正无穷大(POSITIVE_INFINITY);负浮点数除以0得到负无穷大(NEGATIVE_INFINITY)。0.0除以0.0或对一个负数开方得到一个非数(NaN)。(都属于Double或Float包装类)<br>6 . 所有正无穷大数值相等,所有负无穷大数值都是相等;而NaN不与任何数值相等。</p>\n<h3 id=\"1-基本数值型类型的自动类型转换\"><a href=\"#1-基本数值型类型的自动类型转换\" class=\"headerlink\" title=\"1.基本数值型类型的自动类型转换\"></a>1.基本数值型类型的自动类型转换</h3><p>这种很好理解,就是在基本类型中(boolean除外),可以系统自动转换把范围小的直接赋予范围大的变量。</p>\n<ul>\n<li>一般是实行如下转换,不用特别标记:<br><img src=\"http://img.hyhcoder.top/17-3-26/56836039-file_1490513440333_7802.png\" alt=\"\"></li>\n</ul>\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div></pre></td><td class=\"code\"><pre><div class=\"line\"><span class=\"keyword\">public</span> <span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">AutoConversion</span> </span>{</div><div class=\"line\"> <span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">static</span> <span class=\"keyword\">void</span> <span class=\"title\">main</span><span class=\"params\">(String[] args)</span> </span>{</div><div class=\"line\"> <span class=\"keyword\">int</span> a = <span class=\"number\">6</span>;</div><div class=\"line\"> <span class=\"keyword\">float</span> f = a;<span class=\"comment\">//int可以自动转为float</span></div><div class=\"line\"> </div><div class=\"line\"> <span class=\"keyword\">byte</span> b = <span class=\"number\">9</span>;</div><div class=\"line\"> <span class=\"keyword\">char</span> c = b;<span class=\"comment\">//出错,byte不能转为char型</span></div><div class=\"line\"> <span class=\"keyword\">double</span> d = b;<span class=\"comment\">//byte 可以转为double</span></div><div class=\"line\"> </div><div class=\"line\"> }</div><div class=\"line\"> }</div></pre></td></tr></table></figure>\n<p><strong>PS:</strong>有一种比较特殊的自动类型转换,就是把基本类型(boolean也行)和一个空字符连接起来,可以形成对应的字符串。</p>\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div></pre></td><td class=\"code\"><pre><div class=\"line\"><span class=\"keyword\">public</span> <span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Conversion</span> </span>{</div><div class=\"line\"> <span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">static</span> <span class=\"keyword\">void</span> <span class=\"title\">main</span><span class=\"params\">(String[] args)</span> </span>{</div><div class=\"line\"> <span class=\"keyword\">boolean</span> b = <span class=\"keyword\">true</span>;</div><div class=\"line\"> String str = b + <span class=\"string\">\"\"</span>;</div><div class=\"line\"> System.out.print(str);<span class=\"comment\">//这里输出true</span></div><div class=\"line\"> }</div><div class=\"line\">}</div></pre></td></tr></table></figure>\n<h3 id=\"2-强制类型转化\"><a href=\"#2-强制类型转化\" class=\"headerlink\" title=\"2.强制类型转化\"></a>2.强制类型转化</h3><p>上面的自动类型只能把表数范围小的数值转化为大的,如果没有显性表示把大的转为小的,会发生编译错误。</p>\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div><div class=\"line\">11</div><div class=\"line\">12</div><div class=\"line\">13</div><div class=\"line\">14</div></pre></td><td class=\"code\"><pre><div class=\"line\"><span class=\"keyword\">public</span> <span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Conversion</span> </span>{</div><div class=\"line\"> <span class=\"function\"><span class=\"keyword\">public</span> <span class=\"keyword\">static</span> <span class=\"keyword\">void</span> <span class=\"title\">main</span><span class=\"params\">(String[] args)</span> </span>{</div><div class=\"line\"> <span class=\"keyword\">int</span> b = <span class=\"number\">233</span>;</div><div class=\"line\"> <span class=\"keyword\">byte</span> c = (<span class=\"keyword\">byte</span>)b;<span class=\"comment\">//强制把一个int转为byte类型</span></div><div class=\"line\"> System.out.println(c);<span class=\"comment\">//输出-23</span></div><div class=\"line\"> </div><div class=\"line\"> <span class=\"keyword\">float</span> a = <span class=\"number\">5.6</span>;<span class=\"comment\">//错误,因为5.6默认是double类型</span></div><div class=\"line\"> <span class=\"keyword\">float</span> a = (<span class=\"keyword\">float</span>)<span class=\"number\">5.6</span>;<span class=\"comment\">//正确,要进行强制转化</span></div><div class=\"line\"> </div><div class=\"line\"> <span class=\"keyword\">double</span> d = <span class=\"number\">3.98</span>;</div><div class=\"line\"> <span class=\"keyword\">int</span> e = (<span class=\"keyword\">int</span>)d;<span class=\"comment\">//强制把一个double转为int类型</span></div><div class=\"line\"> System.out.println(e);<span class=\"comment\">//输出3</span></div><div class=\"line\"> }</div><div class=\"line\">}</div></pre></td></tr></table></figure>\n<p>像上面一样,要执行表数大的范围转为小的,需要显性声明,若强制转化后数值过大,会造成精度丢失。</p>\n<h3 id=\"3-字符串(String)转换为基本类型\"><a href=\"#3-字符串(String)转换为基本类型\" class=\"headerlink\" title=\"3.字符串(String)转换为基本类型\"></a>3.字符串(String)转换为基本类型</h3><ul>\n<li>通常情况下,字符串不能直接转换为基本类型,但通过基本类型对应的包装类可以实现。</li>\n<li>每个包装类都会有提供一个parseXxx(String str)静态方法来用于字符串转换为基本类型</li>\n</ul>\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div></pre></td><td class=\"code\"><pre><div class=\"line\">Sting a = <span class=\"string\">\"45\"</span>;</div><div class=\"line\"><span class=\"comment\">//使用Integer的方法将一个字符串转换为int类型</span></div><div class=\"line\"><span class=\"keyword\">int</span> iValue = Interger.parseInt(a);</div><div class=\"line\"><span class=\"comment\">//boolean比较特殊,仅在字符串为true的情况下为true,其他为false</span></div><div class=\"line\"><span class=\"keyword\">boolean</span> b = Boolean.valueOf(a);</div></pre></td></tr></table></figure>\n<h3 id=\"4-将基本类型转换为字符串(String)\"><a href=\"#4-将基本类型转换为字符串(String)\" class=\"headerlink\" title=\"4.将基本类型转换为字符串(String)\"></a>4.将基本类型转换为字符串(String)</h3><p>每个包装类都带有一个toString的方法,比如Double.toString(double d)等,可以转换为String字符串。</p>\n<h3 id=\"5-基本数据类型和包装类的转换\"><a href=\"#5-基本数据类型和包装类的转换\" class=\"headerlink\" title=\"5.基本数据类型和包装类的转换\"></a>5.基本数据类型和包装类的转换</h3><table>\n<thead>\n<tr>\n<th>基本数据类型</th>\n<th>包装类</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>boolean</td>\n<td>Boolean</td>\n</tr>\n<tr>\n<td>char</td>\n<td>Character</td>\n</tr>\n<tr>\n<td>byte</td>\n<td>Byte</td>\n</tr>\n<tr>\n<td>short</td>\n<td>Short</td>\n</tr>\n<tr>\n<td>integer</td>\n<td>Integer</td>\n</tr>\n<tr>\n<td>long</td>\n<td>Long</td>\n</tr>\n<tr>\n<td>float</td>\n<td>Float</td>\n</tr>\n<tr>\n<td>double</td>\n<td>Double</td>\n</tr>\n</tbody>\n</table>\n<ul>\n<li>下面示例两者之间的互相转换</li>\n</ul>\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div></pre></td><td class=\"code\"><pre><div class=\"line\"><span class=\"keyword\">int</span> i = <span class=\"number\">1</span>;</div><div class=\"line\">Integer iWrap = <span class=\"keyword\">new</span> Integer(i);<span class=\"comment\">//包装</span></div><div class=\"line\"><span class=\"keyword\">int</span> unWrap = iWrap.intValue();<span class=\"comment\">//解包装</span></div></pre></td></tr></table></figure>","categories":[],"tags":["Java,基础知识"]},{"title":"Oracle数据库服务总结","url":"https://www.hyhcoder.com/2014/05/15/Oracle数据库服务总结/","content":"<h1 id=\"Oracle数据库服务总结\"><a href=\"#Oracle数据库服务总结\" class=\"headerlink\" title=\"Oracle数据库服务总结\"></a>Oracle数据库服务总结</h1><h2 id=\"Oracle的数据库服务默认有5个\"><a href=\"#Oracle的数据库服务默认有5个\" class=\"headerlink\" title=\"Oracle的数据库服务默认有5个\"></a>Oracle的数据库服务默认有5个</h2><p>看了几篇文章后,总结其作用如下:<br>1 .<strong>OracleServiceORCL:数据库服务</strong>,这个服务会自动的启动和停止数据库。ORCL是Oracle的实例标识。此服务被默认的设置为开机启动。</p>\n<ul>\n<li>必须启动,这是Oracle数据库的服务。</li>\n</ul>\n<p>2 .<strong>OracleOraDb11g_home1TNSListener.监听器服务</strong>,服务只有在数据库需要远程访问的时候才需要,此服务被默认的设置为开机启动。</p>\n<ul>\n<li>必须启动,这是临听,用于远程客户端连接你的Oracle;</li>\n</ul>\n<p>3 .<strong>OracleJobSchedulerORCL.Oracle作业调度服务</strong>,ORCL是Oracle实例标识。此服务被默认设置为禁用状态.</p>\n<ul>\n<li>通常不启动,用于定期操作任务的服务; </li>\n<li>数据库工作日程调度,一般没有安排工作日程就不需要启动,为什么默认是禁用?因为启动后会占用很大的系统资源。</li>\n</ul>\n<p>4 .<strong> OracleDBConsoleorcl.Oracle数据库控制台服务</strong>,orcl是Oracle的实例标识,默认的实例为orcl.在运行Enterprise Manager 的时候,需要启动这个服务。此服务被默认设置为自动开机启动的。</p>\n<ul>\n<li>可以不启动,用于管理Oracle的企业管理器的服务; </li>\n</ul>\n<p>5 .<strong>OracleOraDb10g_home1iSQL<em>Plus iSQL</em>Plus的服务进程</strong></p>\n<ul>\n<li>可以不启动,这是isqlplus服务,用于用网页执行sql执行,11g已经取消了这个功能;</li>\n</ul>\n<h2 id=\"用命令启动\"><a href=\"#用命令启动\" class=\"headerlink\" title=\"用命令启动\"></a>用命令启动</h2><ul>\n<li>启动listener:lsnrctl start </li>\n<li>启动数据库:net start OracleServiceORCL</li>\n</ul>\n<h2 id=\"特别注意\"><a href=\"#特别注意\" class=\"headerlink\" title=\"特别注意\"></a>特别注意</h2><ol>\n<li><strong>在资源不够的情况下,要记得:</strong><br>只有这两项是必须启动的:OracleOraDb10g_home1TNSListener和OracleServiceORCL。(就是监听和数据库服务)</li>\n<li>对上面的服务也可以做一个批处理文件来启动和停止,批处理文件如下:</li>\n</ol>\n<ul>\n<li>建立dbstart.cmd文件(开启)</li>\n<li>添加如下内容:</li>\n</ul>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div></pre></td><td class=\"code\"><pre><div class=\"line\">@echo off </div><div class=\"line\">net start OracleServiceORACLE </div><div class=\"line\">net start OracleDBConsoleoracle </div><div class=\"line\">net start OracleOraDb10g_home1iSQL*Plus </div><div class=\"line\">net start OracleOraDb10g_home1TNSListener </div><div class=\"line\">pause</div></pre></td></tr></table></figure>\n<ul>\n<li>同样我们可以建立关闭文件(dbstop.cmd)</li>\n</ul>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div></pre></td><td class=\"code\"><pre><div class=\"line\">@echo off </div><div class=\"line\">net stop OracleServiceORACLE </div><div class=\"line\">net stop OracleDBConsoleoracle </div><div class=\"line\">net stop OracleOraDb10g_home1iSQL*Plus </div><div class=\"line\">net stop OracleOraDb10g_home1TNSListener </div><div class=\"line\">pause</div></pre></td></tr></table></figure>\n","categories":[],"tags":["数据库,Oracle"]},{"title":"Oracle中删除重复记录整理","url":"https://www.hyhcoder.com/2014/03/19/Oracle中删除重复记录整理/","content":"<h1 id=\"Oracle中删除重复记录整理\"><a href=\"#Oracle中删除重复记录整理\" class=\"headerlink\" title=\"Oracle中删除重复记录整理\"></a>Oracle中删除重复记录整理</h1><p>Oracle中经常会删除一些重复记录,整理一下以备用</p>\n<p>举例(建立数据如下):</p>\n<figure class=\"highlight sql\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div><div class=\"line\">7</div><div class=\"line\">8</div><div class=\"line\">9</div><div class=\"line\">10</div></pre></td><td class=\"code\"><pre><div class=\"line\"><span class=\"keyword\">create</span> <span class=\"keyword\">table</span> t_table </div><div class=\"line\">(<span class=\"keyword\">id</span> <span class=\"built_in\">NUMBER</span>, </div><div class=\"line\"><span class=\"keyword\">name</span> VARCHAR2(<span class=\"number\">20</span>) </div><div class=\"line\">);</div><div class=\"line\"><span class=\"keyword\">insert</span> <span class=\"keyword\">into</span> t_table <span class=\"keyword\">values</span> (<span class=\"number\">1234</span>, <span class=\"string\">'abc'</span>); </div><div class=\"line\"><span class=\"keyword\">insert</span> <span class=\"keyword\">into</span> t_table <span class=\"keyword\">values</span> (<span class=\"number\">1234</span>, <span class=\"string\">'abc'</span>); </div><div class=\"line\"><span class=\"keyword\">insert</span> <span class=\"keyword\">into</span> t_table <span class=\"keyword\">values</span> (<span class=\"number\">1234</span>, <span class=\"string\">'abc'</span>); </div><div class=\"line\"><span class=\"keyword\">insert</span> <span class=\"keyword\">into</span> t_table <span class=\"keyword\">values</span> (<span class=\"number\">3456</span>, <span class=\"string\">'bcd'</span>); </div><div class=\"line\"><span class=\"keyword\">insert</span> <span class=\"keyword\">into</span> t_table <span class=\"keyword\">values</span> (<span class=\"number\">3456</span>, <span class=\"string\">'bcd'</span>); </div><div class=\"line\"><span class=\"keyword\">insert</span> <span class=\"keyword\">into</span> t_table <span class=\"keyword\">values</span> (<span class=\"number\">7890</span>, <span class=\"string\">'cde'</span>);</div></pre></td></tr></table></figure>\n<p>1 .<strong>第一种方法:</strong>适用于有少量重复记录的情况(临时表法)</p>\n<ul>\n<li>(建一个临时表用来存放重复的记录)</li>\n<li>(清空表的数据,但保留表的结构)</li>\n<li>(再将临时表里的内容反插回来)</li>\n</ul>\n<figure class=\"highlight sql\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div></pre></td><td class=\"code\"><pre><div class=\"line\"><span class=\"keyword\">create</span> <span class=\"keyword\">table</span> tmp_table <span class=\"keyword\">as</span> <span class=\"keyword\">select</span> <span class=\"keyword\">distinct</span> * <span class=\"keyword\">from</span> t_table; </div><div class=\"line\"><span class=\"keyword\">truncate</span> <span class=\"keyword\">table</span> t_table; </div><div class=\"line\"><span class=\"keyword\">insert</span> <span class=\"keyword\">into</span> t_table <span class=\"keyword\">select</span> * <span class=\"keyword\">from</span> tmp_table;</div></pre></td></tr></table></figure>\n<p>2 .<strong>第二种方法:</strong>适用于有大量重复记录的情况</p>\n<figure class=\"highlight sql\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div><div class=\"line\">3</div><div class=\"line\">4</div><div class=\"line\">5</div><div class=\"line\">6</div></pre></td><td class=\"code\"><pre><div class=\"line\"><span class=\"keyword\">delete</span> t_table <span class=\"keyword\">where</span> </div><div class=\"line\">(<span class=\"keyword\">id</span>,<span class=\"keyword\">name</span>) <span class=\"keyword\">in</span> (<span class=\"keyword\">select</span> <span class=\"keyword\">id</span>,<span class=\"keyword\">name</span> </div><div class=\"line\"><span class=\"keyword\">from</span> t_table <span class=\"keyword\">group</span> <span class=\"keyword\">by</span> <span class=\"keyword\">id</span>,<span class=\"keyword\">name</span> <span class=\"keyword\">having</span> <span class=\"keyword\">count</span>(*)><span class=\"number\">1</span>) </div><div class=\"line\"><span class=\"keyword\">and</span> </div><div class=\"line\"><span class=\"keyword\">rowid</span> <span class=\"keyword\">not</span> <span class=\"keyword\">in</span> (<span class=\"keyword\">select</span> <span class=\"keyword\">min</span>(<span class=\"keyword\">rowid</span>) </div><div class=\"line\"><span class=\"keyword\">from</span> t_table <span class=\"keyword\">group</span> <span class=\"keyword\">by</span> <span class=\"keyword\">id</span>,<span class=\"keyword\">name</span> <span class=\"keyword\">having</span> <span class=\"keyword\">count</span>(*)><span class=\"number\">1</span>);</div></pre></td></tr></table></figure>\n<p>3 .<strong>第三种方法:</strong>适用于有少量重复记录的情况</p>\n<figure class=\"highlight sql\"><table><tr><td class=\"gutter\"><pre><div class=\"line\">1</div><div class=\"line\">2</div></pre></td><td class=\"code\"><pre><div class=\"line\"><span class=\"keyword\">delete</span> <span class=\"keyword\">from</span> t_table a <span class=\"keyword\">where</span> a.rowid!=(<span class=\"keyword\">select</span> <span class=\"keyword\">max</span>(b.rowid) </div><div class=\"line\"><span class=\"keyword\">from</span> t_table b <span class=\"keyword\">where</span> a.id=b.id <span class=\"keyword\">and</span> a.name=b.name);</div></pre></td></tr></table></figure>\n","categories":[],"tags":["数据库,Oracle"]},{"title":"","url":"https://www.hyhcoder.com/404.html","content":"<!DOCTYPE HTML>\n<html>\n<head>\n <meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8;\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n <meta name=\"robots\" content=\"all\">\n <meta name=\"robots\" content=\"index,follow\">\n <link rel=\"stylesheet\" type=\"text/css\" href=\"https://qzone.qq.com/gy/404/style/404style.css\">\n</head>\n<body>\n <script type=\"text/plain\" src=\"http://www.qq.com/404/search_children.js\" charset=\"utf-8\" homepageurl=\"/\" homepagename=\"�ص��ҵ���ҳ\">\n </script>\n <script src=\"https://qzone.qq.com/gy/404/data.js\" charset=\"utf-8\"></script>\n <script src=\"https://qzone.qq.com/gy/404/page.js\" charset=\"utf-8\"></script>\n</body>\n</html>","categories":[],"tags":[]},{"title":"关于","url":"https://www.hyhcoder.com/about/index.html","content":"<blockquote class=\"blockquote-center\">人的一切痛苦,本质上都是对自己的无能的愤怒.<br>王小波</blockquote>","categories":[],"tags":[]},{"title":"标签","url":"https://www.hyhcoder.com/tags/index.html","content":"","categories":[],"tags":[]},{"title":"","url":"https://www.hyhcoder.com/css/personal-style.css","content":"@font-face {\n font-family: \"Meiryo\";\n src: url(\"/fonts/Meiryo.eot\");\n /* IE9 */\n src: url(\"/fonts/Meiryo.eot?#iefix\") format(\"embedded-opentype\"), /* IE6-IE8 */\n url(\"/fonts/Meiryo.woff\") format(\"woff\"), /* chrome, firefox */\n url(\"/fonts/Meiryo.ttf\") format(\"truetype\"), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */\n url(\"/fonts/Meiryo.svg#Meiryo\") format(\"svg\");\n /* iOS 4.1- */\n font-style: normal;\n font-weight: normal;\n}\nhtml.page-home {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-image: url('/images/bg.jpg');\n background-color: transparent;\n background-size: cover;\n background-position: center center;\n background-repeat: no-repeat;\n /*background: linear-gradient( #1abc9c, transparent), linear-gradient( 90deg, skyblue, transparent), linear-gradient( -90deg, coral, transparent);*/\n /*background-blend-mode: screen;*/\n /*background: linear-gradient(to left, #5f2c82, #49a09d);*/\n}","categories":[],"tags":[]},{"title":"category","url":"https://www.hyhcoder.com/category/index.html","content":"","categories":[],"tags":[]},{"title":"search","url":"https://www.hyhcoder.com/search/index.html","content":"","categories":[],"tags":[]},{"title":"project","url":"https://www.hyhcoder.com/project/index.html","content":"","categories":[],"tags":[]},{"title":"link","url":"https://www.hyhcoder.com/link/index.html","content":"","categories":[],"tags":[]}]