分类目录归档:技术

Tomcat生产优化

1 建立JNDI;打开$TOMCAT_HOME/conf/context.xml,添加如下

<!--MySQL-->
    <Resource 
           name="jdbc/market" 
           auth="Container" 
           type="javax.sql.DataSource"
           maxActive="100" 
           maxIdle="30" 
           maxWait="10000"
           username="develop" 
           password="xxxxxx" 
           driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://mysql:3306/market"
    />

<!--SQL Server-->

    <Resource 
           name="jdbc/market" 
           auth="Container" 
           type="javax.sql.DataSource"
           maxActive="100" 
           maxIdle="30" 
           maxWait="10000"
           username="sa" 
           password="xxxxxx" 
           driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
           url="jdbc:sqlserver://sqlserver:1433;DatabaseName=market"
    />

2 优化连接数及压缩选项;打开$TOMCAT_HOME/conf/server.xml,替换如下代码:

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"
               maxThreads="250" maxHttpHeaderSize="8192"
               disableUploadTimeout="true"
               acceptCount="440" emptySessionPath="true"
               enableLookups="false"
               compression="500" compressableMimeType="text/html,text/xml,text/plain,application/octet-stream"/>

3 优化JVM;打开$TOMCAT_HOME/bin/catalina.cmd(catalina.sh),在最上面添加如下

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8
-server -Xms2048m -Xmx2048m
-XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m
-XX:MaxPermSize=512m -XX:+DisableExplicitGC"

4 修改Spring的连接,打开applicationContext.xml,修改如下:

<jee:jndi-lookup jndi-name="jdbc/market" id="dataSource"></jee:jndi-lookup>

如何下载受限资源

1 通过Chrome的network查找到加载的资源,如 http://cache.gensee.com/gsgetrecord/record14.gensee.net/gsrecord/115291/sbr/2018_05_06/V4AFs46eBy_1525568216/3976114433_145.swf

1

2 尝试通过本地的html页面将单张集成起来,但swf有其特殊性集成失败

3 换个思路,切换到移动版本(现在的手机不支持flash),以同样的方法可以找到图片资源地址,如 http://cache.gensee.com/gsgetrecord/record19.gensee.net/gsrecord/115291/sbr/2018_05_05/V4AFs46eBy_1525499873/hls/3976114433_96.png

4 多找两张看看其规律 http://cache.gensee.com/gsgetrecord/record19.gensee.net/gsrecord/115291/sbr/2018_05_05/V4AFs46eBy_1525499873/hls/3976114433_97.png

5 按照规律写脚本,如下:

   var data = [];
    data.push({
        name:'冲刺1', 
        url:'http://cache.gensee.com/gsgetrecord/record20.gensee.net/gsrecord/115291/sbr/2018_05_05/V4AFs46eBy_1525481655/hls/3976114433_{0}.png',
        end: 95
    },{
        name:'冲刺2', 
        url:'http://cache.gensee.com/gsgetrecord/record19.gensee.net/gsrecord/115291/sbr/2018_05_05/V4AFs46eBy_1525499873/hls/3976114433_{0}.png',
        start: 96,
        end: 144
    },{
        name:'冲刺3', 
        url:'http://cache.gensee.com/gsgetrecord/record14.gensee.net/gsrecord/115291/sbr/2018_05_06/V4AFs46eBy_1525568216/hls/3976114433_{0}.png',
        start: 145,
        end: 202
    },{
        name:'冲刺4', 
        url:'http://cache.gensee.com/gsgetrecord/record20.gensee.net/gsrecord/115291/sbr/2018_05_06/V4AFs46eBy_1525586183/hls/3976114433_{0}.png',
        start: 203,
        end: 344
    });

6 将上述页面生成 html

   var b = 0;
    if(qs && qs['b']){
        b = qs['b'] * 1;
    } else {
        document.title = '系分考试';
        $('content').innerHTML = html;
        return;
    }
    
    
    
    var url = data[b].url;
    var start = data[b].start;
    if(!start){
        start = 0;
    }
    var end = data[b].end;
    var name = data[b].name;
    document.title = '系分考试-' + name;
    
    
    
    

    html += '\n\n';
    for(var i = start;i<=end;i++){
    
        html += '\n\n';
        
        html += '![{0}]({0}) '.format(url.format(i));
        
    }
    console.log(html);
    $('content').innerHTML = html;

