作者归档:Jacob Nie

压测与文件同步备份

apache ab 压测

// 并发500 10000请求
abs -n 10000 -c 500 “https://minisite.tohours.com/tsinghuagra/sign?callback=jQuery331038543359793586385_1555899838180&url=https%3A%2F%2Fminisite.tohours.com%2Ftsinghuagra%2Fpage%2Findex.html%3Ffrom%3Dgroupmessage%26isappinstalled%3D0&_=1555899838181”

FastCopy做文件差异备份,AT命令每天备份

“C:\Program Files (x86)\FastCopy\FastCopy.exe” /cmd=diff /auto_close “H:\” /to=”E:\” at 1:00 /every:sunday,monday,tuesday,wednesday,thursday,friday,saturday C:\Users\Administrator\Desktop\backup.bat

清华大学项目上线

连续两年做清华大学的校庆微信活动部分,感谢各位 同事的共同努力 ,本次发布顺利上线。先不谈怎么在技术上实现,但这次设计还是挺好看的,头像框的形式也很有创意 ,唯一是微信不支持一键换头像,使用户体验有所割裂

清华108周年庆活动
如果有兴趣的同学,可以 关注 清华大学公众号参与活动,本周还会有第二个活动上线 技术上实现:
  1. 本次大量是静态资源,所以全部使用CDN加速
  2. 本次唯一的一个接口,使用ab工具压测,保证单台机器在并发300情况下 ,实现1秒之内访问
  3. 使用弹性扩展完成性能检测与自己扩展
  4. 使用RDS实现主从备份,读写分离
没想到的是,清华这次给了我们公众号的完全控制权,意味着我们可以完成公众号所有的功能选项,使开发更有发挥余地

记录的重要性

1 博客已经成了荒原

已经可以看出来,很多没有写东西了,曾经还以为自己多么厉害,写东西肯定没问题,经过两次论文的训练,加上现在自己懒得去写论文来看,其实没有太多的东西可以写。人在没有知道的时候思想是贫乏的。而在思想贫乏的时候,是无法写出很高质量的东西的。也许我能够写出部分东西来,跟自己的工作相关,跟自己不得不做的事情相关。我们大部分时候都觉得不得不做的事情不好,但好像大部分灵感来源于自己不得不做的事情 今天在做中宏项目的时候,有些技术方面的东西需要深入研究,而这些深入研究如果没有记录最终可能也将不了了之。所以我对自己说要记录。比如开发流程,即使只是简单的文字记录,也能够帮助我回忆所写代码的意义,因为代码没有遵循特别的规范,所以只好注释了救场了。 博客这东西虽然已经老古董,虽然已经过时了,但不失为一个记录的好地方,起码我每次去查找一些资料的时候这里都是我优先考虑的地方。而印象笔记里面收录了太多的东西,并且开始的时候我以为使用gmail可以很好完成记录,是的,完成了一些记录,但在我去宁波的时候,超过20M的时候竟然邮件发不出去,同时163的邮箱也无法接收,这种情况是我不愿意看到的。 想到这里,好像我博客的数据库还未备份,先做个阿里云的备份再回来吧。其实不光博客的数据库没备份,连我上传的附件好像也没有备份,还是要加上备份的策略,尽管需要额外的费用
设置完又回来了,刚刚用Surface打开阿里的复杂页面,CPU还是有点吃力的

2 记录的地方比较杂乱

我现在记录的地方可以说比较多,会议的部分一般会在Google Docs,网上收集的部分会放印象笔记,而一些工作项目上的内容一般会用项目的名称.txt然后放在Personal上,使用everything来搜索。博客已经好久没有更新了,但一些旧的内容一般更新在博客上。有时候一些私人的日记使用Gmail发邮件给163的方式来记录。这些内容没有分类,一般都是想到哪里写到哪里,所以无法及时复习,无法及时去整体,形成自己的知识结构。

3 学习未成体系

记录的最终目的是为了学习成体系,我们的学习要有进步,不是昨天看的东西今天又忘记了,就像自已学习英语的状态。所以记录的地方一定要方便看到,现在我已经每天带着Surface了,全功能(虽然性能不怎么好)的电脑可以让我多做很多的事情。有些笔记的整理工作在上面来进行还是非常方便的。连写博客上面的键盘也是一个非常好用的工具。所以需要将自己的知识分类,将需要公开发布的放在这里,将一些只是自已看的部分,放在印象笔记,将txt中的部分尽量拿出来,这样知识才能形成体系。然后把Google Docs里面的会议记录整理一下,如果不需要的就可以删掉了 只有形成了自己的体系,才能形成思想,更好的完成任务

学习苹果公司的售后

苹果公司的产品贵