7 通过浏览器打印生成pdf

8 完整代码

<!DOCTYPE html>
<html>
<title></title>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1">
<link rel="apple-touch-icon" href="images/task/task3.png">
<xmp theme="simplex" style="display:none;" id="content">

</xmp>
<script src="js/tohours.min.js"></script>
<script>
(function(){


    var data = [];
    data.push({
        name:'冲刺1', 
        url:'http://cache.gensee.com/gsgetrecord/record20.gensee.net/gsrecord/115291/sbr/2018_05_05/V4AFs46eBy_1525481655/hls/3976114433_{0}.png',
        end: 95
    },{
        name:'冲刺2', 
        url:'http://cache.gensee.com/gsgetrecord/record19.gensee.net/gsrecord/115291/sbr/2018_05_05/V4AFs46eBy_1525499873/hls/3976114433_{0}.png',
        start: 96,
        end: 144
    },{
        name:'冲刺3', 
        url:'http://cache.gensee.com/gsgetrecord/record14.gensee.net/gsrecord/115291/sbr/2018_05_06/V4AFs46eBy_1525568216/hls/3976114433_{0}.png',
        start: 145,
        end: 202
    },{
        name:'冲刺4', 
        url:'http://cache.gensee.com/gsgetrecord/record20.gensee.net/gsrecord/115291/sbr/2018_05_06/V4AFs46eBy_1525586183/hls/3976114433_{0}.png',
        start: 203,
        end: 344
    });
    
    var $ = function(id){
        return document.getElementById(id);
    }
    
    var html = '';
    for(var i=0;i<data.length;i++){
        if(i%3 == 0){
            html += '\n\n';
        }
        html += '[【{0}】](cc-xf?b={1}) '.format(data[i].name, i);
    }
    html += '\n\n';
    
    html += '<a href="javascript:;" onclick="hideLink()">【关闭】</a> [【首页】](cc-xf)';
    
    
    qs = tohours.queryString();
    var b = 0;
    if(qs && qs['b']){
        b = qs['b'] * 1;
    } else {
        document.title = '系分考试';
        $('content').innerHTML = html;
        return;
    }
    
    
    
    var url = data[b].url;
    var start = data[b].start;
    if(!start){
        start = 0;
    }
    var end = data[b].end;
    var name = data[b].name;
    document.title = '系分考试-' + name;
    
    
    
    

    html += '\n\n';
    for(var i = start;i<=end;i++){
    
        html += '\n\n';
        
        html += '![{0}]({0}) '.format(url.format(i));
        
    }
    console.log(html);
    $('content').innerHTML = html;
})();

function hideLink(){
    var a = document.getElementsByTagName('a');
    for(var i=0;i<a.length;i++){
        a[i].style = 'display:none';
    }
}
</script>
<script src="js/strapdown.js"></script>
</html>

 

如何导出未加密的Kindle书籍使用其他阅读软件打开

由于Kindle软件里面有很多不方便的地方,有时候需要导出自己购买的电子书到其他读书软件里面阅读,或者需要将书籍统一保存,借助于ePUBee Magic可以实现这个目的

1 需要在Kindle的设置查到文件保存的路径

image

2 打开你的Kindle,下载你已经购买的书

3 打开第一步查询到的目录,按时间倒序,找到最新下载的。打开对应目录,找到以.azw结尾的文件,这是我们要脱壳的文件

image

4 打开ePUBee Magic选择脱壳并生成EPUB,然后打开你刚刚找到的.azw文件,这个时候ePUBee Magic会上传一个key文件,有时候杀毒软件会有提醒,点击确定就可以了。

image

5 云端脱壳完成后,会显示下载的按钮,点击下载就能保存到默认的下载目录

image

6 然后通过AirDrop传递到iPhone对应的软件就可以了

总结:无法得知ePUBee Magic这个软件是否绝对安全,另外这个软件对于大于50M的文件是不能上传转换的,像丘吉尔的二战史就是一个大部头,无法在上面脱壳,还是有一些局限性

架构师考试