苹果公司的产品普遍比较贵,不然也不会出现小米的手机了。小米与苹果就是两个极端,但并不是说小米的东西就不好,只是小米在以足够低的价格做到足够好,所谓的性价比。而苹果是将自己的产品做到极端 ,然后定一个极高价格,这样的做法有没有人买单呢?看看苹果的销量及股价就有答案了,苹果的方式是有可持续性的
本来最近想入手一个新的iPad Pro,但发现价格还是太贵了,配齐所有的装备大约要一万块了。基本上等同于他们的手机了。但iPad对阅读pdf的手写支持一直吸引着我,不过目前的surface由于是全功能,虽然性能上远远不及iPad Pro,够用,就暂时先用着。并且iPad也有不可逾越的问题。

苹果公司的东西好用


贵的东西又让你觉得值,这是我对苹果产品的印象。如果是骗钱的生意,最多也就骗我一次罢了,比如买房子,我觉得我应该不会再上二次当了。苹果的东西虽然都是电子类的消费品,直到今天我还没有一件觉得后悔的产品呢,不论当年的3GS还是现在的iPhone XS Max,以及几年前的iPad air,还有自己的MacBook,大部分还都在正常的服役中。换的最快的也就是手机了,不过从3GS到现在我也仅仅用了四台手机,上一部6s plus已经快四年了还在姐姐手里用着呢。
我一直想着把自己的2015年MacBook Pro升级下,但我一直找不到理由。如果我是做视频的,那么我可以说性能不够,导出的速度太慢,渲染速度太慢。但我不做视频,使用视频编辑的功能几乎没有。我用来就是开发的,现在的性能足够了。另外让我下不了决心的应该是信仰灯还有USB接口 Magic safe充电的方式,直接换成4个type-c接口,我的iPhone充电都要重新来过了。
关于MacBook还要多说些,如果只是普通 使用,MacBook绝对是足够省心,关上盖子就走了,你从来不用担心打开会卡顿。而新买的Surface,虽然用着8G内存,我还要打开资源管理器,监视着哪里使用CPU过多了,哪个应用程序使用内存过大了,然后杀一下,一点都不省心。但谁叫它小呢,轻呢,各有优势吧。后续我的主力机型肯定还不是Windows。

苹果公司的售后优秀


苹果的售后,几次的体验都是非常不错了,除了iPhone 5S的时候他们一直找不到原因,让我跑来跑去,但最终查出来不是他们的原因,是联通的原因。
我的Mac,虽然说非常好用,但买来没多久就修了一次电池,而这个电池换了没一年,又坏了,又跑去苹果店换了电池。快过第三年的时候,屏幕上的涂层出现花屏,又去苹果店免费换了上盖。我并不是说免费维修就一定要给好评,但他们有相应的政策,即使已经将要过三年的东西,还是给你维修的,并不是坏什么维修什么,可能由于集成程度比较高,直接就把上盖的换掉了。而之后,再也没出现过问题,可能这台电脑已经感觉到了我的机器 过保了,为我省钱呢。
在花屏这件事情 上,我本来是没有打算去苹果店维修的,本来是想淘宝上找个商家 修理一下,但在搜索的时候,发现网上说这是苹果的质量问题,并且苹果有对应的政策可以免费更换,于是就打电话给了苹果的客服,得到了肯定 的答复就直接预约了维修时间。隔了两天就可以把电脑拿回来了,一台新的电脑。
关于苹果售后的客服,电脑提示音不是合成的语音,应该是人来录音的,让人非常舒服。苹果的客服可能有些真的在家里工作,但说话都非常的客气。我最最喜欢的一点是,他解决了保留证据的问题,所有的问题都有一个case编号 ,你提供这个编号 可以让客服快速的了解 这个问题。并且在一电话结束后,无论是否解决了你的问题,都会有一个电子 邮件发送给你。比如今天又打电话退差价的问题,客服问我是否有之前 的case no,我翻翻邮件很快就找到了。并且现在如果让我找之前的维修记录的话,也肯定是存在的,因为它就在我的电子 邮箱里面,只要邮箱不丢,它丢的概率应该是不大的。

分配到具体的日期里面,也就不觉得苹果的东西是贵的了


前面说苹果的东西有点贵,确实贵,我买的手机直接的超过了1W块,并且信号还被别人拿来吐槽。虽然苹果从来不追求性价比,但与之前的6sp对比,如果这台手机我不用四年就会觉得亏了。但是,举例,我在淘宝上花20-30块买的钢笔,包邮的哦,直接丢在了垃圾桶。而我的iPhone陪我每一天,并且在我每个需要的时刻,它永远是最强劲的那一个。因为如果这个app连苹果最新的手机优化也做的不够的话,它在其他平台的体验就更差了。说到平分所有成本到每一天,那么我的6sp最有发言权,因为6000块,用了四年了,每年的价格都成千元机了,你连续换四台千元机也远远达不到使用6sp的效果。

也有不得不接受的地方


苹果并不是做什么东西都是完美的,比如XS Max,信号问题就是我们不得不接受的,因为这一代确实没有更好的选择了,选择前几代也不是一个好的方案。当然可以等明年,但在你不得不换的时候这就是不得不做出的选择。