架构师是考试已经结束很多天了,跟很多其他事情一样,考试完之后又是没有及时的总结。总是给自己找一个借口,说自己没有时间,但其实大多时间都被浪费掉了,很多时候或者是坐着发呆,或者看一场电影,偶尔看电影是有意义的,一直看电影就没有意义了,或者出去跟朋友喝杯酒,偶尔喝杯酒是有意义的,但是一直喝酒就没有意义了

很多时候我都在找有意义的事情做,逛商场是一件有意义的事情吗,我不确定,但这是现在做的最多的一件事情,找一家咖啡店坐下来买杯咖啡,吃点点心,看会儿电脑,玩会手机。当然这里的看电脑代表了很多事情,有可能是在工作,有可能是在听音乐,还有可能只是简单的浏览网站,很难静下心思考。

本来是写架构师考试,上面又扯的又太远了。架构师考试呢,我准备了两个多月,基本上是从9月9号PMP考试之后才开始着手准备的,但是十一假期期间,我浪费了很多时间。那段时间,基本上都是给了看电影,没有学什么东西,论文草草写了一篇不及格,直到后面大概十月中旬的时候才开始修改论文,当时时间就非常紧张了,提交的第一遍论文只得了20几分,当时认为是老师第一篇批改比较严格造成的。分数也跟我的论文选题有关我选择的是论文架构评估,而对架构评估这个主题我几乎没有任何感觉,也就不知道从何下手,只是自己在网上搜集了很多架构评估理论的资料,具体怎么实施知己一点都不知道,然后把理论的资料随便往里一贴凑够2800字的论文就提交了上去

第一遍论文被退回之后,我始终感觉自己写的还是足够好的,只是老师一直感觉第一次肯定不能给过,于是第二次提交的时间就延后了好多好多。老师第一次给的评语是段落太多,而段落太多跟希赛网站上面的排版方式有关系。第二次提交论文,我几乎只是简单修改了段落方面的内容,以为老师会基本上能够及格,但是结果大大出乎我的意料。因为第二次的文几乎还是30分不到。到这个时候我就有点紧张了,因为,剩下时间不到20天的样子。中间还有个销售,在发朋友圈的时候说现在同学们应该有两到三篇在修改及格的论文了吧。群里面的同学也越来越多地提到自己已经有好几篇论文已经合格了,这就让我更加紧张了,我加快了后面论文的修改,直到第五遍,提交的时候才基本上通过,勉强合格。奇怪的是后面的两篇论文就相当顺利了,应该说,因为后面两篇我选择了自己比较熟悉的主题,如性能和安全这两个方面。我基本上就在这两个方面里面挑三个重点,然后写大段大段跟自己实际工作相关的东西,根据老师提供的格式写出来的论文,基本上都能及格

复习的过程中太偏重于上午题,上午题其实是最不用担心的,毕竟是客观题,即使自己不会还可以蒙几道题,但是案例分析题就五花八门了,很难去针对某个主题做准备,虽然说上午题是案例的理论基础,但是到考试的时候还是有很大担心。包括现在已经考试完了在等成绩的时候对案例题还是没有信心。考试结束之后,上午题和论文题几乎没有太大悬念,都应该能够及格,但是下午几及格不及格就看老师的心情了。

考试的前一天遵循一贯的传统,去考场踩点,结果什么都没看到,因为去的太晚了。考试前一天一直想着,别吃坏肚子了,特别是在考试的时候,结果越担心什么越是来什么,考试前就已经开始拉肚子了,不过还好,有20分钟的时间给我拉屎,考试过程中没有出现任何异常的情况。下午考试比较正常,自己注意了一下中午的饮食。

下午论文考试的时间还是比较紧急的,在两个小时之内写完,2800字的文字,本身已经时间够紧的了,但是还需要思考整个论文的架构,如果事前没有足够的练习的话,是不可能够完成的。不像现在,我可以语音输入文字,而且可以很快,其实这种速度让我的思维有点跟不上,因为我脑子转的没有那么快,可能跟闪电侠是相反的一个角色。

说一下最后的结论吧,整个考试还是对技术知识的一遍梳理,能够拿到证书当然最好,拿不到证书也没有什么好遗憾的,可以参加明年的系统分析师的考试。只不过这个培训费是在有点太贵了。后面问了希赛的销售,据说我们老学员可以打六折,也需要3700块钱的培训费。现在想一想,证书对我而言,好像意义并不是很大,所以有没有这个证书其实不是特别在意,收获有以下几点

1 论文收获,我其实应该是非常不擅长写作文的一个人,包括之前都不擅长语文方面的东西基本上应该算是想到哪里写到哪里?然后。自己也经常会在本子上写一些自言自语的话,还被人嘲笑。其实这些都没有关系的,但是,除了技术方面之外,自己的思考还是没有任何的深度。包括我们从哪里来?要去哪里?这样的终极问题。生活常识中的一些简单问题。都没有自己的想法。很多时候别人会说。我平时不太爱讲话,原因是,不是我不想讲?而是我没有什么可讲的,如果你跟我谈的并不是技术方面的话题的话。儿子一次考试给了我一个很大的锻炼。让自己在写文章的时候注意了一下文章的大纲。其实在读书的时候也了解到,目录的重要性。但是自己毕竟没有写过书,也没有写过太长的文章。每次的博客都是随性而发。写了也不一定有人看。连自己都很少去看。显然没有太注意,文章的结构。当然技术方面的文章除外,因为技术方面我还是有一天要求的,必须能够让别人明白我写的是什么,而且能够解决别人的实际问题。而且我的志向远不止如此。快点论我的能力,并不是简简单单的想写好自己的博客,还想在自己生命结束之后,把自己写的东西给后人看。与能够给多少人看到。自己也说不清楚。因为我想到了一个问题,就是。我们在生命结束之后,能给能够留给世人的。东西是什么?我们能留下点什么?我也经历过很多人的生与死。在他们去世之后,我们很难再看到他们的影子。除了亲人之间的思念,但是。亲人之间的关系是随着。带季的增加而减少。你不可能让一个18代之后的后人去纪念一个毫无建树的先人。当然,你做出了很大的成就,除外,比如说现在很多新潮的人都把曹操当作自己的祖先,其实中间已经隔了不止18代了,所以你要么是一个名人,要么你留下一点线索,证明已到这个世界上来过。要当一个非常出名的人,还是比较困难的,比如三国时代,对于普通人而言,也只能嫉妒,那么有名的几个角色。但是资料就不同了,如果你写的书比较受欢迎的话,你可以跟后面很多很多很多的人去交流,去讨论自己的思想,对人生的思考,自己对于生命的思考。虽然对于现在的我而言,自己思考而还是非常浅显的。论文方面,自己的野心是能够成为一个,学历上。有所追求的人。能够在科技界发表一些自己的论文。发表论文并不是目的,目的是为了交流自己的思想,虽然自己现在还没有什么思想
2 it行业的全局观。虽然也做了这么多,时间的技术。但是有很多领域自己从来没有接触过。趁着学习架构师的,课程,过程中了解了很多,自己,不成了解过的领域。新领域可以作为自己下一步学习的目标。架构师已经站在一个比较高的高度上去。对项目进行管理。比如说我并不知道企业信息化的东西,比如说我并不清楚软件工程中的一些细节,比如说面向对象设计中的一些问题,我也并不是清楚。当然数据库方面的,设计工作在终极的时候就已经,学习过了,所以中级的考试对我的帮助还是很大的,那我希望高级的考试,对我的帮助更大。架构师的考试几乎涉及到IT领域的所有项目。甚至包括了数学统计学,逻辑学等方面的内容,虽然内容的深度并不够,但是内容的广度绝对够用。那我们下一步要做的是在那些我们深度并不深的领域里面。找到自己需要的东西,深入钻研下去。才能达到一个领域需要的程度。
3 坚持精神。参加一场考试,是需要坚持的。很多人由于是自己复习,并且,感觉到报名费用并不是特别高,所以最后弃考的人非常非常多,弃考的原因,我能够想得到。我也弃考过很多次。从今年的三次考试来看,我还是能够坚持得下来。毕竟考的都是自己,熟悉的领域。但是也有放弃的时候,比如说英语的学习,由于跟其他学习冲突,就放弃了,其实这些都是借口。如果自己真正的喜欢英语的话,是不会放弃的。就是觉得英语浪费己的时间,然后放弃了,但是,自己用,放弃英语的时间。去做了一些无聊的事情。
4 结伴精神。考试的过程中,我们有讨论的QQ群。这是很重要的一个特点。因为在群里面我们有共同的目标。我们的目标就是考试通过。整个过程分两个阶段,考试前的复习过程,考试后的等待成绩的过程。中级考试的时候没有经验,没有跟其他同学一起讨论过,在偏僻考试和高级的考试的时候。我就加了好多同学群。虽然以后不一定有什么用处。但是在自己独自复习的时候。还是给自己很多激励?包括一些同学提供的其他考试,对自己也很有帮助。为明年也设置了一些简单的目标。