宁波半日游

20190406周六 今天的行程已经基本结束
没有达到我想要的很多目的地
但主要的博物馆和天一阁及月湖都到了
这些主要的景点大体上能刻画出宁波的形象 虽然这次是打着浏览天一阁的名义来宁波的
但月湖 和博物馆两个免费的景点给了我更多的惊喜
在路上没吃的这一点也让我印象深刻
可能我没有去小吃的街去逛 博物馆 大体上也能看到是近期才建造的,但里面至少有一些看起来很旧的文物
当然缺少的部分便以民俗来充数了
首先是整个博物馆的外观
一开始网上看到的是说得过普利兹克建筑奖
后来在维基百科上确认是王澍曾经拿过这个奖项
而并不能博物馆参与了评定 总体上来讲,对比上海博物馆,外面做的很多足,内容不丰富。一级博物馆的内涵还有欠缺。
但能使用身份证来统计到访游客,能提供相关便利措施给游人以方便,还是非常难得的
其中我看到很多文字的拓本,而本次我也本着拍照的精神,几乎都把这些珍惜材料拆拍了下来,对练习书法可能有一定的帮助吧
还有一些绘画作品,看不出是当代、近代还是古代,只好他说什么就是什么 还有一些出土文物,有些看起来真的很旧了
最早的文物也到了商周了
虽然我不能看出来真假,但至少历史还是有些年份的 天一阁 天一阁是在很多书里看到过的,几乎是文人必知的一个地方。
给我的第一印象,是这个图书博物馆应该在一个山里面
没想到离火车站这么近
本来一天的时间就没有多少
加上我上午出发的有点晚
到宁波已经近下午一点了
而博物馆又有很多值得看的地方
耽误的时间有点长
想2个半小时怕逛不过来
但我想多了
天一阁书库是不可以进去的
并且还有很大的药味
非常像是药房
而主要的建筑天一阁
里面竟然是空的,什么都没有
二楼进行过加固
不上上去,也不知道上面有没有放书在里面
但据说现在的存书大概有30多万册
主要建筑的对面是一座假山
应该说天一阁整个建筑群都是重建的
无论是清朝重建还是近代或90年代重建
才形成了今天的这个样子 如果你想在里面看书喝茶
可能就想错了
没有书可以被你来翻阅
其实喝茶的地方也几乎没有
有点类似于苏州的园林
只不过各个建筑都有一个自己的名字罢了 月湖 我本来不想逛月湖的
逛完天一阁的时候已经接近4点了
而其他几个景点的关门时间也都在4点左右
所以即使不吃饭也没办法到下个景点了
我就导航去吃了一家网红面包店
而这家面包店就在月湖的旁边
吃完饭之后就游荡了一番
其实月湖并不大
其实天一阁就紧临月湖
还有未完全投入运营的一片商业区
进去之后就稀稀拉拉几家店
几乎没有什么人,感觉还挺好的 月湖不大,但还有一个更小的岛
比西湖的湖心岛要丰富的多
西湖的湖心岛就算了吧
在月湖可以看到穿古装的小姐姐
拍照游玩
还有好多游船 虽然我知道周边的建筑大多是近期新建的
给人的错觉依然可以让你觉得这里原来的生活就是这种方式
还有宗祠
竟然也有是人捐赠的
捐赠的就不收门票
哈哈哈哈,这是小度告诉我的
面试有AR导游 虽然里面的景点没我想象的丰富
但外面的科技感还是非常足的
什么微信现场买票直接入场
什么微信关注赠送手绘地图
什么刷脸买饮料
不错不错,这些体验非常的一致 月湖离火车站也非常的近
本来我还想怎么去火车站
怕打车人家嫌太近了
百度地图给出的答案是骑电动车5分钟
我一看周边还真有很多的电动力
再切换到自行车显示7分钟
我相这也没那么远嘛
结果当我逛完月湖的时候
刚好处于离火车站最近的地方
走过来也只有5-10分钟的距离 宁波的景点靠近火车站是人为的原因
对外地来的游客是相当的方便
但不知道会不会直接影响到当地居民的正常生活 另外一个要吐槽的地方是吃饭的地方
我在宁波想找一定小店,没那么多人,一个人好好吃一顿饭
几乎没有
所有的大众点评提供的都是大酒店
人均消费还好说
但我一个人到大酒店吃别人会以什么样的眼光来看我?
景区没什么吃的(至少我到过的这三个景点)是宁波的一套特色
不过对于海鲜我也没有多大兴趣
于是还是到火车站吃了快餐
快餐方便,价格不实惠,味道没那么好
但总算有吃的了

生活再困难也要继续

这次应该是我间隔最长时间的一次,你可能会说期间很忙,是的,可能是这样吧。最近感受到了世事的艰辛,可能在年轻时的我看来不值一提,但真正自己遇到的时候会出现选择困难。 但再困难的生活也是要继续的

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

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的设置查到文件保存的路径

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

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

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

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

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

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