GIT与SVN常用

I GIT

1 与远程保持一致

git reset --hard HEAD 

2 恢复某一个文件

git checkout trunk/code/src/main/webapp/static/js/manufacturer/product.js

3 切换到某个目录,CHECKOUT一个文件的版本

git log login_bg.jpg
git checkout d7d05048d76767b212e1839d3c91136c9d9f48be login_bg.jpg

4 创建新分支

git checkout -b Branch_calendar

5 显示所有分支

git branch -a

6 切换分支

git checkout Branch_calendar 
#如果不存在时会自动创建分支

7 配置基本信息

git config --global user.name "Jacob"
git config --global user.email "hlnie@tohours.com"

8 强制设置当前分支到某个commit

git reset --hard
git reset --hard <commit>

9 清空本地未提交的东西

git clean -df . & git reset --hard

II SVN

1 检出

svn checkout https://svn.tohours.com/svn/scratch aia3

2 提交

svn commit -m "commit"

3 全部增加

svn add --force ./

4 查看状态

svn status

5 更新

  • 在目录:
svn update
  • 不在目录:
svn update d:\deploy\scratch 

6 导出

svn export d:\deploy\scratch d:\webapps\aia3

7 Diff

svn diff -r 1327:1326 mcsd_svc.php

8 回滚到前一个版本

svn merge -r 340:334 ./

9 删除SVN没提交的文件

rm -f  `svn status | awk '{print $2}'`

10 删除某种『._的文件』

rm -f `find . | grep "\._"`
rm -f `find . | grep "\.DS_Store"`

11 SVN revert

svn revert -R .

整理常用Linux命令

这不仅仅是一篇文章,要时时更新与添加最新的使用方法与技术

找到PHP配置文件的地方:

php -i | grep “Loaded Configuration File”

文件路径/etc/sysconfig/iptables

开关 重启 /etc/init.d/iptables start|stop|restart

查看防火墙信息/etc/init.d/iptables status

Java正则类

之前一直研究正则的内容,一直忽略java的类,最近由于需要经常用到,把代码记录下来:

 

String line = “This order was placed( iOS 10.3.1;) for QT3000! OK?”;
String pattern = “iOS ([^;]*);”;

Pattern r = Pattern.compile(pattern);

Matcher m = r.matcher(line);
if (m.find()) {
System.out.println(“Found value: ” + m.group(0));
System.out.println(“Found value: ” + m.group(1));
} else {
System.out.println(“NO MATCH”);
}

内网应用更新方案

现状是:

Was01,Was02,Was03上部署了同样一套代码,其中Was01和Was02只有供前台访问的部署,Was03提供给内网用户管理的部分,如何同时在外网更新01,02,03三台服务器的版本?

看起来穿越两道防火墙,不太可行,其实你只要知道程序是我们开发的,就没有什么不可能。

思路:只要把更新文件放到数据库,每台服务器设置一个定时去检查当前的版本是否与数据库的版本一致,如果不一致就做更新。

需要考虑的问题:

  1. 如果已经更新了,怎样防止无穷更新的问题?
  2. 如果一个版本把更新机制的代码冲掉了怎么办?

SSH生成密钥对,登录服务器

最简单的生成方法:

ssh-keygen

按照提示写文件名就可以了,假设我们生成了xxx.pub和xxx,其中xxx是密钥文件,xxx.pub是公钥文件

配置CentOS的免密码登录:

  1. 用vim打开文件,拷贝里面的内容到需要登录账号的主目录,如/root
  2. 打开vim /root/.ssh/authorized_keys,如果没有这个目录则这样创建
    • mkdir .ssh
    • chmod 700 .ssh
    • cd .ssh
    • touch authorized_keys
    • chmod 644 authorized_keys
  3. 将xxx.pub里面的内容(应该是一行)拷贝到authorized_keys里面(单独占一行)
  4. ssh root@xxx.xxx.xxx.xx,选择xxx密钥文件,就可以不用密码登录了