[{"content":"场景 前端页面中的显示时间，是按当前用户的时区进行转换和显示。所以如果用户在中国大陆访问一个美国网站，看到的时间会是美国时间转换为北京时间后的结果。\n这样不利于查看时间进展，尤其是一些需要近期的时间节点，因为美国的时间比国内晚很多小时。\n解决方案 Chrome插件：Change Timezone for Google Chrome，可以直接通过改变浏览器的时区，刷新页面即可获取当前设置的时区，而不需要调整电脑的时间。\n同时也支持国际上的大部分时区，可以根据需要进行选择。\n安装地址：Change Timezone for Google Chrome - Chrome 网上应用店\n","permalink":"https://shiyuanjie.cn/posts/Tools/Chrome%E6%97%B6%E9%97%B4%E8%B0%83%E6%95%B4/","summary":"\u003ch2 id=\"场景\"\u003e场景\u003c/h2\u003e\n\u003cp\u003e前端页面中的显示时间，是按当前用户的时区进行转换和显示。所以如果用户在中国大陆访问一个美国网站，看到的时间会是美国时间转换为北京时间后的结果。\u003c/p\u003e\n\u003cp\u003e这样不利于查看时间进展，尤其是一些需要近期的时间节点，因为美国的时间比国内晚很多小时。\u003c/p\u003e\n\u003ch2 id=\"解决方案\"\u003e解决方案\u003c/h2\u003e\n\u003cp\u003eChrome插件：\u003ccode\u003eChange Timezone for Google Chrome\u003c/code\u003e，可以直接通过改变浏览器的时区，刷新页面即可获取当前设置的时区，而不需要调整电脑的时间。\u003c/p\u003e","title":"Chrome时区调整"},{"content":"技术类证书，自己也能搞定。 年前，在公司群里，看到有一个考证的信息，当时自己看了下证书涉及的内容，想着扩大知识面，自己也可以试了下，多花点业余时间呗，就参加报名了，报名费1.2K+。\n组织者就把我们报名的几个人拉了一个群，群里通知大家2月份就要去考试，因为公司为了拿下一个项目，需要有一定的证书。时间算下来，一共也就2周多点，自己当时就懵了。不小心跳进了一个深坑里。\n赶紧找对这个技术比较熟悉的同事咨询了下，同事给的反馈是：像我这种技术接触不多的，考取的难度还是不小的。\n没办法既然已经报名了，那就学呗。就这样，过年期间还坚持很天最少学习2小时，考前最后一个周未，两天还坚持到公司来学习。\n最后，还好自己顺利通过了考试，获得了对应的证书。\n通过今天书中的内容，自己想到了发生在身上的这个事情，很多时候，不是自己搞不定，是没有全身心的投入。\n收获 当遇到比较难以客服的困难时，一定要全力去做，这样才能让成功率变高，更不会让自己后悔。\n","permalink":"https://shiyuanjie.cn/posts/Upgrade/HCIA/","summary":"\u003ch2 id=\"技术类证书自己也能搞定\"\u003e技术类证书，自己也能搞定。\u003c/h2\u003e\n\u003cp\u003e年前，在公司群里，看到有一个考证的信息，当时自己看了下证书涉及的内容，想着扩大知识面，自己也可以试了下，多花点业余时间呗，就参加报名了，报名费1.2K+。\u003c/p\u003e\n\u003cp\u003e组织者就把我们报名的几个人拉了一个群，群里通知大家2月份就要去考试，因为公司为了拿下一个项目，需要有一定的证书。时间算下来，一共也就2周多点，自己当时就懵了。不小心跳进了一个深坑里。\u003c/p\u003e","title":"HCIA考证"},{"content":"写于成都出差中。\nFlag in 2020 家庭 陪家人出去游玩 -\u0026gt; Delay,疫情严重没有机会出去 学习5道新菜 -\u0026gt; 完成2/5，还要再努力 带儿子参加2次跑步比赛 -\u0026gt; 疫情基本都荒废了 整体完成30%，还需要再努力！ 学习 读书30本 -\u0026gt;7/30，终究还是自己太懒 跑步800公里 -\u0026gt;200/800.基本没太跑。现在也快荒废了。 学习观察与谈判 -\u0026gt;学会了在沟通中的一些细小动作，太整体进步不大。 驾照 -\u0026gt;8月份完成 培养孩子主动学习 -\u0026gt;孩子的学习还行，主动性还不行。需要继续培养 输出20篇文章 -\u0026gt;输出23篇，包含读书笔记 一场马拉松 -\u0026gt;未完成 整体完成40%，还缺失很多。。 工作 PMP证书 -\u0026gt;未通过 DA(Role Model:亚维) -\u0026gt; 尝试了多项目管理，但重大事项的处理，还缺失处理策略 20%完成度，加油！ 2021 TBD 家庭 孩子回老家上学了，媳妇也回老家陪孩子，多陪陪家人。每月回家至少一次 带孩子出去游玩一次 抽空多给老爸打打电话 学习 读书10本，产出读书笔记 学会一个新技能 每个月写一篇文章，内容不限。从5月开始 工作 不要逃避，有困难赢难而上 多关注客户的业务与项目组管理 每2个月与项目全体成员沟通一次，确保人员成长有推动 回顾 2020总结 2019总结 2018总结 2017总结 ","permalink":"https://shiyuanjie.cn/posts/Flags/2021%E6%80%BB%E7%BB%93/","summary":"\u003cp\u003e写于\u003ccode\u003e成都\u003c/code\u003e出差中。\u003c/p\u003e\n\u003ch2 id=\"flag-in-2020\"\u003eFlag in 2020\u003c/h2\u003e\n\u003ch4 id=\"家庭\"\u003e家庭\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e陪家人出去游玩  -\u0026gt; Delay,疫情严重没有机会出去\u003c/li\u003e\n\u003cli\u003e学习5道新菜 -\u0026gt; 完成2/5，还要再努力\u003c/li\u003e\n\u003cli\u003e带儿子参加2次跑步比赛 -\u0026gt; 疫情基本都荒废了\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e整体完成30%，还需要再努力！\n\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"学习\"\u003e学习\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e读书30本  -\u0026gt;7/30，终究还是自己太懒\u003c/li\u003e\n\u003cli\u003e跑步800公里 -\u0026gt;200/800.基本没太跑。现在也快荒废了。\u003c/li\u003e\n\u003cli\u003e学习观察与谈判 -\u0026gt;学会了在沟通中的一些细小动作，太整体进步不大。\u003c/li\u003e\n\u003cli\u003e驾照 -\u0026gt;8月份完成\u003c/li\u003e\n\u003cli\u003e培养孩子主动学习 -\u0026gt;孩子的学习还行，主动性还不行。需要继续培养\u003c/li\u003e\n\u003cli\u003e输出20篇文章 -\u0026gt;输出23篇，包含读书笔记\u003c/li\u003e\n\u003cli\u003e一场马拉松 -\u0026gt;未完成\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e整体完成40%，还缺失很多。。\n\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"工作\"\u003e工作\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003ePMP证书 -\u0026gt;未通过\u003c/li\u003e\n\u003cli\u003eDA(Role Model:亚维) -\u0026gt; 尝试了多项目管理，但重大事项的处理，还缺失处理策略\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e20%完成度，加油！\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"2021-tbd\"\u003e2021 TBD\u003c/h2\u003e\n\u003ch3 id=\"家庭-1\"\u003e家庭\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e孩子回老家上学了，媳妇也回老家陪孩子，多陪陪家人。每月回家至少一次\u003c/li\u003e\n\u003cli\u003e带孩子出去游玩一次\u003c/li\u003e\n\u003cli\u003e抽空多给老爸打打电话\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"学习-1\"\u003e学习\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e读书10本，产出读书笔记\u003c/li\u003e\n\u003cli\u003e学会一个新技能\u003c/li\u003e\n\u003cli\u003e每个月写一篇文章，内容不限。从5月开始\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"工作-1\"\u003e工作\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e不要逃避，有困难赢难而上\u003c/li\u003e\n\u003cli\u003e多关注客户的业务与项目组管理\u003c/li\u003e\n\u003cli\u003e每2个月与项目全体成员沟通一次，确保人员成长有推动\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"回顾\"\u003e回顾\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://shiyuanjie.cn/posts/Flags/2020%E6%80%BB%E7%BB%93/\"\u003e2020总结\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://shiyuanjie.cn/posts/Flags/2019%E6%80%BB%E7%BB%93/\"\u003e2019总结\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://shiyuanjie.cn/posts/Flags/2018%E6%80%BB%E7%BB%93/\"\u003e2018总结\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://shiyuanjie.cn/posts/Flags/2017%E6%80%BB%E7%BB%93/\"\u003e2017总结\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"2021总结"},{"content":" 把自己考取驾照的过程整理出来，做个记录。 西安有想考驾照，给安利一个十分Nice的教练，高新附件。请留下你的信息\n报名 过年疫情期间，驾校在搞活动，媳妇就说，要不报名吧。等疫情好点了，就赶紧去把回归一拿。随机交了定金，就算报名成功了\n5.16体检 5.16早上把剩余的费用交完，当天下午，坐着驾校的车，去体检中心。\n全程很顺利，完成体检。做完驾校报名登录的所有手续。坐驾校车回家。\n5.28 科目一 体检结束后，就开始刷题。使用的APP是驾考宝典。\n5.19在交管12123APP上发现已经可以预约科目一的考试，立刻预约5.28考试。\n刷题的方法：\n完成1遍所有顺序练习的题目，针对错题有两个注意事项 看下面出现的错误的提示，为什么自己会错 把经常错的部分，可以背下来。在下面会有一些优选评论，很有价值 开始刷模拟考试，记得勾选考场模拟和优先未做题，刷题刚开始分数可能不太理想。没关系，继续刷 共刷了42次考试，过程中可以间歇看下错题和收藏 科目一满分100，90分过关。在考试过程中要注意：\n碰到不会的提目先下一题，不要乱选 会做的题目全部做完，再回过头来仔细看 当天会有两次机会，所以不要紧张不要紧张不要紧张 5.28坐驾校的车，去参加科目一的考试，考试成绩95分。\n5.31第一次练车 练了1个小时的压离合 跑了绕圈4圈，感受加减档 6.7第二次练车 倒车入库半个小时 学习转S弯，自己一个人练习转弯半个小时 6.14第三次练车：倒车入库 全部在练习左侧倒车入库 6.21第四次练车：右侧倒车入库 学习右侧倒车入库 同时练习左侧倒车入库 7.5第五次练车：侧方停车+S弯 侧方停车 就位：A库角在右后视镜中间 倒车：A库角在后视镜消失后，右转弯打死 进库：倒车进入，直到左后视镜出现C角 回正：方向盘回正，继续倒车 左转：右后视镜中观察右后轮毂在一条线，左转弯打死 入库：车停入库即可，不用Care车是否停正。方向盘停住 出库：打左转灯，直接加油出库。在左后视镜出现C角时，右转弯直接打死 结果：完成 S弯 找位：左侧雨刮器，最左边是1号点/最右边是3号点 入弯：车正入弯，1号点与外圈线对齐后，左转弯打一圈 转弯：过程中，1号点与圈线压齐 换弯：1号点至外圈线对齐后，方向回正。3号点对齐外圈线时，右转弯一圈 出弯：观察右后视镜右边线的距离，调整。出弯 7.9第六次练车：四项练习 五项练习中，还有半坡启停没有学习 练习1个来小时，一直在练习四项： S弯： 基本问题不大，可以搞定 侧方停车：速度控制好了之后，问题不大 倒车入库：考虑车倒车开始时的位置 直角转弯：基本问题不大，转弯前不要忘记转向灯 7.14 半坡起步 下班时间，过去练会车。感觉还不错。\n半坡起步，这次终于学习了。方法： 松离合上坡，上坡过程中，注意与右侧边线的距离。确保3号点与边线对齐即可 上坡至停车第一条线时，轻踩离合。继续行驶，至后视镜与最远处线（第三条线）贴合处，踩死刹车。 拉手刹 轻抬刹车，不松离合。踩油门，至转速表在1500-2000转内 松手刹 继续踩油门，至车上坡。 完成半坡起步 练了一个来小时的，半坡起步+其它四项，感觉整体还可以。 由于7.20的的科二没办法参加强训练，所以教练让报了7.28的科三考试。\n7.22 科三练习 由于教练最近下午要外出发传单，今年的行情真的不容乐观。下午就无法练习了。今天中午约了教练去练车。\n科三练习，主要学习了直线加减档/超车/打灯。教练主要是把一些手势方法给讲了下，让自己也能快速的应对考试。\n开始考试 身份证交给教练，等待开考指令 逆时针检查车外况 上车（不用发车） 系安全带，踩离合 按两下喇叭 挂一档/松手刹 打左转向灯，看左后视镜 松离合，进入车道 加减档(1-4) 离合踩死 从高到低，或者从低到高 不能跳跃换档 超车 打灯，等待5秒 方向盘转20度，进入另外一下车道 进入后5秒，再打灯，等待5秒后，回到原始车道 打灯 按车型不一样，后面再学 结束 右转向灯 车靠近路边，依据3号点位观察 车调整好后，踩死离合 挂空档，拉手刹 熄火，松安全带 看左后视镜，开门后，再关门 结束考试 7.25 科三练习 下雨天，下午去驾校学习科三。教练带着在路上跑了近2个小时的科目三。\n收获：科三要听安全员的话，这样才能好过。\n7.26 科三强训 下午去训练场进行科三强训，四个人练了三个小时。\n灯光：\n夜间行使时，打开近光灯，灯光按两下 语音中有不良时，打开远光灯，向下按 语音中有临时停车时，应急停车并打开示阔灯，按下P+调整至示阔灯。在下一条语音播报时，关闭P，并调整示阔灯归位 所有光灯结束时，关闭灯光 7.28 科三考试 早上6:00坐驾校的车，去考试地点：秦汉考务中心。到考务中心已经7点。\n排队等到9点，开始准备考试。等到自己考试的时候，基本快到10点了。\n考试：\n身份证传递给安全员 从车左后方开始，左后方-\u0026gt;右后方-\u0026gt;右前方，依次按压触摸点，每次3秒 结束后，上车，系安全带。等待安全员通知开始考试 开始后第一项灯光考试，顺利通过 上路出发，刚出去一会，在加减档处压线了。直接扣100分。本次考试失败 重回起点参加第二次考试 第二次，全程紧紧张张/战战兢兢的完成了。下车后，被安全员一顿训\u0026hellip;. 最终考试通过，回到考务中心签字确认。\n8.1/8.2 科目二学习 针对科目二进行专项练习，基本没有什么问题了。\n8.8 科目二继续学习 科目二学习，马上要强训了，突击学习下。\n8.9 科目二强训 早上6点上校车，7点到考场，开始强训。\n科目二强训，记住各个点位\n半坡:左侧豁口处，直接踩死 直角转弯:两个横杆中间，方向盘打死 倒车入库:听到语音播报/门把手即将离黄线，开始打方向。入库后，看左侧横杆末端，直接踩死 侧方停车:听到语音播报/后视镜库角消失1秒，打方向盘。C角处横杆消失回正 S弯:雨刮器一号点压住外线。出S弯后，方向盘回至剩一圈，打右转向灯。挺3秒，车头回正，进入直角转弯 8.11 科目二考试 早上6点上校车，7点到考试场地。一直等到10：30了，才开始有考试的正式动静。\n还好自己在11点多弄到了考试的机会，47号车，一把过，100分。\n已预约8.20的科目四考试。抓紧复习\n8.20 科目四考试 早上起来，还是在考科目一的地方，参加科目四的考试。\n快到考场了，肚子不舒服，尴尬的不行。到了地方，赶紧解决下，还一直担心会影响考试。不过还好，后来没有再发生什么情况。\n考试11点到自己了，进去考试，98分通过。\n需要注意的是：\n科目四的题目类型会在中间区域提示 科目四也是要多刷题就可以 考完科目四，下午2：00拿证。\n从科目一的5.25考试，到8.20考完科目四。三个月的时间，整体进度还可以。总结如下：\n找一个大点的驾校，自己有考场和练车的地方。经济允许的情况下，最好报个VIP班，教练的态度和练车的时间会好很多。 科目一和科目四只能依靠自己，多刷题。自己用的APP是驾考宝典 如果你是上班族，请尽量保证每周去半天。周边的同事，报名没有拿证的，基本都是中断之后就不想去了 Tips: 拿钱可以搞定很多事情，自己品。\n","permalink":"https://shiyuanjie.cn/posts/Upgrade/driver-license/","summary":"\u003cblockquote\u003e\n\u003cp\u003e把自己考取驾照的过程整理出来，做个记录。\n西安有想考驾照，给安利一个十分Nice的教练，高新附件。请留下你的信息\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"报名\"\u003e报名\u003c/h2\u003e\n\u003cp\u003e过年疫情期间，驾校在搞活动，媳妇就说，要不报名吧。等疫情好点了，就赶紧去把回归一拿。随机交了定金，就算报名成功了\u003c/p\u003e\n\u003ch2 id=\"516体检\"\u003e5.16体检\u003c/h2\u003e\n\u003cp\u003e5.16早上把剩余的费用交完，当天下午，坐着驾校的车，去体检中心。\u003c/p\u003e","title":"我的驾照历程"},{"content":"书 书名 可复制的领导力 作者 樊登 豆瓣评分 7.3 分类 领导力 In 豆瓣 可复制的领导力 出版社 中信出版社 读书方法 深度阅读 推荐指数 ★★★☆☆ 难度指数 ★☆☆☆☆ 阅读时间 20200617-20200716 问题 哪些领导力可复制？ 对团队的认知：团队如球队 沟通的技巧：倾听 收获 沟通 DDS(Deep Dark Secret) 针对DDS类型的问题不要涉及。\n倾听 三步曲\n深呼吸 提问 复述 如何确保倾听无遗漏？\n用自己的理解复述问题 如何Get此技能\n刻意练习 沟通漏斗 沟通的信息会随着时间的消逝，信息会越来越弱。\n概念卡 DDS Deep Dark Secret，又黑又深的秘密。\n隐私的三个层级，DDS为最深入的部分。另外两层：\n不好意思说 忘了说 针对三个层级的处理方法：\nDDS：不要触碰 不好意思说：管理者要鼓励员工把这部分暴露出来 忘了说：管理者要善于发现并识别此部分内容，这部分往往是埋雷的 金句 你永远无法叫醒一个装睡的人 企业管理说到底就是目标管理。\u0026mdash;德鲁克 自尊从哪里来？来自于一次次的被肯定 关联书单 《高绩效教练》\n感悟 针对倾听的部分，自己需要刻意练习。因为自己在沟通中，有时候会打断别人，有些问题也没有太听清楚。就直接沟通了 脑图版本 可复制的领导力 in shimo\n","permalink":"https://shiyuanjie.cn/posts/Book/%E5%8F%AF%E5%A4%8D%E5%88%B6%E7%9A%84%E9%A2%86%E5%AF%BC%E5%8A%9B/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e可复制的领导力\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e樊登\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e7.3\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e领导力\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/27598664/\"\u003e可复制的领导力\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e中信出版社\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e深度阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e推荐指数\u003c/td\u003e\n          \u003ctd\u003e★★★☆☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e难度指数\u003c/td\u003e\n          \u003ctd\u003e★☆☆☆☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20200617-20200716\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"可复制的领导力"},{"content":"书 书名 再见，忍老师 作者 东野奎吾 豆瓣评分 6.9 分类 人性 In 豆瓣 再见，忍老师 出版社 南海出版公司 读书方法 快速阅读 推荐指数 ★★★★☆ 难度指数 ★☆☆☆☆ 阅读时间 20200325-20200405 问题 单纯当个小说再读，没有问题。\n收获 概念卡 无\n金句 无\n感悟 一个普通老师的一段人生经历，伴随着一次杀人事件的发生。普通的人性，就像生活中的人们。 忍老师，也算很多学生向往的老师那样。跟学生打成一片，性格直爽，生活中也不乏追求者。 情节很贴近生活，故事也不是特别的紧张，很轻松的一本书。读起来很舒适。\n","permalink":"https://shiyuanjie.cn/posts/Book/%E5%86%8D%E8%A7%81%E5%BF%8D%E8%80%81%E5%B8%88/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e再见，忍老师\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e东野奎吾\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e6.9\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e人性\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/30464974/\"\u003e再见，忍老师\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e南海出版公司\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e快速阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e推荐指数\u003c/td\u003e\n          \u003ctd\u003e★★★★☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e难度指数\u003c/td\u003e\n          \u003ctd\u003e★☆☆☆☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20200325-20200405\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"再见，忍老师"},{"content":"书 书名 兄弟 作者 余华 豆瓣评分 8.5 分类 人性 In 豆瓣 兄弟 出版社 作家出版社 读书方法 深度阅读 推荐指数 ★★★★★ 难度指数 ★☆☆☆☆ 阅读时间 20200406-20200420 问题 人性的底线在哪？ 兄弟情，因为一个女人反目； 一堆残疾人，比一堆正常人的本性更善良； 最漂亮的女人，最终也做了最三\b\b俗的事情； 阳光正气的哥哥，因为金钱做变性手术； 收获 概念卡 无\n金句 世界上没有无缘无故的爱，也没有无缘无故的恨。- 毛主席 不要在别人面前哭。 感悟 人性是经不起考验的，想办法做好自己。永远不要考研人性的下限。\n做人要留分寸，不要太过分。不要低估别人的触底反弹。\n","permalink":"https://shiyuanjie.cn/posts/Book/%E5%85%84%E5%BC%9F/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e兄弟\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e余华\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e8.5\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e人性\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/4882133/\"\u003e兄弟\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e作家出版社\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e深度阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e推荐指数\u003c/td\u003e\n          \u003ctd\u003e★★★★★\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e难度指数\u003c/td\u003e\n          \u003ctd\u003e★☆☆☆☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20200406-20200420\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"兄弟"},{"content":" 今天有个朋友问到，BUG Review有什么注意事情和流程方法没？简单整理了下，便于后续回顾。\n源地址：https://mubu.com/doc/amsCZEE1YV\n流程 host QA 流程 QA搜集各位输入信息，并整理数据分布 所有参与人员一起讨论，并制定后续改进 时机 不确定，建议：团队质量较差或者定期做 参与人 全团队成员 必要可以拉上客户 输入 所有的BUG单 反馈信息(客户/用户/其它渠道) 输出 各种分布 新增/修复/关闭时间 BUG的模块分类，如：登录模块/订单模块 等 BUG的原因分类，如：需要描述不清晰/程序代码问题/再次出现 等 优先级划分 责任人 后续改进 改进策略 下一次Review的时间 注意 责任人 看情况是否需要拉出来讨论 改进策略 这部分才是Review的目的 分布的情况，打开讨论，并制定Action。 Review的结论 如果是给客户的，要酌情做一些内容的调整 ","permalink":"https://shiyuanjie.cn/posts/QA/BugReview/","summary":"\u003cblockquote\u003e\n\u003cp\u003e今天有个朋友问到，BUG Review有什么注意事情和流程方法没？简单整理了下，便于后续回顾。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e源地址：\u003ca href=\"https://mubu.com/doc/amsCZEE1YV\"\u003ehttps://mubu.com/doc/amsCZEE1YV\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003e流程\n\u003cul\u003e\n\u003cli\u003ehost\n\u003cul\u003e\n\u003cli\u003eQA\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e流程\n\u003cul\u003e\n\u003cli\u003eQA搜集各位输入信息，并整理数据分布\u003c/li\u003e\n\u003cli\u003e所有参与人员一起讨论，并制定后续改进\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e时机\n\u003cul\u003e\n\u003cli\u003e不确定，建议：团队质量较差或者定期做\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e参与人\n\u003cul\u003e\n\u003cli\u003e全团队成员\u003c/li\u003e\n\u003cli\u003e必要可以拉上客户\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e输入\n\u003cul\u003e\n\u003cli\u003e所有的BUG单\u003c/li\u003e\n\u003cli\u003e反馈信息(客户/用户/其它渠道)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e输出\n\u003cul\u003e\n\u003cli\u003e各种分布\n\u003cul\u003e\n\u003cli\u003e新增/修复/关闭时间\u003c/li\u003e\n\u003cli\u003eBUG的模块分类，如：登录模块/订单模块 等\u003c/li\u003e\n\u003cli\u003eBUG的原因分类，如：需要描述不清晰/程序代码问题/再次出现 等\u003c/li\u003e\n\u003cli\u003e优先级划分\u003c/li\u003e\n\u003cli\u003e责任人\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e后续改进\n\u003cul\u003e\n\u003cli\u003e改进策略\u003c/li\u003e\n\u003cli\u003e下一次Review的时间\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e注意\n\u003cul\u003e\n\u003cli\u003e责任人\n\u003cul\u003e\n\u003cli\u003e看情况是否需要拉出来讨论\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e改进策略\n\u003cul\u003e\n\u003cli\u003e这部分才是Review的目的\u003c/li\u003e\n\u003cli\u003e分布的情况，打开讨论，并制定Action。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eReview的结论\n\u003cul\u003e\n\u003cli\u003e如果是给客户的，要酌情做一些内容的调整\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"Bug Review"},{"content":"书 书名 人类简史 作者 [以色列] 尤瓦尔·赫拉利 豆瓣评分 9.1 分类 历史 In 豆瓣 人类简史 出版社 中信出版社 读书方法 深度阅读 推荐指数 ★★★★☆ 难度指数 ★★★☆☆ 阅读时间 20200229-20200331 问题 人类为什么会站在至高点？ 人类学会了认识/语言/团体等动作模式。\n以后的方向会是怎样？ 未找到答案\n收获 历史 最早的智人是从7万年前，开始出现。并开始征服地球的各个角落 概念卡 认知革命 距今7万至3万年前，出现新的思维和沟通方式。\n影响：会基于当前的事实，想象出关联的变化。\n金句 每一次我们以为自己打破了监狱的高墙/迈向自由的前方，其实只是到了另一间更大的监狱，把活动范围稍稍加以扩大。\n感悟 人类也只是整个地球历史中的一个过客，但人类在这短短的停留中，给地址造成了不可磨灭的创伤。\n","permalink":"https://shiyuanjie.cn/posts/Book/%E4%BA%BA%E7%B1%BB%E7%AE%80%E5%8F%B2/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e人类简史\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e[以色列] 尤瓦尔·赫拉利\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e9.1\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e历史\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/25985021/\"\u003e人类简史\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e中信出版社\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e深度阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e推荐指数\u003c/td\u003e\n          \u003ctd\u003e★★★★☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e难度指数\u003c/td\u003e\n          \u003ctd\u003e★★★☆☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20200229-20200331\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"人类简史"},{"content":"书 书名 学会提问 作者 [美]尼尔·布郎 豆瓣评分 8.6 分类 跃迁 In 豆瓣 学会提问 出版社 中国轻工业出版社后 读书方法 深度阅读 推荐指数 ★★★★☆ 难度指数 ★★★☆☆ 阅读时间 20200123-20200207 问题 什么是批判性思维 对任何事情不要只会接受，要学会去审视。并尝试提出自己思考后的想法与观点。\n收获 概念卡 批判性思维的三个维度 能意识到它们是一整套环环相扣的关键问题 有能力在适当时机以适当的方式提出和回答这些问题 积极主动地使用这些关键问题的强烈渴望 价值观 人们认为较有价值而没有明说出来的观念。 它们树立了行为准则，以此来衡量人类行为的品质高下 金句 无\n感悟 这本书没有看完，整体有点偏理论，等自己有空了，再细细品味吧。 当然，批判性思维是值得学习的，有沟通中寻找有价值的方向。\n","permalink":"https://shiyuanjie.cn/posts/Book/%E5%AD%A6%E4%BC%9A%E6%8F%90%E9%97%AE/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e学会提问\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e[美]尼尔·布郎\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e8.6\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e跃迁\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/1504957/\"\u003e学会提问\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e中国轻工业出版社后\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e深度阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e推荐指数\u003c/td\u003e\n          \u003ctd\u003e★★★★☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e难度指数\u003c/td\u003e\n          \u003ctd\u003e★★★☆☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20200123-20200207\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"学会提问"},{"content":"Tool MD文件转化 使用Python把原来博客的文章从Hexo转移至Hugo，兼容两者在MD文件头部处理。https://github.com/aimer1124/python-format-md\nPython爬虫 使用Python爬取Hexo官网中各个Theme的数据（Star/Folk/Watch/GithubRepo），https://github.com/aimer1124/theme-spider\nNodeJS简书爬虫 使用NodeJS，爬取http://www.jianshu.com/数据。涉及相关框架及工具：Node.js,HighChart,BootStrap,Mongo,Cucumber，Gulp，https://github.com/aimer1124/JianshuSpider\n微信数据处理 使用Python处理获取微信相关数据，再生成词云。https://github.com/aimer1124/WeChatData\nBlog Hugo Theme主题 基于Go语言的静态Blog，https://github.com/aimer1124/maupassant-hugo。Forked https://github.com/flysnow-org/maupassant-hugo\n留言 使用https://utteranc.es/的留言功能，https://github.com/aimer1124/comments-blog。\nHexo Theme主题 基于Hexo的Theme，做了一些定制化。\nhttps://github.com/aimer1124/hexo-theme-icarus.Forked https://github.com/ppoffice/hexo-theme-icarus\nhttps://github.com/aimer1124/blog_theme。Forkedhttps://github.com/tufu9441/maupassant-hexo\nMac Alfred Workflow 自定义的Workflow。https://github.com/aimer1124/workflow_alfred\nQA 性能测试入门手册-JMeter 基于JMeter的性能测试入门手册https://aimer1124.github.io/jmeter-tutorial/，主要面向性能测试新手及JMeter新手。\nEspresso 使用入门 三步学会使用Espresso自动化测试，https://github.com/aimer1124/EspressoDemo\nAppium入门使用 Appium的基础入门，https://github.com/aimer1124/AppiumDemo\nCucumber入门 BDD自动化测试工具，Cucumber入门使用，https://github.com/aimer1124/CucumberDemo\nGauge+Headless UI自动化测试 使用Gauge+Headless完成UI自动化测试 ，https://github.com/aimer1124/GaugeChromeHeadless\nProtractor使用 Protractor E2E入门使用，https://github.com/aimer1124/protractorWithPageObject Headless使用，https://github.com/aimer1124/protractor-headless 响应式测试 Galen 4步入门响应式测试 Galen的使用，https://github.com/aimer1124/GalenDemo\nJMeter Docker file JMeter的Docker file,https://github.com/aimer1124/jmeter_docker\nSuperTest接口测试 使用Grunt集成SuperTest,https://github.com/aimer1124/SuperTestWithGrunt 使用Gulp集成SuperTest，https://github.com/aimer1124/SuperTestWithGulp ","permalink":"https://shiyuanjie.cn/tools/","summary":"\u003ch2 id=\"tool\"\u003eTool\u003c/h2\u003e\n\u003ch4 id=\"md文件转化\"\u003eMD文件转化\u003c/h4\u003e\n\u003cp\u003e使用\u003ccode\u003ePython\u003c/code\u003e把原来博客的文章从Hexo转移至Hugo，兼容两者在MD文件头部处理。\u003ca href=\"https://github.com/aimer1124/python-format-md\"\u003ehttps://github.com/aimer1124/python-format-md\u003c/a\u003e\u003c/p\u003e\n\u003ch4 id=\"python爬虫\"\u003ePython爬虫\u003c/h4\u003e\n\u003cp\u003e使用\u003ccode\u003ePython\u003c/code\u003e爬取\u003ccode\u003eHexo\u003c/code\u003e官网中各个Theme的数据（Star/Folk/Watch/GithubRepo），\u003ca href=\"https://github.com/aimer1124/theme-spider\"\u003ehttps://github.com/aimer1124/theme-spider\u003c/a\u003e\u003c/p\u003e\n\u003ch4 id=\"nodejs简书爬虫\"\u003eNodeJS简书爬虫\u003c/h4\u003e\n\u003cp\u003e使用NodeJS，爬取\u003ca href=\"http://www.jianshu.com/\"\u003ehttp://www.jianshu.com/\u003c/a\u003e数据。涉及相关框架及工具：\u003ccode\u003eNode.js,HighChart,BootStrap,Mongo,Cucumber，Gulp\u003c/code\u003e，\u003ca href=\"https://github.com/aimer1124/JianshuSpider\"\u003ehttps://github.com/aimer1124/JianshuSpider\u003c/a\u003e\u003c/p\u003e\n\u003ch4 id=\"微信数据处理\"\u003e微信数据处理\u003c/h4\u003e\n\u003cp\u003e使用\u003ccode\u003ePython\u003c/code\u003e处理获取微信相关数据，再生成\u003ccode\u003e词云\u003c/code\u003e。\u003ca href=\"https://github.com/aimer1124/WeChatData\"\u003ehttps://github.com/aimer1124/WeChatData\u003c/a\u003e\u003c/p\u003e","title":"我的小工具"},{"content":"实验楼是一家专注于IT技术的在线实训平台，采用创新的“在线实验”学习模式，为学生及在职程序员提供编程、运维、测试、云计算、大数据、数据库等当前主流IT技术实践课程。\n结构 课程 课程，作为实验楼的核心内容。\n训练营 训练营，是涵盖具体知识的系列课程。\n楼+ QQ群交流，班主任跟踪 组团学习 教学视频 会员 实验楼存在三种会员：普通会员/标准会员和高级会员。\n社区 社区中包含：讨论/教程库/直播/比赛。\n企校版 未体验\n用户信息 用户信息主要涉及使用实验楼过程中的用户数据。\n优化点 研发体系课程不完善。缺少QA相关的课程，比如：自动化测试/性能测试等 课程中的讨论功能，没有使用起来。建议：这部分可以把知识点的内容稍做整理，便于学员讨论交流 针对课程/老师进行增加打分功能，让学员可以从大量的课程中，选择认可度比较高的老师。 总结 实验楼是一个功能比较完善的在线教学的IT产品，特别是在线实验室的功能。无论是课程内容的设计和用户体验，都比较完善。关于收费方面，799RMB/年还是值得入手的。\nPS\n输入我的邀请码加入实验楼会员，可享受30元优惠！邀请码：0650KXK。开始学习：https://www.shiyanlou.com/vip 原文地址：https://mubu.com/doc/EkbGA0txLN ","permalink":"https://shiyuanjie.cn/posts/Product/shiyanlou/","summary":"\u003cp\u003e\u003ca href=\"https://www.shiyanlou.com/\"\u003e实验楼\u003c/a\u003e是一家专注于IT技术的\u003ccode\u003e在线实训平台\u003c/code\u003e，采用创新的“在线实验”学习模式，为学生及在职程序员提供编程、运维、测试、云计算、大数据、数据库等当前主流IT技术实践课程。\u003c/p\u003e\n\u003ch2 id=\"结构\"\u003e结构\u003c/h2\u003e\n\u003ch3 id=\"课程\"\u003e课程\u003c/h3\u003e\n\u003cp\u003e课程，作为\u003ca href=\"https://www.shiyanlou.com/\"\u003e实验楼\u003c/a\u003e的核心内容。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Product/shiyanlou/courses_hu_bfcc4062bb60906a.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"课程内容\" loading=\"lazy\" src=\"/posts/Product/shiyanlou/courses.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003ch3 id=\"训练营\"\u003e训练营\u003c/h3\u003e\n\u003cp\u003e训练营，是涵盖\u003ccode\u003e具体知识\u003c/code\u003e的系列\u003ccode\u003e课程\u003c/code\u003e。\u003c/p\u003e\n\u003ch3 id=\"楼\"\u003e楼+\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eQQ群交流，班主任跟踪\u003c/li\u003e\n\u003cli\u003e组团学习\u003c/li\u003e\n\u003cli\u003e教学视频\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"会员\"\u003e会员\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://www.shiyanlou.com/\"\u003e实验楼\u003c/a\u003e存在三种会员：\u003ccode\u003e普通会员/标准会员和高级会员\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Product/shiyanlou/vip_hu_91fa48c8204fb680.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"会员\" loading=\"lazy\" src=\"/posts/Product/shiyanlou/vip.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003ch3 id=\"社区\"\u003e社区\u003c/h3\u003e\n\u003cp\u003e社区中包含：讨论/教程库/直播/比赛。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Product/shiyanlou/social_hu_9e4f92e3ee894c06.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"会员\" loading=\"lazy\" src=\"/posts/Product/shiyanlou/social.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003ch3 id=\"企校版\"\u003e企校版\u003c/h3\u003e\n\u003cp\u003e未体验\u003c/p\u003e\n\u003ch3 id=\"用户信息\"\u003e用户信息\u003c/h3\u003e\n\u003cp\u003e用户信息主要涉及使用\u003ca href=\"https://www.shiyanlou.com/\"\u003e实验楼\u003c/a\u003e过程中的用户数据。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Product/shiyanlou/user_hu_814e7d943906b0c.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"用户\" loading=\"lazy\" src=\"/posts/Product/shiyanlou/user.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003ch2 id=\"优化点\"\u003e优化点\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e研发体系课程不完善。缺少\u003ccode\u003eQA\u003c/code\u003e相关的课程，比如：自动化测试/性能测试等\u003c/li\u003e\n\u003cli\u003e课程中的讨论功能，没有\u003ccode\u003e使用\u003c/code\u003e起来。建议：这部分可以把知识点的内容稍做整理，便于学员讨论交流\u003c/li\u003e\n\u003cli\u003e针对\u003ccode\u003e课程/老师\u003c/code\u003e进行增加\u003ccode\u003e打分\u003c/code\u003e功能，让学员可以从大量的课程中，选择认可度比较高的老师。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"总结\"\u003e总结\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://www.shiyanlou.com/\"\u003e实验楼\u003c/a\u003e是一个功能比较完善的在线教学的IT产品，特别是在线实验室的功能。无论是课程内容的设计和用户体验，都比较完善。关于收费方面，799RMB/年还是值得入手的。\u003c/p\u003e","title":"实验楼"},{"content":"书 书名 茶道：从喝茶到懂茶 作者 王建荣 豆瓣评分 8.1 分类 茶 In 豆瓣 茶道：从喝茶到懂茶 出版社 江苏凤凰科学技术出版社 读书方法 快速阅读 推荐指数 ★★★☆☆ 难度指数 ★☆☆☆☆ 阅读时间 20200406-20200407 问题 为什么会读这样的书 书买回来好久了，一直没有看。最近又买了一些茶叶，把书拿出来学习下，增加一些茶知识。 收获 茶分类 绿茶 红茶 乌龙茶 白茶 黄茶 黑茶 花茶（再加工茶） 泡茶的水温 嫩茶水温：80-85即可 常规茶叶：100 茶叶冲泡几次比较合适 一舤的2-3次最佳 金句 从喝茶到品人生，都是相通的。 感悟 喝茶可以锻炼人的品性，让自己慢下来。\n","permalink":"https://shiyuanjie.cn/posts/Book/%E8%8C%B6%E9%81%93/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e茶道：从喝茶到懂茶\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e王建荣\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e8.1\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e茶\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/26411385/\"\u003e茶道：从喝茶到懂茶\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e江苏凤凰科学技术出版社\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e快速阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e推荐指数\u003c/td\u003e\n          \u003ctd\u003e★★★☆☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e难度指数\u003c/td\u003e\n          \u003ctd\u003e★☆☆☆☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20200406-20200407\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"问题\"\u003e问题\u003c/h2\u003e\n\u003ch4 id=\"为什么会读这样的书\"\u003e为什么会读这样的书\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e书买回来好久了，一直没有看。最近又买了一些茶叶，把书拿出来学习下，增加一些\u003ccode\u003e茶\u003c/code\u003e知识。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"收获\"\u003e收获\u003c/h2\u003e\n\u003ch4 id=\"茶分类\"\u003e茶分类\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e绿茶\u003c/li\u003e\n\u003cli\u003e红茶\u003c/li\u003e\n\u003cli\u003e乌龙茶\u003c/li\u003e\n\u003cli\u003e白茶\u003c/li\u003e\n\u003cli\u003e黄茶\u003c/li\u003e\n\u003cli\u003e黑茶\u003c/li\u003e\n\u003cli\u003e花茶（再加工茶）\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"泡茶的水温\"\u003e泡茶的水温\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e嫩茶水温：80-85即可\u003c/li\u003e\n\u003cli\u003e常规茶叶：100\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"茶叶冲泡几次比较合适\"\u003e茶叶冲泡几次比较合适\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e一舤的\u003ccode\u003e2-3\u003c/code\u003e次最佳\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"金句\"\u003e金句\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e从喝茶到品人生，都是相通的。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"感悟\"\u003e感悟\u003c/h2\u003e\n\u003cp\u003e喝茶可以锻炼人的品性，让自己\u003ccode\u003e慢\u003c/code\u003e下来。\u003c/p\u003e","title":"茶道"},{"content":"TOC 8/100 PM需要具备产品经理的能力么？ 7/100 PMP证书有必要考么？ 6/100 项目临近结束，如何进行需求置换？ 5/100 技术型项目中的QA，是必需的么？ 4/100 团队中成员效率底，如何处理？ 3/100 管理绩效如何提升？ 2/100 PM的权力有哪些？ 1/100 PM的定义是什么？ 8/100 PM需要具备产品经理的能力么？ 今天在跟客户沟通需求变更，客户针对填写的需求描述不够专业，反馈需要提升下产品设计的能力\n产品设计 大到Apple，小到一顿饭的做法。个人理解，都可以类比为产品设计。\n需要做的事情有：\n做这个事情的目的是什么 服务的目标用户有哪些 成本需要考虑哪些 时间范围是哪些 可用的资源有哪些 后续如何改进和优化 如果按上面这种方法来 PM就必需要具备这种能力，同时，各有角色在规划一些工作时，都需要考虑产品设计。\n7/100 PMP证书有必要考么？ What 是PMP PMP,Project Management Professional。\n由PMI机构颁发的证书。\nWho 值得有PMP证书 管理学相关的东西，对所有人都会有帮助。 但，真正能把理论知识，合理运用才获得最大收益的。\nWhen 什么时候考最合适 个人理解：从现在就开始准备不算晚。 虽然我自己从去年就想考试，但一直没有落地，惭愧。\nWhere 在哪考试比较方便 报个培训班，花钱走捷径。 自己也报了一个，还在学习中。\nWhy 是PMP证书，其它可行么 证书没有什么不好的，PMP证书，只是针对项目管理方面的证书。 PMI机构还是其它的证书可以考取，其它机构也有很多的证书可以考。\nHow 如何应用 以下为个人理解： 证书或者考试中的知识，会在工作中是一个指南针。但我们是否要完全的follow，还要看实际的情况来量体裁衣。 相信，重要的技能是基于PMP的理论，再结合实际情况的运用，才能把PMP的价值最大化。\n6/100 项目临近结束，如何进行需求置换？ What 需求置换 项目在签定合同时，约定了要做ABCD。但在实际交付过程中，由于客户价值排序发生调整，额外做了EF。\nCD无法按合同的计划，完成内容交付。\n以上情况，为发生一种需求转换的条件。\nWhy 置换 按上面的情景继续发展下去，如果不置换需求。那么在合同验收的时候，就会出现：\n开发完成的EF功能，无法验收 未开发的CD功能，在合同中有签署，但没有开发。 所以，按合同的条款，这样的合同是没有办法验收的。\nWho 参与者 由于是按合同进行的，那么参与者就会涉及：\n甲方 乙方 中间商（可能存在） When 什么时间 正常情况下，需求置换的发起，应该在客户价值排序发生调整后。就立即发起需求变更，尽量不要拖到项目验收的尾声。\nWhere 在哪里 不同的项目在合同变更层面的处理方法不一样，常见的类型有：\n电子流层面的变更 双方重新签定合同 邮件变更确认 How 怎么做 由需求变更方，发起变更动作。 在相应的流程工具中，进行变更操作。如：电子流审批 确认需求变更成功 需求置换，在项目管理中一个常见的操作。每个公司或者项目都有不同的流程。但基本的方法，应该跟上面是一致的。\n5/100 技术型项目中的QA，是必需的么？ 近期带的几个项目都是偏技术型，业务需求都很少，那么这种类型的项目需要传统的QA人员么？ 项目分析 技术型项目，少有传统的业务需求。\n因此\n对QA人能的业务理解能力要求不高 需要QA人员从架构设计/安全规范/实施部署/代码逻辑等层面，来切入 QA的作用 Quality Aanalysist，这是我们公司对QA的定位。当然每个公司对于QA有不同的解读 基于上面的定位，那么QA在项目中是负责质量分析。那么QA便会在产品开发过程的各个环节。如： 需求规划是否存在质量问题 代码编写是否覆盖足够的场景 架构设计是否考充分的业务需求 整体项目的质量是否有遗漏 \u0026hellip;. 结论 技术型项目中是需要QA人员的，要看合适的时机引入，并让QA发挥最大的价值。 4/100 团队中成员效率底，如何处理？ 上周六加班一天，快到下班时，开发团队在集体联调。 联调时发现，张三同学开发的功能无法集成，且与之前约定出入较大。 调查 同组开发李四沟通，反馈：开发效率太低了，没有找到问题的重点。不知道一天在尽快什么 同组技术负责人王五沟通，反馈：需要每次给指派比较明确的任务，能完成的比较好。但如果安排有一定复杂度的任务时，张三就会无从下手 PM观察：张三同学经常一个人加班到深夜；平时项目成员沟通时，也会主动表达自己的想法。 跟本人沟通后信息：自己现在比较享受当前的工作状态，跟随在TL后面，也可以学习到很多的知识。 分析 张三：对当前的状态比较满意。在能学习到新知识的同时，工作也充实。 同事：对张三的要求有与年限相Match的能力，从表现上面来说，没有达到同事的预期 结论 不要用别人的眼光来要求其他人，每个人有自己满意的工作状态，达到这个程度或者状态就可以了。即使出现了能力与表现不匹配的情况，不要太勉强，As PM做一个好的引导者就可以。 针对一个现状，不要急于去评判。从多个方向去分析，再做决定 3/100 管理绩效如何提升？ 管理的四个关键词：人/资源/目标及工作过程。前三个是管理的条件，后一个是管理的重点。\n做好决策者 不同时间段，明确什么是最重要的。并让团队在第一时间，明确当前的第一优先级在哪里。\n传递信息需要：简洁/清晰/目标导向。\n管理没有对错，面对事实解决问题 基于事实来解决问题，没有对错，用结果来判断管理的正确与合理性。\n结果会证明怎样才是对的。\n管理是一个过程，人与事的搭配 要把人与事分开看，不同的人做相同的事，会有不同的结果。\n所以在管理过程中，要把事情讲清楚（第一位），再把事情与人结合。\n个人目标与团队目标的融合 管理过程中，最好能把个人目标与团队目标融合。\n如果无法融合，那就想办法最大化的向一个方向。\n给团队成员使用资源的权力 不要把活分得太细，让大家都在发挥的空间。给团队成员足够的空间，发挥个人的价值。大家都是成年人。 把好处也分配给团队成员，切记吃独食。 以上来自于对陈春花老师文章的理解，原文地址：陈春花：提升管理者绩效的5个常识\n2/100 PM的权力有哪些？ 权力 the ability or capacity to do something or act in a particular way.\n影响、甚至控制别人行为的能力。\n从定义来看，权力是一个很有诱惑的东西，它是一个双刃剑。\nPM的权力 常见的PM的权力有：\n公司：团队成员KPI定级/团队成员调薪确定 项目：项目资金支配/项目交付进度及风险把控 成员：角色任命/角色去留 客户：客户关系管理/公司形象维护 个人认为：权力只是在最后一步拿出来的工具，不要一直想着自己手中有把武器。 一个好的PM，应试是一个团队的润滑剂，而不是鞭策者。\n参考 权力-Wiki 1/100 PM的定义是什么？ 在IT行业，关于PM有两种划分：Prduct Manager(产品经理)和Project Manager(项目经理)。\nProject Manager(项目经理) A project manager is a professional in the field of project management. Project managers have the responsibility of the planning, procurement and execution of a project, in any undertaking that has a defined scope, defined start and a defined finish; regardless of industry. Project managers are first point of contact for any issues or discrepancies arising from within the heads of various departments in an organization before the problem escalates to higher authorities, as project representative. 摘自Wiki:Project_manager\n项目经理( Project Manager ) ，从职业角度，是指企业建立以项目经理责任制为核心，对项目实行质量、安全、进度、成本管理的责任保证体系和全面提高项目管理水平设立的重要管理岗位。它要负责处理所有事务性质的工作。也可称为“执行制作人”（Executive Producer）。项目经理是为项目的成功策划和执行负总责的人。项目经理是项目团队的领导者，项目经理首要职责是在预算范围内按时优质地领导项目小组完成全部项目工作内容，并使客户满意。为此项目经理必须在一系列的项目计划、组织和控制活动中做好领导工作，从而实现项目目标。 [1] 摘自百度百科：Project Manager\nProject Manager(项目经理) 是对项目的范畴/进度/风险/客户满意度所负责的第一人。\nPrduct Manager(产品经理) A product manager is a professional role that is responsible for the development of products for an organization, known as the practice of product management. Product managers own the business strategy behind a product (both physical and digital products), specify its functional requirements, and generally manage the launch of features. They coordinate work done by many other functions (like software engineers, data scientists, and product designers) and are ultimately responsible for the business success of the product. 摘自Wiki:Product_manager\n产品经理（Product Manager）是企业中专门负责产品管理的职位，产品经理负责市场调查并根据产品、市场及用户等的需求，确定开发何种产品，选择何种业务模式、商业模式等。并推动相应产品的开发组织，他还要根据产品的生命周期，协调研发、营销、运营等，确定和组织实施相应的产品策略，以及其他一系列相关的产品管理活动。 摘自百度百科：Product Manager\nProduct Manager(产品经理)是对产品内容负责的第一人，有产品规划/设计/产品商业模式的能力。\n回答 ProductManager和ProjectManager的工作存在一些重叠，或者有的公司是同一个角色。但其实两者是有差异的，Product更偏重于产品的特性/玩法等，Project则注重项目为单位的完成进度/交付质量/客户满意度等信息。 所以后续关于此文中的PM均是指ProjectManager.\n","permalink":"https://shiyuanjie.cn/posts/Management/PM-Daily/","summary":"\u003ch2 id=\"toc\"\u003eTOC\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#8100-pm%E9%9C%80%E8%A6%81%E5%85%B7%E5%A4%87%E4%BA%A7%E5%93%81%E7%BB%8F%E7%90%86%E7%9A%84%E8%83%BD%E5%8A%9B%E4%B9%88\"\u003e8/100 PM需要具备产品经理的能力么？\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#7100-pmp%E8%AF%81%E4%B9%A6%E6%9C%89%E5%BF%85%E8%A6%81%E8%80%83%E4%B9%88\"\u003e7/100 PMP证书有必要考么？\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#6100-%E9%A1%B9%E7%9B%AE%E4%B8%B4%E8%BF%91%E7%BB%93%E6%9D%9F%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E9%9C%80%E6%B1%82%E7%BD%AE%E6%8D%A2\"\u003e6/100 项目临近结束，如何进行需求置换？\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#5100-%E6%8A%80%E6%9C%AF%E5%9E%8B%E9%A1%B9%E7%9B%AE%E4%B8%AD%E7%9A%84qa%E6%98%AF%E5%BF%85%E9%9C%80%E7%9A%84%E4%B9%88\"\u003e5/100 技术型项目中的QA，是必需的么？\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#4100-%e5%9b%a2%e9%98%9f%e4%b8%ad%e6%88%90%e5%91%98%e6%95%88%e7%8e%87%e5%ba%95%e5%a6%82%e4%bd%95%e5%a4%84%e7%90%86\"\u003e4/100 团队中成员效率底，如何处理？\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#3100-%e7%ae%a1%e7%90%86%e7%bb%a9%e6%95%88%e5%a6%82%e4%bd%95%e6%8f%90%e5%8d%87\"\u003e3/100 管理绩效如何提升？\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#2100-pm%e7%9a%84%e6%9d%83%e5%8a%9b%e6%9c%89%e5%93%aa%e4%ba%9b\"\u003e2/100 PM的权力有哪些？\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#1100-pm%e7%9a%84%e5%ae%9a%e4%b9%89%e6%98%af%e4%bb%80%e4%b9%88\"\u003e1/100 PM的定义是什么？\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"8100-pm需要具备产品经理的能力么\"\u003e8/100 PM需要具备产品经理的能力么？\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e今天在跟客户沟通需求变更，客户针对填写的需求描述不够\u003ccode\u003e专业\u003c/code\u003e，反馈需要提升下\u003ccode\u003e产品设计\u003c/code\u003e的能力\u003c/p\u003e","title":"PM Daily"},{"content":"读了半年，终于读完了。 回顾并审视明朝的发展历程，解读人心。 书 书名 明朝那些事儿（1-7） 作者 当年明月 豆瓣评分 9.2 分类 历史 In 豆瓣 明朝那些事儿 出版社 浙江人民出版社 读书方法 深度阅读 推荐指数 ★★★★★ 难度指数 ★☆☆☆☆ 阅读时间 20190625-20200123 问题 为什么会读这样的书 以前自己很少读历史类的书籍，大部分看的都是小说类。 看到很多人都推荐：以史为鉴，借由此书让自己多了解下人性。 收获 内心要强大 朱重八在失去父母，没有家了之后。在生活没有办法继续的时候，他选择了讨饭。来让自己活下去。\n生命的尊严和生存的压力，哪个更重要？\n人突出的表现 一个很突出的人，不但作战勇敢，而且很在计谋，处事冷静，思虑深远... 处事冷静/思虑深远，这两点，自己经常有处理一些工作或者生活的事情时，把握的不太好。 最近也在尝试做一些改变，为结构化思维在考虑问题，继续坚持。\n事与话的分寸 所谓事可以做绝，话不能说绝，是也。\n金句 生命的尊严和生存的压力，哪个更重要？ 人穷，志不可短。 利益，只有充足的利益，才有驱动人们的魔力，这就是这个世界的真实目的，极其残酷，却异常的真实。 成功只有一个\u0026mdash;-按照自己的方式，去度过人生。 感悟 无欲无求，才是成功的人生。\n","permalink":"https://shiyuanjie.cn/posts/Book/%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e读了半年，终于读完了。\n回顾并审视明朝的发展历程，解读人心。\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e明朝那些事儿（1-7）\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e当年明月\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e9.2\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e历史\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/7163250/\"\u003e明朝那些事儿\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e浙江人民出版社\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e深度阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e推荐指数\u003c/td\u003e\n          \u003ctd\u003e★★★★★\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e难度指数\u003c/td\u003e\n          \u003ctd\u003e★☆☆☆☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20190625-20200123\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"问题\"\u003e问题\u003c/h2\u003e\n\u003ch4 id=\"为什么会读这样的书\"\u003e为什么会读这样的书\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e以前自己\u003ccode\u003e很少\u003c/code\u003e读历史类的书籍，大部分看的都是小说类。\u003c/li\u003e\n\u003cli\u003e看到很多人都推荐：\u003ccode\u003e以史为鉴\u003c/code\u003e，借由此书让自己多了解下\u003ccode\u003e人性\u003c/code\u003e。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"收获\"\u003e收获\u003c/h2\u003e\n\u003ch4 id=\"内心要强大\"\u003e内心要强大\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003e朱重八\u003c/code\u003e在失去父母，没有家了之后。在生活没有办法继续的时候，他选择了\u003ccode\u003e讨饭\u003c/code\u003e。来让自己活下去。\u003c/p\u003e","title":"明朝那些事儿"},{"content":"起因 过年期间，给孩子发作业的时候，老师总是说孩子的字太乱，需要加强，有时还会有更过份的话孩子的字在班级已在是靠后的了，需要重视。\n作为家长，肯定不能忍。\n随即让孩子把字写好，但孩子反问爸爸，你的字都那么难看，还管我？？来自灵魂的考问呀～\n所以，我要练字，给孩子做一个好榜样。我可以，你也一定可以。\nAction 每天最少练一个字 采用微习惯的方法。\n工具 笔：钢笔 字帖：临摹 手机APP：全能扫描王，用于把所有写的字拍照存档。 过程 完整过程：https://aimer1124.github.io/practice-character/\n5.31更新 05.06更新\n切换至全部使用钢笔来书写，临摹 早上起来练习20分钟 已经写了两个月了，自己用字贴临摹的时候，看起来字有所改善 03.31更新\n从3.1开始，把之前的字贴拿出来，到今天时间已经过去一个月了。自己也写了一部分，把一部分传上来。体会下写作的过程。\n3.1 动笔的第一天，笔记还是有些乱。 3.4 20分钟，有点状态了。但字依旧稀烂，换中性笔练字 3.15 在公司午休结束，再写一点 3.26 早起练字。针对每天写的还不错的字，使用红笔标记。还有几个能看过眼的～ 3.31 今天把练字时间调整为20分钟，写了一页半。原来20分钟能写这么多。 最近的状态 早上7点起床，给孩子完成健康打卡。使用15-20分钟左右进行练字，这种状态还不错。继续加油，坚持！\n","permalink":"https://shiyuanjie.cn/posts/Upgrade/word-practice/","summary":"\u003ch2 id=\"起因\"\u003e起因\u003c/h2\u003e\n\u003cp\u003e过年期间，给孩子发作业的时候，老师总是说\u003ccode\u003e孩子的字太乱，需要加强\u003c/code\u003e，有时还会有更过份的话\u003ccode\u003e孩子的字在班级已在是靠后的了，需要重视\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e作为家长，肯定不能忍。\u003c/p\u003e\n\u003cp\u003e随即让孩子把字写好，但孩子反问\u003ccode\u003e爸爸，你的字都那么难看，还管我？？\u003c/code\u003e来自灵魂的考问呀～\u003c/p\u003e\n\u003cp\u003e所以，我要练字，给孩子做一个好榜样。\u003cstrong\u003e我可以，你也一定可以。\u003c/strong\u003e\u003c/p\u003e","title":"练字"},{"content":"Github源代码地址：https://github.com/aimer1124/python-format-md\n为什么做这个： 把原来博客的文章从Hexo转移至Hugo，但两者在MD文件头部处理不一致。\nHexo格式 1 2 3 4 5 6 7 8 9 title: \u0026#39;Http-Header\u0026#39; tags: - API测试 - SuperTest categories: - Tool date: 2016-02-29 20:14:00 thumbnail: /img/a.png --- Hugo格式 1 2 3 4 5 6 7 8 9 --- title: \u0026#39;Http-Header\u0026#39; tags: - API测试 - SuperTest categories: - Tool date: 2016-02-29 20:14:00 --- 暂时发现，需要处理的内容有两处：\n在文件首行添加--- 删除MD文件Header中的thumbnail字段（nice to have） Function Read MD file content Create source MD file Create covert file Read MD file Save the change to MD file Make Change to the MD file Save the change to New file Add --- to the first line of the MD file Delete thumbnail in the file format Find thumbnail line Delete the line Batch to update MD files in the folder read the list in the folder make the convert to the file in the list save the new file to the new folder Day by Day Day 1 Set source md file, source.md Create convert.py as convert controller Use open(file, \u0026quot;r\u0026quot;).read() to get MD file content Day 2 Make Change and save to new MD file Add --- to new MD file Delete the line with thumbnail 1 2 lines = (i for i in sourceFile if \u0026#39;thumbnail\u0026#39; not in i ) targetFile.writelines(lines) Use readlines to convert file: list.insert(index,obj) for add --- and list.remove(obj) for delete thumbnail 1 2 3 4 5 6 7 8 9 sourceFileList = sourceFile.readlines() sourceFileList.insert(0,\u0026#34;---\\n\u0026#34;) for line in sourceFileList: print(line) if \u0026#34;thumbnail\u0026#34; in line: sourceFileList.remove(line) targetFile.writelines(sourceFileList) Day 3 Refactor the code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def convert(sourceFile, targetFile): sourceFile = open(source, \u0026#34;r\u0026#34;) targetFile = open(target,\u0026#34;w\u0026#34;) sourceFileList = sourceFile.readlines() sourceFileList.insert(0,\u0026#34;---\\n\u0026#34;) for line in sourceFileList: # print(line) if \u0026#34;thumbnail\u0026#34; in line: sourceFileList.remove(line) targetFile.writelines(sourceFileList) targetFile.close() sourceFile.close() Get the list in the folder 1 2 import os sourceFileList = os.listdir(sourcePath) Convert the files 1 2 3 4 5 for fileName in sourceFileList: print(\u0026#34;Convert file: \u0026#34; + fileName) target = \u0026#34;./target.md\u0026#34; convert(sourcePath + fileName, targetPath + fileName) 参考 文件读写: https://www.runoob.com/python/python-files-io.html Python List: https://www.runoob.com/python/python-lists.html Python File: https://www.runoob.com/python/os-listdir.html ","permalink":"https://shiyuanjie.cn/posts/Blog/migrate-from-hexo-to-hugo/","summary":"\u003cp\u003eGithub源代码地址：\u003ca href=\"https://github.com/aimer1124/python-format-md\"\u003ehttps://github.com/aimer1124/python-format-md\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e为什么做这个：\n把原来博客的文章从\u003ca href=\"hexo.io/\"\u003eHexo\u003c/a\u003e转移至\u003ca href=\"https://gohugo.io/\"\u003eHugo\u003c/a\u003e，但两者在MD文件头部处理不一致。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHexo格式\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-markdown\" data-lang=\"markdown\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etitle: \u0026#39;Http-Header\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etags:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003e-\u003c/span\u003e API测试\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003e-\u003c/span\u003e SuperTest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecategories:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003e-\u003c/span\u003e Tool\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edate: 2016-02-29 20:14:00\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ethumbnail: /img/a.png\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eHugo格式\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-markdown\" data-lang=\"markdown\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etitle: \u0026#39;Http-Header\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etags:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003e-\u003c/span\u003e API测试\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003e-\u003c/span\u003e SuperTest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecategories:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003e-\u003c/span\u003e Tool\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edate: 2016-02-29 20:14:00\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e暂时发现，需要处理的内容有两处：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e在文件首行添加\u003ccode\u003e---\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e删除MD文件Header中的\u003ccode\u003ethumbnail\u003c/code\u003e字段（nice to have）\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"function\"\u003eFunction\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Read MD file content\n\u003cul\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Create source MD file\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Create covert file\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Read MD file\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Save the change to MD file\n\u003cul\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Make Change to the MD file\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Save the change to \u003ccode\u003eNew\u003c/code\u003e file\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Add \u003ccode\u003e---\u003c/code\u003e to the first line of the MD file\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Delete \u003ccode\u003ethumbnail\u003c/code\u003e in the file format\n\u003cul\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Find \u003ccode\u003ethumbnail\u003c/code\u003e line\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Delete the line\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e Batch to update MD files in the \u003ccode\u003efolder\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e read the list in the \u003ccode\u003efolder\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e make the convert to the file in the list\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e save the new file to the new \u003ccode\u003efolder\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"day-by-day\"\u003eDay by Day\u003c/h2\u003e\n\u003ch3 id=\"day-1\"\u003eDay 1\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSet source md file, \u003ccode\u003esource.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCreate \u003ccode\u003econvert.py\u003c/code\u003e as convert controller\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003eopen(file, \u0026quot;r\u0026quot;).read()\u003c/code\u003e to get MD file content\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"day-2\"\u003eDay 2\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eMake Change and save to new MD file\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003e---\u003c/code\u003e to new MD file\u003c/li\u003e\n\u003cli\u003eDelete the line with \u003ccode\u003ethumbnail\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elines\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003esourceFile\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;thumbnail\u0026#39;\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003etargetFile\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewritelines\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elines\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eUse \u003ccode\u003ereadlines\u003c/code\u003e to convert file: \u003ccode\u003elist.insert(index,obj)\u003c/code\u003e for add \u003ccode\u003e---\u003c/code\u003e and \u003ccode\u003elist.remove(obj)\u003c/code\u003e for delete \u003ccode\u003ethumbnail\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esourceFileList\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esourceFile\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereadlines\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esourceFileList\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einsert\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;---\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003eline\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003esourceFileList\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eline\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;thumbnail\u0026#34;\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eline\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003esourceFileList\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eremove\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eline\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003etargetFile\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewritelines\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esourceFileList\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"day-3\"\u003eDay 3\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRefactor the code\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003econvert\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esourceFile\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etargetFile\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esourceFile\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;r\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etargetFile\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;w\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esourceFileList\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esourceFile\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereadlines\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esourceFileList\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einsert\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;---\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003eline\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003esourceFileList\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# print(line)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;thumbnail\u0026#34;\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eline\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003esourceFileList\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eremove\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eline\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etargetFile\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewritelines\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esourceFileList\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etargetFile\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esourceFile\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eGet the list in the folder\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003eos\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esourceFileList\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elistdir\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esourcePath\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eConvert the files\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-Python\" data-lang=\"Python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003efileName\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003esourceFileList\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Convert file: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003efileName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etarget\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;./target.md\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003econvert\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esourcePath\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003efileName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etargetPath\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003efileName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"参考\"\u003e参考\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e文件读写: \u003ca href=\"https://www.runoob.com/python/python-files-io.html\"\u003ehttps://www.runoob.com/python/python-files-io.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePython List: \u003ca href=\"https://www.runoob.com/python/python-lists.html\"\u003ehttps://www.runoob.com/python/python-lists.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePython File: \u003ca href=\"https://www.runoob.com/python/os-listdir.html\"\u003ehttps://www.runoob.com/python/os-listdir.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"转移hexo文章至Hugo"},{"content":"今天在知乎看到一个问题：\n一个在电气行业待了两年的人，计划转行软件相关，想问下前端开发/软件测试哪个好？ 尝试回答下这个问题\n没有好的方向，只有适合自己的方向。\n每个人在转行的时候，大家都是比较犹豫。恰巧自己也做过转行：做了10年QA，转行PM。现在已经转行快2年了。 作为一个过来人，我认为问题主要集中在：能否放下当前的积累/能否胜任新的工作/新工作的方向究竟如何。\n能否放下当前的积累(兴趣) 回想下自己当初为什么选择现在这个行业，如果能想清楚或者记起来的话，那可以考虑一个问题：自己是否会在未来或者短期再换行业呢？如果还会换，那需要慎重思考，再想一想自己究竟想要做什么。\n另外，自己在当前行业的积累是否可以放下，哪些积累是可以直接拿到新行业去使用的，哪些是完全没有用的。针对可以转移到新行业中的经验，是否有真正的价值，这个也值得深思。\n还有一个现实的问题，换方向会面临薪资的调整，大概率是降薪。是否能接受一定时期薪资的影响。\n针对以上部分，建议使用SWOT模型，分析下自己的情况，再决定去留。\n能否胜任新的工作(难易) 到这里的时候，证明自己已经想得差不多了。那么，针对新方向自己能否胜任呢？\n隔行如隔山，这句俗语是完全真实存在的。就像另一句话：不要用你的爱好，去挑战别人的职业一样。新行业需要的业务知识/专业技能/人脉，自己是否做好了足够的勇气和决心，去适应并挑战这份新的工作。\n这里有一个建议：直接找新行业的真实从业人员深入沟通下，不要只停留在自己以为的层面。\n新工作的方向究竟如何(方向) 最后，我们聊一下新工作的发展方向。\n最近几年，很多行业的人员都转行来到IT，往往是被所谓的高薪的吸引，缺失的是自己对新工作方向的了解。比如：软件开发做了3/5年之后，会做什么工作。具体的发展方向是什么？\n关于这部分，建议多看一些行业的职业发展轨迹或者招聘网站对不同工种的等级划分。如：初级人员是做什么/中级人员是做什么/CTO是做什么？\n基于以上的分析，如果你还认为自己要换方向。那么，我相信你是一个有毅力并愿意为之付出的人，剩下的就是：作好一个孤独者的前行者，享受路上的风景吧。加油！\n","permalink":"https://shiyuanjie.cn/posts/Upgrade/challenge-new-job/","summary":"\u003cp\u003e今天在知乎看到一个\u003ca href=\"https://www.zhihu.com/question/383244782\"\u003e问题\u003c/a\u003e：\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e一个在电气行业待了两年的人，计划转行软件相关，想问下前端开发/软件测试哪个好？\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e尝试回答下这个问题\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003e没有好的方向，只有适合自己的方向。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e每个人在转行的时候，大家都是比较犹豫。恰巧自己也做过转行：做了10年QA，转行PM。现在已经转行快2年了。\n作为一个过来人，我认为问题主要集中在：能否放下当前的积累/能否胜任新的工作/新工作的方向究竟如何。\u003c/p\u003e\n\u003ch2 id=\"能否放下当前的积累兴趣\"\u003e能否放下当前的积累(兴趣)\u003c/h2\u003e\n\u003cp\u003e回想下自己当初为什么选择现在这个\u003ccode\u003e行业\u003c/code\u003e，如果能想清楚或者记起来的话，那可以考虑一个问题：自己是否会在未来或者短期再换\u003ccode\u003e行业\u003c/code\u003e呢？如果还会换，那需要慎重思考，再想一想自己究竟想要做什么。\u003c/p\u003e","title":"选择一个新的方向"},{"content":"SSH 设置密钥对后，无法使用账号登录 设置使用SSH的密钥对登录后，无法正常使用账号+密码的方式进行登录 官方解释： 如果使用SSH密钥对登录Linux实例，将会禁用密码登录，以提高安全性。 参考：https://help.aliyun.com/document_detail/51792.html?spm=5176.2020520101.0.0.182e4df5e0J5S6\n","permalink":"https://shiyuanjie.cn/posts/Aliyun/ECS-tips/","summary":"\u003ch2 id=\"ssh\"\u003eSSH\u003c/h2\u003e\n\u003ch3 id=\"设置密钥对后无法使用账号登录\"\u003e设置\u003ccode\u003e密钥对\u003c/code\u003e后，无法使用账号登录\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e设置使用SSH的\u003ccode\u003e密钥对\u003c/code\u003e登录后，无法正常使用\u003ccode\u003e账号+密码\u003c/code\u003e的方式进行登录\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e官方解释：\n如果使用SSH密钥对登录Linux实例，将会禁用密码登录，以提高安全性。\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e参考：\u003ca href=\"https://help.aliyun.com/document_detail/51792.html?spm=5176.2020520101.0.0.182e4df5e0J5S6\"\u003ehttps://help.aliyun.com/document_detail/51792.html?spm=5176.2020520101.0.0.182e4df5e0J5S6\u003c/a\u003e\u003c/p\u003e","title":"ECS Tips"},{"content":"目标：一行命令，直接连接至阿里云的ECS。不需要手动输入IP/Port/User/Pwd。\nECS 创建密钥对 打开ECS的\u0026quot;网络与安全\u0026quot;..\u0026gt;\u0026ldquo;密钥对\u0026rdquo; 左上角“创建密钥对”，完成密钥创建 保存生成的密钥对至本机 绑定密钥对 在生成的密钥中，点击绑定密钥对 完成密钥与实例的绑定 SSH 配制Config 修改*.pem文件的属性，支持可执行 chmod 400 *.pem 找到本机的ssh config文件，没有可直接创建，路径参考~/.ssh/config 完成config文件的配制，内容参考如下： Host aliyun HostName ECS公网IP User root Port 22 IdentityFile ~/.ssh/*.pem 连通测试 命令行打开，输入ssh aliyun，可直接连接至阿里云的ECS\n参考 使用SSH密钥对连接Linux实例 绑定SSH密钥对 ","permalink":"https://shiyuanjie.cn/posts/Aliyun/one-command-connect-ecs/","summary":"\u003cp\u003e\u003cstrong\u003e目标：一行命令，直接连接至阿里云的ECS。不需要手动输入IP/Port/User/Pwd。\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"ecs\"\u003eECS\u003c/h2\u003e\n\u003ch3 id=\"创建密钥对\"\u003e创建密钥对\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e打开ECS的\u0026quot;网络与安全\u0026quot;..\u0026gt;\u0026ldquo;密钥对\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e左上角“创建密钥对”，完成密钥\u003ccode\u003e创建\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e保存生成的\u003ccode\u003e密钥对\u003c/code\u003e至\u003ccode\u003e本机\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"绑定密钥对\"\u003e绑定密钥对\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e在生成的密钥中，点击\u003ccode\u003e绑定密钥对\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e完成密钥与实例的绑定\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"ssh\"\u003eSSH\u003c/h2\u003e\n\u003ch3 id=\"配制config\"\u003e配制Config\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e修改\u003ccode\u003e*.pem\u003c/code\u003e文件的属性，支持可执行\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003echmod 400 *.pem\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e找到本机的ssh config文件，没有可直接创建，路径参考\u003ccode\u003e~/.ssh/config\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e完成config文件的配制，内容参考如下：\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eHost aliyun\n  HostName ECS公网IP\n  User root\n  Port 22\n  IdentityFile ~/.ssh/*.pem\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"连通测试\"\u003e连通测试\u003c/h3\u003e\n\u003cp\u003e命令行打开，输入\u003ccode\u003essh aliyun\u003c/code\u003e，可直接连接至阿里云的ECS\u003c/p\u003e","title":"一行命令连接ECS"},{"content":"什么是Flutter 1 Flutter is Google’s UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase. 是什么 UI 组件库 做什么 使用一套代码 构建美观、本地话编译的应用程序 适用平台 mobile web desktop 使用Flutter 最佳实践Flutter 参考 Flutter官方地址 Flutter中文官方地址 ","permalink":"https://shiyuanjie.cn/posts/Android/learn-flutter/","summary":"\u003ch2 id=\"什么是flutter\"\u003e什么是Flutter\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-markdown\" data-lang=\"markdown\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFlutter is Google’s UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e是什么\n\u003cul\u003e\n\u003cli\u003eUI 组件库\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e做什么\n\u003cul\u003e\n\u003cli\u003e使用一套代码\u003c/li\u003e\n\u003cli\u003e构建美观、本地话编译的应用程序\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e适用平台\n\u003cul\u003e\n\u003cli\u003emobile\u003c/li\u003e\n\u003cli\u003eweb\u003c/li\u003e\n\u003cli\u003edesktop\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"使用flutter\"\u003e使用Flutter\u003c/h2\u003e\n\u003ch2 id=\"最佳实践flutter\"\u003e最佳实践Flutter\u003c/h2\u003e\n\u003ch2 id=\"参考\"\u003e参考\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://flutter.dev/\"\u003eFlutter官方地址\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://flutter.cn/\"\u003eFlutter中文官方地址\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"Flutter学习"},{"content":" 不要轻信客服人员的办不了，拿起武器，与它们战斗。\n原由 自己的A卡是给孩子的电话手表办的卡，一直用的18RMB/月的套餐。儿童手表不知道丢哪了，想着号码先保留，把套餐调整至8RMB/月的。等待有空了，再去营业厅办理。 用自己的B卡打10086客服，想变更自己A卡的套餐，被告知只能通过A卡呼入才能办理。即使能证明我是A卡和B卡的户主也没有用。要不然就只能去营业厅。\n经过 1.16移动客服投诉 用A卡打移动客服(客服工号：**757)，表明想给自己的B卡更换套餐。被告知：不行。有两种方法可选择：1，使用B卡呼入才能更换套餐，即使用A卡能证明本人也没有用；2，去线下营业厅办理。\n询问是什么政策或者规定不能线上办理，客服表示规定如此。当即表示不能接受要投诉移动。客服表示会马上联系客组长回电。\n等待2小时后，没有等到客服回电。再次给客服(客服工号：**002)打电话，查询自己的投诉情况，表示已被记录，同时会有客服组长在收到投诉后，会第一时间联系我。\n1.16互联网信息服务投诉平台 在知乎上面看到，在公众号：互联网信息服务投诉平台投诉挺不错的。注册账号，投诉移动客服的操作，至今没有收到任何回复~\n1.17上午收到移动客服的投诉编码 移动平台，发来短信表示投诉已经受理，生成了投诉编码(****NMY1)。\n1.17上午在工信部投诉 在工信部(公众号:caict12300)投诉此事件。\n1.17下午 号称是移动客服的人表示可以变更套餐 1.17下午，接到134***7665的电话，自称是移动客服，表示看到我在工信部的投诉，可以帮我线上改A卡套餐。需要我提供我的另外一个号码，我表示不信任对方是移动的官方客服(毕竟是个人手机号码)，只提供尾号，她表示不能提供号码无法办理。\n我就反问，你不是移动的客服么，能改套餐却不能查到号码？\n最后这次通话失败以失败结束。\n1.17晚上 移动客服想忽悠我关闭投诉单 1.17晚上，移动客服(客服工号：**06)给我打电话，询问是否有投诉单。我表示是我想投诉的内容，但客服问：是不是投诉对他们客服的态度不满意？如果是这样，他们会处理\n突然想到这是想忽悠我关闭投诉单呀，随即电话中，明确表示：不是对态度不满意，是对处理问题的形式不满意。不要试图关闭我的投诉单\n另外再告知这个客服，今天你们有人号称可以给我改套餐，我没有同意。\n1.18早上 又一个号称移动客服的询问电话 突然又接到159***4153的电话，自称是移动客服(工号：**757)。咨询是不是有人给我电话表示可以改套餐，并要走了电话号码。\n最终什么也没有说，电话挂了。\n1.18晚上 第一次号称移动客服的私人电话又给我打电话，未接通 下午在开会，134***7665的私人号码又给我打了过来。拒接了，不知道要做什么\n春节放假了，疫情好突然，这个事情搁置了\n2.26晚 工信部投诉 在工信部公众号(微信号：caict12300)，投诉内容与之前一致。\n2.27早 移动客服移人电话又来了，表示可以线上办理 134***7665的私人号码电话打来，并且还记得年前给我打过电话，当时不欢而散。让我提供要变更的手机号码和机主姓名，就可以办理。同时还让我回复一个短信：双方已经合解。\n很快套餐变更的短信就发过来了，变更成功了。\n故事已结局。\n结论 经过这次Battle，发现不要轻易被别人忽悠了，找到他们的弱点，拿起武器，夺回自己的权益。\n在各大运营商那里，还是工信部最管用。\n","permalink":"https://shiyuanjie.cn/posts/Upgrade/%E6%88%91%E4%B8%8E%E4%B8%AD%E5%9B%BD%E7%A7%BB%E5%8A%A8%E7%9A%84%E4%B8%80%E5%9C%BABattle/","summary":"\u003cblockquote\u003e\n\u003cp\u003e不要轻信客服人员的办不了，拿起武器，与它们战斗。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Upgrade/%E6%88%91%E4%B8%8E%E4%B8%AD%E5%9B%BD%E7%A7%BB%E5%8A%A8%E7%9A%84%E4%B8%80%E5%9C%BABattle/chinamobile_hu_fad24fcc9dd39528.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"去移动营业厅\" loading=\"lazy\" src=\"/posts/Upgrade/%E6%88%91%E4%B8%8E%E4%B8%AD%E5%9B%BD%E7%A7%BB%E5%8A%A8%E7%9A%84%E4%B8%80%E5%9C%BABattle/chinamobile.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003ch2 id=\"原由\"\u003e原由\u003c/h2\u003e\n\u003cp\u003e自己的A卡是给孩子的电话手表办的卡，一直用的18RMB/月的套餐。儿童手表不知道丢哪了，想着号码先保留，把套餐调整至8RMB/月的。等待有空了，再去营业厅办理。\n用自己的B卡打10086客服，想变更自己A卡的套餐，被告知只能通过A卡呼入才能办理。即使能证明我是A卡和B卡的户主也没有用。要不然就只能去营业厅。\u003c/p\u003e","title":"我与中国移动的一场Battle"},{"content":"最近偶尔又会去蹭别人的烟，去吸。难道我要复吸了么？\n现象 最近加班比较多，会去蹭别人的烟去吸。已经吸了10根左右了。\n原因 加班多，抗不住 事情太多，分散压力 这真的是原因么？\n深入分析 每次自己去蹭烟的时候，都是想着解决上面原因。但问题根本没有解决 自己在每次蹭烟的过程中，都给自己会找一个理由 结论\n自己又出现了复吸的现象 改进 坚持戒烟，原谅自己复吸的这几根 感谢在我复吸的时候，给我烟的伙伴(门口的保安大哥，王老吉) 同时，感谢身边支持我并相信我戒烟的同事(冲爷、佳佳)，你们无形给了我很多在鼓励。\n1 2 再次出发，进入戒烟的第二阶段。加油。 Start at 20200111. 参考 复吸的危害到底有多大？ 戒烟失败一次并不可怕，只需3步成功扭转败局 ","permalink":"https://shiyuanjie.cn/posts/Life/%E4%BD%A0%E8%A6%81%E5%A4%8D%E5%90%B8%E4%BA%86%E4%B9%88/","summary":"\u003cp\u003e\u003cstrong\u003e最近偶尔又会去蹭别人的烟，去吸。难道我要复吸了么？\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 id=\"现象\"\u003e现象\u003c/h3\u003e\n\u003cp\u003e最近加班比较多，会去蹭别人的烟去吸。已经吸了10根左右了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Life/%E4%BD%A0%E8%A6%81%E5%A4%8D%E5%90%B8%E4%BA%86%E4%B9%88/Ciga_hu_cb2814f05cbe69.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"Ciga\" loading=\"lazy\" src=\"/posts/Life/%E4%BD%A0%E8%A6%81%E5%A4%8D%E5%90%B8%E4%BA%86%E4%B9%88/Ciga.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003ch3 id=\"原因\"\u003e原因\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e加班多，抗不住\u003c/li\u003e\n\u003cli\u003e事情太多，分散压力\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这真的是原因么？\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"深入分析\"\u003e深入分析\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e每次\u003c/code\u003e自己去\u003ccode\u003e蹭\u003c/code\u003e烟的时候，都是想着解决上面\u003ccode\u003e原因\u003c/code\u003e。但问题根本\u003ccode\u003e没有解决\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e自己在每次\u003ccode\u003e蹭\u003c/code\u003e烟的过程中，都给自己会找一个理由\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e结论\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e自己又出现了复吸的现象\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"改进\"\u003e改进\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e坚持戒烟，\u003ccode\u003e原谅\u003c/code\u003e自己\u003ccode\u003e复吸\u003c/code\u003e的这几根\u003c/li\u003e\n\u003cli\u003e感谢在我复吸的时候，给我烟的\u003ccode\u003e伙伴\u003c/code\u003e(门口的保安大哥，王老吉)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e同时，感谢身边支持我并相信我戒烟的同事(冲爷、佳佳)，你们无形给了我很多在鼓励。\u003c/p\u003e","title":"你要复吸了么？"},{"content":"版本发布时间于20191113，本次版本主要是BugFix。 主要内容 本次更新主要为BugFix，更新内容参考5.2。\n版本下载 JMeter5.2.1\n","permalink":"https://shiyuanjie.cn/posts/JMeter/JMeter5.2.1/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e版本发布时间于20191113，本次版本主要是BugFix。\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"主要内容\"\u003e主要内容\u003c/h2\u003e\n\u003cp\u003e本次更新主要为BugFix，更新内容参考5.2。\u003c/p\u003e\n\u003ch2 id=\"版本下载\"\u003e版本下载\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/apache/jmeter/archive/v5.2.1-rc1.zip\"\u003eJMeter5.2.1\u003c/a\u003e\u003c/p\u003e","title":"JMeter5.2.1更新内容"},{"content":"是什么 Alfred https://www.alfredapp.com/\n官方定义： 1 Alfred is an award-winning app for macOS which boosts your efficiency with hotkeys, keywords, text expansion and more. Search your Mac and the web, and be more productive with custom actions to control your Mac. 自己理解 通过定制化的方法，提高使用macOS 效率的工具。\n补充： Alfred提供了Powerpack的收费功能，用于深度定制。 建议购买Powerpack。\nWorkflows Workflows是用于定制Alfred与操作系统交互，可将一个或多个流程性/重复性的操作定制为Workflow。如每天上班后，打开IDEA、邮件等。\n第一个Workflow 需求：一个命令打开IntelliJ和GMail邮件\n初版 定义从热键启动Workflow 启动IntelliJ 使用默认浏览器打开GMail 以上步骤，已完成一个基础功能的Workflow配制。 测试 输入morning回车后，会先打开IntelliJ再使用默认浏览器打开GMail。\n进阶版 回顾初版的功能，发现还有一些不足之处。\n能否打开IntelliJ的同时也打开GMail，减少等待时间 能否打开IntelliJ的时候，打开指定的项目 解决第一个问题：能否打开IntelliJ的同时也打开GMail，减少等待时间 取消打开IntelliJ后再打开GMail的关联性，选择IntelliJ和GMail中间的连接线(选取\u0026ndash;\u0026gt;删除，即可) 设置输入Keyword和GMail的关联性，鼠标悬浮在Keyword后的连接线处，拖动后会出现连接线，选择GMail即可 解决第一个问题：能否打开IntelliJ的时候，打开指定的项目 设置IntelliJ为支持命令行启动,/usr/local/bin/idea 替换Workflow中IntelliJ的启动为命令行启动 1 2 3 projectPath=/Users/yuanjie/Downloads/aimer1124.github.io /usr/local/bin/idea $projectPath projectPath为指定项目地址\n至此，两个问题都已解决\n导出的Workflow地址：https://github.com/aimer1124/workflow_alfred\n我创建的Workflow: https://github.com/aimer1124/workflow_alfred\n参考 https://www.alfredapp.com/ https://www.alfredapp.com/help/workflows/ https://github.com/bchatard/jetbrains-alfred-workflow ","permalink":"https://shiyuanjie.cn/posts/Tools/Alfred_Workflows/","summary":"\u003ch2 id=\"是什么\"\u003e是什么\u003c/h2\u003e\n\u003ch3 id=\"alfred\"\u003eAlfred\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://www.alfredapp.com/\"\u003ehttps://www.alfredapp.com/\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e官方定义：\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-markdown\" data-lang=\"markdown\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAlfred is an award-winning app for macOS which boosts your efficiency with hotkeys, keywords, text expansion and more. Search your Mac and the web, and be more productive with custom actions to control your Mac.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e自己理解\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e通过\u003ccode\u003e定制化\u003c/code\u003e的方法，\u003ccode\u003e提高\u003c/code\u003e使用\u003ccode\u003emacOS\u003c/code\u003e \u003ccode\u003e效率\u003c/code\u003e的工具。\u003c/p\u003e\n\u003cp\u003e补充：\nAlfred提供了Powerpack的\u003ccode\u003e收费\u003c/code\u003e功能，用于\u003ccode\u003e深度\u003c/code\u003e定制。\n建议购买\u003ccode\u003ePowerpack\u003c/code\u003e。\u003c/p\u003e\n\u003ch3 id=\"workflows\"\u003eWorkflows\u003c/h3\u003e\n\u003cp\u003eWorkflows是用于定制Alfred与操作系统交互，可将一个或多个\u003ccode\u003e流程性\u003c/code\u003e/\u003ccode\u003e重复性\u003c/code\u003e的操作定制为Workflow。如每天上班后，打开IDEA、邮件等。\u003c/p\u003e","title":"Alfred中的Workflow配制"},{"content":"版本发布时间于20191008，本次版本基本没有什么更新，主要是切换版本号。 主要内容 本次为版本发布，更新内容参考5.1.1\n提升 HTTP(S) Test Script Recorder 会在名字后追加数字显示，参考Bug 64350 修复：当在XPath表达式中使用XPath Assertion返回Boolean值时，True if nothing matches没有生效并返回值为True。参考Bug 63455 XML现在拒绝不安全的XMl内容，会影响 XMLAssertion XMLSchemAssertion XPath function XPath 1 \u0026amp; 2 Extractors XPath 1 \u0026amp; 2 Assertions 版本下载 JMeter5.2\n","permalink":"https://shiyuanjie.cn/posts/JMeter/JMeter5.2%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e版本发布时间于20191008，本次版本基本没有什么更新，主要是切换版本号。\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"主要内容\"\u003e主要内容\u003c/h2\u003e\n\u003cp\u003e本次为版本发布，更新内容参考5.1.1\u003c/p\u003e\n\u003ch2 id=\"提升\"\u003e提升\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eHTTP(S) Test Script Recorder 会在名字后追加数字显示，参考\u003ca href=\"https://bz.apache.org/bugzilla/show_bug.cgi?id=63450\"\u003eBug 64350\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e修复：当在XPath表达式中使用XPath Assertion返回Boolean值时，True if nothing matches没有生效并返回值为True。参考\u003ca href=\"https://bz.apache.org/bugzilla/show_bug.cgi?id=63455\"\u003eBug 63455\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eXML现在拒绝不安全的XMl内容，会影响\n\u003cul\u003e\n\u003cli\u003eXMLAssertion\u003c/li\u003e\n\u003cli\u003eXMLSchemAssertion\u003c/li\u003e\n\u003cli\u003eXPath function\u003c/li\u003e\n\u003cli\u003eXPath 1 \u0026amp; 2 Extractors\u003c/li\u003e\n\u003cli\u003eXPath 1 \u0026amp; 2 Assertions\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"版本下载\"\u003e版本下载\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/apache/jmeter/archive/v5.2-rc1.zip\"\u003eJMeter5.2\u003c/a\u003e\u003c/p\u003e","title":"JMeter5.2更新内容"},{"content":"诉求：找一个好用的Hexo主题 方法 去官网看了下，Theme有285个，按名字排名。没有任何星级或者推荐之类的，看了下，眼花缭乱。https://hexo.io/themes/ 在知乎上面搜索了下，高赞答案：爬取Theme的Star数量，用数据说话。https://www.zhihu.com/question/24422335/answer/46357100。但数据是2015年的，过去5年了。 要不自己写个爬虫玩一玩？爬下现在的数据是怎样的\nRepo:https://github.com/aimer1124/hexo-theme-spider 需求管理：https://github.com/aimer1124/hexo-theme-spider/projects/1\n结果展示： ","permalink":"https://shiyuanjie.cn/posts/Blog/%E9%80%89%E6%8B%A9%E4%B8%80%E4%B8%AA%E5%A5%BD%E7%9A%84Hexo%E4%B8%BB%E9%A2%98/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e诉求：找一个好用的Hexo主题\n\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"方法\"\u003e方法\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e去官网看了下，Theme有285个，按\u003ccode\u003e名字\u003c/code\u003e排名。没有任何星级或者推荐之类的，看了下，眼花缭乱。\u003ca href=\"https://hexo.io/themes/\"\u003ehttps://hexo.io/themes/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e在知乎上面搜索了下，高赞答案：爬取Theme的Star数量，用数据说话。\u003ca href=\"https://www.zhihu.com/question/24422335/answer/46357100\"\u003ehttps://www.zhihu.com/question/24422335/answer/46357100\u003c/a\u003e。但数据是2015年的，过去5年了。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e要不自己写个爬虫玩一玩？爬下现在的数据是怎样的\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eRepo:\u003ca href=\"https://github.com/aimer1124/hexo-theme-spider\"\u003ehttps://github.com/aimer1124/hexo-theme-spider\u003c/a\u003e\n需求管理：\u003ca href=\"https://github.com/aimer1124/hexo-theme-spider/projects/1\"\u003ehttps://github.com/aimer1124/hexo-theme-spider/projects/1\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e结果展示：\n\u003cpicture\u003e\u003csource srcset=\"/posts/Blog/%E9%80%89%E6%8B%A9%E4%B8%80%E4%B8%AA%E5%A5%BD%E7%9A%84Hexo%E4%B8%BB%E9%A2%98/331e508a_hu_fc14acecc86c1f3b.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"0104数据\" loading=\"lazy\" src=\"/posts/Blog/%E9%80%89%E6%8B%A9%E4%B8%80%E4%B8%AA%E5%A5%BD%E7%9A%84Hexo%E4%B8%BB%E9%A2%98/331e508a.png\"\u003e\u003c/picture\u003e\u003c/p\u003e","title":"选择一个好的Hexo主题"},{"content":"是我 2个儿子的父亲； IT从业者，近20年经验； 热爱运动，喜欢阅读和整理； 撩我 Github: Yuanjie Mail: jacksonshi1985@gmail.com Updated: 2025-10-05\n","permalink":"https://shiyuanjie.cn/about/","summary":"\u003ch2 id=\"是我\"\u003e是我\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e2个儿子的父亲；\u003c/li\u003e\n\u003cli\u003eIT从业者，近20年经验；\u003c/li\u003e\n\u003cli\u003e热爱运动，喜欢阅读和整理；\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"撩我\"\u003e撩我\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eGithub: \u003ca href=\"https://github.com/aimer1124\"\u003eYuanjie\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMail: \u003ca href=\"mailto:jacksonshi1985@gmail.com\"\u003ejacksonshi1985@gmail.com\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003eUpdated: 2025-10-05\u003c/code\u003e\u003c/p\u003e","title":"关于我"},{"content":"前情 背景：今天要处理公司的一个会签材料，两个PDF文件，近70页的内容。两个文件中分别有一处小错误，需要修正后，再合并为一个PDF文件。 处理方法 在原文件中，把小错误改了 再把错误页单独打印 再全部扫描，从第一页到70页，扫了10分钟 发给审核人员。被告知，有一个小错误没有修复好，MMP，我想骂人 再次Repeat 1-4步骤，10几分钟过去了\u0026hellip;. 内心各种CNM，有没有人来拯救我\n寻找解决方案 Google了下google split，第一个就是你-https://www.ilovepdf.com。\n打开网址，Split PDF/Merge PDf，直接呈现眼前 进去试玩一下，发现之前自己做的体力活都直接解决了。关键还：不能登录、全部免费 功能还特别的齐全：整合、拆分、转化各种跟PDF相关的，都支持。完全良心软件啊 妹的，要是早发现这个工具，下午自己完全可以喝点茶，分分钟搞定的\n工具安利在此，后期有需要；再完善\n","permalink":"https://shiyuanjie.cn/posts/Tools/PDF%E8%BD%AC%E6%8D%A2%E7%A5%9E%E5%99%A8/","summary":"\u003ch3 id=\"前情\"\u003e前情\u003c/h3\u003e\n\u003ch4 id=\"背景今天要处理公司的一个会签材料两个pdf文件近70页的内容两个文件中分别有一处小错误需要修正后再合并为一个pdf文件\"\u003e背景：今天要处理公司的一个会签材料，两个PDF文件，近70页的内容。两个文件中分别有一处小错误，需要修正后，再合并为一个PDF文件。\u003c/h4\u003e\n\u003ch4 id=\"处理方法\"\u003e处理方法\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e在原文件中，把小错误改了\u003c/li\u003e\n\u003cli\u003e再把错误页单独打印\u003c/li\u003e\n\u003cli\u003e再\u003ccode\u003e全部扫描\u003c/code\u003e，从第一页到70页，扫了10分钟\u003c/li\u003e\n\u003cli\u003e发给审核人员。被告知，有一个小错误没有修复好，MMP，我想骂人\u003c/li\u003e\n\u003cli\u003e再次\u003ccode\u003eRepeat\u003c/code\u003e 1-4步骤，10几分钟过去了\u0026hellip;.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e内心各种CNM，有没有人来拯救我\u003c/p\u003e","title":"PDF转换神器"},{"content":"需求：更新package.json中dependencies的版本号至最新 解决方案 安装npm-check-updates npm install -g npm-check-updates https://www.npmjs.com/package/npm-check-updates\n运行ncu -u 更新package.json中依赖包版本\n以上需求已解决\n参考 https://flaviocopes.com/update-npm-dependencies/\n","permalink":"https://shiyuanjie.cn/posts/Tools/%E6%9B%B4%E6%96%B0package%E4%B8%AD%E4%BE%9D%E8%B5%96%E5%8C%85%E7%89%88%E6%9C%AC/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e需求：更新package.json中dependencies的版本号至最新\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"解决方案\"\u003e解决方案\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e安装npm-check-updates\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enpm install -g npm-check-updates\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ca href=\"https://www.npmjs.com/package/npm-check-updates?activeTab=dependents\"\u003ehttps://www.npmjs.com/package/npm-check-updates\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e运行\u003ccode\u003encu -u\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e更新package.json中依赖包版本\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e以上需求已解决\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 id=\"参考\"\u003e参考\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://flaviocopes.com/update-npm-dependencies/\"\u003ehttps://flaviocopes.com/update-npm-dependencies/\u003c/a\u003e\u003c/p\u003e","title":"更新package中依赖包版本"},{"content":"Summary in 2019 4道菜 3个交付项目，5个售前项目 1场Workshop+BQTime，1个Community 21本书 620公里 时间飞快，2019再有几天就结束了。整体完成度90%。 回顾自己这一年做的事情，变化还是挺大的。公司重组，多项目管理，DA/PM/QA\u0026hellip;. 事情很多，有成功，也有失败；有激情，也有挫败。 感谢19年陪我一路走过来的亲朋好友，感谢一路有你。\nFlag in 2020 家庭 陪家人出去游玩 学习5道新菜 带儿子参加2次跑步比赛 学习 读书30本 跑步800公里 学习观察与谈判 驾照 培养孩子主动学习 输出20篇文章 一场马拉松 工作 PMP证书 DA(Role Model:亚维) 定期Check，每月一次Trace记录\n回顾 2019总结 2018总结 2017总结 ","permalink":"https://shiyuanjie.cn/posts/Flags/2020%E6%80%BB%E7%BB%93/","summary":"\u003ch2 id=\"summary-in-2019\"\u003eSummary in 2019\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e4道菜\u003c/li\u003e\n\u003cli\u003e3个交付项目，5个售前项目\u003c/li\u003e\n\u003cli\u003e1场Workshop+BQTime，1个Community\u003c/li\u003e\n\u003cli\u003e21本书\n\u003cpicture\u003e\u003csource srcset=\"/posts/Flags/2020%E6%80%BB%E7%BB%93/Book-1_hu_e875a7468258588f.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"Book1/2\" loading=\"lazy\" src=\"/posts/Flags/2020%E6%80%BB%E7%BB%93/Book-1.png\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/Flags/2020%E6%80%BB%E7%BB%93/Book-2_hu_6d053483837bbeb8.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"Book2/2\" loading=\"lazy\" src=\"/posts/Flags/2020%E6%80%BB%E7%BB%93/Book-2.png\"\u003e\u003c/picture\u003e\u003c/li\u003e\n\u003cli\u003e620公里\n\u003cpicture\u003e\u003csource srcset=\"/posts/Flags/2020%E6%80%BB%E7%BB%93/RunRecord_hu_abce9b035d48f46a.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"Run\" loading=\"lazy\" src=\"/posts/Flags/2020%E6%80%BB%E7%BB%93/RunRecord.png\"\u003e\u003c/picture\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"2020总结"},{"content":"一本带你重新审视项目管理、人才招聘及公司运营的书。 书 书名 奈飞文化手册 作者 [美] 帕蒂 麦考德 豆瓣评分 8.1 分类 企业管理 In 豆瓣 奈飞文化手册 出版社 湖南教育出版社 读书方法 深度阅读 推荐指数 ★★★★★ 难度指数 ★☆☆☆☆ 阅读时间 20190814-20190907 问题 为什么会读这样的书 参加公司的招聘的培训，强烈安利的书籍。 收获 成年人 在奈飞只招成年人，当然这个成年人是指心理和心智的成年。\n从招聘的入口，就要看这个人的基本能力或者冰山下的能力，是否符合公司的文化。这点跟TW的文化面试比较相符，我们不能只看到当前的一些技能，更加要长远的看到一些内存的Motivation.\n同样工作3年左右的两位同学：\nA：坚持总结自己的工作，并输出 B：做完自己的事情就结束了，从不考虑总结与输出 上面两位同学在3年后，肯定差距很大。真正的成年人，知道自己如何成长、怎样成长。\n自管理 这点与TW的文化比较契合，我们更多的是期望有自管理能力的人，而不是整天被别人牵着鼻子走的员工。\n经常听到周围的PM提到，组内有个小A又在吐槽问题。但没有自己的解决思路，只是单纯的吐槽。PM没有听到员工自己的思考。\n以前看到过某领导对下属的分层： 1.发现不了问题 2.发现问题，没有解决方案 3.发现问题，提出解决方案\n当然所有的管理者都希望自己有在3层的员工，虽然提出的解决方案不一定能解决问题。但最起码可以让管理者看到自己的努力和思考，久而久之后，自己也会慢慢的学会作为管理者在如何考虑问题。\n感悟 无论是管理一个小团队，还是大到一个公司。有一些通用的法则，诚如书中提到的：招聘、管理、自驱动。\n让一批成年人进行自管理，这应该是管理中的高境界了。 ","permalink":"https://shiyuanjie.cn/posts/Book/%E5%A5%88%E9%A3%9E%E6%96%87%E5%8C%96%E6%89%8B%E5%86%8C/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e一本带你重新审视项目管理、人才招聘及公司运营的书。\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e奈飞文化手册\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e[美] 帕蒂 麦考德\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e8.1\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e企业管理\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/30356081/\"\u003e奈飞文化手册\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e湖南教育出版社\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e深度阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e推荐指数\u003c/td\u003e\n          \u003ctd\u003e★★★★★\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e难度指数\u003c/td\u003e\n          \u003ctd\u003e★☆☆☆☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20190814-20190907\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"奈飞文化手册"},{"content":"最近在听一本电子书《靠谱》，关于咨询师的工作基本功。其中有一个简单的因果论思考方式感觉很不错：天空--\u0026gt;下雨--\u0026gt;雨伞，自己尝试总结下。\n领导问你，外面的天气怎么样？ Common Sense 你会走向窗户边上，看了下外面的天空。哦，今天是乌云密布。\n你回去把今天的天气，告诉了领导：今天是乌云密布。\nEnd。\nGod Sense 你会走向窗户边上，看了下外面的天空。哦，今天是乌云密布。\n老板问天气怎么样，是想外出办事。\n现在是乌云密布，看来下雨的概率很大。\n你找了一把雨伞，交给领导，提醒：外面乌云密布，有可能下雨，最好外出带雨伞。\n总结 在工作中，我们好像经常在做一些Common Sense的事情。\n很明显，Common Sense的事情，就是问题没有进行深入分析，解决问题也不会有好的效果。\n那么，如何养成 God Sense的分析问题的能力和意识，需要做到：\n有问题不要及于回答 分析问题的三步曲 持续锻炼1.2步，把这个能力内化。 看似一个简单的模型，真正做到内化还需要坚持。\n","permalink":"https://shiyuanjie.cn/posts/Upgrade/%E5%A4%A9%E7%A9%BA%E4%B8%8B%E9%9B%A8%E9%9B%A8%E4%BC%9E/","summary":"\u003cp\u003e最近在听一本电子书《靠谱》，关于咨询师的工作基本功。其中有一个简单的因果论\u003ccode\u003e思考方式\u003c/code\u003e感觉很不错：\u003ccode\u003e天空--\u0026gt;下雨--\u0026gt;雨伞\u003c/code\u003e，自己尝试总结下。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e领导问你，外面的天气怎么样？\n\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"common-sense\"\u003eCommon Sense\u003c/h4\u003e\n\u003cp\u003e你会走向窗户边上，看了下外面的\u003ccode\u003e天空\u003c/code\u003e。哦，今天是乌云密布。\u003c/p\u003e\n\u003cp\u003e你回去把今天的\u003ccode\u003e天气\u003c/code\u003e，告诉了领导：今天是乌云密布。\u003c/p\u003e\n\u003cp\u003eEnd。\u003c/p\u003e","title":"天空、下雨、雨伞"},{"content":"本文源于自己购买一支英雄钢笔的售后服务，让自己反思下一个老字号品牌的没落和互联网服务的影响。\n购买 自己之前买了一支百乐78G的钢笔，被孩子不小心弄坏了。最近计划再买一支钢笔，随记在JD下单购买了一支钢笔\u0026amp;墨囊(同一品牌\u0026ndash;英雄)。\n英雄（HERO）1063黑砂铱金钢笔墨水笔暗尖: https://item.jd.com/1128188.html 英雄（HERO）359钢笔墨囊[6支装] 黑色：https://item.jd.com/1586652.html 问题 第一天晚上下单，第二天就收到铅笔。快速打开包装，钢笔的质量还不错。由于没有直接屏蔽墨汁，而是买的墨囊，就安装了墨囊，开始用了起来。\n刚开始发现钢笔还不错，用了两天，打开钢笔的后盖，发现原来墨囊一直处于脱落状态！！！！！\nWTF\n以为是那个墨囊有个别问题，随即更换一个新的墨囊，还是没有办法固定住。不安装后盖的情况下，墨囊完全固定不住，随时可以脱落。\n回家试了下之前买的百乐，发现安装上同一品牌的墨囊，没有任何问题，可以固定住。\n这到底是肿么回事，是被坑了，不会买了假货了吧。\n破案 在JD上面确认了下，自己买的是京东自营店的东西。英雄京东自营官方旗舰店 在钢笔的详情页面找适配的墨囊，没有。https://item.jd.com/1128188.html 在墨囊的详情页面找适配的钢笔，没有。https://item.jd.com/1586652.html WTF这要找谁说理去，赶紧联系英雄京东自营官方旗舰店的客服。客服给了我答案===\u0026gt;这个要提前毅然咨询 咨询 咨询 好了，到这里我已经明白了。原来责任是在我：\n在详细阅读商品说明后，还没有提前做好充足的客服咨询，导致买回来的同一品牌的不兼容。\n对比 突然想起来自己买的日系钢笔百乐，随即找到一个墨囊的详情页面。这个竟然有支持的钢笔类型，瞬间让我无言以对。\n结论 英雄钢笔的细节处理，确实跟百乐还是有差距 JD两家旗舰店的关注数量对比：百乐23万、英雄27.7，作为一个国内的老字号，真心不多 细节的处理，会暴露一个品牌的小细节的处理。当然本次我只是损失了墨囊的钱，但还是希望英雄可以在细节上做好处理。让我们从小一直使用的英雄钢笔，可以强大起来。\n","permalink":"https://shiyuanjie.cn/posts/Life/%E8%8B%B1%E9%9B%84%E9%92%A2%E7%AC%94/","summary":"\u003cp\u003e本文源于自己购买一支\u003ccode\u003e英雄\u003c/code\u003e钢笔的售后服务，让自己反思下一个老字号品牌的没落和互联网服务的影响。\u003c/p\u003e\n\u003ch4 id=\"购买\"\u003e购买\u003c/h4\u003e\n\u003cp\u003e自己之前买了一支\u003ccode\u003e百乐\u003c/code\u003e78G的钢笔，被孩子不小心弄坏了。最近计划再买一支钢笔，随记在JD下单购买了一支钢笔\u0026amp;墨囊(\u003cstrong\u003e同一品牌\u0026ndash;英雄\u003c/strong\u003e)。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e英雄（HERO）1063黑砂铱金钢笔墨水笔暗尖: \u003ca href=\"https://item.jd.com/1128188.html\"\u003ehttps://item.jd.com/1128188.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e英雄（HERO）359钢笔墨囊[6支装] 黑色：\u003ca href=\"https://item.jd.com/1586652.html\"\u003ehttps://item.jd.com/1586652.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Life/%E8%8B%B1%E9%9B%84%E9%92%A2%E7%AC%94/Order_hu_97286f66215fd605.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"订单\" loading=\"lazy\" src=\"/posts/Life/%E8%8B%B1%E9%9B%84%E9%92%A2%E7%AC%94/Order.png\"\u003e\u003c/picture\u003e\u003c/p\u003e","title":"英雄钢笔"},{"content":"8本文为购买网易蜗牛读书会员的过程，记录下来。\n时间出新知 会员权益 对自己诱惑比较大的会员权益：\n无限畅读 专享书库 购买来源 官方：APP内部，直接购买 淘宝：购买店家账号、破解APP、续费充值 闲鱼：购买店家账号、破解APP、续费充值 价格对比 结论 官网(APP)的活动很给力，是平时的7折。 淘宝1RMB的每次均需要使用新账号，很不方便 破解版APP，随时会被官网封杀账号和设备。如果使用，需要做好心理准备 写了这么多，最终对比下来，还是闲鱼的年卡最划算。\n","permalink":"https://shiyuanjie.cn/posts/Tools/%E7%BD%91%E6%98%93%E8%9C%97%E7%89%9B%E8%AF%BB%E4%B9%A6%E4%BC%9A%E5%91%98/","summary":"\u003cp\u003e8本文为购买\u003ccode\u003e网易蜗牛读书\u003c/code\u003e会员的过程，记录下来。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://yuedust.yuedu.126.net/snail_st/static/images/web_intro/logo_header.png?11ac8d10\"\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e时间出新知\n\u003c/code\u003e\u003c/pre\u003e","title":"网易蜗牛读书会员"},{"content":"前提 客户早上找到我，说是领导看到一个大需求的进度慢，工作量也很大。领导很不满意，让我们分析下原因。\n过程 沟通过程概述\n客户合作经理：进度慢，有你们乙方的原因。但也有我们甲方的原因 客户开发主管：我们合理评估工作量就好 客户需求负责人：我的需求是有膨胀 乙方合作经理：慢的原因有：需求膨胀、技术调研\u0026amp;试错 乙方技术负责人：范围有膨胀，但技术复杂度很多。有试错是正常的。 分析问题 需求膨胀 原因 前期需求分析不到位，开发人员开始Coding。进行一半，发现需求有遗漏，加新卡 需求在Coding时，就不清晰。 解决 需求分析时，尽量做到足够清晰，再Coding 如果中间有需求膨胀或调整，则走新的需求。不在原有需求上再追加 技术方案试错 原因 Story原本的技术复杂度高，在方案确定后，在实现过程中，发现不满足业务需求，需要换框架 解决 所有技术方案均需要与甲方开发主管确认后，再进行Coding 如果开发过程中，需要更换技术方案，需要再次三方评估，重新确定新的工作量 本质问题 客户领导的关注点 一个需求做了一个月，没有做完。与预期差异较大。 花费的成本与收益不对等 自己的问题 没有及时关注团队内部的进度及风险，并告知甲方 没有把风险管理起来，引发了这次风波 团队的问题 没有正确流程操作意识，根因：团队JR新人太多，经验缺失 没有管理客户期望的意识 总结 这个问题，虽然看起来不大。但已经说明甲方爸爸缺失对我们的信任了，如何在后续的工作中，建立起来足够的信任，需要我们做更大的努力才可以。当然，作为PM，我自己也要更多去关注客户的预期，同时控制团队的风险。想起一位同事对PM及格线的定义：对内保护、对外\n","permalink":"https://shiyuanjie.cn/posts/Management/%E9%9C%80%E6%B1%82%E5%BB%B6%E6%9C%9F%E7%9A%84%E5%B0%8F%E8%AE%A8%E8%AE%BA/","summary":"\u003ch4 id=\"前提\"\u003e前提\u003c/h4\u003e\n\u003cp\u003e客户早上找到我，说是领导看到一个大需求的进度慢，工作量也很大。领导很不满意，让我们分析下原因。\u003c/p\u003e\n\u003ch4 id=\"过程\"\u003e过程\u003c/h4\u003e\n\u003cp\u003e沟通过程概述\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e客户合作经理：进度慢，有你们乙方的原因。但也有我们甲方的原因\u003c/li\u003e\n\u003cli\u003e客户开发主管：我们合理评估工作量就好\u003c/li\u003e\n\u003cli\u003e客户需求负责人：我的需求是有膨胀\u003c/li\u003e\n\u003cli\u003e乙方合作经理：慢的原因有：需求膨胀、技术调研\u0026amp;试错\u003c/li\u003e\n\u003cli\u003e乙方技术负责人：范围有膨胀，但技术复杂度很多。有试错是正常的。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"分析问题\"\u003e分析问题\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e需求膨胀\n\u003cul\u003e\n\u003cli\u003e原因\n\u003cul\u003e\n\u003cli\u003e前期需求分析不到位，开发人员开始Coding。进行一半，发现需求有遗漏，加新卡\u003c/li\u003e\n\u003cli\u003e需求在Coding时，就不清晰。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e解决\n\u003cul\u003e\n\u003cli\u003e需求分析时，尽量做到足够清晰，再Coding\u003c/li\u003e\n\u003cli\u003e如果中间有需求膨胀或调整，则走新的需求。\u003cem\u003e不在原有\u003c/em\u003e需求上再追加\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e技术方案试错\n\u003cul\u003e\n\u003cli\u003e原因\n\u003cul\u003e\n\u003cli\u003eStory原本的技术复杂度高，在方案确定后，在实现过程中，发现不满足业务需求，需要换框架\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e解决\n\u003cul\u003e\n\u003cli\u003e所有技术方案均需要与\u003cem\u003e甲方开发主管\u003c/em\u003e确认后，再进行Coding\u003c/li\u003e\n\u003cli\u003e如果开发过程中，需要更换技术方案，需要再次\u003cem\u003e三方\u003c/em\u003e评估，重新确定新的工作量\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"本质问题\"\u003e本质问题\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e客户领导的关注点\n\u003cul\u003e\n\u003cli\u003e一个需求做了一个月，没有做完。与预期差异较大。\u003c/li\u003e\n\u003cli\u003e花费的成本与收益不对等\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e自己的问题\n\u003cul\u003e\n\u003cli\u003e没有及时关注团队内部的进度及风险，并告知甲方\u003c/li\u003e\n\u003cli\u003e没有把风险管理起来，引发了这次风波\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e团队的问题\n\u003cul\u003e\n\u003cli\u003e没有正确流程操作意识，根因：团队JR新人太多，经验缺失\u003c/li\u003e\n\u003cli\u003e没有管理客户期望的意识\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"总结\"\u003e总结\u003c/h4\u003e\n\u003cp\u003e这个问题，虽然看起来不大。但已经说明甲方爸爸缺失对我们的信任了，如何在后续的工作中，建立起来足够的信任，需要我们做更大的努力才可以。当然，作为PM，我自己也要更多去关注客户的预期，同时控制团队的风险。想起一位同事对PM及格线的定义：对内保护、对外\u003c/p\u003e","title":"需求延期的小讨论"},{"content":"最近几年，自己也开始为一些软件付费。把自己付费的软件梳理下来，为后续的软件再付费做参考。\n软件排名不分先后\n爱奇艺 功能说明 视频网站，支持手机、IPad、电视。\n付费动机 媳妇当时想看一个综艺节目，不付费的话需要等好几天。 家里老大一直看的一个动画片，突然不付费的话，只能看前面两集。 广告时间太长。 费用 100RMB+/年 收益 再也没有广告了，很爽 没有节目限制，孩子和媳妇想看什么就看什么。除部分新上映电影 是否续费 是 滴答清单 功能说明 清单管理软件，GTD工具。支持手机、Mac、Web。可集成邮箱Calendar提醒。 PS：最近更新的习惯功能有点薄弱，个性化能力有点弱。如，一天多次的重复习惯\n付费动机 找了好几个GTD工具，还是这个功能相对最舒服。\n费用 139RMB/年 收益 工作和生活中的计划安排，基本不会出现遗漏，且更加合理 针对性的可以完成一些工作，不会出现遗忘。如：间歇性的任务 是否续费 是 印象笔记 功能说明 电子笔记管理软件，支持各种常用平台。可以作为日常的资料收集库使用。\n文档扫描、网站内容剪辑、笔记内容掩饰等。 PS：新的Markdown和脑图功能，都相当鸡肋。只能在PC上面编辑，手机端只能查看。\n付费动机 每月上传资料大小不受限制，10G 全局搜索PDF文件内容，对跨文件搜索特别的友好 扫描图书、名片功能 费用 70RMB/年 收益 网站或者APP中需要收集的内容，可以快速的聚合到一起 针对所有自己收集的材料，搜索起来特别方便 读书过程中的精彩片段，摘抄特别快。直接拍照 是否续费 待定 原因：Markdown和脑图功能，手机端无法编辑\n幕布 功能说明 大纲式笔记软件，支持脑图视图。支持常用平台。\n付费动机 大纲式的显示内容，更有利于梳理内容的条理 支持脑图导出 费用 30RMB/年 收益 针对一些计划性的工作或者任务，拆分的过程更加严谨 不同视图的脑图展示，展示形式很丰富。 是否续费 是 京东 Plus 功能说明 JD 的Plus会员，在JD平台购买东西有优惠。\n付费动机 每个月送6张包邮卷 购买返京豆 每个月有100的现金卷 费用 100RMB/年 是否续费 是 网易云音乐 功能说明 音乐播放器，支持常用平台。\n付费动机 听高清音乐 费用 88RMB/年 是否续费 是 Forest 功能说明 番茄钟管理软件\n付费动机 一次性付费软件 针对番茄钟的软件，无其它附加功能 费用 12RMB/年 是否续费 已买断，但已很低频使用 知乎 功能说明 知识分享与查找平台。\n付费动机 Live免费看 读书内容免费看 私家课，免费看 会员标识，原谅我的小虚伪 费用 70RMB/年 是否续费 待定，偶尔会使用到会员的功能 个人域名 功能说明 个人Blog地址\n付费动机 装X 玩玩 费用 40RMB/年 是否续费 已经续费10年，期待自己继续在这里写东西 华为手机云存储 功能说明 把手机中的内容存储到华为云中\n付费动机 手机里面的照片和视频存储不下 不想快速再换手机 费用 50RMB/年 是否续费 是 大概算了下，每年要为软件付费大概600RMB左右。平均每天2RMB.\n总体看下来，自己选择的付费软件还都有一定的实用价值。想起一句话不想花钱，那就花时间，确实就是这样。坚持为知识和效率付费。\n更新记录：\n20191223：1，添加个人域名付费说明；2，将Forest设置为待续费，原因：功能与TickTick有重复 20200119：添加 华为手机云存储 ","permalink":"https://shiyuanjie.cn/posts/Tools/%E6%88%91%E8%B4%AD%E4%B9%B0%E7%9A%84%E6%94%B6%E8%B4%B9%E8%BD%AF%E4%BB%B6/","summary":"\u003cp\u003e最近几年，自己也开始为一些软件付费。把\u003ccode\u003e自己付费\u003c/code\u003e的软件梳理下来，为后续的软件再付费做参考。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e软件排名不分先后\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 id=\"爱奇艺\"\u003e爱奇艺\u003c/h3\u003e\n\u003ch5 id=\"功能说明\"\u003e功能说明\u003c/h5\u003e\n\u003cp\u003e视频网站，支持手机、IPad、电视。\u003c/p\u003e\n\u003ch5 id=\"付费动机\"\u003e付费动机\u003c/h5\u003e\n\u003cul\u003e\n\u003cli\u003e媳妇当时想看一个综艺节目，不付费的话需要等好几天。\u003c/li\u003e\n\u003cli\u003e家里老大一直看的一个动画片，突然不付费的话，只能看前面两集。\u003c/li\u003e\n\u003cli\u003e广告时间太长。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch5 id=\"费用\"\u003e费用\u003c/h5\u003e\n\u003cul\u003e\n\u003cli\u003e100RMB+/年\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch5 id=\"收益\"\u003e收益\u003c/h5\u003e\n\u003cul\u003e\n\u003cli\u003e再也没有广告了，很爽\u003c/li\u003e\n\u003cli\u003e没有节目限制，孩子和媳妇想看什么就看什么。除部分新上映电影\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch5 id=\"是否续费\"\u003e是否续费\u003c/h5\u003e\n\u003cul\u003e\n\u003cli\u003e是\u003c/li\u003e\n\u003c/ul\u003e","title":"我购买的收费软件"},{"content":"现状 自己从开始抽烟到现在已经有15年了，今年34岁，接近一半的岁月 44% 都在抽烟的生活中。抽烟的量基本是1包烟抽不到2天的时间，回想起来还挺可怕的~~\n从这次的正式不抽烟，到今天大概有2个多月了，一根烟没有抽，对自己的坚持要点赞。\n原因 回想下戒烟成功的原因，主要有以下几个方面。\n身体 这一次有戒烟的冲动，完全是因为生病了：发烧+气喘，持续了5天左右。当时，感觉自己的身体怎么会这么的差。想当年自己如何如何\u0026hellip;\n但这次输液波(去了二次医院)+吃饭，都没有快速好转。渐渐让自己萌生了戒烟的想法\n承诺 18春节前，给家里老大承诺，我以后不抽烟了。但后面没有持续两天，自己又悄悄的抽了。\n去年一整年，媳妇和老大经常会说，爸爸说话不算数，还在抽烟。\n歌曲 近期比较喜欢听 HotDog 的歌曲，特别喜欢这首《我的生活》。在跑步过程中，也会把这首歌作为首推歌曲。\n我的生活　放荡　每天　抽　我的生活　放荡　每天　摸 我的生活　放荡　像只　狗　我的生活　放荡　我的生活 我的生活　放荡　每天　抽　我的生活　放荡　每天　摸 我的生活　放荡　像只　狗　我的生活　放荡　我的生活 《我的生活》- MC HotDog\n一次跑步过程中，听到上面的歌词，发现写的就是自己的生活：每天抽、像条狗，自己的生活看起来也很丧。怎样才能把自己的生活改变一下，最起码看起来不那么的丧。\n抽烟的状态 抽烟的时候，1包烟最多能抽2天的时间，特别是加班较多的时候，1包/天。\n在家带孩子出来玩的时候，也是抽空就赶紧抽一根。抽完之后，也没有太多的收获，也就抽完了。\n往往抽完烟之后，同事/家人/朋友都会嗅到我身上浓浓的烟味。很多人都是碍于情面，忍受了自己的烟味。\n也许是由于上面的种种原因，成为最后压死我继续抽烟的稻草。 让我变成了一个不抽烟的人。 改变 坚持跑步，今年开始自己又把跑步捡回来了。也带孩子去参加了跑步比赛，下面是自己近两个月的跑步数据记录。 读书，前几天进行年底回顾的时候，发现自己4/5月基本没有太读书，按照这个进展下去，今年的读书计划要完不成，赶紧追踪起来。 工作，最近公司在重组，自己也做出了选择。相信自己这次的选择，会有新的收获。加油！ ","permalink":"https://shiyuanjie.cn/posts/Life/%E6%88%92%E7%83%9F/","summary":"\u003ch3 id=\"现状\"\u003e现状\u003c/h3\u003e\n\u003cp\u003e自己从开始抽烟到现在已经有\u003ccode\u003e15\u003c/code\u003e年了，今年\u003ccode\u003e34\u003c/code\u003e岁，接近一半的岁月 44% 都在抽烟的生活中。抽烟的量基本是1包烟抽不到2天的时间，回想起来还挺可怕的~~\u003c/p\u003e\n\u003cp\u003e从这次的\u003ccode\u003e正式\u003c/code\u003e不抽烟，到今天大概有\u003ccode\u003e2\u003c/code\u003e个多月了，一根烟没有抽，对自己的坚持要点赞。\u003c/p\u003e","title":"戒烟"},{"content":"邮箱 自己在工作中使用Gmail有4年了，一直坚持在使用一些过滤器和分组整理各种邮件。今天邮箱里面的Filter和Label重新进行了梳理，感觉再次清爽了很多。\n规则 把Filter后不重要或不需要阅读的邮件，直接标记为已读 将Label的分组，依据当前的工作状态与时间关系再次分组。如将去年的同类Label进行归纳至年份Label 将不重要的Label组设置为show if unread 删除几乎不会有邮件进入的Label(不记得自己之前为什么会创建这些Label) 合并部分重叠度很多的Label 效果 在设置为show if unread的Label，在没有未读邮件的时候，不会显示出来。清爽很多 Label的数量减少20%，分类也更多的清晰 未读邮件少了很多，节省阅读一些不必要的邮件时间 TickTick 去年在学习GTD的时候，开始正式使用TickTick(APP+PC)，并购买了年度会员，把自己的工作和生活与TickTick深度结合起来了。最近发现自己创建的一些任务，没有目标性，或者说不知道是为了达成什么目的，仅仅是单纯的重复。如：晚上陪孩子。今天借机梳理完邮件的内容，再把TickTick一并整理下。\n规则 将单纯重复的任务，删除。如：早起、吃早餐等 将没有目标性的任务，明确目标或执行动作，达到可Check的效果。如：陪孩子10分钟、不对孩子发脾气等 删除没有用的List，并给所有有用的List标记颜色 将已完成或结束的List，进行Close操作 效果 当前所有任务都可Check List分组，比之前清晰好多 重复的任务已删除，将重复任务更加细致化 反思 需要定期去整理下，无论是工作/生活/工具 定期的清理能让工作效率和生活有更好的改善 还不确定下次整理的对象是什么，但好期待 ","permalink":"https://shiyuanjie.cn/posts/Upgrade/%E6%95%B4%E7%90%86TickTick%E5%92%8C%E9%82%AE%E7%AE%B1/","summary":"\u003ch3 id=\"邮箱\"\u003e邮箱\u003c/h3\u003e\n\u003cp\u003e自己在工作中使用Gmail有4年了，一直坚持在使用一些过滤器和分组整理各种邮件。今天邮箱里面的Filter和Label重新进行了梳理，感觉再次清爽了很多。\u003c/p\u003e\n\u003ch4 id=\"规则\"\u003e规则\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e把Filter后不重要或不需要阅读的邮件，直接标记为\u003ccode\u003e已读\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e将Label的分组，依据当前的工作状态与时间关系再次\u003ccode\u003e分组\u003c/code\u003e。如将\u003ccode\u003e去年\u003c/code\u003e的同类Label进行归纳至\u003ccode\u003e年份\u003c/code\u003eLabel\u003c/li\u003e\n\u003cli\u003e将不重要的Label组设置为\u003ccode\u003eshow if unread\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e删除几乎不会有邮件进入的Label(不记得自己之前为什么会创建这些Label)\u003c/li\u003e\n\u003cli\u003e合并部分重叠度很多的Label\u003c/li\u003e\n\u003c/ul\u003e","title":"整理TickTick和邮箱"},{"content":"放弃Keep 从2016年开始使用Keep来跑步，断断续续的有3年时间了。但最近我把Keep拉入黑名单了。\n原因 最近报名了Keep里面的48天马拉松集训，用48天的时间让自己有跑下全马的能力。当然，这个集训会比较难坚持下来，但自己还是坚持了18天。但在17天的时候，Keep出现集训中的内容无法记录进去。与客户商量2天的结果是让我重新跑一次。\n内因\nKeep作为一个专业的运动软件，给用户的解决方案竟然是让重新再跑一次。这样的回答，让我很不能接受。虽然现在Keep的用户量很大，但这样敷衍用户，真的是太草率了。 我也是做IT工作的，这个问题的修复也能猜到。但给用户这样的反馈，真把所有的用户都当做小白了。 去向 把跑步的软件转移至了悦跑圈，一个专注跑步的软件。当然，可能悦跑圈也存在一些问题，但我不会对它的期望太高。当把悦跑圈当作一个单纯的跑步APP。\n","permalink":"https://shiyuanjie.cn/posts/Tools/%E6%94%BE%E5%BC%83Keep/","summary":"\u003ch2 id=\"放弃keep\"\u003e放弃Keep\u003c/h2\u003e\n\u003cp\u003e从2016年开始使用Keep来跑步，断断续续的有3年时间了。但最近我把Keep拉入黑名单了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Tools/%E6%94%BE%E5%BC%83Keep/Keep%E4%BD%BF%E7%94%A8_hu_301fe8a6392fba29.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/Tools/%E6%94%BE%E5%BC%83Keep/Keep%E4%BD%BF%E7%94%A8.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Tools/%E6%94%BE%E5%BC%83Keep/Keep%E6%95%B0%E6%8D%AE_hu_7d64780b7aca2a1e.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/Tools/%E6%94%BE%E5%BC%83Keep/Keep%E6%95%B0%E6%8D%AE.png\"\u003e\u003c/picture\u003e\u003c/p\u003e","title":"放弃Keep"},{"content":"今天是自己坚持48天全程马拉松集训的第16天，期间中断一天没有锻炼，不过后面都有在坚持。\n数据 总里程： 70KM 平均配速：6分38秒 收获 提升\n坚持下来真的需要很大的勇气与付出 跑步真的不是在挑战速度之类，而是在挑战自己 没有什么事情是一蹴而就的，只有日程月累才会有收获。 专业知识\n跑步真正的对手是自己 坚持跑步前的热身与跑后的拉伸 不要过度依赖装备的效果，相信并感受自己的承受程度 跑步效果不好的原因：力量不够、姿势不正确 要想跑的长久并有好的效果，一定的持续性的坚持 未来 课程\n仅进行了1/3，还有后面更有挑战的事情需要自己去完成 后面的跑步课程中，很多都是长距离的，如何找到工作与课程的平衡要提前做好规划 跑步\n把跑步的配速控制在6分以内 需要给自己添加护袖、遮阳帽等装备 找到一条适合上班跑步并完成长距离的路线 这仅是完成1/3集训内容的总结，后续完成其它内容的再回来继续完善 ","permalink":"https://shiyuanjie.cn/posts/Run/48DayMathron/","summary":"\u003cp\u003e今天是自己坚持\u003cstrong\u003e48天全程马拉松集训\u003c/strong\u003e的第\u003cstrong\u003e16\u003c/strong\u003e天，期间中断一天没有锻炼，不过后面都有在坚持。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Run/48DayMathron/48%E5%A4%A9Mathron_hu_c5b26a5b5c7d5232.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"16Day in 48DayMathron\" loading=\"lazy\" src=\"/posts/Run/48DayMathron/48%E5%A4%A9Mathron.png\"\u003e\u003c/picture\u003e\u003c/p\u003e","title":"48天全程马拉松集训"},{"content":"从20190103到今天(20190508)，自己坚持的日更已经更新124篇内容，详见日更。其间，中断过2天的日更。\n坚持 从20190103开始准备日更时，定的目标：\n体验下日更，100字/天。 不知道后面会有什么内容，总之先做起来！ 到现在每次更新的时候，轻松就可以写出超过100字的内容。自己的收获还是不小的。\n坚持总会有收获。\n回想自己上学其间，语文一直是最差的，也从来没有想过，自己在有生之年会做出这样的事情。当然，日更的内容质量不怎么样，但还好都是自己纯手工打造的，没有任何添加。\n改进 已经坚持124次日更了，今天在想一个问题：如何改进自己日更的质量。在知乎上面找到一个回答，比较符合自己当前的问题。如何记高质量的日记/工作日志/学习日志？\n看到里面的总结方法，应该比较适合自己，就在印象笔记中创建了这种笔记的模块，后50篇内容，坚持使用此格式的内容进行更新。尝试并山寨下别人的结果，再看后续如何继续改进。\n","permalink":"https://shiyuanjie.cn/posts/Upgrade/%E5%9D%9A%E6%8C%81%E6%97%A5%E6%9B%B4/","summary":"\u003cp\u003e从20190103到今天(20190508)，自己坚持的日更已经更新\u003ccode\u003e124\u003c/code\u003e篇内容，详见\u003ca href=\"https://www.jianshu.com/c/add0c4ba262c\"\u003e日更\u003c/a\u003e。其间，中断过2天的日更。\u003c/p\u003e","title":"坚持日更"},{"content":"将自己翻译的JMeter历史版本的更新记录进行汇总，方便后期查阅。 JMeter版本 发布时间 更新内容 下载地址 5.2.1 20191113 [更新内容](http://shiyuanjie.cn/2019/01/11/JMeter5.2.1/ https://github.com/apache/jmeter/archive/v5.2.1-rc1.zip 5.2 20191008 [更新内容](http://shiyuanjie.cn/2019/01/08/JMeter5.2%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/ https://github.com/apache/jmeter/archive/v5.2-rc1.zip 5.1.1 20190314 更新内容 https://github.com/apache/jmeter/releases/tag/v5_1_1 5.1 20190219 更新内容 https://github.com/apache/jmeter/releases/tag/v5_1 5.0 20180918 更新内容 https://github.com/apache/jmeter/releases/tag/v5_0 4.0 20180210 更新内容 https://github.com/apache/jmeter/releases/tag/v4_0 3.3 20170921 更新内容 https://github.com/apache/jmeter/releases/tag/v3_3 3.2 20170414 更新内容 https://github.com/apache/jmeter/releases/tag/v3_2 3.1 20161120 更新内容 https://github.com/apache/jmeter/releases/tag/v3_1 ","permalink":"https://shiyuanjie.cn/posts/JMeter/JMeterUpdateHistory/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e将自己翻译的JMeter历史版本的更新记录进行汇总，方便后期查阅。\n\u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eJMeter版本\u003c/th\u003e\n          \u003cth\u003e发布时间\u003c/th\u003e\n          \u003cth\u003e更新内容\u003c/th\u003e\n          \u003cth\u003e下载地址\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e5.2.1\u003c/td\u003e\n          \u003ctd\u003e20191113\u003c/td\u003e\n          \u003ctd\u003e[更新内容](\u003ca href=\"http://shiyuanjie.cn/2019/01/11/JMeter5.2.1/\"\u003ehttp://shiyuanjie.cn/2019/01/11/JMeter5.2.1/\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://github.com/apache/jmeter/archive/v5.2.1-rc1.zip\"\u003ehttps://github.com/apache/jmeter/archive/v5.2.1-rc1.zip\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e5.2\u003c/td\u003e\n          \u003ctd\u003e20191008\u003c/td\u003e\n          \u003ctd\u003e[更新内容](\u003ca href=\"http://shiyuanjie.cn/2019/01/08/JMeter5.2%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/\"\u003ehttp://shiyuanjie.cn/2019/01/08/JMeter5.2%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://github.com/apache/jmeter/archive/v5.2-rc1.zip\"\u003ehttps://github.com/apache/jmeter/archive/v5.2-rc1.zip\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e5.1.1\u003c/td\u003e\n          \u003ctd\u003e20190314\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://shiyuanjie.cn/2019/03/20/JMeter5.1.1/\"\u003e更新内容\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://github.com/apache/jmeter/releases/tag/v5_1_1\"\u003ehttps://github.com/apache/jmeter/releases/tag/v5_1_1\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e5.1\u003c/td\u003e\n          \u003ctd\u003e20190219\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://shiyuanjie.cn/2019/03/19/JMeter5.1%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/\"\u003e更新内容\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://github.com/apache/jmeter/releases/tag/v5_1\"\u003ehttps://github.com/apache/jmeter/releases/tag/v5_1\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e5.0\u003c/td\u003e\n          \u003ctd\u003e20180918\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://shiyuanjie.cn/2018/10/17/JMeter5.0%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/\"\u003e更新内容\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://github.com/apache/jmeter/releases/tag/v5_0\"\u003ehttps://github.com/apache/jmeter/releases/tag/v5_0\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e4.0\u003c/td\u003e\n          \u003ctd\u003e20180210\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://shiyuanjie.cn/2018/02/28/JMeter4.0%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/\"\u003e更新内容\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://github.com/apache/jmeter/releases/tag/v4_0\"\u003ehttps://github.com/apache/jmeter/releases/tag/v4_0\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e3.3\u003c/td\u003e\n          \u003ctd\u003e20170921\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://shiyuanjie.cn/2017/10/09/JMeter3.3%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/\"\u003e更新内容\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://github.com/apache/jmeter/releases/tag/v3_3\"\u003ehttps://github.com/apache/jmeter/releases/tag/v3_3\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e3.2\u003c/td\u003e\n          \u003ctd\u003e20170414\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://shiyuanjie.cn/2017/05/13/JMeter3.2%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/\"\u003e更新内容\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://github.com/apache/jmeter/releases/tag/v3_2\"\u003ehttps://github.com/apache/jmeter/releases/tag/v3_2\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e3.1\u003c/td\u003e\n          \u003ctd\u003e20161120\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://shiyuanjie.cn/2017/03/09/JMeter3.1%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/\"\u003e更新内容\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://github.com/apache/jmeter/releases/tag/v3_1\"\u003ehttps://github.com/apache/jmeter/releases/tag/v3_1\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"JMeter历史版本更新内容"},{"content":"此版本主要用于BUG修复 实时报告和测试报告 在工具菜单中，新增直接通过CS/JTL文件来生成测试报告.\n版本下载 JMeter5.1.1\n","permalink":"https://shiyuanjie.cn/posts/JMeter/JMeter5.1.1/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e此版本主要用于BUG修复\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"实时报告和测试报告\"\u003e实时报告和测试报告\u003c/h2\u003e\n\u003cp\u003e在\u003ccode\u003e工具\u003c/code\u003e菜单中，新增直接通过\u003ccode\u003eCS/JTL\u003c/code\u003e文件来生成测试报告.\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Menu_Generate_Report\" loading=\"lazy\" src=\"http://jmeter.apache.org/images/screenshots/changes/5.1.1/01_menu_generate_report.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Select_File to Generate_Report\" loading=\"lazy\" src=\"http://jmeter.apache.org/images/screenshots/changes/5.1.1/02_windows_generate_report.png\"\u003e\u003c/p\u003e","title":"JMeter5.1.1更新内容"},{"content":"核心能力提升 JDBC测试已被提升，可以直接设置SQL语句并支持查询超时功能。 变量问题已被修复，像使用HTTP(S) Test Script Recorder录制HTTPS请求时收集正确的请求头信息。 在5.0版本中，JMeter已调整使用自定义的命令策略来重命名子结果(BUG_62550)，这个变更对功能测试很麻烦，新的属性subresults.disable_renaming=true用于解决这个问题。替代方法是使用在功能测试的测试计划中校验(BUG_63055)。 样式提升 在使用录制时，模板提供了参数化的功能。\n工具菜单被重新定义，用于相关JMeter功能的使用，如：\nFunction Helper Dialog Export transactions for report Generate Schematic View Import from cURL Compile JSR223 Test Elements Create a heap dump Create a thread dump ![New_Tool_Menu(http://jmeter.apache.org/images/screenshots/changes/5.1/jmeter-new-menu-tools.png)\n测试计划 可以使用cURL来创建测试计划\n脚本和调试增强 在工具菜单中新增用于编译所有JSR223的功能\n实时报告和测试报告 可以使用-e或-g来生成JSON格式的性能统计结果 百分比计算的方法已调整为在每次测试时重新计算 通过使用参数-f，更友好的处理报告在生成时空文件夹或文件夹已存在的处理 版本下载 JMeter5.1\n","permalink":"https://shiyuanjie.cn/posts/JMeter/JMeter5.1%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/","summary":"\u003ch2 id=\"核心能力提升\"\u003e核心能力提升\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eJDBC测试已被提升，可以直接设置SQL语句并支持查询超时功能。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg alt=\"JDBC Connection\" loading=\"lazy\" src=\"http://jmeter.apache.org/images/screenshots/changes/5.1/jdbc-connection-config-init-request.png\"\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e变量问题已被修复，像使用\u003ccode\u003eHTTP(S) Test Script Recorder\u003c/code\u003e录制HTTPS请求时收集正确的请求头信息。\u003c/li\u003e\n\u003cli\u003e在5.0版本中，JMeter已调整使用自定义的命令策略来重命名子结果(\u003ca href=\"https://bz.apache.org/bugzilla/show_bug.cgi?id=62550\"\u003eBUG_62550\u003c/a\u003e)，这个变更对功能测试很麻烦，新的属性\u003ccode\u003esubresults.disable_renaming=true\u003c/code\u003e用于解决这个问题。替代方法是使用在功能测试的测试计划中校验(\u003ca href=\"https://bz.apache.org/bugzilla/show_bug.cgi?id=63055\"\u003eBUG_63055\u003c/a\u003e)。\u003c/li\u003e\n\u003c/ul\u003e","title":"JMeter5.1更新内容"},{"content":"早上我刚醒来，儿子也跟着醒来了。时间6:40。\n新学期第一天 今天第一天正式上学，昨晚让孩子早早就睡觉了，不到9点。起来后，让孩子坚持自己穿衣、洗漱，时间也没有太多的浪费，吃完饭，骑电动车把孩子送到学校。到校时间应该还比较早。\n习惯的养成 之前看过一些关于“习惯”养成的书籍，重点就是\n自我驱动意识 成就感 坚持 当然也有其他的类似1万小时理论，但是感觉核心还是上面这几条。 开学刚开始，相信孩子会有一些新的改变，当然需要有大人的合计引导。我们就先从自己穿衣、洗漱开始吧\n","permalink":"https://shiyuanjie.cn/posts/Life/%E5%BC%80%E5%AD%A6%E7%AC%AC%E4%B8%80%E5%A4%A9/","summary":"\u003cp\u003e早上我刚醒来，儿子也跟着醒来了。时间6:40。\u003c/p\u003e","title":"开学第一天"},{"content":"今天儿子要进行一年级第二学期的报名，早上自己也早早的醒来了。这会正在洗漱中。\n新的学期 上个学期的时候，每天早上都要帮他穿衣，提前做好吃的，更要把洗漱的工具准备好。新的学期，需要有点改善：\n早上起来需要自己穿衣 自己准备洗漱工具 也许这些内容对于成年人来说很容易，但是要让孩子养成自理的习惯，还需要一段时间的锻炼。\n","permalink":"https://shiyuanjie.cn/posts/Life/%E6%96%B0%E5%AD%A6%E6%9C%9F%E6%8A%A5%E5%90%8D/","summary":"\u003cp\u003e今天儿子要进行一年级第二学期的报名，早上自己也早早的醒来了。这会正在洗漱中。\u003c/p\u003e\n\u003cp\u003e新的学期\n上个学期的时候，每天早上都要帮他穿衣，提前做好吃的，更要把洗漱的工具准备好。新的学期，需要有点改善：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e早上起来需要自己穿衣\u003c/li\u003e\n\u003cli\u003e自己准备洗漱工具\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e也许这些内容对于成年人来说很容易，但是要让孩子养成自理的习惯，还需要一段时间的锻炼。\u003c/p\u003e","title":"新学期报名"},{"content":"套餐 Github + Hexo + Travis\nGithub 源文件和网站资源的管理\nHexo 网站内容的生成\nTravis 打通Github+Travis\n如何使用 使用自己网站来说明：\n源文章存放：https://github.com/aimer1124/aimer1124.github.io/tree/raw Travis配制：https://github.com/aimer1124/aimer1124.github.io/blob/raw/.travis.yml 自定义主题：https://github.com/aimer1124/blog_theme 使用Submodule的形式引入：https://github.com/aimer1124/aimer1124.github.io/blob/raw/.gitmodules [submodule \u0026#34;themes/themeHexo\u0026#34;] path = themes/themeHexo url = https://github.com/aimer1124/blog_theme.git TravisJob：[https://travis-ci.org/aimer1124/aimer1124.github.io](https://travis-ci.org/aimer1124/aimer1124.github.io 站点静态资源：https://github.com/aimer1124/aimer1124.github.io Enhancement 添加评论 访问量统计 主题自定义 最终实现 使用Markdown编写文章 提交Github后自动 部署并发布 至站点进行更新 页面访问量统计及站点访问统计 站点主题定制化 效果展示：http://shiyuanjie.cn\n","permalink":"https://shiyuanjie.cn/posts/Blog/%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/","summary":"\u003ch3 id=\"套餐\"\u003e套餐\u003c/h3\u003e\n\u003cp\u003eGithub + Hexo + Travis\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Blog/%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/Relationship_hu_d018feda97c718d5.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"Relationship\" loading=\"lazy\" src=\"/posts/Blog/%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/Relationship.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGithub\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e源文件和网站资源的管理\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHexo\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e网站内容的生成\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTravis\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e打通Github+Travis\u003c/p\u003e","title":"个人网站搭建"},{"content":"书 书名 假面前夜 作者 [日] 东野圭吾 豆瓣评分 6.7 分类 小说 In 豆瓣 假面前夜 出版社 南海出版公司 读书方法 深度阅读 推荐指数 ★★★★☆ 难度指数 ★☆☆☆☆ 阅读时间 20181230-20190102 感悟 《假面前夜》是《假面饭店》前奏或者铺垫，《假面山庄》跟这两本好像没有直接的关系。不过，都揭示了“假面”的功效，最近越来越喜欢“东野圭吾”的小说，看了就停不下来。\n“假面”时好时坏，主要是看戴的动机。\n小女警，为了遵守与尚美的约定，对新田和警局撒了谎，带了“善良”的面具； 交换杀人计划的两人，现实生活中是成功人士或者幸福人群，但是他们的举动确是戴着“恶意”的面具。\n我们在生活的日常中，也会不自觉的带上各种面具，每当戴上“面具”的时候，要“警示”自己:面具底下的是谁?\n","permalink":"https://shiyuanjie.cn/posts/Book/%E5%81%87%E9%9D%A2%E5%89%8D%E5%A4%9C/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e假面前夜\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e[日] 东野圭吾\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e6.7\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e小说\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/26703641/\"\u003e假面前夜\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e南海出版公司\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e深度阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e推荐指数\u003c/td\u003e\n          \u003ctd\u003e★★★★☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e难度指数\u003c/td\u003e\n          \u003ctd\u003e★☆☆☆☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20181230-20190102\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"假面前夜"},{"content":"书 书名 微习惯 作者 [美]斯蒂芬·盖斯 / Stephen Guise 豆瓣评分 7.7 分类 跃迁 In 豆瓣 微习惯 出版社 后浪出版公司·江西人民出版社 读书方法 快速阅读 推荐指数 ★★★★★ 难度指数 ★☆☆☆☆ 阅读时间 20181227-20181230 问题 哪些可以算为微习惯？ 消耗很少精力的正向行为都算，比如：每天多喝一杯水、多喝同事说个Say Hi 如何积少成多，引起更大的效益？ 坚持下来各种微习惯，日积月累就会发现优势 如何坚持下来？ 及时发现微习惯的收益，并强化自己坚持下去的意志。 收获 概念卡 微习惯 自己强迫自己做一些微不足道的正向的行为 元分析 从相关文章或文献中提取重要结论的过程 正念 对自己的思维和行动有清醒的认识 自我效能感 对自己影响事件结果能力的信念 微习惯建力方法 强化意志力 当下取得进步 不消耗意志力 金句 重复就是(潜意识)大脑使用的语言。 感悟 微习惯，看这本书之前是第一次听说，看完书之后，发现原来微习惯的作用可以很广泛，涉及到工作、生活各方面的提升。\n","permalink":"https://shiyuanjie.cn/posts/Book/%E5%BE%AE%E4%B9%A0%E6%83%AF/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e微习惯\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e[美]斯蒂芬·盖斯 / Stephen Guise\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e7.7\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e跃迁\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/26877306/\"\u003e微习惯\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e后浪出版公司·江西人民出版社\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e快速阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e推荐指数\u003c/td\u003e\n          \u003ctd\u003e★★★★★\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e难度指数\u003c/td\u003e\n          \u003ctd\u003e★☆☆☆☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20181227-20181230\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"微习惯"},{"content":"书 书名 准备好了吗？开始工作吧 作者 小山升 豆瓣评分 7.6 分类 工作 In 豆瓣 准备好了吗？开始工作吧 出版社 北京联合出版公司·后浪出版公司 读书方法 快速阅读 推荐指数 ★★★☆☆ 难度指数 ★☆☆☆☆ 阅读时间 20181223-20181226 问题 什么样子才算是准备好工作？ 深入理解什么是工作，才能为工作做好准备。 开始后要如何坚持下来？ 主动学习，并将学习的内容付诸实践 对自己的事情负责任 倒逼自己 定好目标 及时沟通 收获 概念卡 理解 对事物的不同理解会采取不同行动，结果也将截然不同。 蝴蝶效应 一只飞舞的蝴蝶，偶尔煽动几下翅膀就可以引起纽约的一场风暴。 沟通 次数的多寡 朝型人 坚持早到公司的人 金句 这个世界不会以你而转动。 不要掩饰错误。 感悟 三不要：不要独自烦恼、不要独自承担、不要随意下判断 工作或者学习的内容要量化起来，不能量化的想办法量化 主动学习很重要，但更重要的是将自己学习到的内容应用于实践 放眼未来，不要局限于当前的一些事情。多想当前的一些事情，会给未来带来多少影响和价值 ToDo 量化自己的生活和工作 ","permalink":"https://shiyuanjie.cn/posts/Book/%E5%87%86%E5%A4%87%E5%A5%BD%E4%BA%86%E5%90%97%E5%BC%80%E5%A7%8B%E5%B7%A5%E4%BD%9C%E5%90%A7/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e准备好了吗？开始工作吧\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e小山升\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e7.6\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e工作\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/26589583/\"\u003e准备好了吗？开始工作吧\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e北京联合出版公司·后浪出版公司\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e快速阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e推荐指数\u003c/td\u003e\n          \u003ctd\u003e★★★☆☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e难度指数\u003c/td\u003e\n          \u003ctd\u003e★☆☆☆☆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20181223-20181226\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"准备好了吗？开始工作吧"},{"content":"书 图片来源：Amazon.cn\n书名 冷场 作者 李诞 豆瓣评分 6.6 分类 小说 In 豆瓣 冷场 出版社 四川文艺出版社 读书方法 深度阅读 阅读时间 20181222-20181222 金句 不要去推敲习惯。 再错的事情人都能为自己找到借口，我们靠此苟活。 感悟 书中看了一章情人们，从两个情侣的不同视角来讲约会过程中各自的心理。感觉挺有意思，但不太适合自己的口胃，所以就只读了第一章，就把书放下了。\n正式认识作者，还是在奇葩大会的节目中，作者是一个节目的新人，但很快就在这个综艺节目中找到了自己的定位，而且可以与高晓松、蔡康永、马东和薛兆丰谈笑风声，虽然从沟通的过程中，可以看出来他跟另外四位大佬对话的差异，但是能接住已经很不错了。另外，作者其实还比较年轻，相信后面会有更好的作品。很期待\n","permalink":"https://shiyuanjie.cn/posts/Book/%E5%86%B7%E5%9C%BA/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg alt=\"冷场\" loading=\"lazy\" src=\"https://images-cn.ssl-images-amazon.com/images/I/31wrrhOG4zL._SX275_BO1,204,203,200_.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e图片来源：\u003ca href=\"https://www.amazon.cn/dp/B07KC5SN2Z/ref=sr_1_1?ie=UTF8\u0026amp;qid=1547286413\u0026amp;sr=8-1\u0026amp;keywords=%E5%86%B7%E5%9C%BA\"\u003eAmazon.cn\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e冷场\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e李诞\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e6.6\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e小说\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/30365801/\"\u003e冷场\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e四川文艺出版社\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e深度阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20181222-20181222\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"冷场"},{"content":"书 书名 尘埃落定 作者 阿来 豆瓣评分 8.4 分类 小说 In 豆瓣 尘埃落定 出版社 人民文学出版社 读书方法 深度阅读 阅读时间 20181218-20181222 金句 即使是奴隶，有人也有权更被宠爱一点。 感悟 尘埃落定，万物轮回。 也许生活就是这样子，主人公，一个被人叫了一辈子“傻子”的人，却做出了所有聪明人都做不到的大事情。反观，我们生活中自认为的聪明人，他们是否也真的聪明么？\n也许傻一点也挺好，把很多事情想得简单一点。傻人有傻福~\n","permalink":"https://shiyuanjie.cn/posts/Book/%E5%B0%98%E5%9F%83%E8%90%BD%E5%AE%9A/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg alt=\"尘埃落定\" loading=\"lazy\" src=\"https://images-cn.ssl-images-amazon.com/images/I/41ALdZ78k4L.jpg\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e尘埃落定\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e阿来\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e8.4\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e小说\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/1080309/\"\u003e尘埃落定\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e人民文学出版社\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e深度阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20181218-20181222\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"尘埃落定"},{"content":"回顾 2018总结 2017总结 2018规划 生活 带 大宝 去参加一次跑步比赛 \u0026ndash;Done 带 家人 出去旅游 一次。 \u0026ndash;Delay 学会做更多的饭菜，让家人可以吃到更多的美味 \u0026ndash;Delay 工作 找机会去实践 PM 的工作，让自己可以有机会完整的来带领一个项目 \u0026ndash;Done 将已有测试技能实践 通用化 起来，更加容易上手 \u0026ndash;Done 把 PMP 证书拿到手 \u0026ndash;Delay 阅读 30本书 \u0026ndash;Delay 其它 跑步500公里 \u0026ndash;Delay 学会控制自己与孩子沟通的情绪 \u0026ndash;Delay 手绘人物画像 \u0026ndash;Delay 上面基于原计划，每项添加了对应的结果，整体完成度只有40%，还没有及格。\n下面复盘下：\n生活 确实今年有了二宝之后，出去玩的可能性小了很多，2019年要出去玩一次 做饭方面，好像去年就新学会了一个做茶叶蛋，其它没有什么新的 工作 PM的工作，自己现在已经在进行第二个项目的PM 测试技能的通用化方向，自己去年做了较多的关于新的培训方面的工作。这个归功于公司的活动的发起，那么如果公司在没有发起类似活动的时候，自己如何做呢？这个要自己多思考 PMP这个，再看吧。暂时没有太多的期望 阅读 去看报名学习了洋葱阅读法，收益很大，读书方法也有了很大的改善，现在每个月基本最少会读4本书(专业和非专业都有) 2018年定的目标还是没有完成，看了下自己的读书笔记，18年中有几个月几乎没有任何读书的动作，以后要将读书作为生活的一部分。 其它 跑步，这个事情今年确实没有怎么跑，应该是只跑了2.3次，明年如果还在西安的话，考虑有机会争取跑步上下班 控制自己的情绪，个人感觉有点小改善，但还是没有控制的很多，后续还要多注意 手绘的事情，基本放弃了 2018年的，事情算了总结完了。后续自己要注意的事情： - 如何将计划的事情如期落地 - 如何将所会的知识，更广的传播 - 如何更好的与家人相处 展望2019 好吧，回顾结束了。现在来总结下2019年要如何做、做哪些？\n生活 带家人出去玩一次，出省 学会做新的4道菜 重新跑步，年总里程：200 工作 将PM的工作做好，Role Model 雷总的客户期望管理与沟通方式 将性能测试、测试策略、测试基线的实践，在公司推广 其它 读书：50本，每本均要有读书笔记产出 坚持早起：7点前 坚持日更200天 基于以上的规划，今年要做精细化的Check，以防在年底的时候，又会有Delay的情况。 每个季度，在这里追加整体的进度情况。 2019 In Progress 20190201 性能测试WorkShop已经在筹备阶段 坚持7点前起床 坚持日更30天：https://www.jianshu.com/c/add0c4ba262c 读书(7/50) 假面前夜 每天必须练习口才 活着 危险的维纳斯 第五项修炼 企业IT架构转型之道(进行中) 刻意练习(进行中) 20190612 性能测试WorkShop已结束，并组织一场对外性能测试MeetUP PM的工作实践仍在进行中，近期也接手到另外两个项目的售前工作。虽然最后项目没有落地，但让自己对售前的工作，有更深入的认识 坚持7点前起床 坚持日更(125+) 125日更 in 简书：https://www.jianshu.com/c/add0c4ba262c 4微信周更 in 公众号：碎碎念的地方 读书(11/50) 财务自由之路 一本小小的红色写作书 一只特立独行的猪 黄金时代 20190701 生活(60%) 当前跑步总里程：177/200 新的菜：凉拌花菜(1/4) 带家人出去玩，计划去北京 工作(70%) PM工作：接触更多的售前，尝试开拓新的商机 性能测试：Workshop及BQTime已组织在公司进行 其它(40%) 读书(15/50) 尼采的锤子：哲学大师的25种思维工具 为何家会伤人 十问：霍金沉思录 明朝那些事(1) 坚持7点前起床 坚持日200天(125日更+6微信，131/200) Summary In Half Year: 整体计划还在进行中，总体完成度大概60%左右。但一些需要持续坚持的实践没有坚持，下半年需要坚持下来了，加油！ 20190802 生活(60%) 当前跑步总里程：219/200 新的菜：凉拌花菜(1/4) 带家人出去玩，计划去北京。8月落地 工作(70%) PM工作：正在进行拓展当前业务范围，尝试把当前客户做大。 规划QA社区运作及人员培养 其它(40%) 读书(17/50) 明朝那些事(2-3) 坚持7点前起床 坚持日200天(125日更+11微信，136/200) 20190903 生活：85% 带家人出去玩一次，出省：80% 休了年假，但只是在省内玩了，完成度 学会做新的4道菜：75% 凉拌花菜 鸡蛋羹 豆角炒肉 重新跑步，年总里程：200: 100% 悦跑圈：281KM 工作:82% 将PM的工作做好，Role Model 雷总的客户期望管理与沟通方式:85% 在当前项目实践过程中 将性能测试、测试策略、测试基线的实践，在公司推广：80% 性能测试Workshop已完成 TD-QA初期筹备中 其它 读书：50本，每本均要有读书笔记产出：36% 假面前夜 每天必须练习口才 活着 危险的维纳斯 第五项修炼 企业IT架构转型之道 刻意练习 财务自由之路 一本小小的红色写作书 一只特立独行的猪 黄金时代 尼采的锤子：哲学大师的25种思维工具 为何家会伤人 十问：霍金沉思录 明朝那些事(1/2/3/4) 坚持早起：7点前：75% 坚持日更200天 125日更 11微信 20191015 生活：100% 带家人出去玩一次，出省：100% 休了年假，但只是在省内玩了，完成度 学会做新的4道菜：100% 凉拌花菜 鸡蛋羹 豆角炒肉 拍黄瓜 重新跑步，年总里程：200: 100% 悦跑圈：401KM 工作:95% 将PM的工作做好，Role Model 雷总的客户期望管理与沟通方式:95% 在当前项目实践过程中 MU与BU之间，人员Staffing情况处理。仍需要继续锻炼 将性能测试、测试策略、测试基线的实践，在公司推广：95% 性能测试Workshop已完成 TD-QA正常运转中 推动学习小组计划 其它 读书：50本，每本均要有读书笔记产出：50% 假面前夜 每天必须练习口才 活着 危险的维纳斯 第五项修炼 企业IT架构转型之道 刻意练习 财务自由之路 一本小小的红色写作书 一只特立独行的猪 黄金时代 尼采的锤子：哲学大师的25种思维工具 为何家会伤人 十问：霍金沉思录 明朝那些事(1/2/3/4/5) 坚持早起：7点前：85% 坚持日更200天 70% 125日更 11微信 关于读书和写作的总结，最近有点少了。后面要抓紧输出。 20191216 生活：100% 带家人出去玩一次，出省：100% 休了年假，但只是在省内玩了 学会做新的4道菜：100% 凉拌花菜 鸡蛋羹 豆角炒肉 拍黄瓜 重新跑步，年总里程：200: 100% 悦跑圈：478KM 工作:100% 将PM的工作做好，Role Model 雷总的客户期望管理与沟通方式:95% 在当前项目实践过程中 MU与BU之间，人员Staffing情况处理。仍需要继续锻炼 在TD有幸参与了很多项目的售前，了解更多的项目玩法 将性能测试、测试策略、测试基线的实践，在公司推广：100% 性能测试Workshop已完成 TD-QA正常运转中 推动学习小组计划 其它：80% 读书：50本，每本均要有读书笔记产出：55% 假面前夜 每天必须练习口才 活着 危险的维纳斯 第五项修炼 企业IT架构转型之道 刻意练习 财务自由之路 一本小小的红色写作书 一只特立独行的猪 黄金时代 尼采的锤子：哲学大师的25种思维工具 为何家会伤人 十问：霍金沉思录 明朝那些事(1/2/3/4/5/6) 狼道 坚持早起：7点前：95% 坚持日更200天：70% 125日更 11微信 20191231 生活：100% 带家人出去玩一次，出省：100% 休了年假，但只是在省内玩了 学会做新的4道菜：100% 凉拌花菜 鸡蛋羹 豆角炒肉 拍黄瓜 重新跑步，年总里程：200: 100% 悦跑圈：478KM 工作:100% 将PM的工作做好，Role Model 雷总的客户期望管理与沟通方式:95% 在当前项目实践过程中 MU与BU之间，人员Staffing情况处理。仍需要继续锻炼 在TD有幸参与了很多项目的售前，了解更多的项目玩法 将性能测试、测试策略、测试基线的实践，在公司推广：100% 性能测试Workshop已完成 TD-QA正常运转中 推动学习小组计划 其它：85% 读书：50本，每本均要有读书笔记产出：55% 假面前夜 每天必须练习口才 活着 危险的维纳斯 第五项修炼 企业IT架构转型之道 刻意练习 财务自由之路 一本小小的红色写作书 一只特立独行的猪 黄金时代 尼采的锤子：哲学大师的25种思维工具 为何家会伤人 十问：霍金沉思录 明朝那些事(1/2/3/4/5/6) 狼道 我的老师是侦探 坚持早起：7点前：95% 坚持日更200天：70% 125日更 11微信 2篇 2019最后一天，整体完成度在90%。 ","permalink":"https://shiyuanjie.cn/posts/Flags/2019%E6%80%BB%E7%BB%93/","summary":"\u003ch2 id=\"回顾\"\u003e回顾\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://shiyuanjie.cn/2018/01/08/2018%E6%80%BB%E7%BB%93/\"\u003e2018总结\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://shiyuanjie.cn/2016/12/28/2017%E6%80%BB%E7%BB%93/\"\u003e2017总结\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"2018规划\"\u003e2018规划\u003c/h3\u003e\n\u003ch4 id=\"生活\"\u003e生活\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e带 \u003ccode\u003e大宝\u003c/code\u003e 去参加一次跑步比赛 \u0026ndash;Done\u003c/li\u003e\n\u003cli\u003e带 家人 出去旅游 一次。 \u0026ndash;Delay\u003c/li\u003e\n\u003cli\u003e学会做更多的饭菜，让家人可以吃到更多的美味 \u0026ndash;Delay\u003c/li\u003e\n\u003c/ul\u003e","title":"2019总结"},{"content":"思维导图版 解决问题 如何快速响应用户需求 为什么要这样做呢？\n抢占市场 试水项目 前中后台的区别 前台：前端的展示平台，如：微信公众号、网站页面、APP 中台：提升用户响应力，如：业务中台、数据中台、组织中台 后台：由后端系统组成，后端平台，如：财力系统、订单系统 不同企业的中台策略示例 阿里：大中台、小前台 华为：大平台炮火支撑精兵作战 海尔：平台自营体支撑一线自营体 类似理论报告：Pace-Layered Application Strategy-Gatner,201210 图片来源：https://cio-wiki.org/?page=gartners-pace-layered-application-strategy\n不同类型 类型 功能 说明 业务中台 业务重用服务 开箱即用的服务 数据中台 数据分析能力 改进方向，调整方向 移动及算法中台 火力支援，个性化服务，体验服务 精准推送 组织中台 投资管理，风险管理，资源管理 方向指导，资源调度 研发中台 技术管理和实践支撑 项目管理，集成管理 技术中台 技术支撑服务 基础设施，数据库支持 参考文章 中台是个什么鬼 | 白话中台战略 白话中台战略2：中台到底长啥样？ Pace-Layered Application Strategy and IT Organizational Design: How to Structure the Application Team for Success Gartner\u0026rsquo;s PACE Layered Application Strategy ","permalink":"https://shiyuanjie.cn/posts/Upgrade/%E4%B8%AD%E5%8F%B0/","summary":"\u003ch2 id=\"思维导图版\"\u003e思维导图版\u003c/h2\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Upgrade/%E4%B8%AD%E5%8F%B0/%E4%B8%AD%E5%8F%B0_hu_55ab59fc497ea773.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"中台\" loading=\"lazy\" src=\"/posts/Upgrade/%E4%B8%AD%E5%8F%B0/%E4%B8%AD%E5%8F%B0.jpg\"\u003e\u003c/picture\u003e\u003c/p\u003e","title":"中台"},{"content":"书 书名 关健沟通 作者 苏珊·斯科特（Susan Scott） 豆瓣评分 9.1 分类 沟通 In 豆瓣 关健沟通 出版社 中国友谊出版公司 读书方法 快速阅读 阅读时间 20181216-20181217 问题 无\n收获 概念卡 关健沟通 目标：把大家的观点都摆在桌子上，再进行拷问。才能达到关健沟通的目的 沟通阶段 拿出提议 核实理解 核实赞同 沟通原则 拿出勇气，拷问现实 走出自我，投入对话 保持专注，不分心 今天开始解决最棘手的挑战 听从自己的直觉 为自己的情绪承担责任 让沉默施展力量 金句 生活弯弯曲曲，别想着把它弄直了。 很多真相，也只是自己认为的想法。 感悟 经常我们在逃避一些沟通，或许是因为沟通过程中会让领导不满意，或许是自己担心别人会拒绝自己，或许是自己对一些事情根本就没有信心。 我们只有做好准备，去做，才能真正的知道真实的结果究竟是什么样子的。当然做的过程中，可以参考作者的7原则，可以使用现有的套路来完善沟通的结果。\n","permalink":"https://shiyuanjie.cn/posts/Book/%E5%85%B3%E5%81%A5%E6%B2%9F%E9%80%9A/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img1.doubanio.com/view/subject/l/public/s29879408.jpg\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e关健沟通\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e苏珊·斯科特（Susan Scott）\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e9.1\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e沟通\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/30317645/\"\u003e关健沟通\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e中国友谊出版公司\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e快速阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20181216-20181217\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"关健沟通"},{"content":"书 书名 虚无的十字架 作者 东野奎吾 豆瓣评分 7.5 分类 小说 In 豆瓣 虚无的十字架 出版社 湖南文艺出版社 读书方法 深度阅读 阅读时间 20181209-20181215 问题 无\n收获 概念卡 假释 只是为了解决监狱爆满问题的不负责任的行为。文中的解释有点偏激，实际操作中应该还会有真实的假释。 金句 死刑判决只是歇脚站 用谎言来掩盖谎言，对任何人都没有好处。 感悟 读完了，跟《假面山庄》和《假面饭店》完全不一样。通过 中原 和妻子 小夜子 的死亡经历，慢慢的推导出杀人案件的实情，而不是像一般小说那样：让警察充当主角。 回到书的内容，也许我们很多人都被虚无的十字架绑架，只是我们在不同的阶段，揭露不同的面目，感觉回到了假面的主题。\n","permalink":"https://shiyuanjie.cn/posts/Book/%E8%99%9A%E6%97%A0%E7%9A%84%E5%8D%81%E5%AD%97%E6%9E%B6/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://images-cn.ssl-images-amazon.com/images/I/51c98SlMCEL.jpg\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e虚无的十字架\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e东野奎吾\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e7.5\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e小说\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/26413027/\"\u003e虚无的十字架\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e出版社\u003c/td\u003e\n          \u003ctd\u003e湖南文艺出版社\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e深度阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20181209-20181215\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"虚无的十字架"},{"content":"解决问题 目标：遗留系统 往往这种系统都会有三个问题：\n框架陈旧，没办法直接使用直接更换新的技术 业务复杂，老业务太复杂，当前很多业务已经没有人熟悉 改造成本大，这条其实是由上面两个问题引起的 提出微前端，就是要解决上面的问题。\n概念定义 将`单个大`体应用，拆分为`多个小`体应用。 特性 独立运行 独立开发 独立部署 不足 依赖需要各个应用自管理 自行设计通讯机制与加载方式 落地步骤 实施步骤：\n用HTTP服务器来重定向多个应用 不同框架之上，需要考虑通讯、加载 组合多个组件和独立应用来构建单体应用 iFrame 纯 Web Components构建 结合 Web Components构建 设计理念 中心化路由 标识化应用 生命周期 独立部署与配置自动化 思维导图版 参考文章 微前端的那些事儿 用微前端的方式搭建类单页应用 ","permalink":"https://shiyuanjie.cn/posts/Book/%E5%BE%AE%E5%89%8D%E7%AB%AF-%E6%80%BB%E7%BB%93/","summary":"\u003ch2 id=\"解决问题\"\u003e解决问题\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e目标：遗留系统\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e往往这种系统都会有三个问题：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e框架\u003c/code\u003e陈旧，没办法直接使用直接更换新的技术\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e业务\u003c/code\u003e复杂，老业务太复杂，当前很多业务已经没有人熟悉\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e改造\u003c/code\u003e成本大，这条其实是由上面两个问题引起的\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e提出\u003ccode\u003e微前端\u003c/code\u003e，就是要解决上面的问题。\u003c/p\u003e","title":"微前端"},{"content":"书 书名 假面饭店 作者 东野奎吾 豆瓣评分 7.1 分类 小说 In 豆瓣 假面饭店 读书方法 深度阅读 阅读时间 20181204-20181209 问题 什么是假面？ 假面，也许就是我们面对他人的时候，我们的一种生活态度。无论在生活、工作，我们都会时不时的戴上各种假面。有些是善意的，有些是恶意的。就像作为TL时，我们应该戴上4顶帽子:TeamLeader的角色认知。 为什么会有这种假面？ 有时候，太真我，会让我们较难的生活下来。 只有我们在不同的时机，戴上不同的帽子，我们才能更好的生活在这个复杂的世界中。 如何规避假面的发生？ 假面的发生并不可怕，可怕的是恶意的假面，类似披着羊皮的狼。不用客意去在意戴的什么面具，重点要考虑我们的本意究竟是什么。 收获 概念卡 无\n金句 永远不要和客人做无谓的讨价还价。 感悟 5天把书读完了，直到最后才Get到谁才是真正的X4.近期对东野奎吾的小说，很有热情，读起来也很顺畅。 假面也许我们天天都在戴不同的面具，但我们为什么要戴，这点是值得我们去思考的。真正的凶手难道真的就是想杀人么？结尾的时候尚美也对自己的严格产生的了怀疑，我们究竟是不是要在合适的时候戴上面具，值得思考。\n","permalink":"https://shiyuanjie.cn/posts/Book/%E5%81%87%E9%9D%A2%E9%A5%AD%E5%BA%97/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://images-cn.ssl-images-amazon.com/images/I/512e8JavaRL.jpg\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e假面饭店\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e东野奎吾\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e7.1\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e小说\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/11615173/\"\u003e假面饭店\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e深度阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20181204-20181209\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"假面饭店"},{"content":"书 书名 围城 作者 钱钟书 豆瓣评分 9.3 分类 小说 In 豆瓣 围城 读书方法 深度阅读 阅读时间 20181123-20181203 问题 什么是围城？ 围城思想：嫁女必须胜吾家，娶妇必须不若吾家。 人为什么会在城里？ 是心在城里，不是人在城里。 有什么办法出城？ 心人在城里，就没办法出城。 收获 概念卡 外表 忠厚老实人的恶毒，像饭里的沙砾或者出骨鱼片里未净的刺，会给人一种不期待的伤害。 围城 围城思想：嫁女必须胜吾家，娶妇必须不若吾家。 驴头前的萝卜 定一个目标，看似可触及，实际遥不可及 金句 结婚仿佛金漆的鸟笼，笼子外面的鸟想住进去，笼内的鸟想飞出来；所以结而离，离而结，没有了局。 年龄是个自然历程不能超越的事实，就像饮食男女，像死亡。有时，这种年辈意识比阶级意识更鲜明。 感悟 围城是自己给自己围的城，要真正出去，还是要靠自己。像书中的主人公鸿渐那样，自己一直没有出去，就一直在城里。 书的结尾，通过鸿渐的妻子，道出了要如何出城的方法。要靠自己。刚读完书的时候，感觉结尾有点快，还没有反应过来，全书就结束了。整理读书笔记的时候，突然发现，其实作者已给出答案。 ","permalink":"https://shiyuanjie.cn/posts/Book/%E5%9B%B4%E5%9F%8E/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://images-cn.ssl-images-amazon.com/images/I/51RMtQatx0L.jpg\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e围城\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e钱钟书\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e9.3\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e小说\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/27070488/\"\u003e围城\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e深度阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20181123-20181203\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"围城"},{"content":"书 书名 洋葱阅读法 作者 彭小六 豆瓣评分 6.8 分类 工具 In 豆瓣 洋葱阅读法 读书方法 快速阅读 阅读时间 20181115-20181117(2H) 问题 什么是洋葱阅读法？ 像剥洋葱一样去掌握读书方法。 读书方法的分类？ 碎片阅读、快速阅读、主题阅读、深度阅读。 工具类书如何读？ 收获 概念卡 个人品牌 你影响了更多人，帮助了更多人。 个人成长 蛋清：平时接触的一些技能和方法，很容易改变，也很容易混在一起 蛋黄：内心，坚固异常，很难改变 学习途径 人：人脉，利用周围的人脉。 网：网络，APP、公众号 事：做事情，边做边学习 书：阅读 学习吸收金字塔 From:http://www.jygd520.com/wzz.asp?x=105 碎片阅读 有目的的学习 找到内容后，去拆解、提炼出核心内容和知识体系，然后再加工、组合、创新变成自己的 快速阅读 扫读，2：8原则。 主题阅读 围绕某个主题，在一定时间内快速阅读多本书的方法 5W1H Why/What/Where/When/Who,How。 思维、方法分析时使用。 深度阅读 练兵场，寻找联系、探索冰山、多场景练习。 练：寻找联系 兵：发现冰山 场：多场景练习 金句 阅读的本质，是可利用的时间里，以你自己能理解的程序去学习。 好书值得读3遍。 感悟 之前参加了洋葱阅读的线上课程，收获很多。再次读小六的书，感觉把之前上课的内容，又重新过一遍。上完课之后，虽然自己的阅读量加上来了，但发现很多知识点在应用的时候，还是没有落实很好，比如：九宫格的应用。后面一定要加强 最近读了好几天关于阅读方法和思维导图的书，感觉其实原理有很多是重复的，比如：记忆、遗忘、阅读。自己后期在阅读的时候也要多从联通的角度去思考。 ToDo 100张九宫格 ","permalink":"https://shiyuanjie.cn/posts/Book/%E6%B4%8B%E8%91%B1%E9%98%85%E8%AF%BB%E6%B3%95/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://images-cn.ssl-images-amazon.com/images/I/5162btsZOPL.jpg\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e洋葱阅读法\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e彭小六\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e6.8\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e工具\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/30253066/\"\u003e洋葱阅读法\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e快速阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20181115-20181117(2H)\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"洋葱阅读法"},{"content":"书 书名 告别失控：软件开发团队管理必读 作者 Mickey W. Mantle \u0026amp; Ron Lichty 豆瓣评分 8.0 分类 管理 In 豆瓣 告别失控：软件开发团队管理必读 读书方法 快速阅读 阅读时间 20181117-20181123(3H) 问题 软件开发团队是什么样的？ 一群有想法、主见的聪明人组成的团队，有不同的角色分工。 为什么会失控？ 四个管理维度没有控制好 管理失控、预防失控的方法是什么？ 时刻做好四个管理维度 收获 概念卡 程序员 自由主义、个人主义色彩浓厚，聪明、贪玩、好奇、独立的一个工种。 管理的构成 向下管理、管上管理、对外管理和自我管理。 TDD的效果 做TDD对不做TDD需要多花15%的时间 ==\u0026gt;不做TDD的bug为24%，做TDD的bug为38%. 马斯洛需求层次理论 生理需求(基本生活：空气、食物..) \u0026ndash;\u0026gt; 安全需求(保护、安全、法律、约束\u0026hellip;) \u0026ndash;\u0026gt; 隶属与爱的需求(家庭、爱情、关系\u0026hellip;) \u0026ndash;\u0026gt; 尊严需求(成就、地位、责任\u0026hellip;) \u0026ndash;\u0026gt; 自我实现(个人成长与实现) 软件开发生命周期出岔假想图 图片来源:用户研究-开启产品设计的上帝视角 金句 程序设计方面的天赋对杰出程序员的技能反而起副作用。 程序设计经理最重要的工作就是招到正确的人。 给予更多的正面评价，而不是负面。 感悟 书中的内容，从更宽广(传统)的视角来分析项目经理如何管控团队，很多内容也讲的很到位。特别适用于一个项目经理可以管控整个团队，从人员的选取、薪资的调整、职业规范等。 在管理过程中，一定要多注意正向的评价，最好不要用负面评价。 ","permalink":"https://shiyuanjie.cn/posts/Book/%E5%91%8A%E5%88%AB%E5%A4%B1%E6%8E%A7%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%9B%A2%E9%98%9F%E7%AE%A1%E7%90%86%E5%BF%85%E8%AF%BB/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://images-na.ssl-images-amazon.com/images/I/51meRrTrPdL._SX395_BO1,204,203,200_.jpg\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e告别失控：软件开发团队管理必读\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003eMickey W. Mantle \u0026amp; Ron Lichty\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e8.0\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e管理\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/26829089/\"\u003e告别失控：软件开发团队管理必读\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e快速阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20181117-20181123(3H)\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"告别失控：软件开发团队管理必读"},{"content":"书 书名 别说你懂思维导图 作者 赵国庆 豆瓣评分 6.7 分类 思维 In 豆瓣 别说你懂思维导图 读书方法 快速阅读 阅读时间 20181120-20181121 问题 怎样的才算思维导图？ 同时满足：焦点集中，主干发散，层次分明，节点关联，使用不同的颜色、形状、代码 如何制做思维导图？ 1.满足上条 2.禁忌：照搬目录，没有层次，连线没有关系，图中信息量过大，内在逻辑过大 软件VS手绘如何取舍？ 同时使用 收获 概念卡 思维导图 放射性思维的表达，人类思维的自然功能。 特点 禁忌 焦点集中，主干发散，层次分明，节点关联，使用不同的颜色、形状、代码 照搬目录，没有层次，连线没有关系，图中信息量过大、逻辑缺失 常规笔记 VS 思维导图 常规笔记 思维导图 线性为主，断落式、条列式和大纲式。 图形、图像、颜色、线条、关联。 埋没关健字，不易记忆，浪费时间，不能刺激大脑。 焦点集中，主干发散，层次分明，节点相联，结构清晰。 记忆(认知心理学) 名称 特点 感觉记忆 瞬时记忆，容易大但记忆时间知 工作记忆 短时记忆，容量有限，提取效率高 长时记忆 对世界和自身的全部记忆，容易无限 感觉记忆\u0026ndash;\u0026gt;工作记忆\u0026lt;\u0026ndash;\u0026gt;长时记忆\n四象限法 维度：重要、紧急 图片来源：【小說商學院】時間四象限法－工作管理 时间管理\ngraph TD A[明确目标] --\u0026gt; B[任务列举并归类] B --\u0026gt; C[任务分解] C --\u0026gt; D[优先级排序] D --\u0026gt; E[落实时间表] E --\u0026gt; F[执行和检查] F --\u0026gt;|复盘| A 此框架与TEFCAS，有很多的类似。\nIn思维导图 手绘 VS 软件 手绘 软件 优势 随时随地，随心所欲，发挥绘画专长 易学，方便个性、保存、分享 不足 个性、保存、分享不便 配图不好找，依赖电脑 建议：手绘+软件 同时使用\n左右脑 左脑 右脑 专注 语言、逻辑、数学、数字、顺序、词语 韵律、节奏、音乐、图画、想像、图案 人类学习模型 graph TD A[新任务] --\u0026gt; B[自我系统] B --\u0026gt; C{是否介入} C --\u0026gt;|Y| D[元认识系统] C --\u0026gt;|N| E[继续现有任务] D --\u0026gt; F[认知系统] G[知识] --\u0026gt; F 元认识系统：建立目标和策略 认知系统：处理相关系统\n金句 对人类来说，最好的学习方式是模仿，大到治国，小到一个具体的技能，莫不如此。 时间管理是计划将来。 感悟 无论是思维管理、阅读还是工作能力提升，最终要做的事情，都把自己的积累快速提高，并在合适的时间进行利用。 温故而知新，一定要温故，要不真记不住 。这不是你的错，是人的特性决定的。 ToDo 针对有积压工作的情况下，采用四象限 + 时间管理，就可以很好的应对。 ","permalink":"https://shiyuanjie.cn/posts/Book/%E5%88%AB%E8%AF%B4%E4%BD%A0%E6%87%82%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://images-na.ssl-images-amazon.com/images/I/51ldM-FeVlL._SX431_BO1,204,203,200_.jpg\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e别说你懂思维导图\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e赵国庆\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e6.7\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e思维\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/26372189/\"\u003e别说你懂思维导图\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e快速阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20181120-20181121\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"别说你懂思维导图"},{"content":"书 书名 日常生活中的思维导图 作者 矢岛美由希 豆瓣评分 6.6 分类 思维导图 In 豆瓣 日常生活中的思维导图 读书方法 快速阅读 阅读时间 20181119(1小时) 收获 问题 什么是思维导图？ 为了搞高记忆力创造出来的。一种有助于记忆和学习的工具。 日常生活中哪里可以应用思维导图？ 任何地方均可以。如：工作计划、日工作内容、个人介绍、演讲、沟通等。 如何实践思维导图？ 7规则： 1,在纸张上 2,画中心图像 3,使用颜色 4,延展线条(分支) 5,在上面写下语言(词语) 基础版本 6,层次化 7,TEFCAS 强化版本 概念卡 思维导图\n7规则 1,在纸张上 种类：白纸 规格：A4/A3 朝向：横放 2,画中心图像 内容：画 时间：5分钟 大小：拳头 3,使用颜色 涂色：五颜六色 写字：钢笔 4,延展线条(分支) 形状：曲线，尾部向上 粗细：层级粗细分明，根粗尖细 长度：均等分配 5,在上面写下语言(词语) 1分支1词语。线条(分支)上写的不是文章，而是词语 基础版本 6,层次化 分层，排序 7,TEFCAS T：Trial-尝试，E：Event-行动，F：Feedback-反馈，C：Check检查，A：Adjust-调整，S：Success-成功。绘制思维导图时的心理准备-人生的指针。 强化版本\n金句 在文具上奢侈一些。 只要掌握方法，就会无所不能。 绘制思维导图时的心理准备-人生的指针TEFCAS。 感悟 画100张思维导图 之前用过一些PC软件的思维导图软件，MindManager、XMind，主要都是用于工作内容和知识的梳理。也尝试手绘过一些思维导图，但基本都是依据之前在PC使用软件的经验来画的，比较随心。读完作者的书，发现原来思维导图还可以有如些广泛的范围：生活、日常、沟通、演讲，可以覆盖整个生活的方方面面。\nToDo 100张手绘思维导图 ","permalink":"https://shiyuanjie.cn/posts/Book/%E6%97%A5%E5%B8%B8%E7%94%9F%E6%B4%BB%E4%B8%AD%E7%9A%84%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://images-na.ssl-images-amazon.com/images/I/5199MnBGeML._SX385_BO1,204,203,200_.jpg\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e日常生活中的思维导图\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e矢岛美由希\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e6.6\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e思维导图\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/26761558/\"\u003e日常生活中的思维导图\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e快速阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20181119(1小时)\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"日常生活中的思维导图"},{"content":"长年有效，持续更新 思特沃克（全国）重磅岗位，有兴趣的发简历至380774061@qq.com，请注明城市和岗位。\n上海:\nSA解决方案架构师（6年以上）\nUI前端开发工程师（3年以上，英文读写流利）\nJava 后端开发工程师（3年以上，英文读写流利）\nUX 用户体验设计师（5年以上，英文流利）\nBA 业务需求分析师（3年以上，英文商务沟通）\nTechnical Advisor 技术咨询师（8年以上）\nAgile Consultant 敏捷咨询师（8年以上）\nQA 质量分析师（3年以上经验，英文读写流利）\nPM 项目经理（5-10年经验，英文流利）\n成都\nJava 后端开发工程师（3年以上，有TL经验优先）\nUI 前端开发工程师 （3年以上经验）\nUX 用户体验设计师（3年以上经验）\nDE 数据工程师（3年以上经验）\nAgile Consultant 敏捷咨询师（8年以上）\n北京：\nUI前端开发工程师（4年以上经验）\nJava 后端开发工程师（4年以上经验）\nUX 用户体验设计师（3年以上）\nBA 业务需求分析师（3年以上，英文商务沟通）\nPM 项目经理（5-10年经验，英文流利）\nTechnical Advisor 技术咨询师（8年以上）\nAgile Consultant 敏捷咨询师（8年以上）\nDevops 运维工程师(5年以上经验，英文口语加分）\nQA 质量分析师（3年以上经验，英文读写流利）\nDE 数据工程师 （3年以上）\n深圳\nBA 业务需求分析师（3年以上）\nUX 用户体验设计师（1年以上）\nSA 解决方案架构师（3年以上）\nJava 后端开发工程师（5年以上）\n产品经理（8年以上）\nTechnical Advisor 技术咨询师（8年以上）\nAgile Consultant 敏捷咨询师（8年以上）\nDE 数据工程师(3年以上）\nDevops 运维工程师（3年以上）\n武汉\nJava 后端开发工程师（3年以上，英文加分）\nUI 前端开发工程师（3年以上，英文加分）\nBA 业务分析师（5年以上，英文流利）\nTL 技术负责人（5年以上）\nPM 项目经理（5年以上）\nDevOps 运维工程师(3年以上）\n西安：\nC#开发工程师（2年以上，英文好优先）\nJava开发工程师（2年以上，英文好优先）\nUI 前端开发工程师（3年以上）\nQA 质量分析师（3年以上经验）\nBA 业务分析师（2年以上经验）\nDE 数据工程师（3年以上经验）\nDevops 运维工程师(3年以上经验）\nUX 用户体验设计师（5年以上经验）\nPM 项目经理（8年以上）\n","permalink":"https://shiyuanjie.cn/posts/Management/%E6%8B%9B%E8%81%98/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e长年有效，持续更新\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e思特沃克（全国）重磅岗位，有兴趣的发简历至\u003ca href=\"mailto:380774061@qq.com\"\u003e380774061@qq.com\u003c/a\u003e，请注明\u003cstrong\u003e城市和岗位\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e上海:\u003c/p\u003e\n\u003cp\u003eSA解决方案架构师（6年以上）\u003c/p\u003e\n\u003cp\u003eUI前端开发工程师（3年以上，英文读写流利）\u003c/p\u003e\n\u003cp\u003eJava 后端开发工程师（3年以上，英文读写流利）\u003c/p\u003e\n\u003cp\u003eUX 用户体验设计师（5年以上，英文流利）\u003c/p\u003e\n\u003cp\u003eBA 业务需求分析师（3年以上，英文商务沟通）\u003c/p\u003e\n\u003cp\u003eTechnical Advisor 技术咨询师（8年以上）\u003c/p\u003e\n\u003cp\u003eAgile Consultant 敏捷咨询师（8年以上）\u003c/p\u003e","title":"思特沃克(全国)招聘"},{"content":"书 书名 图解HTTP 作者 上野宣 豆瓣评分 8.1 分类 技术 In 豆瓣 图解HTTP 读书方法 快速阅读 阅读时间 20181115-20181115(37分钟) 收获 问题 HTTP是什么？ 网络请求的全流程？ 后续发展是什么？ 概念卡 TCP/IP 是互联网相关的各类协议族的总称。分四层：应用层\u0026lt;-\u0026gt;传输层\u0026lt;-\u0026gt;网络层\u0026lt;-\u0026gt;链路层。 DNS Domain Name System，提供域名到IP地址之间的解析服务。 URI/URL URI：统一资源标识符，标识互联网的某一资源；URL：统一资源定位符，标识资源的位置。URL是URI的子集。 HTTP HyperText Transfer Protocol:超文本传输协议，完成从客户端到服务器的运作流程的约定。 HTTPS HTTPS=HTTP+加密+认证+完整性保护，HTTPS是身披SSL外壳的HTTP。 金句 三次握手：TCP协议包发出后，向对方发出的确认。SYN\u0026ndash;\u0026gt;SYN/ACK\u0026ndash;\u0026gt;ACK HTTPS是身披SSL外壳的HTTP。 感悟 虽然使用互联网这么久了，但其实对整个请求流程的了解还不到位。后面需要考虑是否需要把自己个人网站加上HTTPS，尝试下HTTPS的申请、使用、配制的全流程。\n","permalink":"https://shiyuanjie.cn/posts/Book/%E5%9B%BE%E8%A7%A3HTTP/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://images-na.ssl-images-amazon.com/images/I/41rIT5V1tiL._SX381_BO1,204,203,200_.jpg\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e书名\u003c/th\u003e\n          \u003cth\u003e图解HTTP\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e作者\u003c/td\u003e\n          \u003ctd\u003e上野宣\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣评分\u003c/td\u003e\n          \u003ctd\u003e8.1\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e分类\u003c/td\u003e\n          \u003ctd\u003e技术\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eIn 豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://book.douban.com/subject/25863515/\"\u003e图解HTTP\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e读书方法\u003c/td\u003e\n          \u003ctd\u003e快速阅读\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e阅读时间\u003c/td\u003e\n          \u003ctd\u003e20181115-20181115(37分钟)\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"图解HTTP"},{"content":"书 作者：野口真人 豆瓣评分：7.2 分类：理财 In 豆瓣：学全花钱 收获 概念卡 花钱 决定因素：得到的价值 \u0026gt; 支出的金钱(价格) 钱包中钱的分类 消费：为了满足欲望，消耗资产、服务 投资：为了增加将来的资本(生产能力)，投入现有的资本 投机：估好会亏损的准备，挑战一下，看是否能得到比付出更多的回报 价格 由需求与供给决定。 收益现值法(DCF:Discounted Cash Flow) 通过将来产生的现金流量，推导出物品价值的估值方法 企业价值框架(人、物、钱) 金句 巧妙地花一笔钱和挣到这笔钱一样困难。 钱不能买到幸福。但是，钱可以让你在不幸时衣食无忧。 最具现金流量创建能力的是人。 现金是死的，人才是最重要的，因为人能创建现金流量。 感悟 后期花钱时，要多衡量其所带来的价值，不能为了买而买。 引导老婆学习花钱的方法，并引导她学习现金需要动起来才有价值。 人无论在社会还是在企业中，提升自己的价值才是最重要的。所以，要想各种方式来最大化的提升自己。 读书时间20181102-20181114 阅读方法：快速阅读","permalink":"https://shiyuanjie.cn/posts/Book/%E5%AD%A6%E4%BC%9A%E8%8A%B1%E9%92%B1/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img1.doubanio.com/view/subject/l/public/s28929737.jpg\"\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e作者：野口真人\u003c/li\u003e\n\u003cli\u003e豆瓣评分：7.2\u003c/li\u003e\n\u003cli\u003e分类：理财\u003c/li\u003e\n\u003cli\u003eIn 豆瓣：\u003ca href=\"https://book.douban.com/subject/26844959/\"\u003e学全花钱\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"收获\"\u003e收获\u003c/h2\u003e\n\u003ch3 id=\"概念卡\"\u003e概念卡\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e花钱\n决定因素：\u003ccode\u003e得到的价值\u003c/code\u003e \u0026gt; \u003ccode\u003e支出的金钱(价格)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e钱包中钱的分类\n\u003cul\u003e\n\u003cli\u003e消费：为了满足欲望，消耗资产、服务\u003c/li\u003e\n\u003cli\u003e投资：为了增加\u003ccode\u003e将来\u003c/code\u003e的资本(生产能力)，投入现有的资本\u003c/li\u003e\n\u003cli\u003e投机：估好会亏损的准备，挑战一下，看是否能得到比付出\u003ccode\u003e更多\u003c/code\u003e的回报\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e价格\n由需求与供给决定。\n\u003cimg alt=\"Supply-demand-equilibrium\" loading=\"lazy\" src=\"https://upload.wikimedia.org/wikipedia/commons/8/8c/Supply-demand-equilibrium.svg\"\u003e\u003c/li\u003e\n\u003cli\u003e收益现值法(DCF:Discounted Cash Flow)\n通过将来产生的现金流量，推导出物品价值的估值方法\u003c/li\u003e\n\u003cli\u003e企业价值框架(人、物、钱)\u003c/li\u003e\n\u003c/ul\u003e","title":"学会花钱"},{"content":"\n收获 概念卡 无\n金句 这个社会不存在`上流人士`，只是每个人的博弈位置不同而已。而这个不同的位置，恰恰是由于我们对博弈本质的理解所造成的。 人的性格决定人的命运。 有人的地方，就有左中右。 感悟 整本书还不错，职场故事、玩法说的比较多。作者的老江湖玩法也很给力。我们在职场中做事情的时候，需要更多的关注事情究竟是什么？ 有些情况感觉有点拖沓，第一次读雾满拦江的书，以后有机会再拜读其它的书。 读书时间20181022-20181112","permalink":"https://shiyuanjie.cn/posts/Book/%E8%81%8C%E5%9C%BA%E5%A5%8B%E6%96%97%E8%AE%A1/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img3.doubanio.com/view/subject/l/public/s3587205.jpg\"\u003e\u003c/p\u003e\n\u003ch2 id=\"收获\"\u003e收获\u003c/h2\u003e\n\u003ch3 id=\"概念卡\"\u003e概念卡\u003c/h3\u003e\n\u003cp\u003e无\u003c/p\u003e\n\u003ch3 id=\"金句\"\u003e金句\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e这个社会不存在`上流人士`，只是每个人的博弈位置不同而已。而这个不同的位置，恰恰是由于我们对博弈本质的理解所造成的。\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e人的性格决定人的命运。\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e有人的地方，就有左中右。\n\u003c/code\u003e\u003c/pre\u003e","title":"职场奋斗记"},{"content":"\n收获 概念卡 快与慢 快：可快速作出反映，不需要经过大脑过滤。 ==\u0026gt;系统1 慢：需要经过大脑仔细思考、分析。==\u0026gt;系统2 光环效应 喜欢(讨厌)某人就会喜欢(讨厌)这个的人全部(包含你没有观察到的方面)，的这种倾向 - 避免`光环效应`：消除错误的关联 - 应用：在讨论问题前，先让所有人进行自己的思考。确保在讨论的时候，不被其他人带走 金句 无\n感悟 认识到自己在沟通、做事过程中大脑的动作原理，我们很多时候的一些动作是基于系统1的决定，其实这个时候需要的是系统2参与。 这种偏理论性的书籍读进来，还是有点吃力，速读了此书，还是有一定的收获。后续有时间，再拿出来复习。 读书时间20181022-20181105","permalink":"https://shiyuanjie.cn/posts/Book/%E6%80%9D%E8%80%83%E5%BF%AB%E4%B8%8E%E6%85%A2/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img1.doubanio.com/view/subject/l/public/s10345719.jpg\"\u003e\u003c/p\u003e\n\u003ch2 id=\"收获\"\u003e收获\u003c/h2\u003e\n\u003ch3 id=\"概念卡\"\u003e概念卡\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e快与慢\n\u003cul\u003e\n\u003cli\u003e快：可快速作出反映，不需要经过大脑过滤。 ==\u0026gt;\u003ccode\u003e系统1\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e慢：需要经过大脑仔细思考、分析。==\u0026gt;\u003ccode\u003e系统2\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e光环效应\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e喜欢(讨厌)某人就会喜欢(讨厌)这个的人全部(包含你没有观察到的方面)，的这种倾向\n\u003c/code\u003e\u003c/pre\u003e\u003cpre\u003e\u003ccode\u003e- 避免`光环效应`：消除错误的关联\n- 应用：在讨论问题前，先让所有人进行自己的思考。确保在讨论的时候，不被其他人带走\n\u003c/code\u003e\u003c/pre\u003e","title":"思考，快与慢"},{"content":"感悟 值得推荐的一本书，整本小说中基本全部围绕在一个山庄里发生与结束。但更多的是人性的细节，高之作为朋美最喜欢的人，也是即将步入婚姻一对夫妻，很难想像到是因为高之喜欢了朋美的好友雪慧，从而对朋美起了杀意。\n也许，这些事情很难在自己生活中发生，但它对人性真实想法的解读，很精细。\n假面应该就是很多时候，面对生活时候的样子。主人公高之的假面带得很不错，但其实他才是书中最恶的人。如何用合适的方式，看懂别人的假面，我们要如何处理，正是需要反思的。\n阅读时间：20181020-20181023","permalink":"https://shiyuanjie.cn/posts/Book/%E5%81%87%E9%9D%A2%E5%B1%B1%E5%BA%84/","summary":"\u003ch4 id=\"感悟\"\u003e感悟\u003c/h4\u003e\n\u003cp\u003e值得推荐的一本书，整本小说中基本全部围绕在一个山庄里发生与结束。但更多的是人性的细节，\u003ccode\u003e高之\u003c/code\u003e作为\u003ccode\u003e朋美\u003c/code\u003e最喜欢的人，也是即将步入婚姻一对夫妻，很难想像到是因为\u003ccode\u003e高之\u003c/code\u003e喜欢了\u003ccode\u003e朋美\u003c/code\u003e的好友\u003ccode\u003e雪慧\u003c/code\u003e，从而对\u003ccode\u003e朋美\u003c/code\u003e起了\u003cstrong\u003e杀意\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e也许，这些事情很难在自己生活中发生，但它对人性真实想法的解读，很精细。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e假面\u003c/code\u003e应该就是很多时候，面对生活时候的样子。主人公\u003ccode\u003e高之\u003c/code\u003e的\u003ccode\u003e假面\u003c/code\u003e带得很不错，但其实他才是书中最恶的人。如何用合适的方式，看懂别人的\u003ccode\u003e假面\u003c/code\u003e，我们要如何处理，正是需要反思的。\u003c/p\u003e","title":"假面山庄"},{"content":"问题由于网站的大部分床图一直使用的是七牛的，近期官网更新，导致原测试域名已失效，之前在测试域名存储的图片无法访问、查看、下载，网站文章关联的图片无法正常查看。所以决定把图片从七牛迁移至Github来存储，弃用七牛云。\n七牛融合 CDN 测试域名（以 clouddn.com/qiniucdn.com/qiniudn.com/qnssl.com/qbox.me 结尾），每个域名每日限总流量 10GB， 每个测试域名自创建起 30 个自然日后系统会自动回收，仅供测试使用，详情查看 七牛测试域名使用规范 。 具体操作分三步 - Step1:从废弃测试域名空间至可用测试域名空间迁移 - Step2:从测试域名的空间下载至本机 - Step3:从本机上传至Github中 Step1:从废弃测试域名空间至可用测试域名空间迁移 废弃测试域名空间：bucketA，可用测试域名空间：bucketB\n下载qshell包到本机，解压，查看是否可以正常运行 ➜ qshell-v2.2.0 ./qshell-darwin-x64 -v QShell/v2.2.0 (darwin; amd64; go1.9) 执行./qshell-darwin-x64 account AK SK配制自己的账号信息，AK/SK查看方法https://portal.qiniu.com/user/key，检验是否配制成功 ➜ qshell-v2.2.0 ./qshell-darwin-x64 account AccessKey: Your AK SecretKey: Your SK 使用导出文件列表命令，导出需要迁移的bucketA文件列表 ➜ qshell-v2.2.0 ./qshell-darwin-x64 listbucket bucketA tocopy.txt 需要手动把tocopy.txt中的的每行内容修改为仅有文件名\n执行平移(batchcopy)命令\n➜ qshell-v2.2.0 ./qshell-darwin-x64 batchcopy --force --overwrite bucketA bucketB tocopy.txt 至些，已完成失败图片的救援工作。\nStep2:从测试域名的空间下载至本机 新增一个qdownload配制文件，具体使用参考，精简版本如下： { \u0026#34;dest_dir\u0026#34; : \u0026#34;YourDownloadPath\u0026#34;, \u0026#34;bucket\u0026#34; : \u0026#34;bucketB\u0026#34;, \u0026#34;cdn_domain\u0026#34; : \u0026#34;ConfigYourTestCDNDomain\u0026#34; } 如果不配制cdn_domain的话，需支付源站流量费用，无法减免。官方说法，官方说法，官方说法\n执行下载命令，便会开始进入图片下载 ./qshell-darwin-x64 qdownload 10 download.conf 下载结束后，会生成一个下载日志文件，用于查看下载过程。至此，所有图片已下载至本机\nStep3:从本机上传至Github中 将本机图片上传至Github中(依据自己的喜好，随便存) 修改原来文章中的链接地址指向七牛的地址，全部重新指向Github地址。 经测试，所有图片均可正常打开，网站的图片均可正常打开及查看。\n","permalink":"https://shiyuanjie.cn/posts/Tools/%E4%B8%83%E7%89%9B%E5%BA%8A%E5%9B%BE%E8%BF%81%E7%A7%BB%E8%87%B3Github/","summary":"\u003cp\u003e问题由于网站的大部分床图一直使用的是七牛的，近期\u003ca href=\"https://developer.qiniu.com/fusion/kb/1319/test-domain-access-restriction-rules\"\u003e官网更新\u003c/a\u003e，导致原测试域名已失效，之前在测试域名存储的图片无法\u003ccode\u003e访问、查看、下载\u003c/code\u003e，网站文章关联的图片无法正常查看。所以决定\u003cstrong\u003e把图片从七牛迁移至Github来存储，弃用七牛云\u003c/strong\u003e。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e七牛融合 CDN 测试域名（以 clouddn.com/qiniucdn.com/qiniudn.com/qnssl.com/qbox.me 结尾），每个域名每日限总流量 10GB，\n每个测试域名自创建起 30 个自然日后系统会自动回收，仅供测试使用，详情查看 七牛测试域名使用规范 。\n\u003c/code\u003e\u003c/pre\u003e","title":"七牛床图迁移至Github"},{"content":"JMeter官方在20180918发布了JMeter 5.0版本，主要涉及的更新内容如下：\n新增XPath2 extractor元素，用于XML处理 增强Flow Control Action Result Status Action Handler控制器的能力 强化搜索功能，便于在编写JMeter过程中进行搜索 强化录制功能，使用顶部悬浮的特点，便于对录制过程的处理 UI界面中，新增重启功能 HTML Web报告中，新增实时吞吐量显示 HTML Web报告中，新增Custom Graphs section用于个性化图表定制 原文链接：http://jmeter.apache.org/changes.html JMeter5.0下载：http://jmeter.apache.org/download_jmeter.cgi\n核心能力提升 请求能力提升 - Multipart/form-data请求现在支持PUT,DELETE\u0026hellip; - 支持已附件的形式发送JSON数据文件，选择对应的文件路径配制即可 - PUT等请求类型支持Multipart/form-data选项\n在分布式测试中，JMeter自动添加测试机的IP和Port作为线程的前缀名，这样就可以在HTML报告中正确的统计线程数量，而不需要做其它的配制。\nXPath 2.0新增一个元素XPath2 extractor，快速处理XML，与XPath语法保持一致并且有更好的性能。\n已全部更新并支持HTTP模块的最新4.6API，JMeter不再支持此模块已经废弃的API。\n现在更加容易的控制在Loop循环中的中断和跳转至下一循环。可以在Flow Control Action 和 Result Status Action Handler的元素中使用。\nWhile循环现在会抛出一个变量，包含以__jm__\u0026lt;Name of your element\u0026gt;__idx命名的当前索引。比如，如果你的While循环名为WC，那么，你可以使用${__jm__WC__idx}来获取循环的索引\n脚本/调试增强 提升搜索特性，你可以在整个树中进行搜索。可以通过使用Next/Previous/Replace/Replace All/Replace \u0026amp; Find来进行替换或搜索。\n在结果树中，请求和响应的请求头和请求体被清晰的分开，这样就可以更好的检视请求和响应。也可以在所有的Tab中搜索部分值。\n录制特性增加了一个始终在顶部的弹出框，当你在浏览器中操作时，可以命名你的事务。\n现在可以通过菜单File --\u0026gt; Restart来重启JMeter。\n实时报告和网页报告 报告功能也被增强。\nHTML网页报告中新增图表统计每秒的总事务数量。\n现在可以通过sample_variables中的变量来自定义图表。这些定制图表会展示在HTML网页报告的Custom Graphs section中。\n每秒命中次数也被添加了进来。\n在实时报告中，发送和请求的数据被发送至后端(InfluxDB或Graphite)。\n","permalink":"https://shiyuanjie.cn/posts/JMeter/JMeter5.0%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/","summary":"\u003cp\u003e\u003ca href=\"http://jmeter.apache.org/\"\u003eJMeter\u003c/a\u003e官方在\u003ccode\u003e20180918\u003c/code\u003e发布了JMeter 5.0版本，主要涉及的更新内容如下：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e新增\u003ccode\u003eXPath2 extractor\u003c/code\u003e元素，用于XML处理\u003c/li\u003e\n\u003cli\u003e增强\u003ccode\u003eFlow Control Action\u003c/code\u003e \u003ccode\u003eResult Status Action Handler\u003c/code\u003e控制器的能力\u003c/li\u003e\n\u003cli\u003e强化搜索功能，便于在编写JMeter过程中进行搜索\u003c/li\u003e\n\u003cli\u003e强化\u003ccode\u003e录制功能\u003c/code\u003e，使用顶部悬浮的特点，便于对录制过程的处理\u003c/li\u003e\n\u003cli\u003eUI界面中，新增\u003ccode\u003e重启\u003c/code\u003e功能\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eHTML Web\u003c/code\u003e报告中，新增\u003ccode\u003e实时\u003c/code\u003e吞吐量显示\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eHTML Web\u003c/code\u003e报告中，新增\u003ccode\u003eCustom Graphs section\u003c/code\u003e用于个性化图表定制\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e原文链接：\u003ca href=\"http://jmeter.apache.org/changes.html\"\u003ehttp://jmeter.apache.org/changes.html\u003c/a\u003e\nJMeter5.0下载：\u003ca href=\"http://jmeter.apache.org/download_jmeter.cgi\"\u003ehttp://jmeter.apache.org/download_jmeter.cgi\u003c/a\u003e\u003c/p\u003e","title":"JMeter5.0更新内容"},{"content":"最近很长一断时间都比较喜欢用Markdown来编写文件，自己日常的工作和记录也一直都在用Evernote来进行. 看到Evernote在8.20发布的Mac 8.2.0 beta1版本支持Markdown格式的笔记了，赶紧来试下用。 版本支持 仅Mac的Beta版本支持此功能\n版本下载 地址：https://cdn.yinxiang.com/mac-smd/prerelease/YinxiangBiji_BETA_8.2.0_beta_1_457096.dmg\nPS：如果电脑里面已经有之前的版本，安装结束后，会共存两个版本。\n使用Markdown笔记 创建Markdown笔记 在新版本中，左上角会有一个\u0026quot;New Markdown Note\u0026quot;的按钮，点击即可新增一 会创建一个空的Markdown的笔记，默认会显示编辑和预览两种状态 此时就可以直接进行Markdown的内容编辑了，常见的Markdown标签可直接使用。如：标题、加粗、斜体等。\n当然印象笔记的可不限于这些功能，还带了以下功能\n表格，如：3*5的表格 数学公式 流程图 时序图 甘特图 编辑模式下的背影，也支持较种颜色切换：白色、黑色、印象绿、深空灰\n当然之前印象笔记通用的功能，也是还都存在的。比如：共享编辑、提醒、导出PDF、标注笔记。\n不足 流程图、甘特图等在笔记缩略内容显示时，会不正常 保存的Markdown文件，在手机端仅支持查看，无法编辑。\n总结 印象笔记对Markdown的支持总体还是不错的，满足日常的文档编写完全够用了。还新增了流程图、甘特图、时序图这些增强的功能，总体很不错。 值得尝试！ 参考 印象笔记 Markdown 入门指南 印象笔记-官网 Mac版本更新说明 ","permalink":"https://shiyuanjie.cn/posts/Tools/%E5%8D%B0%E8%B1%A1%E7%AC%94%E8%AE%B0%E6%94%AF%E6%8C%81Markdown/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e最近很长一断时间都比较喜欢用Markdown来编写文件，自己日常的工作和记录也一直都在用Evernote来进行.\n看到Evernote在8.20发布的Mac 8.2.0 beta1版本支持Markdown格式的笔记了，赶紧来试下用。\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"版本支持\"\u003e版本支持\u003c/h2\u003e\n\u003cp\u003e仅\u003cstrong\u003eMac的Beta版本\u003c/strong\u003e支持此功能\u003c/p\u003e\n\u003ch2 id=\"版本下载\"\u003e版本下载\u003c/h2\u003e\n\u003cp\u003e地址：\u003ca href=\"https://cdn.yinxiang.com/mac-smd/prerelease/YinxiangBiji_BETA_8.2.0_beta_1_457096.dmg\"\u003ehttps://cdn.yinxiang.com/mac-smd/prerelease/YinxiangBiji_BETA_8.2.0_beta_1_457096.dmg\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ePS：如果电脑里面已经有之前的版本，安装结束后，会共存\u003cstrong\u003e两个\u003c/strong\u003e版本。\u003c/p\u003e\n\u003c!-- more --\u003e\n\u003ch2 id=\"使用markdown笔记\"\u003e使用Markdown笔记\u003c/h2\u003e\n\u003ch3 id=\"创建markdown笔记\"\u003e创建Markdown笔记\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e在新版本中，左上角会有一个\u0026quot;New Markdown Note\u0026quot;的按钮，点击即可新增一\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Tools/%E5%8D%B0%E8%B1%A1%E7%AC%94%E8%AE%B0%E6%94%AF%E6%8C%81Markdown/NewMarkdownNote_hu_9c69eae9959d71e0.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"New Markdown Note\" loading=\"lazy\" src=\"/posts/Tools/%E5%8D%B0%E8%B1%A1%E7%AC%94%E8%AE%B0%E6%94%AF%E6%8C%81Markdown/NewMarkdownNote.png\"\u003e\u003c/picture\u003e\u003c/p\u003e","title":"印象笔记支持Markdown"},{"content":"截止目前，个人阅读中，针对个人成长，总结最详细和接地气的一本书。 收获 概念卡 跃迁：是一种跨越式成长，一种能量激发下的突变。 跃迁的三种状态：认知跃迁、能力跃迁、能级跃迁 外包大脑：把不重要的技能外包，聚集核心技能的路迁 高手战略：找到高价值区，战略性专注，用最有把握的方式取胜。 OODA循环：O-观察（observe）、O-调整（orient）、D-决策（decide）、A-行动（action），通常使用四步不断的循环 三看读书法：看书评、看目录、看具体章节 开放而专注九律： 见得人好，经常随喜赞叹。 找到自己领域的知识源头，并分享。 不随便崇拜谁。一旦崇拜，以他为顶，你的系统就又封闭了。 不再认为自己不喜欢、看不懂的东西就是傻。 小心那些\u0026quot;一切都能解释得通\u0026quot;的上帝视角感理论。 对水平没你高的要宽容，因为你也没有掌握真理。 留出10%-30%的时间，给自己不懂也不太会接触的领域。 站在更高视角，发现和专注于自己的独特之处。 专注于自己的人生大问题。 迟钝而有趣七律： 对不重要的事情，漠不关心。 忍住第一反应，等待第二反应。 不追热点，等要点浮现。 寻求整体最优解，站在长周期做判断。 多元，定期做点不靠谱、有趣无用的事。 成功是小概率事件，找到自己的无限游戏。 放下焦虑，不要放下好奇心。 金句 要多努力，才能看起来毫不费力？ 如果你要指点四周风景，你先要自己爬到屋顶。 不上场，你根本不知道什么是核心优势。 面对世界，开放而专注，进入系统。 面对自己，迟钝而有趣，智慧而超然。 面对他人，简单、善良、可激怒。 面对不确定，善良此吧！ 感悟 第一本认真看完的成长类书籍，真心不错，强烈安利。 书中的知识点和总结太多了，自己读了一轮，感觉认识了很多，以后还会再重读。 想要得到跃迁的变化，一定要经历很多并要有足够多的坚持和实践。 认识自己，才能真正的成长。 阅读时间：20180707","permalink":"https://shiyuanjie.cn/posts/Book/%E8%B7%83%E8%BF%81/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e截止目前，个人阅读中，针对个人成长，总结最详细和接地气的一本书。\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"收获\"\u003e收获\u003c/h2\u003e\n\u003ch4 id=\"概念卡\"\u003e概念卡\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e跃迁：是一种跨越式成长，一种能量激发下的突变。\u003c/li\u003e\n\u003cli\u003e跃迁的三种状态：认知跃迁、能力跃迁、能级跃迁\u003c/li\u003e\n\u003cli\u003e外包大脑：把不\u003ccode\u003e重要\u003c/code\u003e的技能外包，聚集核心技能的路迁\u003c/li\u003e\n\u003cli\u003e高手战略：找到高价值区，战略性专注，用最有把握的方式取胜。\u003c/li\u003e\n\u003cli\u003eOODA循环：O-观察（observe）、O-调整（orient）、D-决策（decide）、A-行动（action），通常使用四步不断的循环\u003c/li\u003e\n\u003cli\u003e三\u003ccode\u003e看\u003c/code\u003e读书法：看书评、看目录、看具体章节\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e开放而专注\u003c/code\u003e九律：\n\u003col\u003e\n\u003cli\u003e见得人好，经常随喜赞叹。\u003c/li\u003e\n\u003cli\u003e找到自己领域的知识源头，并分享。\u003c/li\u003e\n\u003cli\u003e不随便崇拜谁。一旦崇拜，以他为顶，你的系统就又封闭了。\u003c/li\u003e\n\u003cli\u003e不再认为自己不喜欢、看不懂的东西就是傻。\u003c/li\u003e\n\u003cli\u003e小心那些\u0026quot;一切都能解释得通\u0026quot;的上帝视角感理论。\u003c/li\u003e\n\u003cli\u003e对水平没你高的要宽容，因为你也没有掌握真理。\u003c/li\u003e\n\u003cli\u003e留出10%-30%的时间，给自己不懂也不太会接触的领域。\u003c/li\u003e\n\u003cli\u003e站在更高视角，发现和专注于自己的独特之处。\u003c/li\u003e\n\u003cli\u003e专注于自己的人生大问题。\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e迟钝而有趣\u003c/code\u003e七律：\n\u003col\u003e\n\u003cli\u003e对不重要的事情，漠不关心。\u003c/li\u003e\n\u003cli\u003e忍住第一反应，等待第二反应。\u003c/li\u003e\n\u003cli\u003e不追热点，等要点浮现。\u003c/li\u003e\n\u003cli\u003e寻求整体最优解，站在长周期做判断。\u003c/li\u003e\n\u003cli\u003e多元，定期做点不靠谱、有趣无用的事。\u003c/li\u003e\n\u003cli\u003e成功是小概率事件，找到自己的无限游戏。\u003c/li\u003e\n\u003cli\u003e放下焦虑，不要放下好奇心。\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"金句\"\u003e金句\u003c/h4\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e要多努力，才能看起来毫不费力？\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e如果你要指点四周风景，你先要自己爬到屋顶。\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e不上场，你根本不知道什么是核心优势。\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e面对世界，开放而专注，进入系统。\n面对自己，迟钝而有趣，智慧而超然。\n面对他人，简单、善良、可激怒。\n面对不确定，善良此吧！\n\u003c/code\u003e\u003c/pre\u003e","title":"跃迁"},{"content":"收获 概念卡 无\n金句 如果你用正确的方式思考，那么一切皆有可能 有决心的人总能找到办法，解决别人解决不了的问题 时间不会向前流动，你们就不会长大 世上好东西的命运都一样 感悟 谁都无法阻挡时间的流动，但我们能做好的，就是让时间过得有价值。用自己的努力，去让时间的流动都有价值。\n我们无法让别人改变对自己的看法，只能通过自己的努力，让别人看到我们是什么样子的。\n多花一些时间，陪陪家人，做一些自己真正想做的事情。不要然，时间就会走的很快，而且会不够用。\n阅读时间：20180623","permalink":"https://shiyuanjie.cn/posts/Book/%E5%AF%BB%E6%89%BE%E6%97%B6%E9%97%B4%E7%9A%84%E4%BA%BA/","summary":"\u003ch2 id=\"收获\"\u003e收获\u003c/h2\u003e\n\u003ch4 id=\"概念卡\"\u003e概念卡\u003c/h4\u003e\n\u003cp\u003e无\u003c/p\u003e\n\u003ch4 id=\"金句\"\u003e金句\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e如果你用正确的方式思考，那么一切皆有可能\u003c/li\u003e\n\u003cli\u003e有决心的人总能找到办法，解决别人解决不了的问题\u003c/li\u003e\n\u003cli\u003e时间不会向前流动，你们就不会长大\u003c/li\u003e\n\u003cli\u003e世上好东西的命运都一样\u003c/li\u003e\n\u003c/ul\u003e","title":"寻找时间的人"},{"content":"最近在出差，刚好住的酒店有游泳池。晚上有时有空就和同事一起去学习游泳，自己之前只去过三次泳池。但还是没有完全学会。\n今天在知乎上看到梦觉在 B站的系列课程，很不错。整理如下，为以后自己的游泳学习做个备忘。\n怎样快速有效地学习游泳\n梦觉教游泳.蛙泳入门合集\n以下内容摘抄自怎样快速有效地学习游泳。\n换气 陆上换气练习 分两个部分: 抬头张开嘴巴吸气。 闭紧嘴，低头，眼睛看着地上，发出“唔~”的声音来，练这个内容时，你自己心里要有个底，声音能发多久，你也就能把头埋在水中多久。 “不怕不怕”方法： 低头说“不~~~~~~~~~~~~~~~~”，抬头说“怕”。 “不~~~”，是为了在水中吐泡泡，“怕”，是为了抬头换气时嘴巴仍在呼气。 水上换气练习 下水，最好是能站到池底的地方，最好是双手扶着池边，练习内容还是那两个部分。 刚开始下水可能会感到胸闷，吸不上来气，这是因为水对胸腔的压力，属于超级正常的，多做深呼吸，习惯了就一点事都没了。 抬头张开嘴巴吸气 闭紧嘴，低头（眼睛看着地上），发出（唔·····）的声音来。 鼻子会出泡泡，就OK拉。 注意：有的人嘴巴或鼻子碰到了水，会因为恐惧啊不习惯啊各种原因而终止了发出声音，也就没有泡泡啦。 连续换气 很简单，就是把换气连起来做，有的人5秒就会，有的人还是需要一个练习的过程才能掌握。 连续换气讲究的就是个连贯，别抬头后呼次呼次呼吸几次。抬头只呼一次和吸一次气，快速低头，来跟着下面练。 抬头张开嘴巴吸气。 闭紧嘴，低头入水（眼睛看着地上），发出（唔·····）的声音来，呼气。 呼气差不多了，要抬头，抬头的过程中一直保持呼气就行，从水中一直呼气到水面上，再维持吐气2秒。 两秒后，张开嘴巴吸气（这不是死时间，随着练习的熟练，你可以越来越快，越快越好），低头发出（唔·····）的声音来，如此循环。 注意：呼气时不要把嘴巴张好大，平时你怎么吹蜡烛，怎么吹干指甲油，怎么帮别人吹眼睛里面的灰，就怎么吹气。 连续换气练习过程简单来讲就是 吸气 低头 “不~~~~~~~~~~~~” 抬头 “怕~~” 吸气 低头 “不~~~~~~~~~~~~” 抬头 “怕~~” 再强调一次，连续换气，抬头只呼一次气和吸一次气。 开始的时候可以慢一点，然后再慢一些，抬头出水面呼气可以3秒，可以5秒，呼完气后开张嘴巴吸气，吸饱了就快些低头吧。\n练好连续换气是练好游泳的基础，别到时练好了蛙泳的手和腿，换气不行，抬头换一次气要个7、8秒。 有人要问，在水里到底是嘴巴呼气还是鼻子呼气？ 答，都对，你可以都尝试一下，简单得很，而自然才是最好的。\n换气请经常练习，自己觉得自己还不熟练的，一定要常练习，当然了，也不要死磕，练了那么百八十次后，可以练练别的内容。\n漂浮 漂浮，在练换气时，双手扶着岸边，一低头一放松，身体就飘起来了，要做的就是把身体和腿伸直。\n在这说一下，在原地漂不漂得起来，第一因素其实是身体的密度，你不得不承认，人与人之间得差别还是挺大的。 练习内容 ： 最好是在站得到底的泳池，背靠着池边，双手向前伸直。 吸气 低头 双脚蹬离池边（一定要先低头，再蹬池边啊啊啊） 注意：\n手向前伸直。（肘关节不要弯） 眼睛看着池底，或是头顶对着前方，或是下巴贴着脖子，其实这三个描述的是同一个动作。 双腿蹬离池边后伸直并拢。 没错，就是直直的，超直，按一个小学员的话来说，就是像警察叔叔那么直。 能漂多远取决于一下几点：\n要求的动作是否做好了。 好多人都喜欢在漂浮时眼睛看着前面，然后身体就沉得快，然后就漂不动了 憋气时间的长短 双腿蹬离池边的力量， 时间长＋速度快=距离长（废话···） 这个练一下就行了，但请你好好的练，基础扎实些，以后的路好走。\n再需要注意的几点：\n一开始练习的时候，一定要注意顺序，不要先 手往下压水抬头，脚还在后头漂着，没有支撑点，会马上下沉，容易引起初学者心理上的慌张，也容易呛水。 动作慢一点可以，快一点也可以，多做几个动作，也行，我有个学员，每次都做踩单车一样的动作来让下半身下沉。。。有个过渡，没什么不对，但在熟练之后，尽量控制自己的动作，尽量做到动作少，又有效，是最好的。 一开始不要在深水练习。 蛙泳腿 蛙泳腿，先分三个部分动作来学（一般说是四部分，即收腿，翻腿，蹬腿，夹腿）。\n上半身趴在躺椅或者沙发或者床上，下半身悬空。\n准备动作，双腿伸直并拢。\n收腿，小腿收起来，脚掌尽量贴紧屁股，大腿不动，小腿收回来。 翻腿，大腿仍然尽量保持不动，小腿往两边翻开，此时脚掌要勾起来,这个动作做标准了，从正后方看上去，就是个标准的Ｗ形。 蹬夹腿，脚一边往两边蹬出去一边往中间夹紧，伸直并拢。 很简单有没有。下面详细来说说。\n陆上蛙泳腿动作练习 第一阶段 先按上面的来练习。上半身趴在躺椅上，下半身悬空。 1.收腿，脚掌尽量贴紧屁股，大腿不动，小腿收回来。 注意，很多很多的人会犯的一个错误就是会把大腿往肚子的方向收，这点要特别注意，小腿收回时，也不要求大腿直直的对着后面，这样脚掌容易出水面，往后面蹬腿时，就蹬空气了。稍稍往下沉一些，是可以的，大腿与水面的夹角大概是15度到30度。\n大概这样子\n2.翻腿，大腿仍然尽量保持不动，小腿往两边翻开，此时脚掌要勾起来,这个动作做标准了，从正后方看上去，就是个标准的Ｗ形。 注意，小腿尽量往两边翻开，尽量往屁股方向贴近，贴得越紧，蹬腿的距离越长，动力更大。\n3.蹬夹腿，脚一边往两边蹬出去一边往中间夹紧，伸直并拢。\n第二阶段 1.直接翻腿，双腿直接由伸直并拢变成Ｗ形，注意，脚掌要勾起来。 2..蹬夹腿，脚一边往两边蹬出去一边往中间夹紧，伸直并拢。 注意，腿往两边是蹬出去，也就是说蹬腿的过程中，脚掌一直是勾着的，不是脚掌绷直从上往下用脚背打水，而是脚丫心对着后侧方蹬出去。这个是很多很多人会犯的一个错误，而且还挺难改，请一定注意好。 在陆地上模仿蹬腿练习时，要假装用力蹬，至少在脑子里用力，模拟在水中的感觉。但别真的很用力。当年我给学生做示范，说要用力用力，结果一小朋友蹬腿一用力，没收住，脚趾头磕地上，瞬时哭天喊地的…..\n双腿伸直并拢后，脚掌可以放松了。\n练习方法：先做好准备动作。 数一，做动作1； 数二，做动作2。 然后双腿伸直并拢停3秒，再重复数一。 多练习几次，至少在脑袋中有个动作的印象。\n第三阶段 数一，做动作1+2，也就是做一个完整的蛙泳腿动作。再加上三秒的停留时间。 在这里，动作要连贯，不能再出现第二阶段中，做完动作1，之后的停顿。 连贯无关快慢，连贯即是，没有停顿。当然，一个动作做完，还是要停顿三秒。 多练习几次。\n半陆半水蛙泳腿动作练习 上半身在池边上，下半身在水中，要求泳池的池壁和水面落差不大，如果落差太大，那\u0026hellip;只好\u0026hellip;你双手扶着池壁，叫一个人捧着你的肚子，让你漂起来\u0026hellip;\n第一阶段 数一，做动作1； 数二，做动作2。 仍是练这个，20次。\n第二阶段 数一个数，做一个完整的动作。练20次。 注意，腿在水中，可以发力蹬腿了，但请不要从上往下去打水，别水花四溅还很嗨。腿是向后侧方，一边蹬出去一边往中间夹腿的。 蛙泳腿是个很神奇的腿，虽然给人的感觉是蹬着往前走，但它的实质，却是鞭状的动作，什么是鞭状？鞭子的形状。近端慢，远端快，近端发力，远端加力。所以不能先蹬腿 停顿 再夹腿。这得是一个连贯的动作。\n练习20次，练到有种“啊啊啊真的有在向前冲”的感觉，就OK了。\n梳理了这么多，今晚就去实践下。相信自己能游的更远点了，加油！\n","permalink":"https://shiyuanjie.cn/posts/Life/%E8%9B%99%E6%B3%B3/","summary":"\u003cp\u003e最近在出差，刚好住的酒店有游泳池。晚上有时有空就和同事一起去学习游泳，自己之前只去过三次泳池。但还是没有完全学会。\u003c/p\u003e\n\u003cp\u003e今天在知乎上看到\u003ccode\u003e梦觉\u003c/code\u003e在 B站的系列课程，很不错。整理如下，为以后自己的游泳学习做个备忘。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.zhihu.com/question/19767374/answer/18504728\"\u003e怎样快速有效地学习游泳\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.bilibili.com/video/av5892786/\"\u003e梦觉教游泳.蛙泳入门合集\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"蛙泳"},{"content":"收获 概念卡 无\n金句 虾鱼虎一定会待在枪虾的身边。 感悟 表象是无法直接来展示一个人的内心，完美的外表也无法让一个人有纯洁的内心。雪穗有儿时的心里阴影，对她造成的伤害是无法评估的。但她又拥有完美的外表，桐原亮司作为雪穗的知己，一直在她的身边无形的帮助他一步步的成功。 书中的警察一直是书中，最正义的一位，虽然已经退休了，但还是对19年前的案子放不下。最终通过一些持续跟进的细节，将案子破获。\n阅读时间：20180420","permalink":"https://shiyuanjie.cn/posts/Book/%E7%99%BD%E5%A4%9C%E8%A1%8C/","summary":"\u003ch2 id=\"收获\"\u003e收获\u003c/h2\u003e\n\u003ch4 id=\"概念卡\"\u003e概念卡\u003c/h4\u003e\n\u003cp\u003e无\u003c/p\u003e\n\u003ch4 id=\"金句\"\u003e金句\u003c/h4\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e虾鱼虎一定会待在枪虾的身边。\n\u003c/code\u003e\u003c/pre\u003e","title":"白夜行"},{"content":"收获 概念卡 无\n金句 尘世，并不会轻易让一个人孤独的，群居需要一种平衡，嫉妒而引发的诽谤/扼杀/羞辱/打击和迫害，你若不再脱颖，不将平凡，你若继续走，走，终于使众生无法赶超了，众生就会向你欢呼和崇拜，尊你是神圣。 神圣是真正的孤独。 舍得，不舍不得，小舍小得，大舍大得。 感悟 书中的每个章节，都可以当一本微小说来读。内容与深度值得好好品味。\n自在独行，只有先自在才能独行。自在，不是别人看到的自在，而是真正的内心自在，做一些喜欢的事情。只有自在了，才能独行。\n阅读时间：20180507-20180519","permalink":"https://shiyuanjie.cn/posts/Book/%E8%87%AA%E5%9C%A8%E7%8B%AC%E8%A1%8C/","summary":"\u003ch2 id=\"收获\"\u003e收获\u003c/h2\u003e\n\u003ch4 id=\"概念卡\"\u003e概念卡\u003c/h4\u003e\n\u003cp\u003e无\u003c/p\u003e\n\u003ch4 id=\"金句\"\u003e金句\u003c/h4\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e尘世，并不会轻易让一个人孤独的，群居需要一种平衡，嫉妒而引发的诽谤/扼杀/羞辱/打击和迫害，你若不再脱颖，不将平凡，你若继续走，走，终于使众生无法赶超了，众生就会向你欢呼和崇拜，尊你是神圣。\n神圣是真正的孤独。\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e舍得，不舍不得，小舍小得，大舍大得。\n\u003c/code\u003e\u003c/pre\u003e","title":"自在独行"},{"content":"收获 概念 简单设计\n要点提取\n用自己的一句话，总结出来。并写下来 依据所有功能清单，问自己：为什么要做这个 用户分类\n主流用户 随意型用户 专家型用户 四个策略\n删除 组织 隐藏 转移 金句 BlueMotion,为你省钱。 不要让你的设计干扰用户思绪。 人们喜欢自己被包围在不必要的功能中。 改进方向 分析需求时，考虑主流用户的需求是什么。减少对专家型用户、随意型用户的关注 无论是说话、做事时，应该考虑对方的要点究竟是什么，再考虑如何应对。 九宫格 阅读时间：20180420","permalink":"https://shiyuanjie.cn/posts/Book/%E7%AE%80%E7%BA%A6%E8%87%B3%E4%B8%8A/","summary":"\u003ch2 id=\"收获\"\u003e收获\u003c/h2\u003e\n\u003ch4 id=\"概念\"\u003e概念\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e简单设计\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e要点提取\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e用自己的一句话，总结出来。并\u003ccode\u003e写\u003c/code\u003e下来\u003c/li\u003e\n\u003cli\u003e依据所有功能清单，问自己：\u003cstrong\u003e为什么要做这个\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e用户分类\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e主流用户\u003c/li\u003e\n\u003cli\u003e随意型用户\u003c/li\u003e\n\u003cli\u003e专家型用户\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e四个策略\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e删除\u003c/li\u003e\n\u003cli\u003e组织\u003c/li\u003e\n\u003cli\u003e隐藏\u003c/li\u003e\n\u003cli\u003e转移\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"简约至上"},{"content":"封面 书 豆瓣-黄金时代 读后感 很接地气的书，第一次读 王小波 的书籍，文字的流畅性读起来很舒服。一口气读了5部，还有点意犹未尽。 书中的内容，让读者对当时的生活方式和社会形态有很深的既视感。 文革时间，人们的爱情也可以如此的纯粹和浪漫。 阅读时间：20180108","permalink":"https://shiyuanjie.cn/posts/Book/%E9%BB%84%E9%87%91%E6%97%B6%E4%BB%A3/","summary":"\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cimg src=\"https://img3.doubanio.com/lpic/s5745604.jpg\" /\u003e","title":"黄金时代"},{"content":"为什么读书会没有效率，书中的内容不能很好的吸收。 赵周老师发明了关于致用类书籍的 RIA 便签法，让我们可以用更好的形式来解决这个问题。 RIA 将书中的内容使用便签的形式管理起来，便于结合自己的经验和认识来强化对内容的理解与吸收。\n便签法 RIA 解读 R（Reading）：将读书时遇到的心仪或受启发的片段，划下来。\nI ( Interpretation ) :用自己的话复述原文。\nA1 ( Appropriation ) :描述知识中与自己相关的经验。\nA2 ( Appropriation ) :写出这个知识可以如何应用，即回答以后我要怎么应用。\n实践 准备\nMark笔 三种不同颜色的便签，三种颜色分别用于 I/A1/A2 操作\nR:在阅读过程中，找到有启发的内容，使用Mark 笔划下来 I:将有启发的内容，用自己的话写在第一种颜色的便签里面 A1:用第二种颜色的便签，结合自己之前的经历或经验，写下来 A2:用第三种颜色的便签，将自己后续要改进的内容，写下来。 这三种便签都贴在当前页，整本书读完后，将书中所有的便签取下来。这些书中提取到的内容。\n阅读进阶 其实从上面的阅读方法中，我们仅仅是把书中的内容进行了追问、反思经验。没有真正的吸收并加以应用。\n在我们真正需要将书中的内容进行应用时，我们需要进一步考虑：\n追问、反思经验 分析、整理信息 内化、应用知识 只有将上面的三步内容，不断的推进和演进，最终才可以将知识真正的为我所用。\n","permalink":"https://shiyuanjie.cn/posts/Upgrade/RIA%E4%BE%BF%E7%AD%BE%E6%B3%95/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e为什么读书会没有效率，书中的内容不能很好的吸收。\n赵周老师发明了关于致用类书籍的 RIA 便签法，让我们可以用更好的形式来解决这个问题。\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"ria\"\u003eRIA\u003c/h2\u003e\n\u003cp\u003e将\u003ccode\u003e书\u003c/code\u003e中的内容使用\u003ccode\u003e便签\u003c/code\u003e的形式\u003ccode\u003e管理\u003c/code\u003e起来，便于结合\u003ccode\u003e自己\u003c/code\u003e的\u003ccode\u003e经验\u003c/code\u003e和\u003ccode\u003e认识\u003c/code\u003e来强化对内容的\u003ccode\u003e理解与吸收\u003c/code\u003e。\u003c/p\u003e","title":"RIA 便签法"},{"content":"把自己经常使用的工具和网址梳理出来，进行一个较完整的回顾。 Last Update:20200323，持续维护... 工具下载地址(持续更新)： 链接: https://pan.baidu.com/s/1z9NNFc2XQeqbPDq8jdcQhQ 提取码: wgav 我的设备\nPC：Mac 手机：Android 更新说明 20181228 印象笔记：添加使用过程中的不足 有道词典\u0026ndash;\u0026gt;欧陆词典：有道在翻译句子时，每次都要手动切换翻译Tab，很麻烦。另外：欧陆词典包含有道词典的搜索功能。 OmniPlan：有点太重，更适合做项目的精细化管理，如：成本控制 随手记：最近没太关注这方便，暂时取消 网易蜗牛读书：最近读书APP大爱，很多优质资源。每天免费读书1小时。 知乎、喜马拉雅、Kindle阅读、美啊教育、Snapseed、Feedly：精简有机APP，多读书。 Keep 笔记：GTD工具，无缝与Google全家桶结合 小日常：习惯养成的记录，界面很清新 20181116 Skitch\u0026ndash;\u0026gt;Jing：删除Skitch截图软件，Skitch不便于直接登录印象笔记，需要登录Evernote国际版本。与自己经常使用的印象笔记冲突。 影探：删除影探公众号的关注，多读书~ 个人网站：个人内容（工作、生活、学习）的输出地 Enpass\u0026ndash;\u0026gt;1Password:使用收费软件，便于使用Mobile来同步更多的密码相关的信息。 OmniPlan：新增Apple系的项目管理软件 XMind\u0026ndash;\u0026gt;XMind Zen：使用最新版本的，但仍是试用版 20200323 删除工具明细，更新太麻烦了 1年多没更新了，发现很多工具在反复使用。好吧，有点多变 添加工具的存档地址，方便快速下载 ","permalink":"https://shiyuanjie.cn/posts/Tools/%E6%88%91%E7%9A%84%E5%B7%A5%E5%85%B7%E9%9B%86/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e把自己经常使用的工具和网址梳理出来，进行一个较完整的回顾。\n\nLast Update:20200323，持续维护...\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Tools/%E6%88%91%E7%9A%84%E5%B7%A5%E5%85%B7%E9%9B%86/%E6%88%91%E7%9A%84%E5%B7%A5%E5%85%B7%E9%9B%86_hu_83a256ebb3d16aab.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"我的工具集\" loading=\"lazy\" src=\"/posts/Tools/%E6%88%91%E7%9A%84%E5%B7%A5%E5%85%B7%E9%9B%86/%E6%88%91%E7%9A%84%E5%B7%A5%E5%85%B7%E9%9B%86.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e工具下载地址(持续更新)：\n\u003cul\u003e\n\u003cli\u003e链接: \u003ca href=\"https://pan.baidu.com/s/1z9NNFc2XQeqbPDq8jdcQhQ\"\u003ehttps://pan.baidu.com/s/1z9NNFc2XQeqbPDq8jdcQhQ\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e提取码: wgav\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e我的设备\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ePC：Mac \n手机：Android\n\u003c/code\u003e\u003c/pre\u003e","title":"我的工具集"},{"content":"为什么要构建 Headless 的 E2E 测试 A headless browser is a great tool for automated testing and server environments where you don\u0026#39;t need a visible UI shell. For example, you may want to run some tests against a real web page, create a PDF of it, or just inspect how the browser renders an URL. 结合上面的原因，我们还可以\nHeadless结合 E2E 测试，可以让E2E 测试在非 GUI 的操作系统中运行 可以集成至 CI 环境中。让版本得到快速验证 Chrome Headless 的选取 Mac/Linux 的Chrome从59版本后，已经支持 Healess 模式的运行。Windows 的从60版本开始支持 所以选择一个你想要的 Chrome 版本，便可以进行 Headless 的测试 chrome \\ --headless \\ # Runs Chrome in headless mode. --disable-gpu \\ # Temporarily needed if running on Windows. https://www.chromestatus.com # URL to open. Defaults to about:blank. 编写 E2E 测试 - BDD-Gauge BDD home.spec Search ---------------- * Search with 123 home.cpt # Search with 123 * Open Baidu homepage * Search 123 * Check searching result 编写测试实现 使用 Selenium 完成测试用例的实现过程。核心实现\nSystem.setProperty(\u0026#34;webdriver.chrome.driver\u0026#34;, \u0026#34;Path/chromedriver\u0026#34;); ChromeOptions options = new ChromeOptions(); options.addArguments(\u0026#34;--headless\u0026#34;); options.addArguments(\u0026#34;--disable-gpu\u0026#34;); return new ChromeDriver(options); 执行测试 ./gradlew clean gauge\n:clean :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :compileTestJava :processTestResources UP-TO-DATE :testClasses :gauge Feb 28, 2018 10:48:01 PM org.openqa.selenium.remote.DesiredCapabilities chrome INFO: Using `new ChromeOptions()` is preferred to `DesiredCapabilities.chrome()` Starting ChromeDriver 2.35.528157 (4429ca2590d6988c0745c24c8858745aaaec01ef) on port 26606 Only local connections are allowed. Feb 28, 2018 10:48:02 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: OSS # Baidu HomePage ## Search ✔ ✔ ✔auge Successfully generated html-report to =\u0026gt; /Users/yjshi/Documents/GaugeChromeHeadless/reports/html-report/index.html Specifications: 1 executed 1 passed 0 failed 0 skipped Scenarios: 1 executed 1 passed 0 failed 0 skipped Total time taken: 3.097s BUILD SUCCESSFUL Total time: 7.313 secs 挂接 CI 由于现在主流的 CI 在执行 Job 时，都是在 Agent 中执行。因此在跑 Gauge 时，需要在 Agent 中做好准备工作。\n准备工作 - Agent 安装 Gauge 及 Java 插件 安装 Chrome 替换BrowserDriver目录中的 driver 为匹配的版本 跑起来 将代码通过 Job 拉取到本地 执行./gradlew clean gauge 注意事项 CI执行 Job 的用户不能用 root用户 完整代码 GaugeChromeHeadless\n参考 Gauge ChromeDriver Getting Started with Headless Chrome WebDriverException: unknown error: Chrome failed to start: exited abnormally ","permalink":"https://shiyuanjie.cn/posts/UITest/%E5%A6%82%E4%BD%95%E6%9E%84%E5%BB%BA-Headless-%E7%9A%84-E2E-%E6%B5%8B%E8%AF%95/","summary":"\u003ch2 id=\"为什么要构建-headless-的-e2e-测试\"\u003e为什么要\u003ccode\u003e构建 Headless 的 E2E 测试\u003c/code\u003e\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eA headless browser is a great tool for automated testing and server environments where you don\u0026#39;t need a visible UI shell. For example, you may want to run some tests against a real web page, create a PDF of it, or just inspect how the browser renders an URL.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e结合上面的原因，我们还可以\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHeadless结合 E2E 测试，可以让E2E 测试在非 GUI 的操作系统中运行\u003c/li\u003e\n\u003cli\u003e可以集成至 CI 环境中。让版本得到快速验证\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"chrome-headless-的选取\"\u003eChrome Headless 的选取\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eMac/Linux 的Chrome从59版本后，已经支持 Healess 模式的运行。Windows 的从60版本开始支持\u003c/li\u003e\n\u003cli\u003e所以选择一个你想要的 Chrome 版本，便可以进行 Headless 的测试\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003echrome \\\n  --headless \\                   # Runs Chrome in headless mode.\n  --disable-gpu \\                # Temporarily needed if running on Windows.\n  https://www.chromestatus.com   # URL to open. Defaults to about:blank.\n\u003c/code\u003e\u003c/pre\u003e","title":"构建Headless 的 E2E 测试"},{"content":"等了这么久，20180210，终于有较大的更新。无论是从 UI 还是功能优化，都让人耳目一新。下面我们就详细看下具体变化。 原文地址：http://jmeter.apache.org/changes.html 下载地址：apache-jmeter-4.0.zip\n重要更新 主要变更 JMeter 现在支持 JAVA 9.\n新的Boundary Extractor元素可以提供更好的元素提取性能\n新的JSON Assertion元素可用于 JSON 响应的断言。\nJMS Point-to-Point 样例增加了read,browser,clear选项。\n将许多测试元素的最佳选项已设置为默认选中内容，如：\n新增If Controller控制器使用最佳性能选择的默认表达式。 新增JSR223测试元素，在语言使用支持的情况下，默认缓存编写的脚本。 Loop controller和ForEach Controller会使用 __jm__\u0026lt;Name of your element\u0026gt;__idx来暴露循环的遍历次数，可以像下面的方式来使用一个名为 MyLoopController 的 Loop Controller：\n${__jm__MyLoopController__idx}\n详见Bug 61802.\nCookies 在录制过程中，会展示在View Results Tree中。之前他们总是显示为空。\nResponse Assertion允许定制断言信息和请求数据。\nUX 提升 JMeter 现在默认使用Darcula LAFUI样式。\nWokbench 已经被从 UI 中去掉，你可以使用Test Plan中Non Test Elements的子元素来添加对应 Workbench 中的功能。\n菜单样式将最常用元素调整为快速进行操作。\nHTTP(S) Test Script Recorder 允许在录制时，定制更加人性化的 transactions的名称。\nUX样式还有以下提升：\nModule Controller 会提示用户最少需要有一个Controller。 Function Helper Dialog(帮助使用和测试功能的说明)在多个位置有提升。 Swich Controller会自动trim字符串前后的空格，减少问题出现。 Test Plan在运行前会保存。 函数 新函数 __digest 用户快速提升 SHA-XXX，MDX Hash 计算：\n${__digest(MD5,Apache JMeter 4.0 rocks !,,,)} 返回0e16c3ce9b6c9971c69ad685fd875d2b\n新函数 __dateTimeConvert 提供两种时间格式的快速转换：\n${__dateTimeConvert(01 Jan 2017,dd MMM yyyy,dd/MM/yyyy,)} 返回01/01/2017\n新函数 changeCase提供字符在大写、小写、驼峰式之间的转换：\n${__changeCase(Avaro omnia desunt\\, inopi pauca\\, sapienti nihil,UPPER,)} 返回AVARO OMNIA DESUNT, INOPI PAUCA, SAPIENTI NIHIL\n新函数__isVarDefined和 __isPropDefined 用于测试属性和变量是否可用。\n${__isPropDefined(START.HMS)} 返回 true\n${__isVarDefined(JMeterThread.last_sample_ok)} 返回 true\n编码和插件开发 如果你不想样例在测试结果中出现，可以调用SampleResult#setIgnore()。\nJavaSamplerContext 替代在AbstractJavaSamplerClient，有新的方法用于快速的插件开发。\nJMeter 现在发布 Maven 源和 JavaDoc在Maven repository中。\n插件可以注册监听事件，当收到 TestPlan 的开启/关闭状态通知时。\n实时报告和 Web 报告 InfluxDB backend listener支持通过使用**TAG_**来定制化 tags，详见Bug 61794.\n在 Web 报告中 responseTime分布图更加精细。\n一些 BUG 修复也被集成在报告模块中，详见Bug 61900，Bug 61956，Bug 61899。图表中 Latency Vs Request 和 Response Time Vs Request 不会超过1000RPS，详见Bug 61962。\nJMeter 环境配制 JMeter 的启动脚本用于 JVM设置的被放在了单独的文件中(Unix 中是bin/setenv.sh，Windows 中是bin\\setenv.bat)，在启动时会被调用。这样，启动脚本再也不用编辑了。\n优化调整 线程组的Start time 和 End date被移除，详见Bug 61549 分布式测试中，Hold模式被删除。使用其它替代和更有效的模式 针对第三方插件，方法org.apache.jmeter.gui.tree.JMeterTreeNode为合并至 Java9已被废弃(Bug 61529) public Enumeration\u0026lt;JMeterTreeNode\u0026gt; children() tearDown Thread Group 在默认情况下，会停止并关闭测试。如果你不想这样做，去掉 Test Plan中的Run tearDown Thread Groups after shutdown of main threads on Test Plan勾选。详见Bug 61656 sampleresult.getbytes.headers_size属性和sampleresult.getbytes.body_real_size属性被废弃。详见Bug 61587 JMeter 现在会在每次运行时保存测试计划，这个行为可以通过save_automatically_before_run来设置。详见Bug 61731 Workbench元素被废弃，你可以直接添加Test Plan 中 Non Test Element的子元素来直接添加。当加载一个包含这种元素的 Test Plan时，JMeter 会增加将**Mirror Server, Property Display ** 和 HTTP(s) Test Script Recorder添加为直接子元素。对于任何元素，它会创建一个 Test Fragment元素，调用 Workbench Test Fragment 并将元素移入。 下面的类被废弃(org.apache.jmeter.functions.util.ArgumentEncoder, org.apache.jmeter.functions.util.ArgumentDecoder)，详见Pull request #335 在JMS Point-to-Point样例中，设置超时为0时，表示无穷大的时间。未设置时，表示超时为2000ms。详见Bug 61829 当断言用于不同的范围时，它们会被从最外围一个至最内部的一个。详见Bug 61846 JMeter 现在默认启动语言为英语。这是因为缺少很多种类的语言翻译支持。可以通过修改 jmeter 和 jmeter.bat(或最好用 setenv.sh/setenv.bat)中的JVM_ARGS系统设置来调整。我们也很高兴，如果你能贡献支持语言的翻译工作。 Switch Controller现在默认会 trim掉无用的空格，减少问题出现。详见Bug 61771 JMeter JVM 堆设置从**-Xms512m -Xmx512m调整为-Xms1g -Xmx1g**。 ","permalink":"https://shiyuanjie.cn/posts/JMeter/JMeter4.0%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e等了这么久，20180210，终于有较大的更新。无论是从 UI 还是功能优化，都让人耳目一新。下面我们就详细看下具体变化。\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e原文地址：\u003ca href=\"http://jmeter.apache.org/changes.html\"\u003ehttp://jmeter.apache.org/changes.html\u003c/a\u003e\n下载地址：\u003ca href=\"http://ftp.cuhk.edu.hk/pub/packages/apache.org//jmeter/binaries/apache-jmeter-4.0.zip\"\u003eapache-jmeter-4.0.zip\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"重要更新\"\u003e重要更新\u003c/h2\u003e\n\u003ch3 id=\"主要变更\"\u003e主要变更\u003c/h3\u003e\n\u003cp\u003eJMeter 现在支持 JAVA 9.\u003c/p\u003e\n\u003cp\u003e新的\u003ca href=\"http://jmeter.apache.org/usermanual/component_reference.html#Boundary_Extractor\"\u003eBoundary Extractor\u003c/a\u003e元素可以提供更好的元素提取性能\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"http://jmeter.apache.org/images/screenshots/changes/4.0/boundary_extractor.png\"\u003e\u003c/p\u003e\n\u003cp\u003e新的\u003ca href=\"http://jmeter.apache.org/usermanual/component_reference.html#JSON_Assertion\"\u003eJSON Assertion\u003c/a\u003e元素可用于 JSON 响应的断言。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"http://jmeter.apache.org/images/screenshots/changes/4.0/json_assertion.png\"\u003e\u003c/p\u003e\n\u003cp\u003eJMS Point-to-Point 样例增加了\u003cstrong\u003eread,browser,clear\u003c/strong\u003e选项。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"http://jmeter.apache.org/images/screenshots/changes/4.0/jmsptp_communication_styles.png\"\u003e\u003c/p\u003e","title":"JMeter4.0更新内容"},{"content":"2017年中的时候，想把自己针对孩子的教育方式和沟通方式调整下，所以在家里的 Calendar 中每个月都给自己一句话，来提醒自己。 时间过的很快，17年已经结束了。回顾下去年一年的变化。做个简单的总结 在与孩子沟通过程中，自己的的心态有所调整。但有时，还是会对孩子发火。这个还要持续调整 沟通时，多考虑同理心的应用，考虑下孩子的出发点 孩子更多需要的是陪伴，不是单纯的给提供什么环境。2018要多花时间，陪孩子 新的一年要继续坚持下去。 ","permalink":"https://shiyuanjie.cn/posts/Flags/2017CalendarTips/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e2017年中的时候，想把自己针对孩子的教育方式和沟通方式调整下，所以在家里的 Calendar 中每个月都给自己一句话，来提醒自己。\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Flags/2017CalendarTips/6%E6%9C%88_hu_613017874bf14d48.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"6月\" loading=\"lazy\" src=\"/posts/Flags/2017CalendarTips/6%E6%9C%88.jpeg\"\u003e\u003c/picture\u003e\u003c/p\u003e","title":"2017Calendar中的提示"},{"content":"2017年底最后一天，花了一天时间，把这本书读完。 书中主要涉及：刘强东 的个人发展史及 JD 的发展历程。 书 Amazon：我的创业史 读后感 刘强东，从小到大的个人性格一直比较明显。不服输且有一定的商业头脑。刘强东对商业的敏锐程度很高，多次直接的业务转型都有明显的体现。 京东公司的发展过程，可以完全体现出 刘强东 的性格，比如：从不偷税、坚持给客户开票。这些细节可以帮助小型企业省去很多的开销，但 刘强东 一直坚持在做这件事情。让客户在买东西的时，可以很放心。 京东公司的发展也离不开在在业务方向的深耕，一直在电子方向深耕。当然最近几年也有涉猎其它，如图书、个人小型供应商。但核心业务仍然是电子商品。 个人性格会影响到个人的生活方式、生活习性、为人处事。 坚持对一件事情的执着，最终会有成果。但一定要时常关注外界的变化，做出适当的调整。 阅读时间：20171231-20171231","permalink":"https://shiyuanjie.cn/posts/Book/%E6%88%91%E7%9A%84%E5%88%9B%E4%B8%9A%E5%8F%B2/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e2017年底最后一天，花了一天时间，把这本书读完。\n书中主要涉及：刘强东 的个人发展史及 JD 的发展历程。\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"书\"\u003e书\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"我的创业史\" loading=\"lazy\" src=\"https://images-cn-4.ssl-images-amazon.com/images/I/412sjelLNIL._SX377_BO1,204,203,200_.jpg\"\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAmazon：\u003ca href=\"https://www.amazon.cn/mn/detailApp/ref=asc_df_B077H7BN5T2892833/?asin=B077H7BN5T\u0026amp;tag=douban-23\u0026amp;creative=2384\u0026amp;creativeASIN=B077H7BN5T\u0026amp;linkCode=df0\"\u003e我的创业史\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"我的创业史"},{"content":"封面 书 Amazon链接： 深牢大狱 读后感 第一次使用 微信阅读 读完的一本书，APP 体验还不错。 深牢大狱，其实讲的是 人性 的牢狱。主人公从一个富二代，一步步变成一个卧底，再变成一个被世人嫌弃的凶手。也许生活中的我们，都没有错。只是环境影响的我们会变。有的人会变坏，有的人会变好。 人性 如何突破，如何保持自己的 个性，才是我们应该从书中解读到的。书中讲每个人物的性格都刻画与环境的描述很解明，有时会体会到，也许书中的人物就是我们生活周边的人。回归生活时，我们需要注意 人性 的行为。 阅读时间：20171110","permalink":"https://shiyuanjie.cn/posts/Book/%E6%B7%B1%E7%89%A2%E5%A4%A7%E7%8B%B1/","summary":"\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cimg src=\"https://images-cn.ssl-images-amazon.com/images/I/41vHT8DGM-L._SX351_BO1,204,203,200_.jpg\" /\u003e","title":"深牢大狱"},{"content":" 2018年已经过了好几天，这几天终于闲下来，把今年的事情总结下。\n回顾2017计划 2017总结\n工作 更多的尝试其他角色 将更多的测试新技术应用至项目实践中 在两个项目中，尝试并实践了 PM、BA 的工作，自己现在对其它角色有更加深入的认识。 测试新技术的话，实践较多的还是 E2E 和性能测试。 今年在一个项目中，有机会带领2个QA 新人，终于有机会带新人。 阅读 20本书 非暴力沟通 轻量级微服务架构 Node.js+MongoDB+AngularJS Web 开发 摆渡人 刻意练习 深入浅出数据分析 用户故事地图 30天学会绘画 恶意 咨询的奥秘续 深牢大狱 浮生六记 我的创业史 高效能人事的7个习惯--未完成 累计仅读14本书，还有一本未完成。 写作 前半年，周更一篇 后半年，周更两篇 累积发表31表文章，未完成。 家庭 带家人去玩 未完成。今年媳妇怀二宝了，全年都在西安。 运动 跑个半马 4月去杨凌参加了一次半马，成绩还不错。2小时8分钟 其它 学习手绘 四次Session 戒烟 手绘看了几天，就荒废了。。。 Session 应该是只做了两次 戒烟，看起来真的好难。。暂时放弃啦 ~~ 2017的其它事情 我的妈妈去世了，到现在每天还时常会浮现出她生活的情景。也相信，我的妈妈在另外一个世界，会一切安好。 家里添加了新成员 辰辰，新生命的诞生，给家里添加了很多的气氛。 参加了公司组织的 TL 培训，学会了如何使用同理心来处理事情 学会如何做锅盔，陕西的特色 2018 总体看起来，2017完成了一些计划内的事情，当然有一部分还没有完成。未完成的事情，基本都是由于自己没有坚持下来。后面定期要去把自己的2018好好管理起来，让2018更加的充实与高效。 计划2018 生活 带 大宝 去参加一次跑步比赛 带 家人 出去旅游 一次。 学会做更多的饭菜，让家人可以吃到更多的美味 工作 找机会去实践 PM 的工作，让自己可以有机会完整的来带领一个项目 将已有测试技能实践 通用化 起来，更加容易上手 把 PMP 证书拿到手 阅读 30本书 其它 跑步500公里 学会控制自己与孩子沟通的情绪 手绘人物画像 ","permalink":"https://shiyuanjie.cn/posts/Flags/2018%E6%80%BB%E7%BB%93/","summary":"\u003cblockquote\u003e\n\u003cp\u003e2018年已经过了好几天，这几天终于闲下来，把今年的事情总结下。\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"回顾2017计划\"\u003e回顾2017计划\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"http://shiyuanjie.cn/2016/12/28/2017%E6%80%BB%E7%BB%93/\"\u003e2017总结\u003c/a\u003e\u003c/p\u003e\n\u003ch4 id=\"工作\"\u003e工作\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e更多的尝试其他角色\u003c/li\u003e\n\u003cli\u003e将更多的测试新技术应用至项目实践中\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e在两个项目中，尝试并实践了 PM、BA 的工作，自己现在对其它角色有更加深入的认识。\n测试新技术的话，实践较多的还是 E2E 和性能测试。\n今年在一个项目中，有机会带领2个QA 新人，终于有机会带新人。\n\u003c/code\u003e\u003c/pre\u003e","title":"2018总结"},{"content":"咨询师的锦囊集，IT 工程师的镜子，值得深入口味。 书 咨询的奥秘续 读后感 断断续续的读了3个月，书中的原则、定律、场景都可能是工作中的实际场景。需要慢慢品味。本书，绝对是法宝书之一，很多案例，都需要去深入体会。 无论是工程师，还是咨询师，在工作中，一定要有自己的节奏，尽量不要被外力影响。 每个人都会有犯错的时候，书中作者也表明自己也会出错。出错不要过于自责，能从错误中走出业，并总结失败的原因，这样才能得到真正的成长。 阅读时间： 20170704-20171017 ","permalink":"https://shiyuanjie.cn/posts/Book/%E5%92%A8%E8%AF%A2%E7%9A%84%E5%A5%A5%E7%A7%98%E7%BB%AD/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e咨询师的锦囊集，IT 工程师的镜子，值得深入口味。\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg alt=\"咨询的奥秘续\" loading=\"lazy\" src=\"https://images-cn.ssl-images-amazon.com/images/I/41ERm3RxZpL.jpg\"\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.amazon.cn/%E5%92%A8%E8%AF%A2%E7%9A%84%E5%A5%A5%E7%A7%98-%E5%92%A8%E8%AF%A2%E5%B8%88%E7%9A%84%E7%99%BE%E5%AE%9D%E7%AE%B1-%E7%BE%8E-%E6%B8%A9%E4%BC%AF%E6%A0%BC/dp/B015317814/ref=sr_1_1?ie=UTF8\u0026amp;qid=1508744641\u0026amp;sr=8-1\u0026amp;keywords=%E5%92%A8%E8%AF%A2%E7%9A%84%E5%A5%A5%E7%A7%98%E7%BB%AD\"\u003e咨询的奥秘续\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"读后感\"\u003e读后感\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e断断续续的读了3个月，书中的\u003ccode\u003e原则\u003c/code\u003e、\u003ccode\u003e定律\u003c/code\u003e、\u003ccode\u003e场景\u003c/code\u003e都可能是工作中的实际场景。需要慢慢品味。本书，绝对是法宝书之一，很多案例，都需要去深入体会。\u003c/li\u003e\n\u003cli\u003e无论是工程师，还是咨询师，在工作中，一定要有自己的节奏，尽量不要被\u003ccode\u003e外力\u003c/code\u003e影响。\u003c/li\u003e\n\u003cli\u003e每个人都会有犯错的时候，书中作者也表明自己也会出错。出错不要过于自责，能从错误中走出业，并总结失败的原因，这样才能得到真正的成长。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!--more --\u003e\n\u003ch4 id=\"阅读时间-20170704-20171017\"\u003e阅读时间： \u003cstrong\u003e20170704-20171017\u003c/strong\u003e\u003c/h4\u003e","title":"咨询的奥秘续"},{"content":"8月就读完了，一直没来得及整理下，今天得空，赶紧整理下。 书 恶意 读后感 一桩杀人案，通过几个主角的视角展开的情节发展，最终把结局浮出水面，读起来很流畅。 每个出现的章节，都会把剧情推向一个新的高度，让读者也对整个案情有新的认识。通过警察对案情的，深入分析，最终把整个案情分析出来。 人性的嫉妒是可以被无限放大的，最终还可能引起杀人。野野口从小就对日高有嫉妒心理，还帮他引荐出版社的人认识。但他还是把日高给杀害了。甚至还编造出日高侵犯他作品、他与日高妻子恋爱的谎言。 阅读时间： 20170803-20170808","permalink":"https://shiyuanjie.cn/posts/Book/%E6%81%B6%E6%84%8F/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e8月就读完了，一直没来得及整理下，今天得空，赶紧整理下。\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg alt=\"恶意\" loading=\"lazy\" src=\"https://images-cn.ssl-images-amazon.com/images/I/41K3LwaPVkL.jpg\"\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.amazon.cn/%E6%81%B6%E6%84%8F-%E4%B8%9C%E9%87%8E%E5%9C%AD%E5%90%BE/dp/B01LEPWBRO/ref=sr_1_2?ie=UTF8\u0026amp;qid=1508740134\u0026amp;sr=8-2\u0026amp;keywords=%E6%81%B6%E6%84%8F\"\u003e恶意\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"读后感\"\u003e读后感\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e一桩\u003ccode\u003e杀人案\u003c/code\u003e，通过几个主角的视角展开的情节发展，最终把结局浮出水面，读起来很流畅。\u003c/li\u003e\n\u003cli\u003e每个出现的章节，都会把剧情推向一个新的高度，让读者也对整个\u003ccode\u003e案情\u003c/code\u003e有新的认识。通过警察对案情的，深入分析，最终把整个案情分析出来。\u003c/li\u003e\n\u003cli\u003e人性的\u003ccode\u003e嫉妒\u003c/code\u003e是可以被无限放大的，最终还可能引起杀人。\u003ccode\u003e野野口\u003c/code\u003e从小就对\u003ccode\u003e日高\u003c/code\u003e有嫉妒心理，还帮他引荐出版社的人认识。但他还是把\u003ccode\u003e日高\u003c/code\u003e给杀害了。甚至还编造出\u003ccode\u003e日高\u003c/code\u003e侵犯他作品、他与\u003ccode\u003e日高\u003c/code\u003e妻子恋爱的谎言。\u003c/li\u003e\n\u003c/ul\u003e","title":"恶意"},{"content":"通过 Sumlime Text3 来实现将 MarkDown 文件完美保存至 印象笔记中。 Step1: 安装Evernote包 打开 Sumlime Text3 cmd + shift + p打开command pattern 输入Package Controll: Install Package，回车 输入Evernote，等待安装成功。Evernote包地址：https://packagecontrol.io/packages/Evernote 安装结束后，在Package Setting中会有Evernote cmd + shift + p打开command pattern，输入Evernote，查看是否有Evernote对应的功能列表显示 Step2: 获取印象笔记的Developer Token 登录https://app.yinxiang.com/api/DeveloperToken.action 如果没有内容，选择新增一个developer token Step3: 配制Sublime Text中的 Evernote Package Settings \u0026ndash;\u0026gt; Evernote \u0026ndash;\u0026gt; Settings User 默认打开内容为空，设置内容如下(Step2中获取的内容) 1 2 3 4 { \u0026#34;token\u0026#34;: \u0026#34;Token内容，那一串长的字符\u0026#34;, \u0026#34;noteStoreUrl\u0026#34;: \u0026#34;StoreUrl\u0026#34; } 至此，已经配制完成。\n通过Sublime Text新增内容至印象笔记 方法1 在MarkDown文件头中添加 1 2 3 4 5 --- title: notebook: tags: --- - `cmd + shift + p`，输入`Evernote: Send to Evernote as a new note` 方法2 cmd + shift + p，输入Evernote: Send to Evernote as a new note 在Sublime Text底部会出现Title/Tags，输入完成后，会直接保存至印象笔记中 ","permalink":"https://shiyuanjie.cn/posts/Tools/MarkDown%E4%BF%9D%E5%AD%98%E8%87%B3%E5%8D%B0%E8%B1%A1%E7%AC%94%E8%AE%B0/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e通过 Sumlime Text3 来实现将 MarkDown 文件完美保存至 印象笔记中。\n\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"step1-安装evernote包\"\u003eStep1: 安装Evernote包\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e打开 Sumlime Text3\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecmd + shift + p\u003c/code\u003e打开command pattern\u003c/li\u003e\n\u003cli\u003e输入\u003ccode\u003ePackage Controll: Install Package\u003c/code\u003e，回车\u003c/li\u003e\n\u003cli\u003e输入Evernote，等待安装成功。Evernote包地址：\u003ca href=\"https://packagecontrol.io/packages/Evernote\"\u003ehttps://packagecontrol.io/packages/Evernote\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e安装结束后，在\u003ccode\u003ePackage Setting\u003c/code\u003e中会有\u003ccode\u003eEvernote\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecmd + shift + p\u003c/code\u003e打开command pattern，输入Evernote，查看是否有Evernote对应的功能列表显示\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"step2-获取印象笔记的developer-token\"\u003eStep2: 获取印象笔记的Developer Token\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e登录\u003ca href=\"https://app.yinxiang.com/api/DeveloperToken.action\"\u003ehttps://app.yinxiang.com/api/DeveloperToken.action\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e如果没有内容，选择新增一个developer token\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"step3-配制sublime-text中的-evernote\"\u003eStep3: 配制Sublime Text中的 Evernote\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ePackage Settings\u003c/code\u003e \u0026ndash;\u0026gt; \u003ccode\u003eEvernote\u003c/code\u003e \u0026ndash;\u0026gt; \u003ccode\u003eSettings User\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e默认打开内容为空，设置内容如下(Step2中获取的内容)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"nt\"\u003e\u0026#34;token\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Token内容，那一串长的字符\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"nt\"\u003e\u0026#34;noteStoreUrl\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;StoreUrl\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e至此，已经配制\u003ccode\u003e完成\u003c/code\u003e。\u003c/p\u003e","title":"MarkDown保存至印象笔记"},{"content":" 2017.9.21，JMeter3.3版本发布。 原文地址：Apache JMeter 3.3 Release Notes ,历史版本变更记录http://jmeter.apache.org/changes_history.html 下载地址： Download Apache JMeter 3.3 重要变更 JMeter 还不支持 Java9，下个版本将会支持，你可以给出帮助并查看此跟踪记录[Bug 61529](https://bz.apache.org/bugzilla/show_bug.cgi?id=61529)。 建议：使用最新版本的 Java8 ，避免出现 JDK 的问题。 主要提升 HTTP 样例支持Brotli解压算法。\nCacheManager 现在完全支持变量头方式。\nInfluxDB BackendListener 现在支持通过 UDP 协议发送结果至 InfluxDB。\n已经被增强来通过响应状态码和消息针对每一个 Transaction 发送错误数量。\nTCP 样例现在可以计算延迟，详情查看Bug 60156\n更新依赖至最新版本，用于提升性能和修复 BUG。\n持续提升代码质量和测试覆盖率。查看质量报告\n样式提升 花费更多的工作，用于提升对 HiDPI 的支持。\n一些 BUG，像在低内存中使用 View Results Tree 会很慢的，已经被修复。\n常量 DEFAULT_IMPLEMENTATION 被从 CookieManager 中删除，删除它是为了在最新版本中支持HTTP Client 的改变。\nJDBC 样例中的样式被提升，添加选择框来选择驱动器和验证查询。\nIf 控制器和 While 控制器的样式也被提升了。\n报告和仪表盘提升 新的Help 菜单按钮被添加，用于快速配制报告的生成规则。\n文档提升 合并关于不清晰的文档反馈信息\n功能 Function Helper 对话框：新增区域用于展示执行结果\n新功能：\n_timeShift - 返回变量时间计算后的时间模式 _RandomDate - 在特定时间范围内生成随机时间 ","permalink":"https://shiyuanjie.cn/posts/JMeter/JMeter3.3%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/","summary":"\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e2017.9.21\u003c/code\u003e，JMeter3.3版本发布。\u003c/li\u003e\n\u003cli\u003e原文地址：\u003ca href=\"http://jmeter.apache.org/changes.html\"\u003eApache JMeter 3.3 Release Notes \u003c/a\u003e,历史版本变更记录\u003ca href=\"http://jmeter.apache.org/changes_history.html\"\u003ehttp://jmeter.apache.org/changes_history.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e下载地址： \u003ca href=\"http://jmeter.apache.org/download_jmeter.cgi\"\u003eDownload Apache JMeter 3.3\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"重要变更\"\u003e重要变更\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eJMeter 还不支持 Java9，下个版本将会支持，你可以给出帮助并查看此跟踪记录[Bug 61529](https://bz.apache.org/bugzilla/show_bug.cgi?id=61529)。\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e建议：使用最新版本的 Java8 ，避免出现 JDK 的问题。\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"主要提升\"\u003e主要提升\u003c/h3\u003e\n\u003cp\u003eHTTP 样例支持\u003ca href=\"https://news.ycombinator.com/item?id=10257305\"\u003eBrotli\u003c/a\u003e解压算法。\u003c/p\u003e\n\u003cp\u003eCacheManager 现在完全支持变量头方式。\u003c/p\u003e\n\u003cp\u003eInfluxDB BackendListener 现在支持通过 UDP 协议发送结果至 InfluxDB。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"InfluxDB BackendListener\" loading=\"lazy\" src=\"http://jmeter.apache.org/images/screenshots/changes/3.3/influxdb_udp.png\"\u003e\u003c/p\u003e\n\u003cp\u003e已经被增强来通过响应状态码和消息针对每一个 Transaction 发送错误数量。\u003c/p\u003e\n\u003cp\u003eTCP 样例现在可以计算延迟，详情查看\u003ca href=\"https://bz.apache.org/bugzilla/show_bug.cgi?id=60156\"\u003eBug 60156\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e更新依赖至最新版本，用于提升性能和修复 BUG。\u003c/p\u003e\n\u003cp\u003e持续提升代码质量和测试覆盖率。查看\u003ca href=\"https://builds.apache.org/analysis/overview?id=12927\"\u003e质量报告\u003c/a\u003e\u003c/p\u003e","title":"JMeter3.3更新内容"},{"content":"Responsive测试 如何使用Galen进行响应式测试 使用Javascript编写测试代码 完整代码：https://github.com/aimer1124/GalenDemo 安装Galen 通过NPM安装 sudo npm install -g galenframework-cli 检查安装版本galen -v ➜ GalenDemo git:(master) ✗ galen -v Galen Framework Version: 2.3.4 JavaScript executor: Rhino 1.7 release 5 2015 01 29 第一步 创建测试文件，存放于test/step1.test.js test(\u0026#34;First test\u0026#34;, function () { console.log(\u0026#39;This is first test\u0026#39;) }); 执行测试 ➜ GalenDemo git:(master) ✗ galen test test/*.js ======================================== Test: First test ======================================== This is first test ======================================== ---------------------------------------- ======================================== Suite status: PASS Total tests: 1 Total failed tests: 0 Total failures: 0 第二步 添加多个不同的设备，用于测试兼容性 this.devices = { mobile: { deviceName: \u0026#34;mobile\u0026#34;, size: \u0026#34;400x700\u0026#34; }, tablet: { deviceName: \u0026#34;tablet\u0026#34;, size: \u0026#34;600x800\u0026#34; }, desktop: { deviceName: \u0026#34;desktop\u0026#34;, size: \u0026#34;1024x768\u0026#34; } }; forAll(devices, function (device) { test(\u0026#34;Home page on ${deviceName}\u0026#34;, function (device){ var driver = createDriver(\u0026#34;http://galenframework.com\u0026#34;, device.size, \u0026#34;chrome\u0026#34;); console.log(device.size) }); }); 查看测试结果 ➜ GalenDemo git:(master) ✗ galen test test/*.js ======================================== Test: Home page on mobile ======================================== Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 10344 Only local connections are allowed. Aug 01, 2017 2:34:11 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: OSS 400x700 ======================================== Test: Home page on tablet ======================================== Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 6454 Only local connections are allowed. Aug 01, 2017 2:34:17 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: OSS 600x800 ======================================== Test: Home page on desktop ======================================== Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 42862 Only local connections are allowed. Aug 01, 2017 2:34:23 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: OSS 1024x768 ======================================== ---------------------------------------- ======================================== Suite status: PASS Total tests: 3 Total failed tests: 0 Total failures: 0 第三步 引入gspec文件，来难页面布局 新增specs/home-page.gspec @objects header id header = Main section = header: height 5 to 100px 在测试脚本step3.test.js中添加Layout检查 test(\u0026#34;Home page on ${deviceName}\u0026#34;, function (device){ var driver = createDriver(\u0026#34;http://samples.galenframework.com/tutorial1/tutorial1.html\u0026#34;, device.size, \u0026#34;chrome\u0026#34;); checkLayout(driver, \u0026#34;GalenDemo/home-page.gspec\u0026#34;, [device.deviceName]); }); 添加关闭浏览器 driver.close(); 添加页面pageObject 新增pageObject this.home = $page(\u0026#34;home\u0026#34;, { content: \u0026#34;div#content\u0026#34; }); 测试中引用pageObject var homepage = new home(driver); if (!homepage.content.exists()){ console.log(\u0026#34;Content element don\u0026#39;t exist\u0026#34;) } 第四步 不同分辨率下Layout测试及生成测试报告 不同分辨率测试 重新调整设备配制信息 function Device(deviceName, size, tags) { this.deviceName = deviceName; this.size = size; this.tags = tags; } this.devices = { mobile: new Device(\u0026#34;mobile\u0026#34;, \u0026#34;450x700\u0026#34;, [\u0026#34;mobile\u0026#34;]), tablet: new Device(\u0026#34;tablet\u0026#34;, \u0026#34;600x800\u0026#34;, [\u0026#34;tablet\u0026#34;]), desktop: new Device(\u0026#34;desktop\u0026#34;, \u0026#34;1024x768\u0026#34;, [\u0026#34;desktop\u0026#34;]) }; 修改layout测试中的设备辨别和测试 @on * header: height 5 to 100px @on tablet content: width 600px @on desktop content: width 1024px 生成测试报告 ➜ GalenDemo git:(master) ✗ galen test test/step3.test.js --htmlreport ./report ======================================== Test: Home page on mobile ======================================== Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 36316 Only local connections are allowed. Aug 03, 2017 2:56:04 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: OSS = Main section = header: height 5 to 100px ======================================== Test: Home page on tablet ======================================== Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 28325 Only local connections are allowed. Aug 03, 2017 2:56:07 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: OSS = Main section = header: height 5 to 100px content: width 600px ======================================== Test: Home page on desktop ======================================== Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 12177 Only local connections are allowed. Aug 03, 2017 2:56:10 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: OSS = Main section = header: height 5 to 100px content: width 1024px ======================================== ---------------------------------------- ======================================== Suite status: PASS Total tests: 3 Total failed tests: 0 Total failures: 0 从日志中可以查看到，每次在不同设备测试时layout代码已变更 Test: Home page on desktop ======================================== Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 12177 Only local connections are allowed. Aug 03, 2017 2:56:10 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: OSS = Main section = header: height 5 to 100px content: width 1024px ======================================== 参考 http://galenframework.com/ http://galenframework.com/docs/reference-javascript-tests-guide/ ","permalink":"https://shiyuanjie.cn/posts/UITest/Responsive%E6%B5%8B%E8%AF%95/","summary":"\u003ch1 id=\"responsive测试\"\u003eResponsive测试\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e如何使用Galen进行\u003ccode\u003e响应式测试\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e使用Javascript编写测试代码\u003c/li\u003e\n\u003cli\u003e完整代码：\u003ca href=\"https://github.com/aimer1124/GalenDemo\"\u003ehttps://github.com/aimer1124/GalenDemo\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- more --\u003e\n\u003ch2 id=\"安装galen\"\u003e安装Galen\u003c/h2\u003e\n\u003ch3 id=\"通过npm安装\"\u003e通过NPM安装\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo npm install -g galenframework-cli\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"检查安装版本galen--v\"\u003e检查安装版本\u003ccode\u003egalen -v\u003c/code\u003e\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e➜  GalenDemo git:(master) ✗ galen -v\nGalen Framework\nVersion: 2.3.4\nJavaScript executor: Rhino 1.7 release 5 2015 01 29\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"第一步\"\u003e第一步\u003c/h2\u003e\n\u003ch3 id=\"创建测试文件存放于teststep1testjs\"\u003e创建测试文件，存放于\u003ccode\u003etest/step1.test.js\u003c/code\u003e\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etest(\u0026#34;First test\u0026#34;, function () {\n    console.log(\u0026#39;This is first test\u0026#39;)\n});\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"执行测试\"\u003e执行测试\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e➜  GalenDemo git:(master) ✗ galen test  test/*.js\n========================================\nTest: First test\n========================================\nThis is first test\n\n========================================\n----------------------------------------\n========================================\nSuite status: PASS\nTotal tests: 1\nTotal failed tests: 0\nTotal failures: 0\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"第二步\"\u003e第二步\u003c/h2\u003e\n\u003ch2 id=\"添加多个不同的设备用于测试兼容性\"\u003e添加多个不同的设备，用于测试兼容性\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ethis.devices = {\n    mobile: {\n        deviceName: \u0026#34;mobile\u0026#34;,\n        size: \u0026#34;400x700\u0026#34;\n    },\n    tablet: {\n        deviceName: \u0026#34;tablet\u0026#34;,\n        size: \u0026#34;600x800\u0026#34;\n    },\n    desktop: {\n        deviceName: \u0026#34;desktop\u0026#34;,\n        size: \u0026#34;1024x768\u0026#34;\n    }\n};\n\n\nforAll(devices, function (device) {\n    test(\u0026#34;Home page on ${deviceName}\u0026#34;, function (device){\n        var driver = createDriver(\u0026#34;http://galenframework.com\u0026#34;,\n            device.size,\n            \u0026#34;chrome\u0026#34;);\n        console.log(device.size)\n    });\n});\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"查看测试结果\"\u003e查看测试结果\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e➜  GalenDemo git:(master) ✗ galen test test/*.js\n========================================\nTest: Home page on mobile\n========================================\nStarting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 10344\nOnly local connections are allowed.\nAug 01, 2017 2:34:11 PM org.openqa.selenium.remote.ProtocolHandshake createSession\nINFO: Detected dialect: OSS\n400x700\n========================================\nTest: Home page on tablet\n========================================\nStarting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 6454\nOnly local connections are allowed.\nAug 01, 2017 2:34:17 PM org.openqa.selenium.remote.ProtocolHandshake createSession\nINFO: Detected dialect: OSS\n600x800\n========================================\nTest: Home page on desktop\n========================================\nStarting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 42862\nOnly local connections are allowed.\nAug 01, 2017 2:34:23 PM org.openqa.selenium.remote.ProtocolHandshake createSession\nINFO: Detected dialect: OSS\n1024x768\n\n========================================\n----------------------------------------\n========================================\nSuite status: PASS\nTotal tests: 3\nTotal failed tests: 0\nTotal failures: 0\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"第三步-引入gspec文件来难页面布局\"\u003e第三步 引入\u003ccode\u003egspec\u003c/code\u003e文件，来难页面布局\u003c/h2\u003e\n\u003ch3 id=\"新增specshome-pagegspec\"\u003e新增\u003ccode\u003especs/home-page.gspec\u003c/code\u003e\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e@objects\n    header              id      header\n\n= Main section =\n    header:\n        height 5 to 100px\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"在测试脚本step3testjs中添加layout检查\"\u003e在测试脚本\u003ccode\u003estep3.test.js\u003c/code\u003e中添加Layout检查\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e    test(\u0026#34;Home page on ${deviceName}\u0026#34;, function (device){\n        var driver = createDriver(\u0026#34;http://samples.galenframework.com/tutorial1/tutorial1.html\u0026#34;,\n            device.size,\n            \u0026#34;chrome\u0026#34;);\n        checkLayout(driver, \u0026#34;GalenDemo/home-page.gspec\u0026#34;, [device.deviceName]);\n    });\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"添加关闭浏览器\"\u003e添加关闭浏览器\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edriver.close();\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"添加页面pageobject\"\u003e添加页面\u003ccode\u003epageObject\u003c/code\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e新增\u003ccode\u003epageObject\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ethis.home = $page(\u0026#34;home\u0026#34;, {\n    content: \u0026#34;div#content\u0026#34;\n});\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e测试中引用\u003ccode\u003epageObject\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e        var homepage = new home(driver);\n        if (!homepage.content.exists()){\n            console.log(\u0026#34;Content element don\u0026#39;t exist\u0026#34;)\n        }\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"第四步-不同分辨率下layout测试及生成测试报告\"\u003e第四步 不同分辨率下Layout测试及生成测试报告\u003c/h2\u003e\n\u003ch3 id=\"不同分辨率测试\"\u003e不同分辨率测试\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e重新调整设备配制信息\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunction Device(deviceName, size, tags) {\n    this.deviceName = deviceName;\n    this.size = size;\n    this.tags = tags;\n}\n\nthis.devices = {\n    mobile:  new Device(\u0026#34;mobile\u0026#34;, \u0026#34;450x700\u0026#34;, [\u0026#34;mobile\u0026#34;]),\n    tablet:  new Device(\u0026#34;tablet\u0026#34;, \u0026#34;600x800\u0026#34;, [\u0026#34;tablet\u0026#34;]),\n    desktop: new Device(\u0026#34;desktop\u0026#34;, \u0026#34;1024x768\u0026#34;, [\u0026#34;desktop\u0026#34;])\n};\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e修改\u003ccode\u003elayout\u003c/code\u003e测试中的设备\u003ccode\u003e辨别和测试\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e    @on *\n        header:\n            height 5 to 100px\n\n    @on tablet\n        content:\n            width 600px\n\n    @on desktop\n        content:\n            width 1024px\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"生成测试报告\"\u003e生成测试报告\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e➜  GalenDemo git:(master) ✗ galen test test/step3.test.js --htmlreport ./report\n========================================\nTest: Home page on mobile\n========================================\nStarting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 36316\nOnly local connections are allowed.\nAug 03, 2017 2:56:04 PM org.openqa.selenium.remote.ProtocolHandshake createSession\nINFO: Detected dialect: OSS\n= Main section =\n    header:\n        height 5 to 100px\n\n========================================\nTest: Home page on tablet\n========================================\nStarting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 28325\nOnly local connections are allowed.\nAug 03, 2017 2:56:07 PM org.openqa.selenium.remote.ProtocolHandshake createSession\nINFO: Detected dialect: OSS\n= Main section =\n    header:\n        height 5 to 100px\n\n    content:\n        width 600px\n\n========================================\nTest: Home page on desktop\n========================================\nStarting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 12177\nOnly local connections are allowed.\nAug 03, 2017 2:56:10 PM org.openqa.selenium.remote.ProtocolHandshake createSession\nINFO: Detected dialect: OSS\n= Main section =\n    header:\n        height 5 to 100px\n\n    content:\n        width 1024px\n\n\n========================================\n----------------------------------------\n========================================\nSuite status: PASS\nTotal tests: 3\nTotal failed tests: 0\nTotal failures: 0\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e从日志中可以查看到，每次在不同\u003ccode\u003e设备\u003c/code\u003e测试时\u003ccode\u003elayout\u003c/code\u003e代码已变更\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eTest: Home page on desktop\n========================================\nStarting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 12177\nOnly local connections are allowed.\nAug 03, 2017 2:56:10 PM org.openqa.selenium.remote.ProtocolHandshake createSession\nINFO: Detected dialect: OSS\n= Main section =\n    header:\n        height 5 to 100px\n\n    content:\n        width 1024px\n\n\n========================================\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"参考\"\u003e参考\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://galenframework.com/\"\u003ehttp://galenframework.com/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://galenframework.com/docs/reference-javascript-tests-guide/\"\u003ehttp://galenframework.com/docs/reference-javascript-tests-guide/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"Responsive测试"},{"content":"为什么要提反馈 什么是反馈 来自百度百科 - 反馈\n反馈又称回馈，是现代科学技术的基本概念之一。一般来讲，控制论中的反馈概念，指将系统的输出返回到输入端并以某种方式改变输入，进而影响系统功能的过程，即将输出量通过恰当的检测装置返回到输入端并与输入量进行比较的过程。反馈可分为负反馈和正反馈。在其他学科领域，反馈一词也被赋予了其他的含义，例如传播学中的反馈，无线电工程技术中的反馈等等。 简单来讲就是，我跟你说话，你要响应我。如果我说的是你做的好的，就是正反馈；如果是做的不好的，就是负反馈。\n为什么要提反馈 提反馈，是为了提出并让对方知道在什么场景下的行为是 正确的还是错误 。\n如果你为了 对方 好，请给出`反馈`。 反馈的分类及方法 正面的反馈-STAR S/T：S ituation/T ask，情况/任务。 A：A ction，行为。 R：R esults，结果。 给反馈的过程中，一定要 真诚、具体明确，按上面的STAR，给出反馈。\n改进型的反馈-STARAR S/T：S ituation/T ask，情况/任务。 A：A ction，行为。 R：R esults，结果。 A/R：Alternative A ction/Alternative R esults 针对改进型的反馈，最好在反馈的最后给出自己的建议和结果。\n给反馈时，一定要 - 基于具体的事实 - 不要带个人的感情色彩 - 充分了解反馈内容的Context 总结 给出反馈后，一定要记得及时跟进反馈的结果。 反馈一定要是基于事实。 参考 反馈 ","permalink":"https://shiyuanjie.cn/posts/Management/TeamLeader%E5%A6%82%E4%BD%95%E6%8F%90%E5%8F%8D%E9%A6%88/","summary":"\u003ch2 id=\"为什么要提反馈\"\u003e为什么要提反馈\u003c/h2\u003e\n\u003ch3 id=\"什么是反馈\"\u003e什么是反馈\u003c/h3\u003e\n\u003cp\u003e来自百度百科 - \u003ca href=\"http://baike.baidu.com/link?url=AvOQ2ATaxoMULc09bflgMRpcftXrL-9qFx4nvvAVuVJXjzHod1mYxCtGOg2esb5g7gMHkFXgGpxgZfijCTeZTP3J_mk8eQM3sf33DNl5Woe\"\u003e反馈\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e反馈又称回馈，是现代科学技术的基本概念之一。一般来讲，控制论中的反馈概念，指将系统的输出返回到输入端并以某种方式改变输入，进而影响系统功能的过程，即将输出量通过恰当的检测装置返回到输入端并与输入量进行比较的过程。反馈可分为负反馈和正反馈。在其他学科领域，反馈一词也被赋予了其他的含义，例如传播学中的反馈，无线电工程技术中的反馈等等。\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e简单来讲就是，我跟你说话，你要响应我。如果我说的是你做的好的，就是正反馈；如果是做的不好的，就是负反馈。\u003c/p\u003e\n\u003ch3 id=\"为什么要提反馈-1\"\u003e为什么要提反馈\u003c/h3\u003e\n\u003cp\u003e提反馈，是为了提出并让对方\u003ccode\u003e知道\u003c/code\u003e在什么场景下的行为是 \u003cem\u003e正确的还是错误\u003c/em\u003e 。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e如果你为了 对方 好，请给出`反馈`。\n\u003c/code\u003e\u003c/pre\u003e","title":"Feedback反馈"},{"content":"大王 作为项目的TL，最近接手一个任务，需要分配给同事去做，其他同事都不适合只有 小牛 比较适合。小牛 是项目组的成员，平时加班很多，最近家里也有点事情。工作和生活的事情加在一起，搞的 小牛 焦头烂额的。 于是，大王 找 小牛 想说下分配工作的事情，大王 也知道 小牛 最近加班很多。感觉有点不好意思，但工作还是要分配的。 大王：小牛啊，看你最近加班挺多的。但没有办法，我们又接到一个新任务，公司下个月要把这个项目做完。要不公司今年的业绩会受到影响的。这个任务，还要分配给你 小牛：又有任务？我现在每天都在加班，忙的很啊 大王：没办法，别人都不适合干这个 小牛：(皱了皱眉头)，那好吧。 小牛虽然接了新的任务，但他的内心很不愿意。又迫于 大王 是领导，没办法拒绝。只要继续之前的工作状态。 很多人都有过类似的经历，无论是安排或被安排。那么我们有没有办法，可以让 小牛 在接受任务的时候，不那么难堪。或者让 大王 明白 小牛 其实内心很不愿意，但没地方诉说。 那么，在 大王 分配 任务时，我们是不是可以换一种沟通方式来解除双方的沟通障碍，让沟通更加顺畅？ 为什么会有沟通障碍 究竟是什么原因，引起这样的情况发生呢？ - 认知偏差。下面我们来看看究竟什么是认知偏差\n来源 百度百科 认知偏差是指人们根据一定表现的现象或虚假的信息而对他人作出判断，从而出现判断失误或判断本身与判断对象的真实情况不相符合。 为什么会引起认知偏差，看看知乎上面的作答人容易出现哪些认知偏差？ 回到文章开头的故事： 大王 分配任务是从公司的角度在出发，完成公司的业绩。再让团队把这个事情完成，自己的活就算完成了。 但 小牛 接受任务时，纯粹从个人的角度出来，迫于领导的压力。但自己的事情又干不完，只能口头先答应。后面边干边说。 下面，我们就简单分析下产生沟通障碍的原因及为什么 大王 和 小牛 会有各自不同的想法。\n产生沟通障碍的原因 听不到位 往往我们在与人沟通时，会听到一些信息，但大部分对方表达出来的只是表面的意思。也就是表达出来的需求，但还有一部分未表达出来的需求，这部分需求往往是因为我们在沟通时，没有听到位。\n无效表达 在沟通过程中，会表达出来很多内容。但往往很多都是无效的，如何去除这些，并找到或引导对方把真正的内容表达出来，这就是在沟通障碍的另一原因。\n缺乏参与 沟通问题过程中，我们往往在没有参与实际工作时，与他人沟通。这样我们在沟通时，所表达出来的意思就是基于我们所认为或想象的样子。这是最后一个引起沟通障碍的原因。\n如何来克服或资源，在沟通中出现上面的三种情况，并达到在效的沟通呢。下面再围绕三个方面来讲下：听、问、说。 有效沟通的技巧 听 如何在沟通中听出对方的真正想表达的意思，要做到以下三点：C A R。\nC：Concentrate，专注集中。想达到这个目标，最好先选择一个合适的环境，首先让自己可以专注的听对方的表达。 A：Acknowledge，理解确认。在听对方表述的过程中，要及时或适时的 以自己的语言复述对方所表达的意思，在复述后通过澄清来让对方确认是否理解一致。 R：React，回应情绪。在对方表达结束后，第一步要从同理心的角度，给对方回应。做到同理心需要我们： 回应事实 回应情绪 不要表示 同意，同情，提意见，比惨 其实在听的过程中，需要我们 听出 下面4个维度的信息\n显然，在沟通时只听是不够的。还需要我们及时的提问。\n问 问目的有：收集信息 了解真相 澄清疑虑 核对想法 拓展思维 鼓励参与。如何有效的提问，就需要我们掌握下面两种提问方式：\n封闭式问题：往往用于向对方确认结果，经常只需要对方给出是否、对错的结果。如：\n你说的是明天给我方案？ 你的想法是需要8个Dev、1个QA？ 你的方案是先A，再B，最后C，对吗？ 你需要张三来协助你，是这样么？ 给你5个人，你就可以完成这项工作？ 开放式问题：激活对方的思考。如：\nWhat 你的建议是什么？ 可能遇到什么挑战/困难/障碍？ When 你认为什么时候可以完成？ 我们何时开始进行？ Why 什么原因，你会这样建议？ 这样建议的理由是？ 你认为可能是什么原因？ How 你打算如何开始/进行? 要怎么样做，才可以？ 下一步该做什么才能有效的面对现状？ Who 谁可以帮忙呢？ 哪些人应该进入这个项目计划？ 可以从谁那边获取资源/资料/协助？ 其它 假如你是XX，你会如何处理？ 如果拥有充分的资源和决定权，你打算怎么做？ 问的过程中，我们还要掌握下面的技巧：\n尽量简单，一次一个 由广泛到具体，沙漏状提问 保持开放，不要假问 运用跟进式来逐步提问 要有敏锐度，尊重隐私 问题不带威胁性，不激发防卫心 问的过程中，不要被对方带走方向。时刻铭记提问的初衷是什么 说 说 就是为了信息传达、坦诚分享、建立信任。\n注意事项：\n适度分享自己的感受和想法 不要忽略分享理由 补充自己的想法，而不是坚持自己的想法 我们通过会说哪些：\n意见/建议 \u0026ndash;\u0026gt; 原因/理由 \u0026ndash;\u0026gt; 感受\n结合上面的听、问、说，我们可以看到沟通过程中，其实是要做到 1. 明确主题 2. 理清情况 3. 讨论出沟通方案 4. 双方达成一致的作法 5. 最终再针对作法进行总结 再次回到文章开头的故事： 看看 双方 有哪些事情，说的不合适的 大王：小牛啊，看你最近加班挺多的。但没有办法，我们又接到一个新任务，公司下个月要把这个项目做完。要不公司今年的业绩会受到影响的。这个任务，还要分配给你 1. “但没办法”，从 小牛 的角度来看，公司的事情是公司的。没有什么没有办法的，反正公司又没有倒闭。 2. “公司业绩受到影响“，在 小牛 看来，之所以会有这个任务，完全是 大王 想拿这个任务来提高自己的业绩。跟自己压根就没有关系。 小牛：又有任务？我现在每天都在加班，忙的很啊 1. 没有明解了解任务的明细及对任务不清楚的地方 大王：没办法，别人都不适合干这个 1. “没办法”，可能是真的没办法。但让 小牛 听到之后感觉这就是 强塞 任务，完全就不跟自己商量。干好干差，也跟自己没多大关系。 2. “别人都不适合干这个“，小牛 也许会理解 大王 ，这个任务确实别人不合适。 小牛：(皱了皱眉头)，那好吧。 就这样沟通就结束了，小牛 虽然接受了任务。但他完成这个任务需要哪些资源、要做多少事情、什么时间完成等等都不明确。小牛 自己肯定也想着，这么多事情，老子哪做的过来。先接着吧，要不还得罪领导。 信任 有些时候，我们已经按上面的套路进行了。但发现还是不能有好的沟通，那么问题可能出现在双方的信任上。当你想跟对方沟通时，对方可能对你根本就不信任。那么如何建立信任呢？\n提升与亲密度 找到对方的爱好 如果对方有表面较好时，一定要及时给予肯定和表扬 提升个人能力，用技能来让对方信任 有较高的信用 千万不要太自私 文章中的故事可以看出来。小牛 接受这个任务，完全是基于领导力的压迫；大王 安排这个工作，也是为了完成公司的任务。虽然故事中，没有体现出来`信任`的关系，但是 大王 通过这次的任务安排，就可以相信 小牛 可以把这个任务做好呢？ 总结\u0026ndash;套路 定 方向：确定目的及重要性 理 情况：理清事实/数据，问题/疑虑 想 方案：一起讨论方案，并确定方案所需要的资源及支持 明 作法：确定最终的行动计划，及后续的追踪和应变 做 总结：把本次沟通的要点再明确，同时给予对方足够的信息来完成 以上的5步法，我们可以应用到平时的任务分配中，相信会起到不一样的效果。\n与同事沟通时，一定要明确影响的表达层级：个人 \u0026gt; 团队 \u0026gt; 公司。首先谈谈这件事情，会对个人的影响。 分配任务时，一定要让双方都能信任彼此。小牛 有足够的时间和资源来完成任务，有信心，大王 通过梳理任务中的问题，最终与小牛达成一致，相信 小牛 可以把任务做好。只有达到这种效果，大王 才能信任的把任务交给 小牛 来完成。 畅想下，如果再有文章开始的故事发生时，我们是否可以套用上面的套路来出牌。虽然我们的目的只有一个，让 小牛 接受任务。但是不是会达到更好的沟通效果呢？\n参考 认知偏差 人容易出现哪些认知偏差？ ","permalink":"https://shiyuanjie.cn/posts/Management/TeamLeader%E6%9C%89%E6%95%88%E6%B2%9F%E9%80%9A/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e大王 作为项目的TL，最近接手一个任务，需要分配给同事去做，其他同事都不适合只有 小牛 比较适合。小牛 是项目组的成员，平时加班很多，最近家里也有点事情。工作和生活的事情加在一起，搞的 小牛 焦头烂额的。\n于是，大王 找 小牛 想说下分配工作的事情，大王 也知道 小牛 最近加班很多。感觉有点不好意思，但工作还是要分配的。\n\n大王：小牛啊，看你最近加班挺多的。但没有办法，我们又接到一个新任务，公司下个月要把这个项目做完。要不公司今年的业绩会受到影响的。这个任务，还要分配给你\n小牛：又有任务？我现在每天都在加班，忙的很啊\n大王：没办法，别人都不适合干这个\n小牛：(皱了皱眉头)，那好吧。\n\n小牛虽然接了新的任务，但他的内心很不愿意。又迫于 大王 是领导，没办法拒绝。只要继续之前的工作状态。\n\n很多人都有过类似的经历，无论是安排或被安排。那么我们有没有办法，可以让 小牛 在接受任务的时候，不那么难堪。或者让 大王 明白 小牛 其实内心很不愿意，但没地方诉说。\n\n那么，在 大王 分配 任务时，我们是不是可以换一种沟通方式来解除双方的沟通障碍，让沟通更加顺畅？\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"为什么会有沟通障碍\"\u003e为什么会有沟通障碍\u003c/h2\u003e\n\u003cp\u003e究竟是什么原因，引起这样的情况发生呢？ - \u003ccode\u003e认知偏差\u003c/code\u003e。下面我们来看看究竟什么是\u003ccode\u003e认知偏差\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e来源  \u003cem\u003e百度百科\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e认知偏差是指人们根据一定表现的现象或虚假的信息而对他人作出判断，从而出现判断失误或判断本身与判断对象的真实情况不相符合。\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e为什么会引起\u003ccode\u003e认知偏差\u003c/code\u003e，看看知乎上面的作答\u003ca href=\"https://www.zhihu.com/question/37723905\"\u003e人容易出现哪些认知偏差？\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"TeamLeader的有效沟通"},{"content":"经常在团队内部出现问题时，作为一名合格的TeamLeader，我们如何才能正确的分析问题并解决问题呢？ 如何分析问题 找到问题的本质：每个问题的发生，都是有原因的。作为TL，如何引导团队找到问题的的本质 为什么会发生这样的问题 分析发生的原因： 为什么这个人会引发这样的问题 如何让团队在后面的开发过程中，避免再次出现类似的问题 引发问题的原因及解决方案 与团队成员一并商讨，问题的原因 最终达成共识，确定解决方案 从上面分析问题的过程，我们可以看出来作为TL - 一定要从当前的思维中跳出来，找准自己的角色 - 在问题分析的不同阶段，扮演好不同的角色。 如何才能正确的认知TL角色、作为TL需要戴哪几顶帽子呢？下面就这两个问题讨论下 角色认识 分析 往往我们在做决定时，都会基于特定的环境。 不同的环境我们会有不同的行为。 行为的产生是因为我们所拥有的知识和技能不同。 拥有不同的知识和技能，部分程度是由于我们的信念不同。 信念的产生，又是因为不同的价值观。 价值观的产生，往往是基于我们对当时的角色认知不同 角色认识的不同，是因为我们的精神归属不同。 通过上面的分析，我们可以发现。大部分情况下，我们所做的决定，都是因为我们对角色认知不同或错误，进而做出了一些不合适或错误的决定。那如何才能 减少或避免 这种情况的发生呢？\n工具 基于上面的分析，我们可以套用NLP思维逻辑层次.\n精神归属：谈及自己时，人生的意义和所做出的社会价值 角色认知：自己需要以哪种角色来处理当前的事情 价值观：当不同的事情摆在面前时，应该采用何种方式来处理？处理问题的优先级应该如何排序？ 信念 为什么做(或不做) 有些什么(重要)意义? 应该是怎样的? 对我有什么好处? 知识和技能：真正做事情时，所需要的能力(知识和技能) 行为：做事情时，自己会有哪些表现 环境：在什么环境下，会这样来做 总结 在所处的环境下，每个人处理问题所表现出来的方式和方法，都依赖于他在以上几个层次对自己的判断。可以准确判断出自己在每个层次所处的位置，对于正确处理问题来说，非常重要。\n4顶帽子 作为TL在平时的工作中，基本都会戴上这几顶帽子。只有在不同的场景中，所戴的帽子不同。有时多，有时少。\nExpert 大部分的TL，都是纯技术出身，所在行业的Expert。当然这个不是非必要条件。\n作为Expert，我们需要关注的是解决问题。\nManager 当戴上Manager的帽子时，就需要把事情管对、管理的事情也要让别人愿意被管理或管理的舒服。\n作为Manager，我们需要关注的是达成结果。\nLeader 需要Leader时，需要我们引领团队。有一定的战略思维、创新能力、演讲能力。\n作为Leader，我们需要关注的是鼓励他人。\nCoach 需要我们当Coach时，我们需要做的更多的是聆听和提问。\n作为Coach，我们需要关注发展他人、发现他人的问题、协助他人来解决问题。\n总结 4顶帽子，看起来比较容易，但在项目过程中，往往我们会没有太多的时间来处理具体的事情。其实出现这些问题的本质就是我们要做平衡：人、事，长期、短期的平衡。并在平衡的过程中，选择一个当下最合适的决定。\nSummary 从上面的分析，可以看出来：作为TL首先要认清自己角色的本质，再戴上4顶帽子，在出现问题时，做出合适的决定。\n参考 NLP思维逻辑层次 ","permalink":"https://shiyuanjie.cn/posts/Management/TeamLeader%E8%A7%92%E8%89%B2%E8%AE%A4%E7%9F%A5/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e经常在团队内部出现问题时，作为一名合格的TeamLeader，我们如何才能正确的分析问题并解决问题呢？\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"如何分析问题\"\u003e如何分析问题\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e找到问题的本质：每个问题的发生，都是有原因的。作为TL，如何引导团队找到问题的的本质\n\u003cul\u003e\n\u003cli\u003e为什么会发生这样的问题\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e分析发生的原因：\n\u003cul\u003e\n\u003cli\u003e为什么这个人会引发这样的问题\u003c/li\u003e\n\u003cli\u003e如何让团队在后面的开发过程中，避免再次出现类似的问题\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e引发问题的原因及解决方案\n\u003cul\u003e\n\u003cli\u003e与团队成员一并商讨，问题的原因\u003c/li\u003e\n\u003cli\u003e最终达成共识，确定解决方案\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e从上面分析问题的过程，我们可以看出来作为TL\n- 一定要从当前的思维中跳出来，找准自己的角色\n- 在问题分析的不同阶段，扮演好不同的角色。\n如何才能正确的认知TL角色、作为TL需要戴哪几顶帽子呢？下面就这两个问题讨论下\n\u003c/code\u003e\u003c/pre\u003e","title":"TeamLeader的角色认知"},{"content":"书 用户故事地图 读后感 如果你在玩敏捷，定要看此书； 如果还没玩敏捷，更要看此书。 极力推荐！！！ 开始做产品前，一定要构建出产品全景图。不要担心花时间，只有这里理讲产品的故事路线，后面的故事情节才能不偏离主线。 故事地图，一定要完整 确立精准的用户画像 从用户的角度来讲解故事的发展 确定计划 使用估算，来确立是否真的可以完成。并实时调整后续的发布计划 计划，也是为了后面项目计划的更好完善 MVP及各Release的发布计划确定 时间 范围 如何创建故事地图 分步骤写出你的故事 组织故事发展情节 寻找痛点中的替代故事 提取故事地图的主干路线 选择业务目标，从主干路线中提取完成业务所需要的故事 注意故事时，故事的粒度 如何将故事讲好 统一业务术语 制作故事描述模板 不需要把所有的内容都写在卡片上 常规的卡片结构 简短的标题 描述信息 故事序号 估算、规模或预算 优先级 校验规则 依赖 完成状态 状态日期 卡片信息如何传递并细化 Card编写卡片 Conversation讨论卡片 Confirmation确认卡片信息 Construction完善卡片信息，添加讨论结果、记要 Consequences与客户、团队达成一致，并完成估算 Tips： 讨论时，控制参加的人数为5以内 及时与客户Stackholder沟通产出（文档、软件），同步确定后续调整方案和策略 定期与团队、客户回顾故事发展情况，确定调整方案和策略 阅读时间：20170426-20170626 ","permalink":"https://shiyuanjie.cn/posts/Book/%E7%94%A8%E6%88%B7%E6%95%85%E4%BA%8B%E5%9C%B0%E5%9B%BE/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cp\u003e\u003cimg alt=\"用户故事地图\" loading=\"lazy\" src=\"https://images-cn.ssl-images-amazon.com/images/I/51iG786xhuL._SX422_BO1,204,203,200_.jpg\"\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B01DVFE2TK/ref=sr_1_1?ie=UTF8\u0026amp;qid=1499161495\u0026amp;sr=8-1\u0026amp;keywords=%E7%94%A8%E6%88%B7%E6%95%85%E4%BA%8B%E5%9C%B0%E5%9B%BE\"\u003e用户故事地图\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"读后感\"\u003e读后感\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e如果你在玩敏捷，定要看此书；\n如果还没玩敏捷，更要看此书。\n极力推荐！！！\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e开始做产品前，一定要构建出\u003ccode\u003e产品全景图\u003c/code\u003e。不要担心花时间，只有这里理讲产品的故事路线，后面的故事情节才能不\u003ccode\u003e偏离\u003c/code\u003e主线。\n\u003cul\u003e\n\u003cli\u003e故事地图，一定要完整\u003c/li\u003e\n\u003cli\u003e确立精准的\u003ccode\u003e用户画像\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e从\u003ccode\u003e用户\u003c/code\u003e的角度来讲解故事的发展\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e确定计划\n\u003cul\u003e\n\u003cli\u003e使用\u003ccode\u003e估算\u003c/code\u003e，来确立是否真的可以完成。并实时调整后续的发布计划\u003c/li\u003e\n\u003cli\u003e计划，也是为了后面项目计划的更好完善\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eMVP\u003c/code\u003e及各Release的发布计划确定\n\u003cul\u003e\n\u003cli\u003e时间\u003c/li\u003e\n\u003cli\u003e范围\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e如何创建故事地图\n\u003cul\u003e\n\u003cli\u003e分步骤写出你的故事\u003c/li\u003e\n\u003cli\u003e组织故事发展情节\u003c/li\u003e\n\u003cli\u003e寻找\u003ccode\u003e痛点\u003c/code\u003e中的替代故事\u003c/li\u003e\n\u003cli\u003e提取故事地图的主干路线\u003c/li\u003e\n\u003cli\u003e选择\u003ccode\u003e业务目标\u003c/code\u003e，从主干路线中提取完成\u003ccode\u003e业务\u003c/code\u003e所需要的故事\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e注意故事时，故事的粒度\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e如何将故事讲好\n\u003cul\u003e\n\u003cli\u003e统一业务术语\u003c/li\u003e\n\u003cli\u003e制作故事描述模板\u003c/li\u003e\n\u003cli\u003e不需要把所有的内容都写在卡片上\u003c/li\u003e\n\u003cli\u003e常规的卡片结构\n\u003cul\u003e\n\u003cli\u003e简短的标题\u003c/li\u003e\n\u003cli\u003e描述信息\u003c/li\u003e\n\u003cli\u003e故事序号\u003c/li\u003e\n\u003cli\u003e估算、规模或预算\u003c/li\u003e\n\u003cli\u003e优先级\u003c/li\u003e\n\u003cli\u003e校验规则\u003c/li\u003e\n\u003cli\u003e依赖\u003c/li\u003e\n\u003cli\u003e完成状态\u003c/li\u003e\n\u003cli\u003e状态日期\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e卡片信息如何传递并细化\n\u003cul\u003e\n\u003cli\u003eCard编写卡片\u003c/li\u003e\n\u003cli\u003eConversation讨论卡片\u003c/li\u003e\n\u003cli\u003eConfirmation确认卡片信息\u003c/li\u003e\n\u003cli\u003eConstruction完善卡片信息，添加讨论结果、记要\u003c/li\u003e\n\u003cli\u003eConsequences与客户、团队达成一致，并完成估算\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eTips：\n讨论时，控制参加的人数为5以内\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e及时与客户Stackholder沟通产出（文档、软件），同步确定后续调整方案和策略\u003c/li\u003e\n\u003cli\u003e定期与团队、客户回顾故事发展情况，确定调整方案和策略\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"阅读时间20170426-20170626\"\u003e阅读时间：\u003ccode\u003e20170426-20170626\u003c/code\u003e\u003c/h4\u003e","title":"用户故事地图"},{"content":" 原文地址：http://docs.locust.io/en/latest/what-is-locust.html# 什么是Locust Locust是一个容易使用、分布式的压力测试工具。它是用于网站压力测试(或其它系统)并找出多少用户一个系统可以承载。\n在测试过程中，策略就是一个Locust的蠕虫将会攻击你的网站。每一个locust的行为(或你使用的测试用户)是你自己定义的，并且蠕虫进程从一个网页视图中被实时监测。这样会帮助你来实现测试，在真实用户使用前定义系统的瓶颈。\nLocust是完全基于事件的，因此可以在单台机器中支持数以千计的用户在线。和其它基于事件的程序相比较，它是不需要使用回调的。相反，它通过gevent使用轻量级的进程。每一个locust测试你的网站时，实际上是真实的在内部运行它自己的进程(或greenlet,准确的说)。这样就允许你不使用复杂的回调方法，而是使用Python编写复杂的场景。\n特性 使用纯Python脚本编写测试场景\n不需要笨重的UI或臃肿的XML，只需要你平时编写的代码即可。使用协和来代替回调，你的代码看起来更像正常的Python代码块。\n分布式 \u0026amp; 大量级 - 支持数以千计的用户\nLocust支持跨多台机器来运行压力测试。当然由于基于事件，一个Locust节点也可以在单进程下支持好几千用户。这背后的原因是即使你模拟了这么多用户，但并不是所有的用户都是活跃在攻击你的系统。通常，用户是空闲的，在等待下一次的动作。每秒的请求 != 在线用户数。\n基于Web的UI\nLocust有一个整洁的 HTML + JS 用户交互界面，用于实时展示对应的测试明细。并且，由于UI是基于Web的，所以它是跨平台并容易扩展的。\n可测试任何系统\n即使Locust是面向Web的，但它可用于测试大部分系统。只需要针对你要测试的系统写一个client，再使用Locust来压测它。真的很容易！\n可改造的\nLocust是一个非常小巧并可改造的，并且我们计划一直保持这样。所有重量级的事件I/O和协程都被委托给gevent。容易改造的测试工具是我们创建Locust的初衷。\n背景 Locust被创建是因为我们要解决已经存在的问题。没有一个对于来说可以解决正确的问题，它们没找到核心点。我们尝试了JMeter和Tsung。这两个工具使用起来都很不错；在工作中，我们多次使用了前者来测试基准。JMeter。JMeter自带了UI交互，这一秒你可能认识这是一件好事。但你很快就会认识到，这是一个PITA，通过一些点击界面箅编码测试场景。第二，JMeter是基于线程的。这就是所有你想模拟的用户，你需要一个独立的线程。不用说，在一台机器实现几千用户是相当产灵活的。\n另一方面，由于是使用Erlang编写的，Tsung没有线程问题。它通过使用BEAM自身来实现轻量级线程，并很容易将量级提升。但，当定义测试场景时，Tsung和JMeter一样被限制了。它提供一个基于XML的动态描述语言来定义，在测试时的用户行为。我猜，你可以想像编码实现它的荣耀。当完成你的post请求并从测试日志中生成日志，展示任何图形排序或报告。接下来你就可以理解测试是怎么运行的。\n无论如何，在创建Locust时，我们已经尝试罗列这些问题。希望上面的痛点都不存在。\n我猜，你会说我们真的只是罗列了我们的好处。我们希望尽可能的实现一些有用的。\n作者 Jonatan Heyman(@jonatanheyman on Twitter) Carl Byström (@cgbystrom on Twitter) Joakim Hamrén (@Jahaaja on Twitter) Hugo Heyman (@hugoheyman on Twitter) 许可证 在MIT许可证下的开源许可(查看许可证明细)\n","permalink":"https://shiyuanjie.cn/posts/Locust/%E4%BB%80%E4%B9%88%E6%98%AFLocust/","summary":"\u003cul\u003e\n\u003cli\u003e原文地址：\u003ca href=\"http://docs.locust.io/en/latest/what-is-locust.html#\"\u003ehttp://docs.locust.io/en/latest/what-is-locust.html#\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"什么是locust\"\u003e什么是Locust\u003c/h2\u003e\n\u003cp\u003eLocust是一个容易使用、分布式的压力测试工具。它是用于网站压力测试(或其它系统)并找出多少用户一个系统可以承载。\u003c/p\u003e\n\u003cp\u003e在测试过程中，策略就是一个Locust的蠕虫将会攻击你的网站。每一个locust的行为(或你使用的测试用户)是你自己定义的，并且蠕虫进程从一个网页视图中被实时监测。这样会帮助你来实现测试，在真实用户使用前定义系统的瓶颈。\u003c/p\u003e\n\u003cp\u003eLocust是完全基于事件的，因此可以在单台机器中支持数以千计的用户在线。和其它基于事件的程序相比较，它是不需要使用回调的。相反，它通过\u003ca href=\"http://www.gevent.org/\"\u003egevent\u003c/a\u003e使用轻量级的进程。每一个locust测试你的网站时，实际上是真实的在内部运行它自己的进程(或greenlet,准确的说)。这样就允许你不使用复杂的回调方法，而是使用Python编写复杂的场景。\u003c/p\u003e","title":"什么是Locust"},{"content":"分布式运行Locust 一旦单台机器不够模拟足够多的用户时，Locust支持运行在多台机器中进行压力测试。\n为了实现这个，你应该在master模式中使用--master标记来启用一个Locust实例。这个实例将会运行你启动测试的Locust交互网站并查看实时统计数据。master节点的机器自身不会模拟任何用户。相反，你必须使用--slave标记启动一台到多台Locustslave机器节点，与标记--master-host一起使用(指出master机器的IP/hostname)。\n常用的做法是在一台独立的机器中运行master，在slave机器中每个处理器内核运行一个slave实例。\n** !Note **\n** master和每一台slave机器，在运行分布式测试时都必须要有locust的测试文件。**\n示例 使用master模式启动:\nlocust -f my_loucstfile.py --master 在每个slave中执行(使用master机器的IP替换192.168.0.14):\nlocust -f my_locustfile.py --slave --master-host=192.168.0.14 参数 --master 设置locust为master模式。网页交互会在这台节点机器中运行。\n--slave 设置locust为slave模式。\n--master-host=X.X.X.X 可选项，与--slave一起结合使用，用于设置master模式下的master机器的IP/hostname(默认设置为127.0.0.1)\n--master-port=5557 可选项，与--slave一起结合使用，用于设置master模式下的master机器中Locust的端口(默认为5557)。注意，locust将会使用这个指定的端口号，同时指定端口+1的号也会被占用。因此，5557会被使用，Locust将会使用5557和5558。\n--master-bind-host=X.X.X.X` 可选项，与--master一起结合使用。决定在master模式下将会绑定什么网络接口。默认设置为*(所有可用的接口)。\n--master-bind-port=5557 可选项，与--master一起结合使用。决定哪个网络端口master模式将会监听。默认设置为5557。注意Locust会使用指定的端口号，同时指定端口+1的号也会被占用。因此，5557会被使用，Locust将会使用5557和5558。\n本文Locust版本0.7.5 原文地址：http://docs.locust.io/en/latest/running-locust-distributed.html ","permalink":"https://shiyuanjie.cn/posts/Locust/Locust%E5%88%86%E5%B8%83%E5%BC%8F%E6%B5%8B%E8%AF%95/","summary":"\u003ch2 id=\"分布式运行locust\"\u003e分布式运行Locust\u003c/h2\u003e\n\u003cp\u003e一旦单台机器不够模拟足够多的用户时，Locust支持运行在多台机器中进行压力测试。\u003c/p\u003e\n\u003cp\u003e为了实现这个，你应该在\u003ccode\u003emaster\u003c/code\u003e模式中使用\u003ccode\u003e--master\u003c/code\u003e标记来启用一个Locust实例。这个实例将会运行你启动测试的Locust交互网站并查看实时统计数据。\u003ccode\u003emaster\u003c/code\u003e节点的机器自身不会模拟任何用户。相反，你必须使用\u003ccode\u003e--slave\u003c/code\u003e标记启动一台到多台Locust\u003ccode\u003eslave\u003c/code\u003e机器节点，与标记\u003ccode\u003e--master-host\u003c/code\u003e一起使用(指出\u003ccode\u003emaster\u003c/code\u003e机器的\u003ccode\u003eIP/hostname\u003c/code\u003e)。\u003c/p\u003e\n\u003cp\u003e常用的做法是在一台独立的机器中运行master，在\u003ccode\u003eslave\u003c/code\u003e机器中每个处理器内核运行一个\u003ccode\u003eslave\u003c/code\u003e实例。\u003c/p\u003e\n\u003cp\u003e** !Note **\u003c/p\u003e\n\u003cp\u003e** \u003ccode\u003emaster\u003c/code\u003e和每一台\u003ccode\u003eslave\u003c/code\u003e机器，在运行分布式测试时都\u003ccode\u003e必须\u003c/code\u003e要有locust的测试文件。**\u003c/p\u003e","title":"分布式测试"},{"content":"Locust文件就是一般的Python文件。唯一的需求就是它至少需要一个继承于Locust的类.\nLocust类 Locust类代表一个用户(如果愿意，也可以是一个准备出动的蝗虫)。Locust会为每一个模拟用户生成一个locust类实例。同时会有一些locust类属性被定义。\ntask_set属性 task_set属性是指向一个定义用户行为的TaskSet类，下面会有详细的介绍。\nmin_wait和max_wait属性 除了task_set属性，另外一个经常被使用的就是min_wait和max_wait属性。是用于各自以毫秒为单位的最小值和最大值，一个模拟用户将会在每个任务执行时的等待执行的时间间隔。min_wait和max_wait默认设置为1000，如果不声明的话，Locust会默认在每个任务间等待1秒。\n参考下面的代码，每个用户将会在每个任务间等待5至15秒:\nfrom locust import Locust, TaskSet, task_set class MyTaskSet(TaskSet): @task def my_task(self): print \u0026#34;executing my_task\u0026#34; class MyLocust(Locust): task_set = MyTaskSet min_wait = 5000 max_wait = 15000 min_wait和max_wait属性可以用于重写TaskSet类。\nweight属性 你可以通过同一个文件来运行两个locust，就像这样:\nlocust -f locust_file.py WebUserLocust MobileUserLocust 如果你更倾向于用这种方法来运行，便可以在这些类中尝试weight属性。比如，就像这样来定义web用户比Mobile用户多3倍：\nclass WebUserLocust(Locust): weight = 3 ... class MobileUserLocust(Locust): weight = 1 ... host属性 host属性是到要加载目标URL的前缀(如:\u0026quot;http://google.com\u0026quot;)。通常情况下，当Locust被启动时，在命令行中是需要通过--host来指定的。如果host属性在locustfile文件中被声明，则在命令行中则不需要使用--host属性来再次声明。\nTaskSet类 如果Locust类代表一只准备出动的蝗虫，那么你可以说TaskSet类代表蝗虫的大脑。每一个Locust类中必须要包含一个指向TaskSet的task_set属性设置。\nTaskSet就像它的名字一样，是一个任务集合。这些任务是常规的Python调用,如果我们压力测试一个拍卖网站，便可以做这些操作加载启动页面、搜索一些产品、竞标。\n当一个压力测试被启动时，每一个准备的Locust类实例将会开始执行它们的TaskSet。接下来是每一个TaskSet找到它的task并调用它。它将在min_wait和max_wait属性值之间随机等待几毫秒(除非min_wait和max_wait被定义在TaskSet中，在这种情况下将会使用TaskSet设置的值)。然后，它将会找到一个新task并调用，再次等待，一直这样持续下去。\n声明task 对于TaskSet来说，典型的声明task的方法是直接使用task。\n参考这个例子:\nfrom locust import Locust, TaskSet, task class MyTaskSet(TaskSet): @task def my_task(self): print \u0026#34;Locust instance (%r) executing my_task\u0026#34; % (self.locust) class MyLocust(Locust): task_set = MyTaskSet @task 将会获取一个可选的权重参数，用于说明任务执行的比率。在下面的例子中 task2 将会比 task1 执行的次数多两倍:\nfrom locust import Locust, TaskSet, task class MyTaskSet(TaskSet): min_wait = 5000 max_wait = 15000 @task(3) def task1(self): pass @task(6) def task2(self): password class MyLocust(Locust): task_set = MyTaskSet task属性 使用@task操作符来声明task是一种便捷的方法，并且经常是最好的方式。然而，也可以定义TaskSet中的task通过设置tasks属性(使用操作符@task比tasks属性更流行)。\ntasks 属性不是python列表的调用就是一个callbale:int字典。tasks是python调用接收执行task的TaskSet类实例参数。下面是一个极其简单的示例(不会影响任何测试):\nfrom locust import Locust, TaskSet def my_task(l): pass class MyTaskSet(TaskSet): tasks = [my_task] class MyLocust(Locust): task_set = MyTaskSet 如果task属性被定义在列表中，每次任务被执行时，将会随机从 tasks 属性中选择。如果 tasks 是一个带有关健字和数值调用的字典，被执行的任务将会被随机选择以数字的比率来执行。就像下面的这样:\n{my_task: 3, another_task:1} my_task 将会比 another_task 多执行三倍。\nTaskSet可以嵌套 TaskSet有一个重要的属性就是可以被嵌套，由于真实的网站是有一定的业务层级结构的，并带有一些子模块。嵌套的TaskSet将会帮助我们来定义更加真实的用户行为。比如，我们可以定义TaskSet像下面的结构\nMain user behaviour Index page Forum page Read thread Reply New thread View next page Browser categories Watch movies Filter movies About page 嵌套TaskSet的方法就像使用task属性来说明task一样，但代替参考Python函数，你可以参考下面的TaskSet:\nclass ForumPage(TaskSet): @task(20) def read_thread(self): pass @task(1) def new_thread(self): pass @task(5) def stop(self): self.interrupt() class UserBehaviour(TaskSet): tasks = {ForumPage:10} @task def index(self): pass 在上面的示例中，当UserBehaviour的TaskSet执行时，ForumPage会被选中来执行，接下来ForumPage的TaskSet将会开始执行。ForumPage的TaskSet会找到它的tasks并执行它，再等待，一直这样持续下去。\n针对上面的例子中有一个重要的事情要注意，就是在ForumPage页面中的Stop方法中调用self.interrupt()。这个做的事情是停止执行ForumPage任务并在UserBehaviour实例中继续执行。如果在ForumPage中，我们没有调用interrupt()方法，除非被调用否则Locust不会调用ForumPage任务。但通过interrupt函数 ，我们可以结合weight任务来定义模拟用户离开Forum.\n也可以在类内部声明嵌套TaskSet,通过使用@task操作符，像声明正常的task一样：\nclass MyTaskSet(TaskSet): @task class SubTaskSet(TaskSet): @task def my_task(self): pass on_start函数 TaskSet可以选择声明on_start函数。如果这样的话，当模拟用户开始执行TaskSet类时，函数被调用。\n关联Locust实例，或父TaskSet实例 TaskSet实例有locust属性来指向它的Locust实例，属性parent用来指向它的父TaskSet（它会指向Locsut实例，在基类TaskSet中）。\nHTTP请求 到现在为止，我们仅覆盖了一个Locsut用户的部分任务计划。为了真实的压力测试一个系统时，我们需要生成HTTP请求。为了帮助我们实现这个功能，可以使用HttpLocust类。当使用这个类时，每一个实例将会获得一个用于生成Http请求的HttpSession实例的client属性。\nclass HttpLocust 表示一个用于压力测试的孵化和攻击系统的HTTP 用户。\n这个用户的行为通过task_set属性来定义，直接指向TaskSet类。\n这个类创建一个client属性，在初始化时，HTTP客户端支持为每一个用户在请求间保存session。\nclient=None HttpSession实例在Locust初始化时被创建。client支持cookies，同时在请求间会保存session。\n当从HttpLocust类继承时，我们可以使用client属性来对服务器生成HTTP请求。下面是一个locust文件示例用于在一个网站的两个URL / 和 /about/ 。\nfrom locust import HttpLocust, TaskSet, task class MyTaskSet(TaskSet): @task(2) def index(self): self.client.get(\u0026#39;/\u0026#39;) @task(1) def about(self): self.client.get(\u0026#39;/about/\u0026#39;) class MyLocust(HttpLocust): task_set = MyTaskSet min_wait = 5000 max_wait = 15000 使用上面的Locust类，每一个模拟用户将间隔5-15秒内请求，并且/将会比/about/请求数量多2倍。\n细心的读者会发现有一些奇怪，我们使用self.client关联HttpSession实例，而不是TaskSet,也不是self.locust.client。我们可以这样做，是因为TaskSet类有一个属性调用client简单的返回self.locust.client。\n使用HTTP client 每一个HttpLocust实例在client属性中有一个HttpSession实例。HttpSession类实际上是requests.Session的子类，可使用get post put delete head patch 和 options方法来生成HTTP请求，用于Locust的数据统计。HttpSession实例在请求间维护cookies，因此可用于登录网站并保存session在请求之间。client可以通过Locust实例的TaskSet实例来关联，因此很容易获取client并在任务中生成HTTP请求。\n下面是一个生成GET请求到 /about 路径的示例(在这里，我们可以假设 self 是一个TaskSet 或 HttpLocust 类的实例):\nresponse = self.client.get(\u0026#34;/about\u0026#34;) print \u0026#34;Response staus code:\u0026#34;, response.status_code print \u0026#34;Response content:\u0026#34;, response.content 下面是一个生成POST请求的示例:\nresponse = self.client.post(\u0026#34;/login\u0026#34;, {\u0026#34;username\u0026#34;: \u0026#34;testuser\u0026#34;, \u0026#34;password\u0026#34;: \u0026#34;password\u0026#34;}) 安全模式 HTTP client被配制运行在safe_mode。这样做是任何请求在连接超时、错误、相似失败时将不会抛出异常，而是返回一个空的假Response对象。请求将会在Locust统计中算做一次失败。返回假Response内容属性将会被设置为None，并且它的status_code将会是0.\n手动设置请求是成功或失败 默认情况下，请求被标记为失败除非在返回状态码是OK(2XX)。大部分时间内，这个默认就是你所需要的。然而，比如在测试一个URL节点，你期待返回状态码为404，或者测试一个即使错误发生也会返回200的系统，因此，需要手工控制locust来判断是成功还是失败。\n一个可以生成失败请求，即使当响应代码是OK，通过使用catch_response参数和with语法:\nwith client.get(\u0026#34;/\u0026#34;, catch_response = True) as response: if response.content != \u0026#34;Success\u0026#34;: response.failure(\u0026#34;Got wrong response\u0026#34;) 就像一个可以使用响应为OK的请求当做失败来处理，一个方法就是可以使用catch_response参数和with语法来让请求HTTP错误时，仍然统计数据为成功:\nwith client.get(\u0026#34;/does_not_exist/\u0026#34;, catch_response = True) as response: if response.status_code = 404: response.success() 使用动态参数来分组URL请求 针对网站，有一个常用的功能是获取URL中包含一些动态参数的页面数据。通常情况下，在Locust统计中，使用动态分组在URL中是很有意义的。通过name参数来给HttpSession传递不同的请求方法。\n比如:\n# Statistics for these requests will be grouped under: /blog/?id=[id] for i in range(10): client.get(\u0026#34;/blog?id=%i\u0026#34; % i, name = \u0026#34;/blog?id=[id]\u0026#34;) 常用库 通常，大家想分享多个locust文件用于分享常用的库。在这种情况下，定义项目根目录用于调用Locsut是很重要的，建议将所有的locust文件有些话在项目的根目录中。\n一个平铺的结构像下面这样:\n项目根目录 commonlib_conf.py commonlib_auth.py locustfile_web_app.py locsutfile_api.py locustfile_ecommerce.py locust文件可以调用常用的库通过使用import commonlib_auth.然而，这种方法不会从locust文件中，清晰分辨出常用库。\n子文件夹可以有一个清晰的方法(查看下面的示例)，但是locust仅会有运行locsut文件的位置引用相关的模块。如果你想从你的根目录导入(如，你运行locust命令的位置)，确保在任何locust文件中添加常用库前有代码sys.path.append(os.getcwd())，会生成导入根目录(如，当前工作目录)。\nproject root __init__.py common/ __init__.py config.py auth.py locustfiles/ __init__.py web_app.py api.py ecommerce.py 使用上面的项目结构，你的locust文件可以通过下面代码导入常用的库:\nsys.path.append(os.getcwd()) import common.auth 本文Locust版本0.7.5 原文地址：http://docs.locust.io/en/latest/writing-a-locustfile.html ","permalink":"https://shiyuanjie.cn/posts/Locust/%E7%BC%96%E5%86%99%E4%B8%80%E4%B8%AALocust%E6%96%87%E4%BB%B6/","summary":"\u003cp\u003eLocust文件就是一般的Python文件。唯一的需求就是它至少需要一个继承于\u003ccode\u003eLocust\u003c/code\u003e的类.\u003c/p\u003e\n\u003ch2 id=\"locust类\"\u003eLocust类\u003c/h2\u003e\n\u003cp\u003eLocust类代表一个用户(如果愿意，也可以是一个准备出动的蝗虫)。Locust会为每一个模拟用户生成一个locust类实例。同时会有一些locust类属性被定义。\u003c/p\u003e\n\u003ch3 id=\"task_set属性\"\u003e\u003ccode\u003etask_set\u003c/code\u003e属性\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003etask_set\u003c/code\u003e属性是指向一个定义用户行为的\u003ccode\u003eTaskSet\u003c/code\u003e类，下面会有详细的介绍。\u003c/p\u003e\n\u003ch3 id=\"min_wait和max_wait属性\"\u003e\u003ccode\u003emin_wait\u003c/code\u003e和\u003ccode\u003emax_wait\u003c/code\u003e属性\u003c/h3\u003e\n\u003cp\u003e除了\u003ccode\u003etask_set\u003c/code\u003e属性，另外一个经常被使用的就是\u003ccode\u003emin_wait\u003c/code\u003e和\u003ccode\u003emax_wait\u003c/code\u003e属性。是用于各自以毫秒为单位的最小值和最大值，一个模拟用户将会在每个任务执行时的等待执行的时间间隔。\u003ccode\u003emin_wait\u003c/code\u003e和\u003ccode\u003emax_wait\u003c/code\u003e默认设置为\u003ccode\u003e1000\u003c/code\u003e，如果不声明的话，Locust会默认在每个任务间等待\u003ccode\u003e1秒\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e参考下面的代码，每个用户将会在每个任务间等待\u003ccode\u003e5至15\u003c/code\u003e秒:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efrom locust import Locust, TaskSet, task_set\n\nclass MyTaskSet(TaskSet):\n    @task\n    def my_task(self):\n        print \u0026#34;executing my_task\u0026#34;\n\nclass MyLocust(Locust):\n    task_set = MyTaskSet\n    min_wait = 5000\n    max_wait = 15000\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003emin_wait\u003c/code\u003e和\u003ccode\u003emax_wait\u003c/code\u003e属性可以用于重写\u003ccode\u003eTaskSet\u003c/code\u003e类。\u003c/p\u003e","title":"编写一个Locust文件"},{"content":"Locust，基于Python的性能测试工具。 什么是Locust 本文Locust版本0.7.5 原文地址：http://docs.locust.io/en/latest/quickstart.html# 示例locustfile.py 下面是一个简单的locustfile.py小示例:\nfrom locust import HttpLocust, TaskSet def login(l): l.client.post(\u0026#34;/login\u0026#34;, {\u0026#34;username\u0026#34;:\u0026#34;ellen_key\u0026#34;, \u0026#34;password\u0026#34;:\u0026#34;education\u0026#34;}) def index(l): l.client.get(\u0026#34;/\u0026#34;) def profile(l): l.client.get(\u0026#34;/profile\u0026#34;) class UserBehavior(TaskSet): tasks = {index: 2, profile: 1} def on_start(self): login(self) class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 5000 max_wait = 9000 这里我们定义了一些带一个参数(Locust类实例)正常Python执行的Locust任务。这些任务在task属性中 TaskSet类被聚集。接下来，我们有一个代表一个用户的HttpLocust类，这里我们定义多久一个模拟用户应该等待在执行任务之间，同时TaskSet类应该定义用户行为.python类TaskSet \u0026lt;locust.core.TaskSet\u0026gt;可以被嵌入。\nHttpLocust类从Locust类中继承，它有一个用于发送HTTP请求的HttpSession属性在客户端属性中。\n另外一种方式，我们可以使用另外一种更简洁的方法声明任务，就是使用@task声明。下面的代码和上面的代码一致：\nfrom locust import HttpLocust, TaskSet, task class UserBehavior(TaskSet): def on_start(self): \u0026#34;\u0026#34;\u0026#34; on_start is called when a Locust start before any task is scheduled \u0026#34;\u0026#34;\u0026#34; self.login() def login(self): self.client.post(\u0026#34;/login\u0026#34;, {\u0026#34;username\u0026#34;:\u0026#34;ellen_key\u0026#34;, \u0026#34;password\u0026#34;:\u0026#34;education\u0026#34;}) @task(2) def index(self): self.client.get(\u0026#34;/\u0026#34;) @task(1) def profile(self): self.client.get(\u0026#34;/profile\u0026#34;) class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 5000 max_wait = 9000 Locust类(在子类中也叫HttpLocust类)可以指定针对每一个模拟用户在执行任务之间设置最小和最大的等待时间(min_wait和max_wait)，像用户行为一样。\n启动Locust 为了运行上面的Locust文件，如果文件被命名为locustfile.py并保存在当前目录，我们可以直接运行:\nlocust --host=http://example.com 如果Locust文件在子文件夹或命名与locustfile.py不一致时，可以通过参数-f:\nlocust -f locust_files/my_locust_file.py --host=http://example.com 运行Locust的分布式多线程，我们应该启动master通过参数--master:\nlocust -f locust_files/my_locust_file.py --master --host=http://example.com 接下来我们可以启动slave线程:\nlocust -f locust_files/my_locust_file.py --slave --host=http://example.com 如果我们想运行Locust在多台机器，在启动slaves时，我们应该指定master地址(这不是必须的，当运行Locust分布式在同一台机器时，master的默认地址是127.0.0.1):\nlocust -f locust_files/my_locust_file.py --slave --master-host=192.168.0.100 --host=http://example.com 查看所有的选项，输入:\nlocust --help 打开Locust的Web界面 一旦你通过上面的命令启动了Locust，你应该打开浏览器并输入http://127.0.0.1:8089(如果你是在本机运行的Locust)。接下来，你应该可以看到下面的页面:\n","permalink":"https://shiyuanjie.cn/posts/Locust/Locust%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eLocust，基于Python的性能测试工具。\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://docs.locust.io/en/latest/what-is-locust.html\"\u003e什么是Locust\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e本文\u003ca href=\"http://locust.io/\"\u003eLocust\u003c/a\u003e版本\u003ccode\u003e0.7.5\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e原文地址：\u003ca href=\"http://docs.locust.io/en/latest/quickstart.html#\"\u003ehttp://docs.locust.io/en/latest/quickstart.html#\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"示例locustfilepy\"\u003e示例\u003ccode\u003elocustfile.py\u003c/code\u003e\u003c/h2\u003e\n\u003cp\u003e下面是一个简单的\u003ccode\u003elocustfile.py\u003c/code\u003e小示例:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efrom locust import HttpLocust, TaskSet\n\ndef login(l):\n    l.client.post(\u0026#34;/login\u0026#34;, {\u0026#34;username\u0026#34;:\u0026#34;ellen_key\u0026#34;, \u0026#34;password\u0026#34;:\u0026#34;education\u0026#34;})\n\ndef index(l):\n    l.client.get(\u0026#34;/\u0026#34;)\n\ndef profile(l):\n    l.client.get(\u0026#34;/profile\u0026#34;)\n\nclass UserBehavior(TaskSet):\n    tasks = {index: 2, profile: 1}\n\n    def on_start(self):\n        login(self)\n\nclass WebsiteUser(HttpLocust):\n    task_set = UserBehavior\n    min_wait = 5000\n    max_wait = 9000\n\u003c/code\u003e\u003c/pre\u003e","title":"Locust快速入门"},{"content":" 2017.4.14，JMeter3.2版本发布。 原文地址：Apache JMeter 3.2 Release Notes , 下载地址： Download Apache JMeter 3.2 重要变更 JMeter现在需要Java8。确保你使用的最新版本的Java。 JMeter日志已经被迁移至SLF4J和Log4j 2。这个影响配制和第三方插件，查看下面的『日志变更』. 在使用JMeter的3.2版本时，在结果树中的结果数里从默认修改为500.如果你想查看更多，必须修改属性view.results.tree.max_results为一个更高的数值或者你不想限制数量可改为0。你可以在bin/user.properties中设置。更多的信息可查看这里\n主要提升 JMeter现在提供一个新的BackendListener与InfluxDB交互 这个功能使用异步的HTTP请求发送数据至InfluxDB通过HTTP API并提供下面的图形展示结果 DNS缓存管理器提供静态表来管理host JMS Publisher和Subscriber现在允许在暂停的错误情况下，重新链接 JMS Publisher中的变量支持所有类型的信息。添加编码类型来转换内容中的类型 XPath提取器允许随机提取，通过索引或者所有的匹配 响应断言现在支持在请求头中，提供一种或的组合方式。 JMeter现在使用Oracle Nashorn Javascript引擎来替代Rhino。新引擎提供更快速的Javascript招待。 HTTP HC4默认提供基础验证。 在CSS中的内嵌资源下载已经被改进，减少在查找资源时的重复转换。 在测试代码质量和代码覆盖率中也有一个重要的提升，自Sonar已经被内置。你可以在这里查看Sonar的报告 样式提升 当运行测试时，由于Sample Reults监听器数量限制和GUI的工作方式的更新，GUI模式将会有更快的响应和对内存更少的影响。 HTTP请求的样式被精简并提供更多的位置用于参数和请求体的配制。 HTTP(S) Test Script Recorder更加精简和清晰。 Replace特性被添加至搜索功能中，用于替换一些元素。 ReplaceAll不会在所有的元素中生效，只会在： - HeaderManager： 替换值 - Http Request： 替换参数，路径和地址 查看结果树现在提供一种需要JavaFX的更实时的浏览方式。 你可以添加一个上下文的思考时间，它会添加思考时间在sampler和Transaction控制器的选择节点之间。 你现在可以针对Transaction控制器应用一种命名策略。默认策略时存在的，但你可以增强你自己的策略通过org.apache.jmeter.gui.action.TreeNodeNamingPolicy和配制naming_policy.impl属性。 在View Results in Table、Summary Report、 Aggregate Report and Aggregate Graph中，现在支持针对每个价值流的排序。 报告和仪表盘提升 统计数据已经被重新组装，使报告更加清晰： 现在可以基于正则表达式或sample名来定制每一个Transaction的APDEX阀值。下面这个示例用于应用在对于Sampler的样式中不同的阀值，sampleA、scenarioB和默认的(500至1500应用于静态分析和容量阀值)被声明： jmeter.reportgenerator.apdex_satisfied_threshold=500 jmeter.reportgenerator.apdex_tolerated_threshold=1500 jmeter.reportgenerator.apdex_per_transaction=sample(\\\\d+):1000|2000;\\ sampleA:3000|4000;\\ scenarioB:5000|6000 文档提升 PDF文档已经被合并且更新到HTML的用户手册中。 ","permalink":"https://shiyuanjie.cn/posts/JMeter/JMeter3.2%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/","summary":"\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e2017.4.14\u003c/code\u003e，JMeter3.2版本发布。\u003c/li\u003e\n\u003cli\u003e原文地址：\u003ca href=\"http://jmeter.apache.org/changes.html\"\u003eApache JMeter 3.2 Release Notes \u003c/a\u003e,\u003c/li\u003e\n\u003cli\u003e下载地址： \u003ca href=\"http://jmeter.apache.org/download_jmeter.cgi\"\u003eDownload Apache JMeter 3.2\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"重要变更\"\u003e重要变更\u003c/h2\u003e\n\u003cp\u003eJMeter现在需要\u003ccode\u003eJava8\u003c/code\u003e。确保你使用的最新版本的Java。\nJMeter日志已经被迁移至SLF4J和Log4j 2。这个影响配制和第三方插件，查看下面的『日志变更』.\n在使用JMeter的3.2版本时，在结果树中的结果数里从默认修改为500.如果你想查看更多，必须修改属性\u003ccode\u003eview.results.tree.max_results\u003c/code\u003e为一个更高的数值或者你不想限制数量可改为0。你可以在\u003ccode\u003ebin/user.properties\u003c/code\u003e中设置。更多的信息可查看\u003ca href=\"http://jmeter.apache.org/usermanual/component_reference.html#View_Results_Tree\"\u003e这里\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"主要提升\"\u003e主要提升\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eJMeter现在提供一个新的\u003ccode\u003eBackendListener\u003c/code\u003e与\u003ccode\u003eInfluxDB\u003c/code\u003e交互\n\u003cimg alt=\"BackendListener\" loading=\"lazy\" src=\"http://jmeter.apache.org/images/screenshots/changes/3.2/backend_influxdb.png\"\u003e\n这个功能使用异步的HTTP请求发送数据至InfluxDB通过\u003ca href=\"https://docs.influxdata.com/influxdb/v1.2/guides/writing_data/\"\u003eHTTP API\u003c/a\u003e并提供下面的图形展示结果\n\u003cimg alt=\"Graph\" loading=\"lazy\" src=\"http://jmeter.apache.org/images/screenshots/backend_listener_influxdb_graph.png\"\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"JMeter3.2更新内容"},{"content":"书 刻意练习：如何从新手到大师 读后感 刻意练习：deliberate practice 从新人到大师的唯一方法：练习 练习可以帮你变的优秀 常规的学习方法，只能让我们达到常人的水平，无法到大师的水平 如何练习 练习时，一定要有针对性的有目的的进行，不要盲目的进行 练习时，最好能找到及时给你提出反馈的人。如果有大师可以给你反馈，成长速度会快很多 强迫自己走出舒适区，找一个可以进步的方向 制定一个目标，目标不要定的太大。逐步来实现 练习的过程中一定要保持最初的动机 分阶段奖励自己 海马体 大脑中存储记忆的部位 心理表征 心理表征是一种与我们大脑正在思考的某个物体、某个观点、某些信息或者其他任何事物相对应的心理结构，或具体或抽象。 在处理大部分事情时，我们都是依赖心理表征在进行 练习时间与成功，正相关 练习时间比智商重要 高效练习方法 找出大师 模仿大师成功的方法 提练自己的方法 刻意练习适用于所有人 阅读时间: 20170304-20170426","permalink":"https://shiyuanjie.cn/posts/Book/%E5%88%BB%E6%84%8F%E7%BB%83%E4%B9%A0/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.amazon.cn/%E5%88%BB%E6%84%8F%E7%BB%83%E4%B9%A0-%E5%A6%82%E4%BD%95%E4%BB%8E%E6%96%B0%E6%89%8B%E5%88%B0%E5%A4%A7%E5%B8%88-%E5%AE%89%E5%BE%B7%E6%96%AF-%E8%89%BE%E5%88%A9%E5%85%8B%E6%A3%AE/dp/B01MDQ7RAX/ref=tmm_pap_swatch_0?_encoding=UTF8\u0026amp;qid=1493970802\u0026amp;sr=8-1\"\u003e刻意练习：如何从新手到大师\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"读后感\"\u003e读后感\u003c/h2\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Book/%E5%88%BB%E6%84%8F%E7%BB%83%E4%B9%A0/%E5%88%BB%E6%84%8F%E7%BB%83%E4%B9%A0_hu_d45e03c6c4646096.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"刻意练习\" loading=\"lazy\" src=\"/posts/Book/%E5%88%BB%E6%84%8F%E7%BB%83%E4%B9%A0/%E5%88%BB%E6%84%8F%E7%BB%83%E4%B9%A0.png\"\u003e\u003c/picture\u003e\u003c/p\u003e","title":"刻意练习：如何从新手到大师"},{"content":"为什么要进行Showcase Showcase目的：将迭代开发过程中，已完成的内容定期给客户演示，让客户对迭代中的内容有直观的了解\n因此Showcase可以帮助\n客户尽早了解到迭代中的功能，做出及时调整 团队少走弯路，减少不必要的功能开发 客户与团队更好的沟通，达成一致的交付目标 6步完成Showcase 确定参与人 客户关系人： 提前确定客户需要参与的人员清单，确保通知的时候没有遗漏\n主讲人：团队内部负责Shocase的角色，也可多个成员Pair进行，但一定要明确到人\n敲定时间 提前与客户关系人、主讲人确认具体的时间，确保所有人在指定时间点都有时间参加会议 明确方式 提前与客户关系人确认Showcase的方式：远程视频会议/普通会议 准备环境 提前将版本的运行环境，调试正常 需要硬件设备，确保提前准备就续 提前进行一次内部Showcase演习，将全流程跑一遍。确保在跟客户Showcase的时候，整个流程中内容没有遗漏\nShowcase ing 将本次Showcase的内容进行HighLevel的串讲，确保大家有足够的上下文了解 将迭代中的所有Story功能进行展示 将修复BUG的内容进行演示，可以同时讲解下引起BUG的原因 将接口更新的内容进行演示 将数据库更新内容进行讲解 \u0026hellip;.其它的更新内容 Showcase时，一定 及时跟客户互动和交流，确保带动整个Showcase的节奏\n汇总反馈 在Showcase的过程中，及时收集客户的反馈 收集反馈的过程中，注意辨别：新需求、需求变动 最终将所有的反馈整理汇总，纳入到后续迭代的Backlog中 整个流程跑完之后，组织Showcase的成员可以进行一次Retro。提高下一次Showcase的质量\n总结 Showcase周期一般为一个迭代一次，但依据不同的项目也可适当调整，但不要拖得太长。 Showcase可以让客户或用户提早了解的版本内容，减少开发团队对需求理解的偏差、减少项目走弯路。 参考 敏捷实践Showcase的七宗罪 Showcase in Agile Methodology ","permalink":"https://shiyuanjie.cn/posts/Agile/Showcase%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF/","summary":"\u003ch2 id=\"为什么要进行showcase\"\u003e为什么要进行Showcase\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eShowcase目的：\u003cstrong\u003e将迭代开发过程中，已完成的内容\u003ccode\u003e定期\u003c/code\u003e给客户演示，让客户对迭代中的内容有\u003ccode\u003e直观\u003c/code\u003e的了解\u003c/strong\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e因此Showcase可以\u003ccode\u003e帮助\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e客户\u003ccode\u003e尽早\u003c/code\u003e了解到迭代中的功能，做出及时\u003ccode\u003e调整\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e团队\u003ccode\u003e少走\u003c/code\u003e弯路，减少不必要的功能开发\u003c/li\u003e\n\u003cli\u003e客户与团队更好的沟通，达成一致的\u003ccode\u003e交付目标\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"6步完成showcase\"\u003e\u003ccode\u003e6\u003c/code\u003e步完成Showcase\u003c/h2\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Agile/Showcase%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF/Showcase_hu_ef3ee89a08b535b0.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"6步法\" loading=\"lazy\" src=\"/posts/Agile/Showcase%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF/Showcase.png\"\u003e\u003c/picture\u003e\u003c/p\u003e","title":"Showcase的正确姿势"},{"content":"中雨跑 杨凌马拉松 2015-02-23开始跑步，到现在也有2年多的时间了，一直是一个人在跑，累积跑步不到1000公里。以前在深圳的时候，坚持的还比较好，但西安的雾霾天气，断断续续的中断过好几次。\n今年终于有机会报了杨凌马拉松，也跑了一次半马，成绩2小时8分。参赛当天，下着中雨，不过对于第一次参加马拉松的人来说，确实不是啥大问题.当然，还有家人在为我加油，全程跑起来，感觉很轻松。\n如何准备一场马拉松呢？\n多少跑量，才可以报名？ 如果平时可以跑10公里，那么就勇敢的报半马。 Keep里面有适合半马的课程，可以依据课程进行科学的练习。 跑步最重要的是跑，而不是把目标定的有多远。 跑起来，就可以。 赛前准备 报名成功的话，第一时间在网上定酒店。找个离起点近点的地方 赛前几天，一定要坚持跑。但，跑量不要太多。不要出现其它意外伤 比赛前，一定一定一定 要修剪脚指甲. 阅读比较的规则，确保参赛物品和芯片是自己的，芯片可以在会场进行校验。 提前将平时跑步用的装备清单列出来，确保去的时候，没有落下任何装备。 自己这次由于跑之前忘记剪脚指甲，跑完之后，第二天发现两个脚的中指全部充血。在网上查了下，整个指甲要脱落。 本次参赛的时候，忘记带腰包。结果全程把手机在裤兜里面放的，跑起来不太舒服。 参赛时刻 最好比赛前，能提前一天到比赛的城市。先熟悉下城市的环境。\n如果住酒店的话，你会发现住的人基本全是参加比赛的。可以跟别人聊下，放松下自己的心情。不要压力太大。 开跑当天早上，最好能自己吃点东西。当然会场也会有准备。切记，不要吃太饱，喝太多 最少提前半小时，到起点：存包，提前提入跑区。占领前面的位置。站位的分布，如果你报的是半马，那么你前面会有所有参加全马的人在你前面 跑的过程中，一定不要太急。按自己平时的配速来跑，千万不要盲目的去追别人。 提前准备好一切，会让你跑前的心态很放松。\n成绩知晓 跑完之后，官方平台会先发一个短信。通知具体的成功结果 ，但没有分段明细 比赛结束后，3天左右，便可以在官网查询具体的成绩了。 跑步当天，如果用手机记录成绩的话。很可能手机没网线和GPS没信号。因为好几万人中很多人都在用这方法。\n总结 其实这次跑之前，媳妇对于能不能跑完21公里，一点信心都没有。因为自己从来没有跑过21公里，最大的跑量也只有15公里。但自己还是比较有信心，之前看过好多帖子都说过：如果平时能跑10公里，那么半马基本问题都不大 跑步过程中，千万不要着急，按自己平时的配速跑就可以。 如果可以的话，带上家人、朋友一起去。他们的参与或加油，会给你很大的信心。 如果可以的话，建议一定要去体验一次。会让你对跑步会有新的认识\n","permalink":"https://shiyuanjie.cn/posts/Run/2017%E6%9D%A8%E5%87%8C%E9%A9%AC%E6%8B%89%E6%9D%BE/","summary":"\u003ch2 id=\"中雨跑-杨凌马拉松\"\u003e\u003ccode\u003e中雨\u003c/code\u003e跑 杨凌马拉松\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003e2015-02-23\u003c/code\u003e开始跑步，到现在也有\u003cstrong\u003e2\u003c/strong\u003e年多的时间了，一直是一个人在跑，累积跑步不到\u003ccode\u003e1000公里\u003c/code\u003e。以前在深圳的时候，坚持的还比较好，但西安的雾霾天气，断断续续的中断过好几次。\u003c/p\u003e\n\u003cp\u003e今年终于有机会报了杨凌马拉松，也跑了一次\u003ccode\u003e半马\u003c/code\u003e，成绩\u003cstrong\u003e2小时8分\u003c/strong\u003e。参赛当天，下着\u003ccode\u003e中雨\u003c/code\u003e，不过对于第一次参加马拉松的人来说，确实不是啥大问题.当然，还有\u003ccode\u003e家人\u003c/code\u003e在为我加油，全程跑起来，感觉很轻松。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Run/2017%E6%9D%A8%E5%87%8C%E9%A9%AC%E6%8B%89%E6%9D%BE/20170409%E6%9D%A8%E5%87%8C%E9%A9%AC%E6%8B%89%E6%9D%BE_hu_ae4b723588093437.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"完赛证书\" loading=\"lazy\" src=\"/posts/Run/2017%E6%9D%A8%E5%87%8C%E9%A9%AC%E6%8B%89%E6%9D%BE/20170409%E6%9D%A8%E5%87%8C%E9%A9%AC%E6%8B%89%E6%9D%BE.jpg\"\u003e\u003c/picture\u003e\u003c/p\u003e","title":"2017杨凌马拉松"},{"content":"Retro Retro是什么 敏捷团队中，针对一定周期内的活动进行的回顾会议。 Retrospective的缩写 Retro要做什么 团队中的每个成员，均可暴露以下所有行为的任何问题\n敏捷实践的落实情况 团队内部协作、工作流程 工作环境 其他角色的工作方式、行为 任何你想吐槽的问题 暴露问题的时候，一定有足够的事实做依据和自己理想的做法。\n如何组织一场Retro Step0: 通知参与人，时间+地点 准备一场Retro前，一定要提前通知所有参与人时间和地点。确保大家都能参加，提高会议人员的参与度。\n提前准备会议要用的笔、Sticker和预定会议室，确保会议室中有可贴Sticker的地方\nStep1: 确定会议安全级别 团队内部的所有人员，对Retro的安全级别进行投票。\n目的: 确保会议中的所有人均可吐露真言 如果有人对安全级别投反对票，则将参加会议中的最级级别的人物请出会议。再次投票，直到所有参加会议的人员均认可Retro足够安全。 Step2: 宣读宣言 确保大家在回顾过程中的问题均对事不对人 确保反馈的时候，相信其他同事已经尽了最大努力。 Step3: 回顾上次的Action 针对上次产出Action进行回顾，确保在本次Retro时，针对上次Action进行再次反馈。\nStep4: 确定维度 确定本次Retro问题的维度，一般常用的是Well/Less Well/Suggestion。\nWell: 做的好的地方。如:新同事XXX修复BUG质量很高 Less Well: 做的不好的地方。如: 工位很挤 Suggestion: 针对当前的状态有任何建议。如: TB应该每周来一次 Step5: 编写Sticker内容 花费5-10分钟，开始编写自己的回顾内容。 确保每张Sticker仅一个事项 Step6: 分类Sticker内容 每个人将自己写的内容，分类贴到墙上。\nStep7: 对内容进行、归类 待大家将Sticker贴完后，由会议主持人带领大家一起将所有的Sticker内容串讲一遍。确保大家对所有的内容均理解一致。如果中间，有部分Sticker的内容不清晰，可由编写人进行内容澄清 过Sticker的同时，可直接将Sticker反馈的内容进行分类。如: 团队内部的问题、办工环境的问题 过完每个维度后，可针对反馈较多的好事项，进行简单总结。 Step8: 投票 所有参加会议的人员，可进行已分类的问题投票 每人3票 Step9: 生成Action 所有人投票结束后，可选出票数最多的3-5个问题，进行集中讨论，产出Action 每项Action后，一定要有对应的Owner 每项Action的Owner要在后续的工作中，对产出的Action进行负责，确保Action可正常落地执行 Retro是为了让团队内部的各种问题和好事，暴露出来。通过团队成员，促进团队和个人往更好的方向发展。\n参考 7 Step Agenda for an Effective Retrospective Energizer 我在ThoughtWorks中的敏捷实践 Agile Retrospective Resource Wiki ","permalink":"https://shiyuanjie.cn/posts/Agile/%E5%A6%82%E4%BD%95%E7%BB%84%E7%BB%87%E4%B8%80%E5%9C%BARetro/","summary":"\u003ch2 id=\"retro\"\u003eRetro\u003c/h2\u003e\n\u003ch2 id=\"retro是什么\"\u003eRetro是什么\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e敏捷团队中，针对一定周期内的活动进行的回顾会议。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eRetrospective\u003c/code\u003e的缩写\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"retro要做什么\"\u003eRetro要做什么\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e团队中的每个成员，\u003ccode\u003e均\u003c/code\u003e可暴露以下\u003ccode\u003e所有行为\u003c/code\u003e的\u003cstrong\u003e任何\u003c/strong\u003e问题\u003c/p\u003e\u003c/blockquote\u003e\n\u003cul\u003e\n\u003cli\u003e敏捷实践的落实情况\u003c/li\u003e\n\u003cli\u003e团队内部协作、工作流程\u003c/li\u003e\n\u003cli\u003e工作环境\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e其他角色\u003c/code\u003e的工作方式、行为\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e任何你想吐槽的问题\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e暴露问题的时候，一定有足够的\u003ccode\u003e事实\u003c/code\u003e做依据和自己理想的\u003ccode\u003e做法\u003c/code\u003e。\u003c/p\u003e\u003c/blockquote\u003e","title":"如何组织一场Retro"},{"content":"经常被客户问到，你们的敏捷团队是怎么定义的？敏捷的落实情况如何，项目开发中的敏捷实践有多少？\n个人的理解\n敏捷是一种团队状态，不是一个人的实践 评判一个团队是否敏捷，不能单看是否有敏捷实践，而是要看团队成员对敏捷的实践的落地 敏捷不是口号，而是实践。在迭代过程中，对敏捷实践的落地 敏捷是一个持续的过程，不能说今天我敏捷，明天我就不敏捷 敏捷是拥抱变化，但我们拥抱的是有节制、规划的变化 敏捷不是没有文档，只是轻文档，减少不必要的文档输出 团队敏捷与否，看的是敏捷实践是否在可持续的落地\n","permalink":"https://shiyuanjie.cn/posts/Book/%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E4%B8%80%E4%B8%AA%E5%9B%A2%E9%98%9F%E6%98%AF%E6%95%8F%E6%8D%B7%E5%9B%A2%E9%98%9F/","summary":"\u003cp\u003e经常被客户问到，你们的敏捷团队是怎么定义的？敏捷的落实情况如何，项目开发中的敏捷实践有多少？\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e个人的理解\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e敏捷是一种团队状态，不是一个人的实践\u003c/li\u003e\n\u003cli\u003e评判一个团队是否敏捷，不能单看是否有敏捷实践，而是要看团队成员对敏捷的实践的落地\u003c/li\u003e\n\u003cli\u003e敏捷不是口号，而是实践。在迭代过程中，对敏捷实践的落地\u003c/li\u003e\n\u003cli\u003e敏捷是一个持续的过程，不能说今天我敏捷，明天我就不敏捷\u003c/li\u003e\n\u003cli\u003e敏捷是拥抱变化，但我们拥抱的是有节制、规划的变化\u003c/li\u003e\n\u003cli\u003e敏捷不是没有文档，只是轻文档，减少不必要的文档输出\u003c/li\u003e\n\u003c/ul\u003e","title":"如何判断一个团队是敏捷团队？"},{"content":"今天带儿子去迪卡侬，计划买轮滑，挑选好轮滑后，又看中了滑板车。随改主意。\n我的方案：\n自己想好到底要哪个 把自己的决定重复一遍 告诉妈妈，自己的决定是什么 为什么我会用这个方案\n孩子要长大，有些决定需要自己做 自己的决定要自己想好，告诉别人，确定最终的结果 自己的决定，要自己来负责 儿子最终要长大，从小要学会为自己的决定买单。\n","permalink":"https://shiyuanjie.cn/posts/Life/%E8%BD%AE%E6%BB%91VS%E6%BB%91%E6%9D%BF%E8%BD%A6/","summary":"\u003cp\u003e今天带儿子去迪卡侬，计划买\u003cstrong\u003e轮滑\u003c/strong\u003e，挑选好\u003cstrong\u003e轮滑\u003c/strong\u003e后，又看中了\u003cstrong\u003e滑板车\u003c/strong\u003e。随改主意。\u003c/p\u003e\n\u003cp\u003e我的方案：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e自己想好到底要哪个\u003c/li\u003e\n\u003cli\u003e把自己的决定重复一遍\u003c/li\u003e\n\u003cli\u003e告诉妈妈，自己的决定是什么\u003c/li\u003e\n\u003c/ul\u003e","title":"轮滑VS滑板车"},{"content":" 2016.11.20，JMeter官网已经正式发布了3.1的版本，今天尝试翻译下更新内容，内容中肯定还有很多不足，希望大家多多谅解。\n原文地址：Apache JMeter 3.1 Release Notes , 下载地址： Download Apache JMeter 提升报告和仪表盘 仪表盘新增三个图表和一个概要表格\n连接时间 成功百分比响应时间 响应时间分布 执行样例中的错误Top5 细化错误表中的错误信息 静态分析表中添加平均响应时间 激活线程表中显示堆叠线程数 新的维度 sent_bytes被添加至发送服务器的数据统计中。 connect_time在本版本中默认可用。 处理大的响应 JMeter现在可以处理大于2GB的响应数据，最大限制是9223372TB。为了处理大响应，当可以缩减响应来避免内存溢出。具体查看httpsampler.max_bytes_to_store_per_request属性.\n新函数__groovy 介绍一个新函数__groovy来使用Groovy可用。当在使用高并发测试时，这个会很有用。就像JavaScript脚本会很平滑一样(同样适用于BeanShell)。\n对于JSR-223元素默认使用Groovy Groovy是JSR-223元素使用的默认语言。如果你想使用其它的语言，你必须要做出明确的选择：\n虽然我们建议你来检查它来确保你没有使用${varName}语法而是用vars.get(\u0026quot;varName\u0026quot;)来代替。默认情况下通常如果可用的编译缓存数据是不需要检查的，\n在结果树中格式化HTML显示 在结果树中的HTML代码现在可以格式化来查看。这是相当有用的，在网页中的代码已被删除多余的空格代码。 使用一个属性来更新所有的定时器 新的属性timer.factor=1.0f已被添加，用于来倍数调整计数器，如Gaussian,Uniform和Poisson计数器。它可使用一处的调整来更新整个产品的Think Time。\n主要提升 大量样式和布局内容修复 内存使用提升 JDBC请求现在可以返回Blob/Clob，并且可计算延迟和连接时间 在3.0版本中的CSS转化已经优化至内存级别 HTTP请求现在可以处理在Get请求中的数据体，比如这个针对Elastic请求很有用 文档更新 文档的审查和改进更容易 新增属性文档 ","permalink":"https://shiyuanjie.cn/posts/JMeter/JMeter3.1%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/","summary":"\u003cblockquote\u003e\n\u003cp\u003e\u003ccode\u003e2016.11.20\u003c/code\u003e，\u003ca href=\"http://jmeter.apache.org/\"\u003eJMeter\u003c/a\u003e官网已经正式发布了3.1的版本，今天尝试翻译下更新内容，内容中肯定还有很多不足，希望大家多多谅解。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cul\u003e\n\u003cli\u003e原文地址：\u003ca href=\"http://jmeter.apache.org/changes.html\"\u003eApache JMeter 3.1 Release Notes \u003c/a\u003e,\u003c/li\u003e\n\u003cli\u003e下载地址： \u003ca href=\"http://jmeter.apache.org/download_jmeter.cgi\"\u003eDownload Apache JMeter\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"提升报告和仪表盘\"\u003e提升报告和仪表盘\u003c/h2\u003e\n\u003cp\u003e仪表盘新增三个图表和一个概要表格\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e连接时间\n\u003cimg loading=\"lazy\" src=\"http://jmeter.apache.org/images/screenshots/dashboard/report_connect_time_over_time.png\"\u003e\u003c/li\u003e\n\u003cli\u003e成功百分比响应时间\n\u003cimg loading=\"lazy\" src=\"http://jmeter.apache.org/images/screenshots/dashboard/response_time_percentiles_over_time.png\"\u003e\u003c/li\u003e\n\u003cli\u003e响应时间分布\n\u003cimg loading=\"lazy\" src=\"http://jmeter.apache.org/images/screenshots/dashboard/response_time_overview.png\"\u003e\u003c/li\u003e\n\u003cli\u003e执行样例中的错误Top5\n\u003cimg loading=\"lazy\" src=\"http://jmeter.apache.org/images/screenshots/dashboard/top_5_errors_by_sampler.png\"\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"JMeter3.1更新内容"},{"content":"Github地址(源文件及脚本)\n本文目的 面向新手，学习后可以使用JMeter独立完成项目的性能测试 快速分析并使用JMeter定位出项目性能测试结果 产出有价值的性能测试报告 目录 简介\n认识JMeter\n了解并启动JMeter 认识JMeter 第一个测试 提高JMeter\n线程高并发 逻辑控件器 断言测试 结果分析 完善JMeter\nHTTP信息头管理 数据获取 实战性能测试 分析测试\n断言结果详细分析 结果详细分析 服务器分析 扩展插件 进阶使用\n命令行执行JMeter 性能测试常用专业述语 JMeter最佳实践 性能测试最佳实践 测试报告 结束语\n说明 基础环境信息： OS:macOS Mojave 10.14.2 JDK:11.0.1 JMeter：5.2.1 QQ交流群：478527666 文中关于JMeter的功能，不会很详尽，够用足以 源GitBook地址:https://aimer1124.gitbooks.io/jmeter-tutorial/content/，停止更新 ","permalink":"https://shiyuanjie.cn/posts/PerformanceTest/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95-JMeter%E5%85%A5%E9%97%A8/","summary":"\u003cp\u003e\u003ca href=\"https://github.com/aimer1124/jmeter-tutorial\"\u003eGithub地址(源文件及脚本)\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch1 id=\"本文目的--build-status\"\u003e本文目的  \u003ca href=\"https://travis-ci.org/aimer1124/jmeter-tutorial\"\u003e\u003cimg alt=\"Build Status\" loading=\"lazy\" src=\"https://travis-ci.org/aimer1124/jmeter-tutorial.svg?branch=master\"\u003e\u003c/a\u003e\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e面向新手，学习后可以使用\u003ca href=\"http://jmeter.apache.org/\"\u003eJMeter\u003c/a\u003e\u003cstrong\u003e独立\u003c/strong\u003e完成项目的性能测试\u003c/li\u003e\n\u003cli\u003e快速分析并使用\u003ca href=\"http://jmeter.apache.org/\"\u003eJMeter\u003c/a\u003e定位出项目\u003cstrong\u003e性能测试结果\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e产出\u003cstrong\u003e有价值\u003c/strong\u003e的性能测试报告\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"目录\"\u003e目录\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/README.html\"\u003e简介\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter1/README.html\"\u003e认识JMeter\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter1/%E4%BA%86%E8%A7%A3%E5%B9%B6%E5%90%AF%E5%8A%A8JMeter.html\"\u003e了解并启动JMeter\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter1/%E8%AE%A4%E8%AF%86JMeter.html\"\u003e认识JMeter\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter1/%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%B5%8B%E8%AF%95.html\"\u003e第一个测试\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter2/README.html\"\u003e提高JMeter\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter2/%E7%BA%BF%E7%A8%8B%E9%AB%98%E5%B9%B6%E5%8F%91.html\"\u003e线程高并发\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter2/%E9%80%BB%E8%BE%91%E6%8E%A7%E4%BB%B6%E5%99%A8.html\"\u003e逻辑控件器\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter2/%E6%96%AD%E8%A8%80%E6%B5%8B%E8%AF%95.html\"\u003e断言测试\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter2/%E7%BB%93%E6%9E%9C%E5%88%86%E6%9E%90.html\"\u003e结果分析\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter3/README.html\"\u003e完善JMeter\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter3/HTTP%E4%BF%A1%E6%81%AF%E5%A4%B4%E7%AE%A1%E7%90%86.html\"\u003eHTTP信息头管理\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter3/%E6%95%B0%E6%8D%AE%E8%8E%B7%E5%8F%96.html\"\u003e数据获取\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter3/%E5%AE%9E%E6%88%98%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95.html\"\u003e实战性能测试\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter4/README.html\"\u003e分析测试\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter4/%E6%96%AD%E8%A8%80%E7%BB%93%E6%9E%9C%E8%AF%A6%E7%BB%86%E5%88%86%E6%9E%90.html\"\u003e断言结果详细分析\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter4/%E7%BB%93%E6%9E%9C%E8%AF%A6%E7%BB%86%E5%88%86%E6%9E%90.html\"\u003e结果详细分析\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter4/%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%88%86%E6%9E%90.html\"\u003e服务器分析\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter4/%E6%89%A9%E5%B1%95%E6%8F%92%E4%BB%B6.html\"\u003e扩展插件\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter5/README.html\"\u003e进阶使用\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter5/%E5%91%BD%E4%BB%A4%E8%A1%8C%E6%89%A7%E8%A1%8CJMeter.html\"\u003e命令行执行JMeter\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter5/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E5%B8%B8%E7%94%A8%E4%B8%93%E4%B8%9A%E8%BF%B0%E8%AF%AD.html\"\u003e性能测试常用专业述语\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter5/JMeter%E5%AE%98%E6%96%B9%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.html\"\u003eJMeter最佳实践\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter5/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.html\"\u003e性能测试最佳实践\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/chapter5/%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.html\"\u003e测试报告\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://aimer1124.github.io/jmeter-tutorial/end/README.html\"\u003e结束语\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"说明\"\u003e说明\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e基础环境信息：\n\u003cul\u003e\n\u003cli\u003eOS:macOS Mojave 10.14.2\u003c/li\u003e\n\u003cli\u003eJDK:11.0.1\u003c/li\u003e\n\u003cli\u003eJMeter：5.2.1\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eQQ交流群：\u003cstrong\u003e478527666\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e文中关于\u003ca href=\"http://jmeter.apache.org/\"\u003eJMeter\u003c/a\u003e的功能，不会很详尽，\u003cstrong\u003e够用足以\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e源GitBook地址:\u003ca href=\"https://aimer1124.gitbooks.io/jmeter-tutorial/content/\"\u003ehttps://aimer1124.gitbooks.io/jmeter-tutorial/content/\u003c/a\u003e，停止更新\u003c/li\u003e\n\u003c/ul\u003e","title":"性能测试-JMeter入门手册"},{"content":"封面 读后感 手绘版 三个世界的经历，女主角从一个普通的女孩，变成一个勇敢且可以为了心爱的人付出生命的人。 爱情的力量让：两个主人公，经历磨难，都做出了在三个不同世界中根本不存在和不可能的事情。 警示我们：在现实生活中，不要害怕做不好事情，只要奋力去做就好。结果一定会让你满意的。 阅读时间：20170126-20170226","permalink":"https://shiyuanjie.cn/posts/Book/%E6%91%86%E6%B8%A1%E4%BA%BA/","summary":"\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cimg src=\"https://images-cn.ssl-images-amazon.com/images/I/51jKsrXCSmL._SX448_BO1,204,203,200_.jpg\" /\u003e\n\u003ch2 id=\"读后感\"\u003e读后感\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e手绘版\n\u003cpicture\u003e\u003csource srcset=\"/posts/Book/%E6%91%86%E6%B8%A1%E4%BA%BA/%E6%91%86%E6%B8%A1%E4%BA%BA_hu_a4496989cd1bb11e.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/Book/%E6%91%86%E6%B8%A1%E4%BA%BA/%E6%91%86%E6%B8%A1%E4%BA%BA.jpeg\"\u003e\u003c/picture\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"摆渡人"},{"content":" 水杯，碗，蜡烛，小人 不停的在找模仿的资源，但还是没有找到路数，先继续模仿，坚持 ","permalink":"https://shiyuanjie.cn/posts/Art/%E6%89%8B%E7%BB%98-20170224-%E6%B0%B4%E6%9D%AF%E7%A2%97%E8%9C%A1%E7%83%9B%E5%B0%8F%E4%BA%BA/","summary":"","title":"20170224-水杯，碗，蜡烛，小人"},{"content":" 9天的模仿记录 总结 每天的模仿让自己对需要模仿的目标，有新的认识 对模仿逐渐了有新的认识。模仿时，一定要找到目标的特性，对模仿渐渐有一点感觉。 画的虽然依旧有点丑陋，但还是会坚持 ","permalink":"https://shiyuanjie.cn/posts/Art/%E6%89%8B%E7%BB%98-20170209-20170222%E6%A8%A1%E4%BB%BF%E7%AC%AC%E4%B8%80%E6%89%B9/","summary":"\u003cul\u003e\n\u003cli\u003e\n\u003ch2 id=\"9天的模仿记录\"\u003e9天的模仿记录\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Art/%E6%89%8B%E7%BB%98-20170209-20170222%E6%A8%A1%E4%BB%BF%E7%AC%AC%E4%B8%80%E6%89%B9/20170210_hu_6d17c1809df9dc05.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"20170210\" loading=\"lazy\" src=\"/posts/Art/%E6%89%8B%E7%BB%98-20170209-20170222%E6%A8%A1%E4%BB%BF%E7%AC%AC%E4%B8%80%E6%89%B9/20170210.jpeg\"\u003e\u003c/picture\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"20170209-20170222，模仿第一批"},{"content":"JMeter_docker Use JMeter with Docker\nReplace Demo.jmx Change the following about Demo.jmx file COPY\tDemo.jmx /opt/jmeter build Docker file in root folder docker build -t performanceDocker . run docker with performance testing docker run --rm -v $(pwd):/root performanceDocker bin/jmeter -n -t Demo.jmx The log maybe like this: Writing log file to: /opt/jmeter/jmeter.log Creating summariser \u0026lt;summary\u0026gt; Created the tree successfully using Demo.jmx Starting the test @ Wed Jan 25 02:16:12 UTC 2017 (1485310572802) Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445 summary = 1 in 00:00:01 = 1.2/s Avg: 619 Min: 619 Max: 619 Err: 0 (0.00%) Tidying up ... @ Wed Jan 25 02:16:13 UTC 2017 (1485310573711) ... end of run Resource Github: https://github.com/aimer1124/jmeter_docker DockerImage: https://hub.docker.com/r/yjshi/jmeter/ ","permalink":"https://shiyuanjie.cn/posts/JMeter/jmeter%E4%B8%8EDocker/","summary":"\u003ch1 id=\"jmeter_docker\"\u003eJMeter_docker\u003c/h1\u003e\n\u003cp\u003eUse JMeter with Docker\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eReplace \u003ccode\u003eDemo.jmx\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eChange the following about \u003ccode\u003eDemo.jmx\u003c/code\u003e file\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eCOPY\t\tDemo.jmx /opt/jmeter\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003ebuild Docker file in root folder\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edocker build -t performanceDocker .\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003erun docker with performance testing\u003c/li\u003e\n\u003c/ul\u003e","title":"JMeter与Docker"},{"content":"书 读后总结 微服务的架构实践，书中的内容更偏重于落地的实践操作。 详细的讲解了如何搭建一套微服务框架环境，适合于寻找实践操作的书籍\n微服务就是将功能分而治之 架构框架落地 Spring Boot做开发框架 Node.js做网关 Zookeeper做微服务注册与发现 Docker封装微服务\u0026ndash;容器化 Jenkins实现CI 章节中，重点讲解了每个落地步骤的操作方法 Amazon: 轻量级微服务架构(上册) 阅读时间：20170109-20170119","permalink":"https://shiyuanjie.cn/posts/Book/%E8%BD%BB%E9%87%8F%E7%BA%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E4%B8%8A%E5%86%8C/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cimg src=\"https://images-cn.ssl-images-amazon.com/images/I/41CcOT9lGUL._SX377_BO1,204,203,200_.jpg\" /\u003e\n\u003ch2 id=\"读后总结\"\u003e读后总结\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e微服务的架构实践，书中的内容更偏重于\u003ccode\u003e落地的\u003c/code\u003e实践操作。 详细的讲解了如何\u003ccode\u003e搭建\u003c/code\u003e一套微服务框架环境，适合于寻找实践操作的书籍\u003c/p\u003e\u003c/blockquote\u003e\n\u003cul\u003e\n\u003cli\u003e微服务就是将功能\u003ccode\u003e分而治之\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e架构框架落地\n\u003cul\u003e\n\u003cli\u003eSpring Boot做开发框架\u003c/li\u003e\n\u003cli\u003eNode.js做网关\u003c/li\u003e\n\u003cli\u003eZookeeper做微服务注册与发现\u003c/li\u003e\n\u003cli\u003eDocker封装微服务\u0026ndash;\u003ccode\u003e容器化\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eJenkins实现CI\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e章节中，重点讲解了每个\u003ccode\u003e落地\u003c/code\u003e步骤的\u003ccode\u003e操作方法\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"轻量级微服务架构(上册)"},{"content":"由来 项目的测试需求，需要针对64位 Chrome 42+的各个稳定版本进行测试,但安装环境又无法直接访问外网进行在线版本安装，因此需要搜集已发布的离线安装版本。作为安装源。\n首先，来认识下Chrome到底有哪些版本。\nChrome VS Chromium 区别 The Chromium projects include Chromium and Chromium OS, the open-source projects behind the Google Chrome browser and Google Chrome OS, respectively. This site houses the documentation and code related to the Chromium projects and is intended for developers interested in learning about and contributing to the open-source projects.\n简而言之，Chrome是基于 开源项目 Chromium的 。新功能会优先在Chromium发布。\n支持操作系统 均支持 Windows32、Windows64、Mac、Linux、Android、IOS Chrome各版本下载地址，历史版本下载：https://www.slimjet.com/chrome/google-chrome-old-version.php Chromium各版本下载地址 以下针对可以获取不同的维度，进行分类整理：官方的变更记录、下载地址、Wiki的ChangeList汇总\n官方的变更记录 https://chromereleases.googleblog.com/ 内容涉及 官网用于发布每个版本的变更BLOG 包括 Dev版本、Beta版本、稳定版本 包括 Android版本、IOS版本及PC版本 每个版本，下面都会有部分用户的使用反馈，可以查看到其他用户对每个版本的使用反馈. 官方现在不提供历史版本的下载地址，需要自行收集各版本的下载地址 下载地址 http://www.chrome64bit.com/ 内容涉及 针对64位的各个不同OS的离线安装包 包括 Linux、Mac、Windows、Portable版 以及每个版本的 32位与64位 的区别 Windows下载列表 Mac下载列表 Linux下载列表 Portable下载列有 http://google-chrome.en.uptodown.com/windows/old 内容涉及 32位及64位的针对Windows中的各个Chrome版本，版本总量相对比较全 下载速度很慢，会出现其它语言包的安装包，但不影响使用 Wiki的ChangeList汇总 https://en.wikipedia.org/wiki/Google_Chrome_version_history 内容涉及 主版本号 发布时间 Layout引擎版本 V8引擎版本 官方变更说明 Wiki的数据来源是Google的官方网站，仅将每个版本的内容进行汇总。\nSummary 本文主要针对需要下载Windows64位各个离线版本的Chrome，进行汇总 从搜集内容的过程中，可以看出：Chrome的各个版本的变更内容，也不是特别详细。 https://chromereleases.googleblog.com/中会有用户进行使用反馈，但每少看到官方人员给予回复 Chrome官方更建议用户使用最新版本，不提供历史版本的下载地址 参考 http://www.howtogeek.com/202825/what%E2%80%99s-the-difference-between-chromium-and-chrome/ http://www.diffen.com/difference/Chromium_vs_Google_Chrome https://www.chromium.org/ https://en.wikipedia.org/wiki/Google_Chrome_version_history#cite_note-Chrome_50-116 ","permalink":"https://shiyuanjie.cn/posts/Tools/%E8%8E%B7%E5%8F%96Chrome%E6%B5%8F%E8%A7%88%E5%99%A8/","summary":"\u003ch2 id=\"由来\"\u003e由来\u003c/h2\u003e\n\u003cp\u003e项目的测试需求，需要针对64位 Chrome 42+的各个\u003ccode\u003e稳定版\u003c/code\u003e本进行测试,但安装环境又无法\u003ccode\u003e直接访问外网\u003c/code\u003e进行\u003ccode\u003e在线版本\u003c/code\u003e安装，因此需要搜集已发布的\u003ccode\u003e离线安装\u003c/code\u003e版本。作为\u003ccode\u003e安装源\u003c/code\u003e。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e首先，来认识下Chrome到底有哪些版本。\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"chrome-vs-chromium\"\u003e\u003ca href=\"www.google.com/chrome\"\u003eChrome\u003c/a\u003e VS \u003ca href=\"www.chromium.org\"\u003eChromium\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"区别\"\u003e区别\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe Chromium projects include Chromium and Chromium OS, the open-source projects behind the Google Chrome browser and Google Chrome OS, respectively. This site houses the documentation and code related to the Chromium projects and is intended for developers interested in learning about and contributing to the open-source projects.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e简而言之，Chrome是基于 \u003cstrong\u003e开源项目\u003c/strong\u003e Chromium的 。新功能会优先在Chromium发布。\u003c/p\u003e","title":"获取Chrome浏览器"},{"content":"书 读后总结 书中通过真实的体验感受，讲述了如何有效的沟通。 其他沟通技巧的书，经常讲述的是理论，但本书除了从体验、练习、案例的方式，讲述如何才能达到真正的高效，很值得阅读。 如何从观察-感受-需要-请求，四个步骤和维度来进行沟通。\n常用的非暴力沟通四个套路：观察-感受-需要-请求\n观察：观察别人的什么行为，激发了沟通 感受：别人的行为，对自己产生了什么样的感受 需求：自己需要的是一个什么样的结果 请求：表达出自己想让对方做些什么 以上的套路，一定要建立在用心的倾听对方的表达。理解对方的本意\n如果真的愤怒了，一定要表达出愤怒的原因。不要只表现出愤怒，让对方知道原因\n记得感谢对你有帮助的任何人，真实的让对方感受到感谢。\nAmazon:非暴力沟通\n阅读时间：20161222-20170109","permalink":"https://shiyuanjie.cn/posts/Book/%E9%9D%9E%E6%9A%B4%E5%8A%9B%E6%B2%9F%E9%80%9A/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cimg src=\"https://images-cn.ssl-images-amazon.com/images/I/51vjGcA21kL._SX334_BO1,204,203,200_.jpg\" /\u003e\n\u003ch2 id=\"读后总结\"\u003e读后总结\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e书中通过真实的体验感受，讲述了如何有效的沟通。 其他沟通技巧的书，经常讲述的是理论，但本书除了从体验、练习、案例的方式，讲述如何才能达到真正的高效，\u003ccode\u003e很值得阅读\u003c/code\u003e。\n如何从\u003ccode\u003e观察-感受-需要-请求\u003c/code\u003e，四个步骤和维度来进行沟通。\u003c/p\u003e\u003c/blockquote\u003e","title":"非暴力沟通"},{"content":"书 封面 读后总结 整本书围绕 古古 和 小戈，的故事在展开，通篇通过各个生活中的小场景来讲述说话的处理方式，从错误的处理方式，到如何正确的处理，给出了完整的方案和推理过程。 不过， 书的文笔描述，读起来不是很顺畅，自己不太适应。可能是自己第一次读 蔡康永 书的原因吧。\n沟通中，尝试理解对方真正想要表达的意思。\n如果在沟通中，有不感兴趣的话题，可以尝试转移话题。\n沟通中，尝试减少我的使用。\n沟通中，可以适当的留白。不用着急去回复对方\n如果实现没有想好，如何去回复对方时，可以尝试重复对方话语中的关键字\n需要夸奖对方时，尝试找到线索、分析线索，来夸奖对方\nAmazon:蔡康永的说话之道\n阅读时间：20161222-20170105","permalink":"https://shiyuanjie.cn/posts/Book/%E8%94%A1%E5%BA%B7%E6%B0%B8%E7%9A%84%E8%AA%AA%E8%A9%B1%E4%B9%8B%E9%81%93/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e封面\u003c/li\u003e\n\u003c/ul\u003e\n\u003cimg src=\"https://images-cn.ssl-images-amazon.com/images/I/51F9YrrK3ZL._SX362_BO1,204,203,200_.jpg\" /\u003e\n\u003ch2 id=\"读后总结\"\u003e读后总结\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e整本书围绕 古古 和 小戈，的故事在展开，通篇通过各个生活中的小场景来讲述说话的处理方式，从错误的处理方式，到如何正确的处理，给出了完整的方案和推理过程。 不过， 书的文笔描述，读起来不是很顺畅，自己不太适应。可能是自己第一次读 蔡康永 书的原因吧。\u003c/p\u003e\u003c/blockquote\u003e","title":"蔡康永的说话之道"},{"content":"书 读后总结 书中作者运用大量调研的实例，说明在实例化需求说明过程中的注意事项及团队应用后的效果。很多案例还没有亲身体验，但通过本书，可以在以后的实践过程中少走很多弯路。\n构建有效产品的条件\n确保所有干系人和交付成员，都对需要交付的东西有统一的认识。 有准确的需求说明书。 有用于衡量某项工作是否已经完成的客观标准。 有引导软件功能或团队结构变更的文档。 实例化需求说明的主要过程模式\n从 业务目标 中获取 范围（用户故事、用例） 从 用户故事 中提取 关键实例 从 关键实例 中提炼 实例化需求说明 从 从实例化需求 中生成 可执行的需求 从 可执行的需求 中生成 活文档、验收文档 实例化需求，将测试文档和需求说明合并至一起。但仍需要其它类型的测试，如探索性测试、可用性测试\nAmazon: 实例化需求：团队如何交付正确的软件\n阅读时间：20161031-20170103","permalink":"https://shiyuanjie.cn/posts/Book/%E5%AE%9E%E4%BE%8B%E5%8C%96%E9%9C%80%E6%B1%82/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cimg src=\"https://images-cn.ssl-images-amazon.com/images/I/51X56mzlyNL.jpg\" /\u003e\n\u003ch2 id=\"读后总结\"\u003e读后总结\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e书中\u003ccode\u003e作者\u003c/code\u003e运用\u003ccode\u003e大量\u003c/code\u003e调研的实例，说明在\u003ccode\u003e实例化需求说明\u003c/code\u003e过程中的注意事项及团队应用后的\u003ccode\u003e效果\u003c/code\u003e。很多案例还没有亲身体验，但通过本书，可以在以后的实践过程中少走很多\u003ccode\u003e弯路\u003c/code\u003e。\u003c/p\u003e\u003c/blockquote\u003e","title":"实例化需求：团队如何交付正确的软件"},{"content":" 2016还有几天就结束了，公司的Review基本做完，自己再做个总结。便于对新的一年有整体的规划。\n2016 工作 专业技能 测试技能\n掌握Protractor对Angular项目的测试 掌握SuperTest进行API测试 熟悉项目中应用Docker，进行容器化部署的全流程 更加深入的掌握JMeter在性能测试中的功能 其它角色\n实践PM、BA角色在项目中的经验 实践公司项目售前的操作方法 利用自己的个人项目，体验敏捷项目中，其它各角色的工作方式 业务 了解银行账号系统、借贷系统 了解市面主流敏捷看板工具，及各自优缺点 阅读 累积阅读14本书，5本专业书籍，5本方法与技巧类，4本小说、历史类。已完成书评12本。\n技术类\nNode.js开发指南 Node入门 The Cucumber Book: Behaviour-Driven Development for Testers and Developers JavaScript核心概念及实践 Node.js+MongoDB+AngularJS Web开发 方法与技巧\n你的灯亮着吗?:发现问题的真正所在 如何阅读一本书 自控力 非暴力沟通 蔡康永的说话之道 小说、历史\n别笑，这是大清正史1,2,3 解忧杂货店 三体 无声告白 购买喜马拉雅FM的节日好好说话，微信公众号彪悍一只猫的如何快速崛起\n写作 个人博客中，累积发表45篇文章。 简书中发表18篇文章，收获134个粉丝，217个喜欢。 开发者头条APP中，个人公众号测试之自动化，订阅者489。\n个人 家庭 带儿子和媳妇去成都玩一周 4月的时候，母亲被查出子宫癌晚期，医生给的时间最多1-3年。不过，庆幸的是，现在母亲还能进行简单的生活自理，相信母亲还会继续坚持下去。 11月岳母的脑梗复发。在医院住了半个多月。最近又住院了，在医院进行全面的检查，相信岳母身体也会早点好起来的。 家里的其他成员，身体都挺好。儿子也在健康快乐的成长。 运动 前半年，经常在出差，跑步时断时续。5月后回西安了，将原来的跑步重新坚持下来。每次10公里。\n西安的冬天，雾霾对我这种只户外跑步的人来说，是个硬伤。简直，对身体的伤害太大。雾霾天，又将跑步搁浅了。只要天气好了，就会赶紧出去跑一次。\n没做的事 原计划2016要尝试去跑一次半马的，一直没参加过。 2017 工作 更多的尝试其他角色 将更多的测试新技术应用至项目实践中 阅读 20本书 写作 前半年，周更一篇 后半年，周更两篇 家庭 带家人去玩 运动 跑个半马 其它 学习手绘 四次Session 戒烟 ","permalink":"https://shiyuanjie.cn/posts/Flags/2017%E6%80%BB%E7%BB%93/","summary":"\u003cblockquote\u003e\n\u003cp\u003e2016还有几天就结束了，公司的Review基本做完，自己再做个总结。便于对新的一年有整体的规划。\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch1 id=\"2016\"\u003e2016\u003c/h1\u003e\n\u003ch2 id=\"工作\"\u003e工作\u003c/h2\u003e\n\u003ch3 id=\"专业技能\"\u003e专业技能\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e测试技能\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e掌握\u003ccode\u003eProtractor\u003c/code\u003e对Angular项目的测试\u003c/li\u003e\n\u003cli\u003e掌握\u003ccode\u003eSuperTest\u003c/code\u003e进行API测试\u003c/li\u003e\n\u003cli\u003e熟悉项目中应用\u003ccode\u003eDocker\u003c/code\u003e，进行容器化部署的全流程\u003c/li\u003e\n\u003cli\u003e更加深入的掌握\u003ccode\u003eJMeter\u003c/code\u003e在性能测试中的功能\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e其它角色\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e实践PM、BA角色在项目中的经验\u003c/li\u003e\n\u003cli\u003e实践公司项目\u003ccode\u003e售前\u003c/code\u003e的操作方法\u003c/li\u003e\n\u003cli\u003e利用自己的\u003ca href=\"https://github.com/aimer1124/JianshuSpider\"\u003e个人项目\u003c/a\u003e，体验敏捷项目中，其它各角色的工作方式\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"业务\"\u003e业务\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e了解银行\u003ccode\u003e账号系统、借贷系统\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e了解市面主流\u003ccode\u003e敏捷看板\u003c/code\u003e工具，及各自优缺点\u003c/li\u003e\n\u003c/ul\u003e","title":"2017总结"},{"content":" 本文整理的内容，来源于微信公众号『彪悍一只猫』作者猫哥的分享，『如何快速崛起』。\n整理 完整脑图\n总结 读书很重要，学会分享更重要。 找到比你牛逼的人，尝试与他们沟通。 如果有人帮你，一定要真诚的感谢。 一定不要只顾着自己进步，有机会最好能帮助下别人。 做事情一定要有耐心，只有足够的耐心才能帮助你成长。 ","permalink":"https://shiyuanjie.cn/posts/Book/%E5%A6%82%E4%BD%95%E5%BF%AB%E9%80%9F%E5%B4%9B%E8%B5%B7/","summary":"\u003cblockquote\u003e\n\u003cp\u003e本文整理的内容，来源于微信公众号『彪悍一只猫』作者猫哥的分享，『如何快速崛起』。\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"整理\"\u003e整理\u003c/h2\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Book/%E5%A6%82%E4%BD%95%E5%BF%AB%E9%80%9F%E5%B4%9B%E8%B5%B7/%E5%A6%82%E4%BD%95%E5%BF%AB%E9%80%9F%E5%B4%9B%E8%B5%B7_hu_6c63b0b6d540ea29.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"如何快速崛起\" loading=\"lazy\" src=\"/posts/Book/%E5%A6%82%E4%BD%95%E5%BF%AB%E9%80%9F%E5%B4%9B%E8%B5%B7/%E5%A6%82%E4%BD%95%E5%BF%AB%E9%80%9F%E5%B4%9B%E8%B5%B7.png\"\u003e\u003c/picture\u003e\u003c/p\u003e","title":"如何快速崛起"},{"content":"Web页面Layout测试，一直是测试人员比较头疼的事情。原因有\n当前市面中设备的分辨率千差万别 浏览器版本众多，工作量很大 如何使用高效的方式来测试Web Layout是否能正常，下面来看下Galen是如何帮助我们的\nGalen的特点 开源项目，License基于Apache License, Version 2.0 可测试页面布局、响应式设计，支持功能测试 基于Selenium，对Selenium Grid支持很好，可直接在Sauce Labs和 BrowserStack 支持并行测试，减少测试时间 语法简洁 @objects comments #comments article-content div.article = Main section = @on mobile, tablet comments: width 300px inside screen 10 to 30px top right near article-content \u0026gt; 10px right @on desktop comments: width ~ 100% of screen/width below article-content \u0026gt; 20px 使用 安装 Java 1.8或更新版本 NPM安装 sudo npm install -g galenframework-cli 验证安装 ➜ Downloads galen -v Galen Framework Version: 2.3.2 JavaScript executor: Rhino 1.7 release 5 2015 01 29 第一个测试项目 测试页面: http://samples.galenframework.com/tutorial1/tutorial1.html 创建一个空文件夹，新增一个文件home-page.gspec home-page.gspec内容如下 @objects header id header = Main section = header: height 100px 测试验证的内容是header元素的高为100px 下载一个driver，本次测试以下载chromedriver为例 geckodriver chromedriver 修改配制: ~/.galen.config 浏览器配制 # Default browser # ~~~~~~~~~~~~~~~~~~~~~~~~ # A browser that should be used by default in case it was not specified in galen test galen.default.browser=chrome 在配制文件内，追加driver本机路径 $.webdriver.chrome.driver=~/Documents/All/Software/driver/chromedriver 执行测试 galen check home-page.gspec --url http://samples.galenframework.com/tutorial1/tutorial1.html --size 640x480 --htmlreport . 执行测试时，会先将浏览器启动 浏览器的大小为640x480 对比header元素的height是否为100px 在当前home-page.gspec的文件夹中，会生成测试报告 以下为执行过程日志 ➜ galenDemo galen check home-page.gspec --url http://samples.galenframework.com/tutorial1/tutorial1.html --size 640x480 --htmlreport . ======================================== Test: home-page.gspec ======================================== Starting ChromeDriver 2.25.426935 (820a95b0b81d33e42712f9198c215f703412e1a1) on port 7505 Only local connections are allowed. Nov 28, 2016 3:15:04 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Attempting bi-dialect session, assuming Postel\u0026#39;s Law holds true on the remote end Nov 28, 2016 3:15:05 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: OSS check home-page.gspec --url http://samples.galenframework.com/tutorial1/tutorial1.html --size 640x480 --htmlreport . -Dwebdriver.chrome.driver=/usr/local/lib/node_modules/galenframework-cli/node_modules/chromedriver/lib/chromedriver/chromedriver = Main section = header: height 100px ======================================== ---------------------------------------- ======================================== Suite status: PASS Total tests: 1 Total failed tests: 0 Total failures: 0 查看测试报告 至此，使用Galen进行单个页面布局的测试就已经结束了。下面再进行一次测试修改元素高度\n修改header元素的height是否为40px，home-page.gspec @objects header id header = Main section = header: height 40px － 再次执行测试，查看测试结果\n➜ galenDemo galen check home-page.gspec --url http://samples.galenframework.com/tutorial1/tutorial1.html --size 640x480 --htmlreport . ======================================== Test: home-page.gspec ======================================== Starting ChromeDriver 2.25.426935 (820a95b0b81d33e42712f9198c215f703412e1a1) on port 9809 Only local connections are allowed. Nov 28, 2016 3:24:11 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Attempting bi-dialect session, assuming Postel\u0026#39;s Law holds true on the remote end Nov 28, 2016 3:24:12 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: OSS check home-page.gspec --url http://samples.galenframework.com/tutorial1/tutorial1.html --size 640x480 --htmlreport . -Dwebdriver.chrome.driver=/usr/local/lib/node_modules/galenframework-cli/node_modules/chromedriver/lib/chromedriver/chromedriver = Main section = header: -\u0026gt; height 40px -\u0026gt; : \u0026#34;header\u0026#34; height is 100px instead of 40px ======================================== ---------------------------------------- ======================================== Failed tests: home-page.gspec Suite status: FAIL Total tests: 1 Total failed tests: 1 Total failures: 1 There were failures in galen tests 测试失败FAIL，查看测试报告中具体报告 选择Tests页签 点击home-page.gspec，会自动显示具体的报错信息 到目前为止，我们可以发现，使用Galen进行页面布局测试会很方便和快速，且错误信息显示足够详细\n总结 使用Galen进行测试时，可以很快速的切换不同的浏览器和浏览器大小，来支持Layout测试 Galen自带的测试报告，可以帮助测试人员，快速定位出具体的问题在哪。 Galen基于Selenium，还可用来进行功能测试，可以将Layout测试与Function测试结合一起使用 参考 Galen Install Galen First Project-Galen ","permalink":"https://shiyuanjie.cn/posts/UITest/Layout%E6%B5%8B%E8%AF%95/","summary":"\u003cp\u003eWeb页面Layout测试，一直是测试人员比较头疼的事情。原因有\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e当前市面中设备的\u003ccode\u003e分辨率\u003c/code\u003e千差万别\u003c/li\u003e\n\u003cli\u003e浏览器版本众多，工作量很大\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e如何使用\u003ccode\u003e高效\u003c/code\u003e的方式来测试Web Layout是否能正常，下面来看下\u003ca href=\"http://galenframework.com/\"\u003eGalen\u003c/a\u003e是如何帮助我们的\u003c/p\u003e\n\u003ch2 id=\"galen的特点\"\u003e\u003ca href=\"http://galenframework.com/\"\u003eGalen\u003c/a\u003e的特点\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e开源项目，License基于\u003ca href=\"http://www.apache.org/licenses/LICENSE-2.0\"\u003eApache License, Version 2.0\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e可测试页面布局、响应式设计，支持功能测试\u003c/li\u003e\n\u003cli\u003e基于\u003ca href=\"http://www.seleniumhq.org/\"\u003eSelenium\u003c/a\u003e，对Selenium Grid支持很好，可直接在\u003ca href=\"https://saucelabs.com/\"\u003eSauce Labs\u003c/a\u003e和 \u003ca href=\"https://www.browserstack.com/\"\u003eBrowserStack\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e支持并行测试，减少测试时间\u003c/li\u003e\n\u003cli\u003e语法简洁\u003c/li\u003e\n\u003c/ul\u003e","title":"Layout测试"},{"content":"Espresso Test Recorder的好处\n直接录制与APP的所有交互操作 支持在录制过程中添加断言 可直接生成可回放的测试脚本，基本不需要做任何修改 原文地址: Create UI Tests with Espresso Test Recorder，以下为正文\n注意: Espresso Test Recorder在AndroidStudio 2.2 Beta版本之后才有。\nEspresso Test Recorder可以在不写一行代码的情况下创建UI测试。通过录制一个测试场景，你可以记录设备的交互并在APP的部分快照中添加断言来验证元素。Espresso Test Recorder会保存录制并自动生成对应的UI测试，并可直接运行来测试你的APP。\nEspresso Test Recorder编写的测试基于Espresso Testing framework，API在Android Testing Support Library。Espresso API鼓励你创建基于用户操作的简洁且可信赖的UI测试。通过使用expectations、interactions和assertions而不是底层APP的Activity和Views，这样的结构防止了测试的脆弱性并优化测试运行速度。\n查看下面的视频可对Espresso Test Recorder有一个快速的了解，一个新的特性在AndroidStudio2.2:\n关闭你设备中的动画 在使用Espresso Test Recorder之前，确保你关闭你设备中的动画以防止出现非预期的结果。依据\u0026quot;安装Espresso\u0026quot;说中在测试UI在单个APP中中，但是记得你不需要手工设置依赖相关配制到Espresso库中，因为Test Recorder会自动帮你做，当你录制的时候。这些步骤只需要在一个已有的项目中做一次。\n录制一个Espresso测试 Espresso测试由两个主要部分组成: 在View元素中的UI交互和断言。UI交互包括一个人可以用来与你APP交互的点击和输入动作。断言验证在屏幕中的可见元素的存在或内容。比如，针对Notes testing app的一个Espresso测试，包括UI交互针对点击一个按钮和写一个新的笔记，但使用断言来验证按钮的存在和笔记内容。\n录制UI交互 为了开始录制一个Espresso Test Recorder，参考下面的步骤\n点击 Run \u0026gt; Record Espresso Test。 在 Select Deployment Target 窗口中，选择你想要录制的测试的设备。如果有必要，创建一个新安卓虚拟设备。点击 OK。 Espresso Test Recorder会激活构建你的项目，APP一定要在Espresso Test Recorder允许你交互之前，安装且启动。在APP启动之后，Record Your Test 窗口会显示，如果你还没有跟设备交互，主面板会显示\u0026quot;No event recorded yet.\u0026quot; 与你的设备开始交互来启动记录事件，比如\u0026quot;点击\u0026quot;和\u0026quot;输入\u0026quot;动作。 注意:在你开始记录交互操作之前，在设备中你也许会看到一个对话框显示\u0026quot;Waiting for Debugger\u0026quot;或\u0026quot;Attaching Debugger\u0026quot;。Espresso Test Recorder使用debugger来记录UI事件。当debugger被attach，对话框将会自动关闭，不要点击 Force Close.\n录制的交互将会显示在主面板中的 Record Your Test ，像下图1显示。当你开始运行测试，Espresso测试执行这些测试按相同的次序。\n添加断言来验证UI元素 断言通过三种主要的方式验证一个View元素的存在或内容:\ntext is : 校验选择元素的文件内容 exists : 屏幕中当前的View内，校验元素是存在的 does not exist : 当前的View内，校验元素是不存在的 给测试中添加断言，参考下面的步骤:\n点击 Add Assertion 。一个 \u0026ldquo;屏幕截图\u0026quot;对话会显示出来，当Espresso获取到关于当前APP状态的UI结构或其它信息。一旦Espresso获取到屏幕截图，对话框将会关闭。 在当前面板 Record Your Test 窗口的右侧会显示当前屏幕显示的布局样式。选择一个需要创建断言的可见元素，在截图中点击元素或点击在窗口底部的 Edit assertion 对话框的第一个下拉菜单。被选择的View对象会在红框中高亮。 在__Edit assertion__ 对话框的第二个下拉菜单中选择你想使用的断言。Espresso交会弹出针对选择元素的断言 如果你选择\u0026quot;text is\u0026quot;断言，Espresso会自动插入当前选择元素中的值。你可以在 Edit assertion 编辑文本来匹配你想得到的断言结果。 点击 Save and Add Another 来创建另外一个断言或点击 Save Assertion 来关闭断言面板。 在图2中，显示了\u0026quot;text is\u0026quot;断言被创建用于验证笔记的标题是\u0026quot;Happy Testing!\u0026rdquo;: 当创建一个断言时，你可以继续与你的APP交互，只要断言面板 Record Your Test 窗口仍然打开。Espresso Test Recorder将持续录制你的动作，一旦你正在编辑的断言保存后，新的交互会显示在后面。针对断方的截屏会保存当你在设备或模拟器中点击\u0026quot;Add Assertion\u0026quot;时的APP布局。\n注意：Espresso Test Recorder还是一个实验性的特性，工具当前仅支持可见层断言。你可以通过添加断言来确定屏幕中的元素，屏幕截取仍显示可见模式，并且选择的元素的红色边框和无素在屏幕中的实际位置是不匹配的。\n保存录制 一旦，你完成与你APP的交互并添加了断言，使用下面的步骤来保存你的记录并生成Espresso测试脚本：\n点击 Complete Recording 。Pick a test class name for your test 窗口将会显示。 Espresso Test Recorder将会对测试一个基于启动的Activity的唯一名字。如果你想改变测试名的话，使用 Test class name 。点击 Save 。 如果你没有给项目添加Espresso依赖， Missing Espresso dependencies 对话框会在你保存的时候显示。 点击 Yes 将会自动添加依赖至你的 build.gradle 文件中。\n在Espresso Test Recorder生在文件之后，会自动打开。并且 Android Studio将会在IDE的 Project 窗口中找开测试类。 测试被保存的位置依据你的instrumentation test，也与启动的Activity包名有关。比如，测试Notes testing app保存在 src \u0026gt; androidTest \u0026gt; java \u0026gt; com.example.username.appname 录制测试的APP模块下。\n本地运行Espresso测试 为了运行Espresso测试，使用在IDE左侧的 Project 窗口：\n打开APP模块文件夹，找到你想运行的测试。测试的位置依据你的instrumentation test位置和启动Activity包名。下面的例子说明Notes testing app的测试应该保存在哪： 如果你在窗口中使用Android视图，进入 java \u0026gt; com.example.username.appname(androidTest) . 如果你在窗口中使用 Project视图， 进入 src \u0026gt; androidTest \u0026gt; java \u0026gt; com.example.username.appname 模板文件夹。 在测试代码上点击右键，选择 Run \u0026rsquo;testName\u0026rsquo; . 同样，你可以打开测试文件，在生成的测试类或方法中右键点击来运行测试。了解更多关于如何运行测试在测试你的APP。 在 Select Deployment Target 窗口，选择你想要运行测试的测试设备。如果有需要，创建一个新安卓虚拟设备。点击 OK 。 在IDE的底部 Run 窗口中，会显示测试的运行过程。Android Studio运行项目的完整构建并在 Run 窗口中打开一个测试名称的页签，如图3展示。你可以在页签中检查是否你的测试通过或失败，以及你的测试运行的多久。当测试结束后，页签将会显示 \u0026ldquo;Tests ran to completion.\u0026rdquo; 了解更多的编写测试的运行配制，可以去创建并编辑 运行、调试 配制看\u0026quot;Defining a test configuration for a class or method\u0026quot;部分\n运行Android的Espresso测试在 Firebase Test Lab 你可以在Firebase Test Lab运行的Espresso测试在数以百计设备配制中。在Test Lab中可以使用free daily quota on the Spark plan来免费运行测试。为了在Firebase Test Lab中运行测试，为你的APP创建一个Firebase项目，并按Android Studio的操作说明来运行你的测试使用Firebase Test Lab. ","permalink":"https://shiyuanjie.cn/posts/Android/Android-UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E7%A5%9E%E5%99%A8-Espresso%E5%BD%95%E5%88%B6/","summary":"\u003cp\u003eEspresso Test Recorder的好处\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e直接录制与APP的所有交互操作\u003c/li\u003e\n\u003cli\u003e支持在录制过程中添加断言\u003c/li\u003e\n\u003cli\u003e可直接生成\u003ccode\u003e可回放\u003c/code\u003e的测试脚本，基本不需要做任何修改\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e原文地址: \u003ca href=\"https://developer.android.com/studio/test/espresso-test-recorder.html\"\u003eCreate UI Tests with Espresso Test Recorder\u003c/a\u003e，以下为正文\u003c/p\u003e\n\u003chr\u003e\n\u003cblockquote\u003e\n\u003cp\u003e注意: Espresso Test Recorder在AndroidStudio 2.2 Beta版本之后才有。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eEspresso Test Recorder可以在不写一行代码的情况下创建UI测试。通过录制一个测试场景，你可以记录设备的交互并在APP的部分快照中添加断言来验证元素。Espresso Test Recorder会保存录制并自动生成对应的UI测试，并可直接运行来测试你的APP。\u003c/p\u003e\n\u003cp\u003eEspresso Test Recorder编写的测试基于\u003ca href=\"https://google.github.io/android-testing-support-library/docs/espresso/\"\u003eEspresso Testing framework\u003c/a\u003e，API在\u003ca href=\"https://developer.android.com/topic/libraries/testing-support-library/index.html\"\u003eAndroid Testing Support Library\u003c/a\u003e。Espresso API鼓励你创建基于用户操作的简洁且可信赖的UI测试。通过使用expectations、interactions和assertions而不是底层APP的Activity和Views，这样的结构防止了测试的脆弱性并优化测试运行速度。\u003c/p\u003e","title":"Android UI自动化测试神器-Espresso录制"},{"content":"PageObject 老马关于PageObject的定义 It should allow a software client to do anything and see anything that a human can\nPageObject到底是个啥 将针对Page的所有操作进行统一封装，如: 输入框中输入内容、点击按钮等\nE2E的几个痛点\n前端调整引起元素定位不到，如 登录页面的密码输入框的id被程序员不小心给删除了，执行E2E测试过程中就会无法定位到密码输入框，即使有错误提示，你就要找到所有的密码输入框并修改密码输入框元素定位\n相同的页面操作，要在不同的地方使用，写N次，代码冗余，很不利于后期维护 用户登录，这样的操作是最常见的。但我们经常会出现在每个需要登录的地方，都写一遍用户登录\n使用PageObject都可以解决\n如果元素定位不到，只需要修改对应的页面的PageObject就好，一处改动，关联的地方都OK了 将相同的页面操作，进行抽离至PageObject中，大大减少代码的冗余 下面我们看一个实践: 如何将页面进行PageObject抽离\n分离PageObject 原始代码 public class ExampleInstrumentedTest { public static final String STRING_TO_BE_TYPED_EMAIL = \u0026#34;EspressoDemo@mail.com\u0026#34;; public static final String STRING_TO_BE_TYPED_EMAIL_PASSWORD = \u0026#34;123456\u0026#34;; @Rule public ActivityTestRule\u0026lt;LoginActivity\u0026gt; mActivityRule = new ActivityTestRule\u0026lt;\u0026gt;( LoginActivity.class); @Test public void testAttemptLogin() { // Type text and then press the button. onView(withId(demo.test.espressodemo.R.id.email)) .perform(typeText(STRING_TO_BE_TYPED_EMAIL), closeSoftKeyboard()); onView(withId(demo.test.espressodemo.R.id.email)) .check(matches(withText(STRING_TO_BE_TYPED_EMAIL))); onView(withId(demo.test.espressodemo.R.id.password)) .perform(typeText(STRING_TO_BE_TYPED_EMAIL_PASSWORD), closeSoftKeyboard()); onView(withId(demo.test.espressodemo.R.id.password)) .check(matches(withText(STRING_TO_BE_TYPED_EMAIL_PASSWORD))); onView(withId(demo.test.espressodemo.R.id.email_sign_in_button)) .perform(click()); } } 从testAttemptLogin中可以看出测试流程是这样\n第一步: R.id.email输入内容STRING_TO_BE_TYPED_EMAIL，再验证输入内容是否为STRING_TO_BE_TYPED_EMAIL 第二步: R.id.password输入内容STRING_TO_BE_TYPED_EMAIL_PASSWORD，再验证输入内容是否为STRING_TO_BE_TYPED_EMAIL_PASSWORD 第三步: 点击R.id.email_sign_in_button按钮 这是一个最常见的E2E测试的编写方式，这样的编写方式，明显就一步一步进入了我们上面提的 E2E的几个痛点 中\n分离手术 提取登录PageObject: LoginPageObject public class LoginPageObject { public static void inputEmail(String email){ onView(withId(demo.test.espressodemo.R.id.email)) .perform(typeText(email), closeSoftKeyboard()); onView(withId(demo.test.espressodemo.R.id.email)) .check(matches(withText(email))); } public static void inputPassword(String password){ onView(withId(demo.test.espressodemo.R.id.password)) .perform(typeText(password), closeSoftKeyboard()); onView(withId(demo.test.espressodemo.R.id.password)) .check(matches(withText(password))); } public static void clickLogin(){ onView(withId(demo.test.espressodemo.R.id.email_sign_in_button)) .perform(click()); } } 使用登录PageObject来实现之前的测试功能 public class ExampleInstrumentedTest { public static final String email = \u0026#34;EspressoDemo@mail.com\u0026#34;; public static final String password = \u0026#34;123456\u0026#34;; @Rule public ActivityTestRule\u0026lt;LoginActivity\u0026gt; mActivityRule = new ActivityTestRule\u0026lt;\u0026gt;( LoginActivity.class); @Test public void testAttemptLogin() { // Type text and then press the button. LoginPageObject.inputEmail(email); LoginPageObject.inputPassword(password); LoginPageObject.clickLogin(); } } 至此，PageObject已经分离完成，我们肯定不会到此就结束的，再把测试数据进行分离，便于整体数据的维护\n提取用户数据: UserInfo public class UserInfo { public static final String email = \u0026#34;EspressoDemo@mail.com\u0026#34;; public static final String password = \u0026#34;123456\u0026#34;; } 再次调整测试代码 public class ExampleInstrumentedTest { @Rule public ActivityTestRule\u0026lt;LoginActivity\u0026gt; mActivityRule = new ActivityTestRule\u0026lt;\u0026gt;( LoginActivity.class); @Test public void testAttemptLogin() { // Type text and then press the button. LoginPageObject.inputEmail(UserInfo.email); LoginPageObject.inputPassword(UserInfo.password); LoginPageObject.clickLogin(); } } 走到这里，我们会发现，现在的测试很清晰，也很好维护\n测试仅有三步骤\nLogin输入邮箱地址 Login输入密码 Login点击登录按钮 有没有发现，这样的测试，更符合业务.\n总结 使用PageObject模型后，测试代码更加便于维护，大大增加了可读性,减少了冗余代码 PageObject就是将页面的操作行为，进行单独分离和维护，统一管理 PageObject/测试数据/测试脚本的关系 完整代码: https://github.com/aimer1124/EspressoDemo 参考 PageObject Tutorial: Sustainable Android Tests with Page Objects ","permalink":"https://shiyuanjie.cn/posts/UITest/PageObject%E5%88%86%E7%A6%BBE2E%E6%B5%8B%E8%AF%95/","summary":"\u003ch2 id=\"pageobject\"\u003ePageObject\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://martinfowler.com\"\u003e老马\u003c/a\u003e关于\u003ca href=\"http://martinfowler.com/bliki/PageObject.html\"\u003ePageObject\u003c/a\u003e的定义\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt should allow a software client to do anything and see anything that a human can\u003c/p\u003e\u003c/blockquote\u003e\n\u003cul\u003e\n\u003cli\u003ePageObject到底是个啥\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e将针对Page的\u003ccode\u003e所有操作\u003c/code\u003e进行\u003ccode\u003e统一\u003c/code\u003e封装，如: 输入框中输入内容、点击按钮等\u003c/p\u003e\u003c/blockquote\u003e","title":"PageObject分离E2E测试"},{"content":" 需求：在Mac电脑中录制操作，并生成GIF文件。GIF文件需要循环播放。\n工具选择 Recordit，7.2M大小，Free gifsicle，加工GIF图片工具 安装Recordit，录制GIF图片 下载最新版本，解压后直接运行 点击Record，会提示选择录制范围 选择范围后，再点击Recordit的图标，开始录制 操作完成后，再点击Recordit的图标，录制结束 Recordit会将本次的录制内容上传至服务器，如果需要删除时，需要手动在Recordit中删除\n使用gifsicle设置图片为循环播放 下载gifsicle，gifsicle-1.88.tar.gz，解压 Terminal进入解压目录，运行./configure --disable-gifview --disable-gifdiff ➜ gifsicle-1.88 ./configure --disable-gifview --disable-gifdiff checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... ./install-sh -c -d checking for gawk... no checking for mawk... no checking for nawk... no checking for awk... awk checking whether make sets $(MAKE)... yes checking whether make supports nested variables... yes checking whether make sets $(MAKE)... (cached) yes checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking whether gcc understands -c and -o together... yes checking for style of include used by make... GNU checking dependency style of gcc... gcc3 checking how to run the C preprocessor... gcc -E checking for an ANSI C-conforming const... yes checking for inline... inline checking for random... yes checking for strerror... yes checking for strtoul... yes checking for mkstemp... yes checking for library containing pow... none required checking for grep that handles long lines and -e... /usr/bin/grep checking for egrep... /usr/bin/grep -E checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking sys/select.h usability... yes checking sys/select.h presence... yes checking for sys/select.h... yes checking for inttypes.h... (cached) yes checking for unistd.h... (cached) yes checking for inttypes.h... (cached) yes checking for sys/types.h... (cached) yes checking for uintptr_t... yes checking for int64_t... yes checking size of unsigned int... 4 checking size of unsigned long... 8 checking size of void *... 8 checking that generated files are newer than configure... done configure: creating ./config.status config.status: creating Makefile config.status: creating src/Makefile config.status: creating config.h config.status: executing depfiles commands 执行make命令 ➜ gifsicle-1.88 make /Library/Developer/CommandLineTools/usr/bin/make all-recursive Making all in src gcc -DHAVE_CONFIG_H -I. -I.. -I../include -g -O2 -MT clp.o -MD -MP -MF .deps/clp.Tpo -c -o clp.o clp.c mv -f .deps/clp.Tpo .deps/clp.Po gcc -DHAVE_CONFIG_H -I. -I.. -I../include -g -O2 -MT fmalloc.o -MD -MP -MF .deps/fmalloc.Tpo -c -o fmalloc.o fmalloc.c mv -f .deps/fmalloc.Tpo .deps/fmalloc.Po gcc -DHAVE_CONFIG_H -I. -I.. -I../include -g -O2 -MT giffunc.o -MD -MP -MF .deps/giffunc.Tpo -c -o giffunc.o giffunc.c mv -f .deps/giffunc.Tpo .deps/giffunc.Po gcc -DHAVE_CONFIG_H -I. -I.. -I../include -g -O2 -MT gifread.o -MD -MP -MF .deps/gifread.Tpo -c -o gifread.o gifread.c mv -f .deps/gifread.Tpo .deps/gifread.Po gcc -DHAVE_CONFIG_H -I. -I.. -I../include -g -O2 -MT gifunopt.o -MD -MP -MF .deps/gifunopt.Tpo -c -o gifunopt.o gifunopt.c mv -f .deps/gifunopt.Tpo .deps/gifunopt.Po gcc -DHAVE_CONFIG_H -I. -I.. -I../include -g -O2 -MT merge.o -MD -MP -MF .deps/merge.Tpo -c -o merge.o merge.c mv -f .deps/merge.Tpo .deps/merge.Po gcc -DHAVE_CONFIG_H -I. -I.. -I../include -g -O2 -MT optimize.o -MD -MP -MF .deps/optimize.Tpo -c -o optimize.o optimize.c mv -f .deps/optimize.Tpo .deps/optimize.Po gcc -DHAVE_CONFIG_H -I. -I.. -I../include -g -O2 -MT quantize.o -MD -MP -MF .deps/quantize.Tpo -c -o quantize.o quantize.c mv -f .deps/quantize.Tpo .deps/quantize.Po gcc -DHAVE_CONFIG_H -I. -I.. -I../include -g -O2 -MT support.o -MD -MP -MF .deps/support.Tpo -c -o support.o support.c mv -f .deps/support.Tpo .deps/support.Po gcc -DHAVE_CONFIG_H -I. -I.. -I../include -g -O2 -MT xform.o -MD -MP -MF .deps/xform.Tpo -c -o xform.o xform.c mv -f .deps/xform.Tpo .deps/xform.Po gcc -DHAVE_CONFIG_H -I. -I.. -I../include -g -O2 -MT gifsicle.o -MD -MP -MF .deps/gifsicle.Tpo -c -o gifsicle.o gifsicle.c gifsicle.c:24:9: warning: \u0026#39;static_assert\u0026#39; macro redefined [-Wmacro-redefined] #define static_assert(x, msg) switch ((int) (x)) case 0: case !!((int) (x)): ^ /usr/include/assert.h:107:9: note: previous definition is here #define static_assert _Static_assert ^ 1 warning generated. mv -f .deps/gifsicle.Tpo .deps/gifsicle.Po gcc -DHAVE_CONFIG_H -I. -I.. -I../include -g -O2 -MT gifwrite.o -MD -MP -MF .deps/gifwrite.Tpo -c -o gifwrite.o gifwrite.c mv -f .deps/gifwrite.Tpo .deps/gifwrite.Po gcc -g -O2 -o gifsicle clp.o fmalloc.o giffunc.o gifread.o gifunopt.o merge.o optimize.o quantize.o support.o xform.o gifsicle.o gifwrite.o make[2]: Nothing to be done for `all-am\u0026#39;. 进入src目录，将原GIf图片(目录:~/Documents/test.gif)设置为循环播放 ➜ gifsicle-1.88 cd src ➜ src ./gifsicle -bl ~/Documents/test.gif 将GIF图片设置为循环播放已完成。\n其它gifsicle参数 \u0026#39;Gifsicle\u0026#39; manipulates GIF images. Its most common uses include combining single images into animations, adding transparency, optimizing animations for space, and printing information about GIFs. Usage: gifsicle [OPTION | FILE | FRAME]... Mode options: at most one, before any filenames. -m, --merge Merge mode: combine inputs, write stdout. -b, --batch Batch mode: modify inputs, write back to same filenames. -e, --explode Explode mode: write N files for each input, one per frame, to \u0026#39;input.frame-number\u0026#39;. -E, --explode-by-name Explode mode, but write \u0026#39;input.name\u0026#39;. General options: Also --no-OPTION for info and verbose. -I, --info Print info about input GIFs. Two -I\u0026#39;s means normal output is not suppressed. --color-info, --cinfo --info plus colormap details. --extension-info, --xinfo --info plus extension details. --size-info, --sinfo --info plus compression information. -V, --verbose Prints progress information. -h, --help Print this message and exit. --version Print version number and exit. -o, --output FILE Write output to FILE. -w, --no-warnings Don\u0026#39;t report warnings. --no-ignore-errors Quit on very erroneous input GIFs. --conserve-memory Conserve memory at the expense of speed. --multifile Support concatenated GIF files. Frame selections: #num, #num1-num2, #num1-, #name Frame change options: --delete FRAMES Delete FRAMES from input. --insert-before FRAME GIFS Insert GIFS before FRAMES in input. --append GIFS Append GIFS to input. --replace FRAMES GIFS Replace FRAMES with GIFS in input. --done Done with frame changes. Image options: Also --no-OPTION and --same-OPTION. -B, --background COL Make COL the background color. --crop X,Y+WxH, --crop X,Y-X2,Y2 Crop the image. --crop-transparency Crop transparent borders off the image. --flip-horizontal, --flip-vertical Flip the image. -i, --interlace Turn on interlacing. -S, --logical-screen WxH Set logical screen to WxH. -p, --position X,Y Set frame position to (X,Y). --rotate-90, --rotate-180, --rotate-270, --no-rotate Rotate the image. -t, --transparent COL Make COL transparent. Extension options: --app-extension N D Add an app extension named N with data D. -c, --comment TEXT Add a comment before the next frame. --extension N D Add an extension number N with data D. -n, --name TEXT Set next frame\u0026#39;s name. --no-comments, --no-names, --no-extensions Remove comments (names, extensions) from input. Animation options: Also --no-OPTION and --same-OPTION. -d, --delay TIME Set frame delay to TIME (in 1/100sec). -D, --disposal METHOD Set frame disposal to METHOD. -l, --loopcount[=N] Set loop extension to N (default forever). -O, --optimize[=LEVEL] Optimize output GIFs. -U, --unoptimize Unoptimize input GIFs. Whole-GIF options: Also --no-OPTION. --careful Write larger GIFs that avoid bugs in other programs. --change-color COL1 COL2 Change COL1 to COL2 throughout. -k, --colors N Reduce the number of colors to N. --color-method METHOD Set method for choosing reduced colors. -f, --dither Dither image after changing colormap. --gamma G Set gamma for color reduction [2.2]. --resize WxH Resize the output GIF to WxH. --resize-width W Resize to width W and proportional height. --resize-height H Resize to height H and proportional width. --resize-fit WxH Resize if necessary to fit within WxH. --scale XFACTOR[xYFACTOR] Scale the output GIF by XFACTORxYFACTOR. --resize-method METHOD Set resizing method. --resize-colors N Resize can add new colors up to N. --transform-colormap CMD Transform each output colormap by shell CMD. --use-colormap CMAP Set output GIF\u0026#39;s colormap to CMAP, which can be \u0026#39;web\u0026#39;, \u0026#39;gray\u0026#39;, \u0026#39;bw\u0026#39;, or a GIF file. 总结 使用MAC录制GIF图片，只需要Recordit就可以 使用gifsicle处理图片 将图片转为GIF 处理GIF的机制，循环次数、设置大小、透明度等 ","permalink":"https://shiyuanjie.cn/posts/UITest/Mac%E5%88%B6%E4%BD%9CGIF%E5%8F%8A%E8%AE%BE%E7%BD%AEGIF%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE/","summary":"\u003cblockquote\u003e\n\u003cp\u003e需求：在Mac电脑中录制操作，并生成GIF文件。GIF文件需要循环播放。\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"工具选择\"\u003e工具选择\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://recordit.co/\"\u003eRecordit\u003c/a\u003e，7.2M大小，Free\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.lcdf.org/gifsicle/\"\u003egifsicle\u003c/a\u003e，\u003ccode\u003e加工\u003c/code\u003eGIF图片工具\u003c/li\u003e\n\u003c/ul\u003e","title":"MAC制作GIF及设置GIF循环播放"},{"content":"Espresso Espresso是什么 由Google提供的开源native测试框架。支持所有版本的Android API.\n如何测试 通过使用Rule来获取Activity 针对Activity中的元素进行操作，进而达到测试的目的 测试运行的基础组件 onView: 查找元素 .perform: 执行一个操作 .check: 验证结果 1 2 3 onView(withId(R.id.my_view)) // withId(R.id.my_view) is a ViewMatcher .perform(click()) // click() is a ViewAction .check(matches(isDisplayed())); // matches(isDisplayed()) is a ViewAssertion 准备工作 SDK Tool: 安装Android Support Repository 实现Espresso代码 源APP程序: 使用Android Studio的模板创建的一个LoginActivityAPP\n配制Gradle build\nandroidTestCompile(\u0026#39;com.android.support.test.espresso:espresso-core:2.2.2\u0026#39;, { exclude group: \u0026#39;com.android.support\u0026#39;, module: \u0026#39;support-annotations\u0026#39; }) 编写测试代码\n配制Rule @Rule public ActivityTestRule\u0026lt;LoginActivity\u0026gt; mActivityRule = new ActivityTestRule\u0026lt;\u0026gt;( LoginActivity.class); 编写测试 输入邮箱、密码 点击登录 @Test public void testAttemptLogin() { // Type text and then press the button. onView(withId(demo.test.espressodemo.R.id.email)) .perform(typeText(STRING_TO_BE_TYPED_EMAIL), closeSoftKeyboard()); onView(withId(demo.test.espressodemo.R.id.email)) .check(matches(withText(STRING_TO_BE_TYPED_EMAIL))); onView(withId(demo.test.espressodemo.R.id.password)) .perform(typeText(STRING_TO_BE_TYPED_EMAIL_PASSWORD), closeSoftKeyboard()); onView(withId(demo.test.espressodemo.R.id.password)) .check(matches(withText(STRING_TO_BE_TYPED_EMAIL_PASSWORD))); onView(withId(demo.test.espressodemo.R.id.email_sign_in_button)) .perform(click()); } 设备设置: 关闭动画及缩放, 在开发者选项-绘画中，关闭下面的内容\n窗口动画缩放 过滤动画缩放 动画程序时长缩放 执行测试\n启动模拟器，如果模拟器环境有问题，参考Android模拟器环境搭建 执行测试 在Android Studio中查看测试结果\n2:10:32 PM Executing tasks: [:app:assembleDebug, :app:assembleDebugAndroidTest] 2:10:42 PM Gradle build finished in 8s 988ms 2:10:49 PM Tests Passed: 1 passed 至此，使用Espresso进行简单的测试已经完成\n总结 使用Espresso进行测试的步骤\n找到对应的Activity 获取对应的元素 针对元素进行操作 验证结果 完整代码: https://github.com/aimer1124/EspressoDemo\n参考 Android user interface testing with Espresso - Tutorial Testing UI for a Single App Android模拟器环境搭建 ","permalink":"https://shiyuanjie.cn/posts/UITest/Espresso%E5%85%A5%E9%97%A8/","summary":"\u003ch2 id=\"espresso\"\u003eEspresso\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEspresso是什么\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e由Google提供的开源native测试框架。支持所有版本的Android API.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cul\u003e\n\u003cli\u003e如何测试\n\u003cul\u003e\n\u003cli\u003e通过使用\u003ccode\u003eRule\u003c/code\u003e来获取\u003ccode\u003eActivity\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e针对\u003ccode\u003eActivity\u003c/code\u003e中的元素进行操作，进而达到测试的目的\n\u003cpicture\u003e\u003csource srcset=\"/posts/UITest/Espresso%E5%85%A5%E9%97%A8/Espresso%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86_hu_ad9e260d3948ea62.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"Espresso工作原理\" loading=\"lazy\" src=\"/posts/UITest/Espresso%E5%85%A5%E9%97%A8/Espresso%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86.png\"\u003e\u003c/picture\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"Espresso入门"},{"content":"目的 Mac电脑上面搭建Android模拟器 将APP运行在模拟器中 自己最近刚把电脑重新安装，顺便梳理下整修安装过程。为后面研究Espresso做准备\n安装Android Studio MAC电脑进行Android开发的IDE。\n下载最新的Android Studio, Android-Studio-2.2.2.0 安装完成即可 安装Genymotion Android模拟器，运行速度较快，个人Free。支持40多种安卓设备及所有的安卓版本。\n安装Virtual Box，下载页\n下载Genymotion\n注册个人账号，登录 下载Genymotion, 下载页 安装完成即可 下载模拟器\n进入本机安装的Genymotion 登录个人账号，选择一个模拟器下载:Google Nexus 9 - 6.0.0 一个模拟器大概200M左右，等待下载完成即可 点击Devices列表中的Google Nexus 9 - 6.0.0，点击Start，会启动Adnroid模拟器 集成 安装Android Studio的Genymotion插件 command+, \u0026ndash;\u0026gt; plugins \u0026ndash;\u0026gt; Browse Repositories 搜索Genymotion 进行安装，结束后重启AndroidStudio 关联Genymotion到AndroidStudio 点击ToolBar的最后一个Genymotion Device Manager 在弹出框中，添加Genymotion程序 关联成功后，再次打开Genymotion Device Manager，会显示之前添加的Google Nexus 9 - 6.0.0 点击Start，可直接启动Genymotion的模拟器 至此，我们已经完成通过AndroidStudio来启动Android模拟器。下面再看下如何启动将自己的APP在模拟器中运行\n运行自己的APP在Genymotion中 创建一个新的APP项目 使用Login Activity模板创建一个APP项目 名称为MyApplication 在模拟器中运行 点击Run时，会弹出选择运行的环境。如果列表为空，请查看是否模拟器未启动成功 选择Google Nexus 9 - 6.0.0 \u0026ndash;\u0026gt; OK，在模拟器中运行MyApplication程序 总结 通过AndroidStudio来跑模拟器，本质上是在执行Genymotion AndroidStudio自身也有模拟器，在ToolBar \u0026ndash;\u0026gt; AVD Manager中可添加，但可选范围过小 有了不同类型的模拟器后，便可针对不同的机型进行兼容性测试 ","permalink":"https://shiyuanjie.cn/posts/Android/Android%E6%A8%A1%E6%8B%9F%E5%99%A8%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/","summary":"\u003ch2 id=\"目的\"\u003e目的\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eMac电脑上面搭建Android模拟器\u003c/li\u003e\n\u003cli\u003e将APP运行在模拟器中\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e自己最近刚把电脑重新安装，顺便梳理下整修安装过程。为后面研究\u003ca href=\"https://developer.android.com/training/testing/ui-testing/espresso-testing.html\"\u003eEspresso\u003c/a\u003e做准备\u003c/p\u003e\u003c/blockquote\u003e","title":"Android模拟器环境搭建"},{"content":"阅读时间：201605 这本书早就看完了，一直没有勇气把这本书的笔记整理下，最近终于有点时间，就尝试梳理了下。后面有机会还会再次阅读。\n读后感 看到书名，大家应该就明白书的内容是什么。虽然一直看书，但还是没有掌握书中内容的吸取方式，从这本书中学到了一点方法，并进行整理。书中引导方法不限于读一本书，在后面给出读者尝试去进行主题阅读的方法，感觉很有收获。\n从小到大，读书也有20多年了，但一直没有对读书的层次进行过划分，作者给出了详细的层次划线：基础阅读/检视阅读/分析阅读/主题阅读。\n基础阅读，就是小学前几年的读书方式。 检视阅读，通常大家说的浏览或者粗读 分析阅读，读懂书中的内容，还要提出自己的观点 主题阅读，最高的层次，从主题的内容去找书读 检视阅读，一定要给下面的四个问题找到答案\n整本书在讲什么 作者细说了什么，怎么说的 这本书讲的有道理么 这本书跟自己有什么关系 分析阅读，三个阶段\n第一阶段：如何用一句/几句话，总结整本书的内容 第二阶段：找出书上究竟在说什么 第三阶段：像沟通知识一样，评论一本书的规则 主题阅读\n准备阶段：观察研究范围 阅读准备阶段收集的所有书集 梳理内容 Mind-如何阅读一本书 书 Amazon-如何阅读一本书 ","permalink":"https://shiyuanjie.cn/posts/Book/%E5%A6%82%E4%BD%95%E9%98%85%E8%AF%BB%E4%B8%80%E6%9C%AC%E4%B9%A6/","summary":"\u003ch4 id=\"阅读时间201605\"\u003e阅读时间：\u003ccode\u003e201605\u003c/code\u003e\u003c/h4\u003e\n\u003cblockquote\u003e\n\u003cp\u003e这本书早就看完了，一直没有勇气把这本书的笔记整理下，最近终于有点时间，就尝试梳理了下。后面有机会还会\u003ccode\u003e再次\u003c/code\u003e阅读。\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"读后感\"\u003e读后感\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e看到书名，大家应该就明白书的内容是什么。虽然一直看书，但还是没有掌握书中内容的吸取方式，从这本书中学到了一点方法，并进行整理。书中引导方法不限于读一本书，在后面给出读者尝试去进行\u003ccode\u003e主题\u003c/code\u003e阅读的方法，感觉很有收获。\u003c/p\u003e\u003c/blockquote\u003e","title":"如何阅读一本书"},{"content":"JMeter是什么 http://jmeter.apache.org/，性能测试工具。\n基于Java的开源性能测试工具 支持测试的协议 Web - HTTP, HTTPS SOAP / REST FTP Database LDAP Message-oriented middleware (MOM) Mail Native commands or shell scripts TCP 支持多线程并发 完善的GUI界面，用于快速设计测试计划和调试测试脚本 完整测试结果，便于结果分析 JMeter不会执行HTML中的JavaScript脚本 BeanShell是什么 http://beanshell.org/\n基于Java的免费解释器 松散类型的脚本语言 动态执行的Java代码 只有150K大小的JAR包 BeanShell既然可以编写Java代码，那么我们就可以在使用JMeter测试的过程中，使用Java语法功能，且支持关键字高亮，进行业务逻辑的处理，进而达到场景功能的设计。\nBeanShell与JMeter的化学反应 JMeter提供5种方式使用BeanShell BeanShell Sampler 直接使用BeanShell来编写样例。 BeanShell PreProcessor 在样例触发前，使用BeanShell进行加工处理。 BeanShell PostProcessor 在样例触发后，使用BeanShell进行加工处理。 BeanShell Assertion 使用BeanShell进行断言处理。 BeanShell Listener 使用BeanShell做监听器。 JMeter提供的BeanShell功能，遍布整个测试的各个阶段。只要你需要的时候，它都可以直接拿来用。\n变量处理 JMeter中已有变量名name，值为testBeanShell 配制BeanShell的Parameters，传入参数test。并编写变量内容输出代码，log不是Java内置的对象，但是JMeter的内置对象。 log.info(\u0026#34;Test is \u0026#34; + vars.get(\u0026#34;test\u0026#34;)); 执行测试，便可查看出变量内容的输出 通过上面的BeanShell脚本，我们可以发现BeanShell可以直接获取JMeter的变量内容。下面我们针对变量内容进行加工，看下如何实现\n将test变量的值获取后，再随机在原变量值后追加随机数，并再次赋值给test变量 log.info(\u0026#34;Init test: \u0026#34; + vars.get(\u0026#34;test\u0026#34;)); Random ran = new Random(); int x = ran.nextInt(6); vars.put(\u0026#34;test\u0026#34;,vars.get(\u0026#34;test\u0026#34;)+x); log.info(\u0026#34;Random test: \u0026#34; + vars.get(\u0026#34;test\u0026#34;)); 执行测试，查看结果 使用自定义的JAR包 Java源文件 appendString类中有方法append: 将参数的内容追加-Append后，返回追加后的字符串\n1 2 3 4 5 6 package com.test; public class appendString { public String append(String sourceString){ return sourceString + \u0026#34;-Append\u0026#34;; } } 生成Jar包\n利用其它工具将此源文件打包成Jar文件\nJMeter中引用Jar包功能\n将Jar包复制至JMeter下方lib/ext下\n重新打开JMeter，进入BeanShell中，添加调试代码：输出加工后的内容\nimport com.test.appendString; log.info(new appendString().append(\u0026#34;111\u0026#34;)); 查看JMeter的日志输出：加工后的字符为111-Append 通过上面的方法，我们可以看出，通过JMeter与BeanShell的结合，可以将外部的代码与JMeter结合，也可直接使用BeanShell来操作JMeter内部的数据处理。 下面我们再看下BeanShell提供了哪些内置的操作对象\nBeanShell的内置对象 对象名 存在元素 功能 log BeanShell Sampler BeanShell PreProcessor BeanShell PostProcessor BeanShell Assertion BeanShell Listener 日志信息输出 Label BeanShell Sampler 样例 FileName BeanShell Sampler 文件名 Parameters BeanShell Sampler 参数 bsh.args BeanShell Sampler BeanShell脚本 SampleResult BeanShell Sampler BeanShell Assertion BeanShell Listener 样例结果 ResponseCode BeanShell Sampler BeanShell Assertion 返回的状态码 ResponseMessage BeanShell Sampler BeanShell Assertion 返回信息 IsSucess BeanShell Sampler 是否成功 ctx BeanShell Sampler BeanShell PreProcessor BeanShell PostProcessor BeanShell Assertion BeanShell Listener JMeter的上下文 vars BeanShell Sampler,BeanShell PreProcessor BeanShell PostProcessor BeanShell Assertion BeanShell Listener 变量操作 props BeanShell Sampler BeanShell PreProcessor BeanShell PostProcessor BeanShell Assertion BeanShell Listener JMeter属性 prev BeanShell PreProcessor BeanShell PostProcessor BeanShell Listener 样例的前置结果读取 sampler BeanShell PreProcessor BeanShell PostProcessor 当前样例 Response BeanShell Assertion 返回的对象，读-写 Failure BeanShell Assertion 是否失败 FailureMessage BeanShell Assertion 失败信息 ResponseData BeanShell Assertion 返回数据体，字节形式 ResponseHeader BeanShell Assertion 返回信息头 RequestHeader BeanShell Assertion 请求信息头 SampleLabel BeanShell Assertion 样例名称 SampleData BeanShell Assertion 发送至服务器的数据 SampleEvent BeanShell Listener 读取当前样例的事件 有了上面的操作对象，可以在测试过程中，对测试的内容，进行更加详细的加工。 完善的对象使用方法，可查阅JMeter官方API文档\n后期应用扩展 将请求的数据进行个性化加工 将获取的数据进行扩展保存 完善业务场景 参考 http://jmeter.apache.org/ https://jmeter.apache.org/api/ http://beanshell.org/ ","permalink":"https://shiyuanjie.cn/posts/JMeter/JMeter%E4%B8%8EBeanshell%E7%9A%84%E5%8C%96%E5%AD%A6%E5%8F%8D%E5%BA%94/","summary":"\u003ch2 id=\"jmeter是什么\"\u003eJMeter是什么\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"http://jmeter.apache.org/\"\u003ehttp://jmeter.apache.org/\u003c/a\u003e，性能测试工具。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e基于\u003ccode\u003eJava\u003c/code\u003e的\u003ccode\u003e开源\u003c/code\u003e性能测试工具\u003c/li\u003e\n\u003cli\u003e支持测试的协议\n\u003cul\u003e\n\u003cli\u003eWeb - HTTP, HTTPS\u003c/li\u003e\n\u003cli\u003eSOAP / REST\u003c/li\u003e\n\u003cli\u003eFTP\u003c/li\u003e\n\u003cli\u003eDatabase\u003c/li\u003e\n\u003cli\u003eLDAP\u003c/li\u003e\n\u003cli\u003eMessage-oriented middleware (MOM)\u003c/li\u003e\n\u003cli\u003eMail\u003c/li\u003e\n\u003cli\u003eNative commands or shell scripts\u003c/li\u003e\n\u003cli\u003eTCP\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e支持多线程并发\u003c/li\u003e\n\u003cli\u003e完善的GUI界面，用于快速设计测试计划和调试测试脚本\u003c/li\u003e\n\u003cli\u003e完整测试结果，便于结果分析\u003c/li\u003e\n\u003cli\u003eJMeter不会执行HTML中的JavaScript脚本\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"beanshell是什么\"\u003eBeanShell是什么\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"http://beanshell.org/\"\u003ehttp://beanshell.org/\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e基于\u003ccode\u003eJava\u003c/code\u003e的免费解释器\u003c/li\u003e\n\u003cli\u003e松散类型的脚本语言\u003c/li\u003e\n\u003cli\u003e动态执行的Java代码\u003c/li\u003e\n\u003cli\u003e只有150K大小的JAR包\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBeanShell既然可以编写Java代码，那么我们就可以在使用JMeter测试的过程中，使用Java语法功能，且支持关键字\u003ccode\u003e高亮\u003c/code\u003e，进行业务逻辑的处理，进而达到\u003ccode\u003e场景\u003c/code\u003e功能的设计。\u003c/p\u003e\u003c/blockquote\u003e","title":"JMeter与BeanShell的化学反应"},{"content":"阅读时间：20160930-20161031 读后感 国内仅有的几本Node书，内容还算不错。但由于Node.js的版本更新太快，有些模块会有点陈旧，但思路不陈旧。\n玩Node.js也快有1年了，第一次完整的读一本书，整体内容还不错，阅读起来挺快的。\n书中的有些概念作者讲的也比较清晰，让自己也有一定的收获。\nNode.js开发指南.xmind\n书 amazon\n豆瓣\n","permalink":"https://shiyuanjie.cn/posts/Book/Node.js%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/","summary":"\u003ch4 id=\"阅读时间20160930-20161031\"\u003e阅读时间：\u003ccode\u003e20160930-20161031\u003c/code\u003e\u003c/h4\u003e\n\u003ch2 id=\"读后感\"\u003e读后感\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e国内仅有的几本Node书，内容还算不错。但由于Node.js的版本更新太快，有些模块会有点陈旧，但思路不陈旧。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e玩Node.js也快有1年了，第一次完整的读一本书，整体内容还不错，阅读起来挺快的。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e书中的有些概念作者讲的也比较清晰，让自己也有一定的收获。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"Node.js开发指南"},{"content":"跑步数据 从刚开始跑步到现在，已经用过三款跑步APP了，小米运动 咕咚 Keep。现在用的是Keep，已有大半年。\n从2015-02-23的3.7公里/配速7'43\u0026quot;至今，总计跑步里程507.96，现在的个人配速基本在6'分钟左右。\n软件 累积里程 Keep 146.88 小米运行 182.2 咕咚 178.88 个人收获 资料 天生就会跑步/无基础健身/枯燥乏味的心理心 记录片： 行者 装备 三双跑步鞋，都是入门级的，最贵的一双 跑步短袖2条 收缩裤2条 短裤1条 累积投入应该有800左右 个人身体 今年10.1全家人感冒了，自己吃了3天药，就停了，慢慢也好了。近2年唯一一次吃药 整体个人的气色比之前好多了，人也感觉有精神了许多。 坚持 开始跑步之后，感觉自己也变得有了一些坚持，也让自己学会了坚持。 中间也有中断过，但还好自己又调整过来了。 遗憾 跑了2年了，一直都是一个人在跑步，没有参考过任何的比赛。希望后面有机会参加下马拉松之类的，对自己的跑步也进行一次考验 后面想做的事情 继续坚持跑步 有机会一定要去参加下比赛 ","permalink":"https://shiyuanjie.cn/posts/Run/%E8%B7%91%E6%AD%A5500%E5%85%AC%E9%87%8C%E7%9A%84%E5%B0%8F%E6%80%BB%E7%BB%93/","summary":"\u003ch2 id=\"跑步数据\"\u003e跑步数据\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e从刚开始跑步到现在，已经用过三款跑步APP了，\u003ccode\u003e小米运动\u003c/code\u003e \u003ccode\u003e咕咚\u003c/code\u003e \u003ccode\u003eKeep\u003c/code\u003e。现在用的是\u003ccode\u003eKeep\u003c/code\u003e，已有\u003ccode\u003e大半年\u003c/code\u003e。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e从2015-02-23的\u003ccode\u003e3.7公里/配速7'43\u0026quot;\u003c/code\u003e至今，总计跑步里程\u003ccode\u003e507.96\u003c/code\u003e，现在的个人\u003ccode\u003e配速\u003c/code\u003e基本在\u003ccode\u003e6'\u003c/code\u003e分钟左右。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"跑步500公里的小总结"},{"content":"阅读时间：20160929 读后感 这是一本很值得阅读的书，书中用大量的实验结果和原理性的内容分析了自控力。让读者会明白，平时自己究竟是哪部分做的不够好/哪里出了问题。阅读本书，不要着急，慢慢品味和实践。\n个人收获: 读这本书后，坚持每天早上6点起床，已坚持1个多月。\n明确自控力之前，先明确自己的目标究竟是什么。套用公式我想做__,我想要__,我不要__.\n锻炼自己的我想要\n想象下挑战成功会有什么收获，个人能获得什么 挑战成功，别人会有什么收获，能得到什么 想象下挑战成功的样子 增强自控力肌肉\n增强我不要力量\n不随便发誓 坐下的时候，不要有小动作 尝试用平时不常用的手，去做一些日常活动。 增强我想要力量\n每天做一些现在不常做的事情，用来养成习惯 家里找一些不常用的东西扔掉 增强我不要力量\n记录一天平时不关心的事情，可以是看电视/上网/吃饭 道德许可\n我们往往会先做一件好事，然后会“允许”自己做一些自控力挑战“外”的事情。而自己又感觉良好。\n- 不要从`圣人`变成`罪人` - 不要错误的把`支持`目标实现行为，误认为是`目标本身` - 不要说你做了一件与目标一致的事情，你就不会再范`类似`错误 - 当你发现用`曾经`的善行给现在的`放纵`作理由时，`停`下来想一下，你之前为什么会那样做 不要向明天赊账\n当你要做挑战时，是否会在脑海中闪过明天再做吧 是否曾经告诉过自己，明天会做的更好？ 美德暗示\n当我们想做放纵时，会给自己找一个美德来暗示 还会为自己要做的放纵来辩护 失败的时候，记得原谅自己\n如果想到挫折时，描述下自己的感受。想下当时失败时候的感受 每个人都是凡人，想象下你的偶像是否也会有同样的情况 想象下如果是你的好朋友碰到这种事情，你会怎么跟他沟通 遇见未来的自己\n创想一个未来的记忆 给未来的自己写一条信息或邮件 想象一下未来的自己是什么样子 增强免疫系统\n在每天开始的时候，花几分钟想象下自己的目标 想象你会怎么受到诱惑 想象你要改变自己的目标 讽刺性反弹\n当人们试图去摆脱某个想法时，它却总会嗖的一下就回来 不要客意去不想某个事情，其实想想也没有什么的 忠于自己的感受，但别相信所有\n遇到烦恼时，不防转移到自己的呼吸时，感受下自己的呼吸 直面自己的欲望，但不要去做 尝试把我不要___，变成我想要____ 小方法 冥想 每天坚持5分钟即可，冥想的好处: 提醒自控力，提升注意力，管理压力，克制冲动，认识自己的能力\n找个安静的地方，静静的坐下。什么也不要做\n只注意自己的呼吸\n感受呼吸。如果有走神，想下自己为什么会走神\n放松\n压力过大的话，会让人只看到短期的目标和结果，无法看到长远的目标。因此，一定要学会放松自己。\n找个地方躺下来，当然最好是在床上\n找个枕头垫在膝盖下面\n闭目，感受呼吸。持续5-10分钟\n10分钟法则\n当我们想拒绝诱惑时，可以尝试下10分钟法则\n当你想拒绝诱惑时，尝试等10分钟再做 书 Amazon-自控力(斯坦福大学很受欢迎的心理学课程)\n","permalink":"https://shiyuanjie.cn/posts/Book/%E8%87%AA%E6%8E%A7%E5%8A%9B/","summary":"\u003ch4 id=\"阅读时间20160929\"\u003e阅读时间：\u003ccode\u003e20160929\u003c/code\u003e\u003c/h4\u003e\n\u003ch2 id=\"读后感\"\u003e读后感\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e这是一本很值得阅读的书，书中用\u003ccode\u003e大量\u003c/code\u003e的\u003ccode\u003e实验结果\u003c/code\u003e和\u003ccode\u003e原理性\u003c/code\u003e的内容分析了\u003ccode\u003e自控力\u003c/code\u003e。让读者会明白，平时自己究竟是哪部分做的不够好/哪里出了问题。阅读本书，不要着急，慢慢品味和实践。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e个人收获: 读这本书后，坚持每天早上\u003ccode\u003e6\u003c/code\u003e点起床，已坚持\u003ccode\u003e1\u003c/code\u003e个多月。\u003c/p\u003e","title":"自控力"},{"content":"自己之前也没有任何写书的经验，这次写这本书，也是经一位朋友的建议，把自己了解的关于JMeter内容梳理下来，整本书仅79页。\n书中的内容是性能测试工具JMeter的入门级使用。在准备写的时候，在心里做了简单的规划，如下:\n写作工具 Gitbook平台发布，选择Gitbook的原因: 完美支持Markdown文件格式 可本地直接预览，也可直接网上预览 可完整导出PDF MOBI EPUB文件格式 所有源文件使用Git仓库管理 Atom工具编写源文件，安装Markdown插件，可实时预览效果 目标 写什么 让读者了解到如何使用JMeter工具进行性能测试，那么内容就会围绕JMeter工具的介绍/使用/实际场景进行展开。\n目标群体 初始的定位是小白或初级性能测试 人员。\n有了写什么和目标群体之后，就有工具和对象了，接下来就要准备搭建框架内容。\n内容 大纲 大纲一定要简书，只要大章节就好。简单把每个章节的名称定下来就足够，但一定要有循序渐进。\n- [简介](README.md) - [认识JMeter](chapter1/README.md) - [提高JMeter](chapter2/README.md) ... - [结束语](end/README.md) 目录 有了大纲的基础之后，就可以丰富目录了，把章节的内容进行拆分。\n目录简要说明 目录已有完善了，但最好还是给每个目录有一个简要的说明，明确每个目录里的内容涉及哪些且不会有重复的知识点。\n完成框架搭建之后，整个书的结构已经完全出来了，接下就落地实际的内容。\n落地 此处的工作量最大，需要对整个书的内容进行完善的丰富，当然有可能会对之前的目录进行调整。\n丰富目录 目录内容的丰富，将目录中的内容进行落地，落地过程中，最好配合必要的UI展示，让读者可以更加清晰的知道是在讲什么\n过程中需要进行有大量的资料的查阅/合并/剃除，最终完成一篇目录的内容。列下经常用的网站\nJMeter: JMeter官网，里面的内容已经基本足够。\nGoogle: 不用多说，大家基本都懂\nStack Overflow: 开发/运维同学的天堂，大部分问题都能在这里找到答案\nBlazeMeter: 专注性能测试的一个平台，里面分享了大量详细的测试文章。\nJMeter Plugins: JMeter的插件提供平台\nsoftware-testing-tutorials-automation: 一位老外的个人博客，有些文章也挺不错\nJMeter API: JMeter提供的官方API文档，如果需要写代码这部分一定要看\n调整结构 编写过程中难勉需要把目录名称或目录内容进行调整，这是很正常的，不要担心\n编写过程中，会出现知识点过少或与其它内容有重复的部分，需要删除不必要的目录或章节\n回顾 写作完每一个目录内容后，最好及时回顾下，确保没有错误字！！！ 落地是一个重复迭代的过程，每次丰富目录都是一次挑战，不要担心修改之前的内容。我们要拥抱变化\n写在最后 这本书是从2016-08-22开始，到2016-09-18完成了第一个版本。有效时间21天(周未和晚上的时间都用来陪儿子和家人)，主要用于写用的时间在上班前/午饭间/下班后。\n第一本书，可能还不能算有效的书吧。虽然过程有点艰辛，而且内容肯定还不完善，心里还是有点小成就感。\n内容还需要再进行多次Review，待结束后分享链接地址。\n个人的收获\n对JMeter的认识更加系统化\n让自己对写作有了一个新的认识，任何知识体系都不是那么容易，要花足够的时间去吸收\n不要对没有做过的事情有所担心，做就对了\n","permalink":"https://shiyuanjie.cn/posts/Upgrade/%E5%88%A9%E7%94%A821%E5%A4%A9%E7%9A%84%E5%AE%8C%E6%88%90%E4%B8%80%E6%9C%ACMini%E4%B9%A6/","summary":"\u003cp\u003e自己之前也没有任何写\u003ccode\u003e书\u003c/code\u003e的经验，这次写这本书，也是经一位朋友的建议，把自己了解的关于\u003ca href=\"http://jmeter.apache.org/\"\u003eJMeter\u003c/a\u003e内容\u003ccode\u003e梳理\u003c/code\u003e下来，整本书仅\u003ccode\u003e79\u003c/code\u003e页。\u003c/p\u003e\n\u003cp\u003e书中的内容是\u003ccode\u003e性能测试工具\u003c/code\u003e\u003ca href=\"http://jmeter.apache.org/\"\u003eJMeter\u003c/a\u003e的\u003cstrong\u003e入门级\u003c/strong\u003e使用。在准备写的时候，在心里做了简单的规划，如下:\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/Upgrade/%E5%88%A9%E7%94%A821%E5%A4%A9%E7%9A%84%E5%AE%8C%E6%88%90%E4%B8%80%E6%9C%ACMini%E4%B9%A6/Mind_hu_75d36723ce93abfd.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"整体结构\" loading=\"lazy\" src=\"/posts/Upgrade/%E5%88%A9%E7%94%A821%E5%A4%A9%E7%9A%84%E5%AE%8C%E6%88%90%E4%B8%80%E6%9C%ACMini%E4%B9%A6/Mind.png\"\u003e\u003c/picture\u003e\u003c/p\u003e","title":"利用21天的完成一本Mini书"},{"content":"Dashboard Report JMeter3.0版本发布后，开始支持动态报表报告。让测试人员编写性能测试报告更加容易。\n支持在测试结束后，生成测试报告\n导入之前测试结果，生成测试报告\n下面就看下如何使用这个新特性，生成测试报告\n测试结束后，生成本次测试的报告 执行测试文件\n生成测试结果文件\n生成最终的测试报告\njmeter -n -t test.jmx -l result.jtl -e -o /tmp/ResultReport 参数说明:\n-n: 非GUI模式执行JMeter\n-t: 执行测试文件所在的位置\n-l: 指定生成测试结果的保存文件，jtl文件格式\n-e: 测试结束后，生成测试报告\n-o: 指定测试报告的存放位置\n-l -o指定的文件及文件夹，必须不存在，否则执行会失败\n使用之前的测试结果，生成测试报告 将已存在的测试结果文件，生成测试报告\njmeter -g result.jtl -o /tmp/ResultReport 参数说明:\n-g: 指定已存在的测试结果文件 两种方式，其实最终都依赖生成的测试报告。双击报告文件夹中的index.html即可查看报告。\n报告详解 Dashboard Test and Report informations 测试和报告信息: 测试结果保存文件/测试开始时间/测试结束时间/展示过滤器。\nAPDEX(Application Performance Index) 应用程序性能满意度的标准，范围在0-1之间，1表示达到所有用户均满意。是由APDEX公司推出的。计算公式:\nRequests Summary 请求的通过率(OK)与失败率(KO)，百分比显示。\nStatistics 数据分析，基本将Summary Report和Aggrerate Report的结果合并。\nErrors 错误情况，依据不同的错误类型，将所有错误结果展示。\nCharts 用图表的形式展示测试数据，让测试报告更加直观。特点:\n将测试过程中经常使用的数据，用图表的形式展示，让测试结果更加直观\n每个图表数据，有两种展示形式。\n支持请求样例过滤显示\n支持导出PNG图片格式\nOver Time Response Times Over Time: 响应时间\nBytes Throughput Over Time: 字节接收/发送的数量\nLatencies Over Time:延迟时间\nThroughput Hits Per Second: 每秒点击率\nCodes Per Second: 每秒状态码数量\nTransactions Per Second: 每秒事务量\nResponse Time Vs Request: 响应时间点请求的成功/失败数\nLatency Vs Request: 延迟时间点请求的成功/失败数\nResponse Times Response Time Percentiles: 响应时间百分比\nActive Threads Over Time: 激活线程数\nTime Vs Threads: 测试过程中的线程数时续图\nResponse Time Distribution: 响应时间分布\n了解到每个报表的功能，就可以将需要的报表添加到测试报告中。\n问题 报表中，中文命名的Label会显示乱码 总结 JMeter3.0中提供了丰富的报表展示，很便于编写性能测试报告中的数据展示\n在生成测试报表时，JMeter还提供了丰富的参数配制，配制文件在/bin/reportgenerator.properties中。具体配制方法可参考: http://jmeter.apache.org/usermanual/generating-dashboard.html\nJMeter3.0中提供的报表功能，在Plugin-Manager中的3 Basic Graphs和5 Additional Graphs有部分功能是有重复的。\n参考 Wikipedia-Apdex\nJMeter-Generating Dashboard\n本文首发于: 简书-JMeter-自动生成测试报告\n","permalink":"https://shiyuanjie.cn/posts/JMeter/JMeter-%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90%E6%B5%8B%E8%AF%95Report/","summary":"\u003ch1 id=\"dashboard-report\"\u003eDashboard Report\u003c/h1\u003e\n\u003cp\u003e\u003ca href=\"http://jmeter.apache.org/changes.html\"\u003eJMeter3.0\u003c/a\u003e版本发布后，开始支持\u003ccode\u003e动态\u003c/code\u003e报表报告。让测试人员编写\u003ccode\u003e性能测试报告\u003c/code\u003e更加容易。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e支持在\u003ccode\u003e测试结束\u003c/code\u003e后，生成测试报告\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e导入\u003c/code\u003e之前测试结果，生成测试报告\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e下面就看下如何使用这个\u003ccode\u003e新特性\u003c/code\u003e，生成测试报告\u003c/p\u003e","title":"JMeter-自动生成测试Report"},{"content":"书 在线版本: Node入门，可在线阅读全文 读后感 Node.js的入门，没有讲任何的框架。但从最基础的知识点把Node如何使用讲的比较清晰\n书中的例子做完后(只有42页)，可以实现一个文件上传的完整功能，不需要其它复杂的框架\n代码分析 功能说明 选择文件，并上传至/tmp/test.png 回显上传的文件至页面中 . ├── index.js #入口文件 ├── requestHandlers.js #请求处理 ├── router.js #路由跳转 └── server.js #服务控制 index.js var server = require(\u0026#39;./server\u0026#39;); var router = require(\u0026#39;./router\u0026#39;); var requestHandlers = require(\u0026#39;./requestHandlers\u0026#39;); var handle = {}; handle[\u0026#34;/\u0026#34;] = requestHandlers.start; handle[\u0026#34;/start\u0026#34;] = requestHandlers.start; handle[\u0026#34;/upload\u0026#34;] = requestHandlers.upload; handle[\u0026#34;/show\u0026#34;] = requestHandlers.show; server.start(router.route,handle); requestHandlers.js var querystring = require(\u0026#34;querystring\u0026#34;), fs = require(\u0026#34;fs\u0026#34;), formidable = require(\u0026#34;formidable\u0026#34;); function start(response) { console.log(\u0026#34;Request handler \u0026#39;start\u0026#39; was called.\u0026#34;); var body = \u0026#39;\u0026lt;html\u0026gt;\u0026#39;+ \u0026#39;\u0026lt;head\u0026gt;\u0026#39;+ \u0026#39;\u0026lt;meta http-equiv=\u0026#34;Content-Type\u0026#34; content=\u0026#34;text/html; \u0026#39;+ \u0026#39;charset=UTF-8\u0026#34; /\u0026gt;\u0026#39;+ \u0026#39;\u0026lt;/head\u0026gt;\u0026#39;+ \u0026#39;\u0026lt;body\u0026gt;\u0026#39;+ \u0026#39;\u0026lt;form action=\u0026#34;/upload\u0026#34; enctype=\u0026#34;multipart/form-data\u0026#34; \u0026#39;+ \u0026#39;method=\u0026#34;post\u0026#34;\u0026gt;\u0026#39;+ \u0026#39;\u0026lt;input type=\u0026#34;file\u0026#34; name=\u0026#34;upload\u0026#34; multiple=\u0026#34;multiple\u0026#34;\u0026gt;\u0026#39;+ \u0026#39;\u0026lt;input type=\u0026#34;submit\u0026#34; value=\u0026#34;Upload file\u0026#34; /\u0026gt;\u0026#39;+ \u0026#39;\u0026lt;/form\u0026gt;\u0026#39;+ \u0026#39;\u0026lt;/body\u0026gt;\u0026#39;+ \u0026#39;\u0026lt;/html\u0026gt;\u0026#39;; response.writeHead(200, {\u0026#34;Content-Type\u0026#34;: \u0026#34;text/html\u0026#34;}); response.write(body); response.end(); } function upload(response, request) { console.log(\u0026#34;Request handler \u0026#39;upload\u0026#39; was called.\u0026#34;); var form = new formidable.IncomingForm(); console.log(\u0026#34;about to parse\u0026#34;); form.parse(request, function(error, fields, files) { console.log(\u0026#34;parsing done\u0026#34;); fs.renameSync(files.upload.path, \u0026#34;/tmp/test.png\u0026#34;); response.writeHead(200, {\u0026#34;Content-Type\u0026#34;: \u0026#34;text/html\u0026#34;}); response.write(\u0026#34;received image:\u0026lt;br/\u0026gt;\u0026#34;); response.write(\u0026#34;\u0026lt;img src=\u0026#39;/show\u0026#39; /\u0026gt;\u0026#34;); response.end(); }); } function show(response) { console.log(\u0026#34;Request handler \u0026#39;show\u0026#39; was called.\u0026#34;); fs.readFile(\u0026#34;/tmp/test.png\u0026#34;, \u0026#34;binary\u0026#34;, function(error, file) { if(error) { response.writeHead(500, {\u0026#34;Content-Type\u0026#34;: \u0026#34;text/plain\u0026#34;}); response.write(error + \u0026#34;\\n\u0026#34;); response.end(); } else { response.writeHead(200, {\u0026#34;Content-Type\u0026#34;: \u0026#34;image/png\u0026#34;}); response.write(file, \u0026#34;binary\u0026#34;); response.end(); } }); } exports.start = start; exports.upload = upload; exports.show = show; router.js function route(handle, pathname, response, request) { console.log(\u0026#39;About to route a request for \u0026#39; + pathname); if (typeof handle[pathname] === \u0026#39;function\u0026#39;) { handle[pathname](response, request); } else { console.log(\u0026#34;No request handler found for \u0026#34; + pathname); response.writeHead(404, {\u0026#34;Content-Type\u0026#34;: \u0026#34;text/html\u0026#34;}); response.write(\u0026#34;404 Not found\u0026#34;); response.end(); } } exports.route = route; server.js var http = require(\u0026#34;http\u0026#34;); var url = require(\u0026#39;url\u0026#39;); function start(route,handle) { function onRequest(request,response) { var pathname = url.parse(request.url).pathname; var postData = \u0026#34;\u0026#34;; console.log(\u0026#39;Request for \u0026#39; + pathname + \u0026#39; received.\u0026#39;); route(handle, pathname, response, request); } http.createServer(onRequest).listen(8889); console.log(\u0026#39;Server starting on 8889.\u0026#39;); } exports.start = start; ","permalink":"https://shiyuanjie.cn/posts/Book/Node%E5%85%A5%E9%97%A8/","summary":"\u003ch2 id=\"书\"\u003e书\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e在线版本: \u003ca href=\"http://www.nodebeginner.org/index-zh-cn.html\"\u003eNode入门\u003c/a\u003e，可在线\u003ccode\u003e阅读全文\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"读后感\"\u003e读后感\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNode.js的入门，没有讲任何的框架。但从最基础的知识点把Node如何使用讲的比较清晰\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e书中的例子做完后(只有\u003cstrong\u003e42\u003c/strong\u003e页)，可以实现一个\u003ccode\u003e文件上传\u003c/code\u003e的完整功能，不需要其它复杂的框架\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"Node入门"},{"content":"事实上，你的JMeter客户端机器是不能表现出完美的压力请求，来模拟足够多的用户或由于网络限制去向服务施加压力，一种解决方法是通过一个JMeter去控制多个/远程JMeter。通过运行JMeter的远程模式，你可以通过多个低配制的电脑复制测试计划用于模拟一个大数据量的压力并发在服务器上。一个JMeter客户端实例可以控制多个远程JMeter实例，并收集所有数据信息。特点如下:\n保存测试样例在本机电脑 通过一台机器来管理多台JMeter测试机 不需要复制测试计划到每一台JMeter测试机-JMeter客户端会发送至所有的服务器 提示: 相同的测试计划将会被运行在所有的服务器中。JMeter不会在服务器间分发压力，每一个均会完整执行测试计划。因此，如果你设置了1000个线程并有6个JMeter服务，你将会完成6000线程注入。\n然而，远程模式比独立运行相同数量的无UI测试使用更多的资源。如果许多服务实例被使用，JMeter客户端会超负载，直到达到网络链接的上限。通过使用剥离模式可以得到提升(见下文)，但你可以一直查看是否你的JMeter是否超负载。\n请注意，当你可以在你的应用程序服务器上执行JMeter测试时，你需要知道有一件事实将有会额外的消耗在你的应用服务器中并会影响你的测试结果。推荐的方式时，将JMeter与你的应用服务配制在同一网断。这将最小化由于网络引起影响的性能测试结果。\nStep 0: 配制节点 确保所有的节点(客户端和服务):\n运行相同的JMeter版本 在所有系统中使用相同的Java版本。使用不同的Java版本也可正常工作，但不鼓励这样做。 如果在测试过程中使用任何数据文件，注意这些将不会被通过客户端发送给服务器，因此请确保这些信息可被所有的服务所获取 。如果需要，你可以通过在每个服务中的user.properties或system.properties来定义不同的属性。当服务启启动时，这些属性将会被使用并可以应用到测试计划中来影响测试操作(如，链接不同的远程服务)。或者，在测试的数据文件中使用不同的数据(如，每个服务使用唯一的id，把这些数据分到不同的数据文件中)\nStep 1: 启动服务 使用远程模式运行JMeter，在所有的机器中启动JMeter服务组件通过运行JMETER_HOME/bin/jmeter-server (unix) 或JMETER_HOME/bin/jmeter-server.bat (windows)脚本。\n注意，在每一个节点中仅应该有一个JMeter服务，除非有不同的RMI在使用。\n自JMeter2.3.1后，JMeter应用服务自行启动RMI的服务注册;不需要再单独启RMI。为了改变上面的方式，可以定义JMeter的属性\nserver.rmi.create=false 在服务的系统中。\n通常，RMI为JMeter服务引擎使用动态端口。这样会引起防火墙问题，找到属性名server.rmi.localport来控制你的端口号。如果这个是非0，服务器将会使用它来做为本地的端口号。\nStep 2: 在客户端属性文件中添加服务端IP地址 在控制JMeter机器中修改属性文件。在JMETER_HOME/bin/jmeter.properties中，找出属性名remote_hosts，添加你运行JMeter的机器IP。多个地址通过逗号分隔。\n注意，你可以使用命令行选项-R来替代远程主机来使用。有相同的功能，像使用-r和-Jremote_hosts={serverlist}。比如:\njmeter -Rhost1,127.0.0.1,host2 如果你定义JMeter的属性server.exitaftertest=true，服务器在运行独立测试后将会退出。查看-X标记的使用(下文有说明)。\nStep 3a: 使用JMeter GUI客户端检查配制 现在你已经准备控制JMeter客户端。在Windows电脑中，开启客户端通过bin/jmeter.bat。在UNIX电脑中，使用脚本bin/jmeter。你将注意到Run菜单包括两个字菜单: Remote Start和Remote Stop(查看下图)。这些菜单包括你发送属性配制文件。使用Remote Start和Remote Stop代替正常JMeter的Start和Stop。\nStep 3b: 通过非GUI启动JMeter GUI模式应该仅用来在调试模式，作为一种更好的改变，你应该通过非GUI(命令行)模式启动远程测试。命令行如下:\njmeter -n -t script.jmx -r 或\njmeter -n -t script.jmx -R server1,server2,... 其它有用的参数:\n-Gproperty=value 在所有服务器中定义一个属性(可以出现多次)\n-X 测试结束后，退出远程模式\n第一个例子将会启动远程测试无论在JMeter属性remote_hosts是否定义;第二个例子从服务列表定义remote_hosts并在远程服务中启动测试。当所有的远程服务停止后，命令行客户端将会退出。\n手工操作 在一些场景下，JMeter服务脚本将无法工作(你所使用的操作系统平台不支持JMeter运行开发)。下面是怎样开始JMeter服务通过一种手机的方法:\nStep 1a: 启动RMI注册\n自JMeter2.3.1版本后，RMI注册通过JMeter服务启动，因此在平常场景下这部分不会生效。为了解决上面的方法，定义JMeter属性server.rmi.create=false在服务存放系统中并按下面的操作继续。\nJMeter使用Remote Method Invocation(RMI)当作远程通讯工具。因此，你需要运行JDK自带的RMI注册应用程序(被命名为，rmiregistry)，位置在bin目录中。在运行rmiregistry之前，确保下面的jar包在你的系统环境变量中:\nJMETER_HOME/lib/ext/ApacheJMeter_core.jar JMETER_HOME/lib/jorphan.jar JMETER_HOME/lib/logkit-2.0.jar rmiregistry应用程序需要读取一些JMeter类。运行rmiregistry不需要参数。默认监听的端口号是1099.\nStep 1b: 启动JMeter服务\n一旦RMI注册应用程序已经运行，启动JMeter服务。使用-s参数作为JMeter的启动参数。\n第2/3步还是保持一致。\n提示 JMeter/RMI需要从客户端至服务器的连接。将会使用你选择的端口号，默认是1099. JMeter/RMI也需要一个回传的链接，用于返回样例结果从服务器端到客户端。这个会使用一个较大数字的端口号。 通过JMeter的jmeter.properties的属性client.rmi.localport来控制端口号。如果没有防火墙和其它网络过滤在JMeter的客户端和服务器端，你需要确保他们创建的链接是可通的。如果有必要，使用监听软件查看通信被生成。\n如果你使用Suse Linux系统，这些信息将会有帮助。默认的安装将会启动防火墙。如果这样的话，远程测试将无法工作。下面的方法是Sergey Ten提供的。\n如果你看到链接被拒绝，通过下面的选项打开调试:\nrmiregistry -J-Dsun.rmi.log.debug=true \\ -J-Dsun.rmi.server.exceptionTrace=true \\ -J-Dsun.rmi.loader.logLevel=verbose \\ -J-Dsun.rmi.dgc.logLevel=verbose \\ -J-Dsun.rmi.transport.logLevel=verbose \\ -J-Dsun.rmi.transport.tcp.logLevel=verbose \\ 在JMeter2.3.1版本之后，RMI注册被服务启动;但选项仍可在命令行中工作。如: jmeter -s -Dsun.rmi.loader.logLevel=verbose(如，删除-J前缀)。改变属性可以在system.properties属性文件中定义。\n解决问题的方案是删除回调127.0.0.1和127.0.0.2从/etc/hosts。发生了什么引起，jmeter-server不能链接rmiregistry如果127.0.0.2回调不可用。使用下面的设置修复:\n替换\n`dirname $0`/jmeter -s \u0026#34;$@\u0026#34; 用\nHOST=\u0026#34;-Djava.rmi.server.hostname=[computer_name][computer_domain] \\ -Djava.security.policy=`dirname $0`/[policy_file]\u0026#34; \\ `dirname $0`/jmeter $HOST -s \u0026#34;$@\u0026#34; 同时创建协议文件，并添加电脑名 电脑域行在/etc/hosts。\n为了更好的支持RMI通讯通道的SSH协议在远程测试中，自JMeter2.6版本后:\n一个新的属性client.rmi.localport可以设置来控制RMI端口通过使用RemoteSampleListenerImpl 为了支持RMI使用SSH通信协议作为一个远程终端，在本机使用一个端口，可在Java的系统属性java.rmi.server.hostname参数中说明出来的回调接口现在允许调用。 使用不同的端口号 默认情况下，JMeter使用标准RMI的端口1099。是可以改变的。为了达到这个目的，下面所有的都是执行:\n在服务器上，使用新的端口号来启动rmiregistry 在服务器上，使用服务器定义的端口号来启动JMeter 在客户端上，更新remote_hosts属性包括新的host:port设置 自JMeter2.1.1版本后，JMeter服务端脚本提供支持变更端口。比如，假设你想使用1664(1099已被占用)\n在Windows电脑中(命令行)\nC:\\JMETER\u0026gt; SET SERVER_PORT=1664 C:\\JMETER\u0026gt; JMETER-SERVER [other options] 在Unix电脑中\n$ SERVER_PORT=1664 jmeter-server [other options] [环境变量使用大写字母]\n在上面两种情况下，在特殊的端口使用脚本启动rmiregistry，接着通过已经定义的server_port属性在服务端启动JMeter。\n可选端口号将会被输出在服务器的jmeter.log文件中(rmiregistry不会创建日志文件)。\n使用不同的测试样例 在测试计划中，监听器发送他们的结果至默认的JMeter客户端。通过情况下，样例结果将会在生成的时候同时返回。这个将会影响服务器的最大吞吐量;样例结果在线程继续时必须返回所有的结果。有一些JMeter属性可以改变这个功能。\nmode 样例发送模式-在2.9版本默认采用是StrippedBatch。这个将会被发送至客户端结点。 Standard: 在生成样例后即发送结果 Hold: 保存样例至数组中直到运行结束。这个将会使用大量的内存在服务器端，不推荐使用。 DiskStore: 存储样例在磁盘文件中(java.io.temp文件夹下)直到运行结束。JVM退出时，这个文件将会被删除。 StrippedDiskStore: 从返回数据中删除成功的数据，并使用DiskStore发送 Batch: 发送保存的样例当数量(num_sample_threshold)或时间(time_threshold)达到一个阀值，在这个阀点时将同步发送样例。这个值可以在服务器的下列属性中配制: num_sample_threshold: 样例累积数，默认100 time_threshold: 时间值，默认是 60000毫秒 = 60秒 异步模式的使用，在下面。 Statistical: 发送概要样例当数量或时间达到阀值。样例将被归整通过线程组名和样例标签。下面是可以归整的属性: elapsed time latency bytes sample count error count Stripped: 从返回数据中删除成功的样例 StrippedBatch: 从返回数据中删除成功的样例，并使用Batch发送 Asynch: 样例被临时存储在本地队列中。一个单独的工作线程发送样例。这样就不需要测试线程等待结果发送至客户端。然而，如果线程的创建速度比发送速度快，消息队列将会最终被填满，样例线程会被堵塞直到样例被从队列中清理完全。这个模式比较适用于平滑的样例测试。消息队列的大小可以在服务器端调节通过JMeter的属性asynch.batch.queue.size(默认100)。 StrippedAsynch: 从返回数据中删除成功的样例,并使用Asynch发送 Custom implementation: 配制模式参数至你的自定义样例类名中。这个必须继承接口SampleSender并且有一个独立参数类型为RemoteSampleListener的构造方法。 `Stripped`模式会包括`responseData`流，因此一些元素前置`responseData`将能正常工作。 这不是真正的问题，将会有更有效的方法来增加这个特性。 下面的属性应用于Batch和Statistical模式:\nnum_sample_threshold 设置的样例数(默认为100) time_threshold 设置时间值(默认60秒)\n处理节点启动失败 针对大数量级的测试，有一种情况是部分远程服务会不可用或无法启动。比如，当你使用自动化脚本来定位大量的云机器并使用作为并发机器，一些请求机器也许会失败因为一些云的问题。自JMeter2.13后，有一些新的属性来控制这种行为。\n首先，你应该尝试重试初始化在那些仅是因为延时启动。为了确保重试，你应该设置client.tries属性来设置总的尝试次数。默认情况下仅会尝试一次。为了控制重试延迟，设置client.retries_delay属性来控制在等待尝试的时间间隔(毫秒)。\n最后，你应该继续运行使用这些并发机器测试，并成功初始化且跳过失败的节点。为了使这个可用，设置client.continue_on_fail=true属性。\n原文地址: Remote Testing\n本文首发于: 简书-[译]性能测试远程模式\n","permalink":"https://shiyuanjie.cn/posts/PerformanceTest/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E4%B9%8B%E8%BF%9C%E7%A8%8B%E6%A8%A1%E5%BC%8F/","summary":"\u003cp\u003e事实上，你的JMeter客户端机器是不能表现出完美的压力请求，来模拟足够多的用户或由于网络限制去向服务施加压力，一种解决方法是通过一个JMeter去控制多个/远程JMeter。通过运行JMeter的远程模式，你可以通过多个低配制的电脑复制测试计划用于模拟一个大数据量的压力并发在服务器上。一个JMeter客户端实例可以控制多个远程JMeter实例，并收集所有数据信息。特点如下:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e保存测试样例在本机电脑\u003c/li\u003e\n\u003cli\u003e通过一台机器来管理多台JMeter测试机\u003c/li\u003e\n\u003cli\u003e不需要复制测试计划到每一台JMeter测试机-JMeter客户端会发送至所有的服务器\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e提示: 相同的测试计划将会被运行在所有的服务器中。JMeter不会在服务器间分发压力，每一个均会完整执行测试计划。因此，如果你设置了1000个线程并有6个JMeter服务，你将会完成6000线程注入。\u003c/p\u003e\u003c/blockquote\u003e","title":"性能测试之远程并发模式"},{"content":"保持使用最新版本 JMeter被经常推荐用来测试性能，鼓励用户使用最新的版本。\n确保你要经常去阅读变更记录中的新功能和模块的提升。你不应该再使用3.0之前的版本了\n使用正确的线程数 你硬件设备的能力及测试计划将都会影响你的JMeter可运行的线程数。数量也依赖于你的服务有多快(一个可快速响应的服务可以让JMeter变更更加给力)。像其它性能测试工具一样，如果你没有正确的线程数，你将面对不准备或错误结果的Coordinated Omission问题。如果你需要大数量级的压力测试，考虑使用分布式模式在多台机器上运行无GUI的JMeter实例。当使用分布式模式时，结果将被聚合在控制器的结果中，如果使用多个自已的实例，结果文件可以聚合用于持续性分析。对于如何在一个给定的平台上使用JMeter测试，JavaTest Sampler可以考虑使用。它不需要任何网络请求便可返回一些信息在最大的吞吐量。\nJMeter有选项用于延迟线程创建直到线程正常启动，如在其它线程组延迟之后和线程自身的启动时间。这样就允许一个非常大数量级的线程数，不需要太多的线程同时并发。\nCookie管理器的位置 可在构建一个Web测试中查看\nAuthorization管理器的位置 可在构建一个高级Web测试中查看\n使用HTTP(S) Test Script Recorder录制 关于HTTP(S) Test Script Recorder的细节在建议录制器中。最重要的事情是，剔除你不感兴趣的。比如，不关心在录制过程中的图片请求(JMeter可以下载一个页面中的所有图片-具体查看HTTP Request)。这些内容将会让你的测试计划一团糟糕。大部人都会这样，有一个扩展对你的所有文件集，如.jsp,.asp,.php,.html或者其它。这些内容你通过输入.*\\.jsp在Include Pattern中引入。\n或者，你也可以剔除图片通过输入.*\\.gif在Exclude Pattern中。具体依据你的应用程序，你可以选择一种更好的方案去执行。你也可以去剔除stylesheets,javascritpt文件和其它文件类型。测试你的配制来验证你的录入内容是你想要的，接着清除内容并且开始刷新页面。\nHTTP(S) Test Script Recorder期望用于使用Recording Controller发现HTTP Request记录的元素至一个线程组元素中。这样便于你可以直接将所有的样例打包至一个控制器下，当然可以再给出一个可描述测试用例的名称。\n现在，执行测试用例的步骤。如果你有无前置步骤的测试用例，使用JMeter来录制你的操作定义你的测试用例。一旦你完成了一系列特定的操作，保存整个测试用例至一个合适的文件名中。接着，清理记录开始一个新的测试用例。通过这样操作，你可以快速记录大量粗糙的测试用例。\nHTTP(S) Test Script Recorder最有用的一个特性是你可以通过录制的样例来抽象出通用的元素。通过定义自定义的用户变量在测试计划级别或在用户自定义变量元素中，你可以用JMeter自动替换你录制样例中的值。比如，如果你测试一个APP在服务xxx.example.com，你可以定义一个变量server的值为xxx.example.com，再所有在录制样例中的值将会被替换为**${server}**\n匹配时，注意大小写敏感 如果JMeter没有录制到任何请求，检查你的浏览器是否启用代理设置。如果在JMeter没有启动时，浏览器可正常使用，那浏览器一定是没有使用代理设置。一些浏览器忽略了代理设置localhost或127.0.0.1，那么请使用本机名或IP代替。\n错误unknown_ca可以是你正试图录入HTTPS，浏览器不接收JMeter的代理服务证书。\n用户变量 一些测试计划中，需要使用不同的值对于不同的用户/线程。如，你想测试需要每个用户登录后的一系列步骤。这个使用JMeter可以很容易实现。\n比如:\n创建一个文件，包含用户名和密码且使用逗号分隔。存放到与你的测试计划在同一文件夹。 添加一个CSV DataSet的配制元素至你的测试计划。定义变量名为USER和PASS。 替换登录名为**${USER}和密码为${PASS}** CSV DataSet元素将会为每个线程读取一新行内容。\n减少资源使用 减少资源使用的一些建议:\n使用无GUI的模式: jmeter -n -t test.jmx -l test.jtl 尽量少使用监听器Listener;如果使用上面的-l标记，他们均可以被删除或禁用 在压力测试过程中，不要使用查看结果树或在Table中查看结果监听器，仅在脚本调试阶段使用即可 相比使用大量相似的样例，在一个循环中使用相同的样例，并使用变量(CSV DataSet)来实现样例的不同。[Include Controller在此步骤没有任何用，它在文件中添加所有的测试元素至测试计划中] 不要使用功能模式 使用CSV格式输出要优于XML 仅保存需要的数据 尽可能使用少的断言 使用最优的脚本语言(查看JSR223部分) 如果你的测试需要大量的数据 - 特别是如果需要随机化的 - 创建测试数据在可被读取的CSV文件中。这样会避免浪费资源在运行时。\nBeanShell服务 BeanShell解释器有一个很有用的特性 - 当可以用来扮演server，可被telnet或http访问。\n没有安全性。能连接至端口的任何人都可以发布任何BeanShell命令。这些可以提供无限制的访问至JMeter程序和目标。 不要启用服务除非端口被限制访问，如，被防火墙。 如果你想使用服务，在jmeter.properties中定义下面内容:\nbeanshell.server.port=9000 beanshell.server.file=../extras/startup.bsh 在上面的例子中，服务将会被启动，将会监听端口9000和9001。端口9000用于http访问，端口9001用于telnet访问。startup.bsh文件将会被服务处理，可被用于定义功能和启动时的变量。启动文件定义用于启动和输出JMter和系统属性的方法。这些是你将在JMeter控制台看到的:\nStartup script running Startup script completed Session started on port: 9001 有一个样例脚本(extras/remote.bsh)你可以用来测试服务。[看看它怎么工作的]\n当启动当在JMeterbin目录(调整目录，如果你在其它位置)，输出会像这样:\n$ java -jar ../lib/bshclient.jar localhost 9000 ../extras/remote.bsh Connecting to BSH server on localhost:9000 Reading responses from server … BeanShell 2.0b5 - by Pat Niemeyer (pat@pat.net) bsh % remote.bsh starting user.home = C:\\Documents and Settings\\User user.dir = D:\\eclipseworkspaces\\main\\JMeter_trunk\\bin log_level.jmeter = INFO log_level.jorphan = INFO Setting property \u0026#39;EXAMPLE\u0026#39; to \u0026#39;0\u0026#39;. Setting property \u0026#39;EXAMPLE\u0026#39; to \u0026#39;1\u0026#39;. Setting property \u0026#39;EXAMPLE\u0026#39; to \u0026#39;2\u0026#39;. Setting property \u0026#39;EXAMPLE\u0026#39; to \u0026#39;3\u0026#39;. Setting property \u0026#39;EXAMPLE\u0026#39; to \u0026#39;4\u0026#39;. Setting property \u0026#39;EXAMPLE\u0026#39; to \u0026#39;5\u0026#39;. Setting property \u0026#39;EXAMPLE\u0026#39; to \u0026#39;6\u0026#39;. Setting property \u0026#39;EXAMPLE\u0026#39; to \u0026#39;7\u0026#39;. Setting property \u0026#39;EXAMPLE\u0026#39; to \u0026#39;8\u0026#39;. Setting property \u0026#39;EXAMPLE\u0026#39; to \u0026#39;9\u0026#39;. EXAMPLE = 9 remote.bsh ended bsh % … disconnected from server. 举个例子，假设你有一个运行时间较长的非GUI运行模式测试，并且你想让吞吐量在测试过程中不同。测试计划包括Constant Throughout Timer定义属性，如${__P(thoughput)}。下面的BeanShell可用于改变测试:\nprintprop(\u0026#34;throughput\u0026#34;); curr = Integer.decode(args[0]); // Start value inc = Integer.decode(args[1]); // Increment end = Integer.decode(args[2]); // Final value secs = Integer.decode(args[3]); // Wait between changes while(curr \u0026lt;= end) { setprop(\u0026#34;throughput\u0026#34;,curr.toString()); // Needs to be a string here Thread.sleep(secs*1000); curr += inc; } printprop(\u0026#34;throughput\u0026#34;); 脚本可以被存储在一个文件中(如，throughput.bsh)，使用bshclient.jar发送至服务。参考:\njava -jar ../lib/bshclient.jar localhost 9000 throughput.bsh 70 5 100 60 BeanShell脚本 概述 每一个BeanShell测试元素在解释器中的每个线程中均有自己的副本。如果测试元素被重复调用，如: 在loop中，那么元素会被解释器存储在报文中除非Reset bsh.Interpreter before each call选项被勾选。对扩展的压力测试，推荐使用脚本引擎集成了可编译的JSR223脚本语言，可在JSR223中查看详情。\n一些运行时间较长的测试会导致解释器使用大量的内存;如果真的要这样做，尝试使用reset选项。\n你可以测试BeanShell脚本使用命令行解释器，不依赖于JMeter:\n$ java -cp bsh-xxx.jar[;other jars as needed] bsh.Interpreter file.bsh [parameters] 或\n$ java -cp bsh-xxx.jar bsh.Interpreter bsh% source(\u0026#34;file.bsh\u0026#34;); bsh% exit(); // or use EOF key (e.g. ^Z or ^D) 共享变量 变量可以被定义在启动(安装)脚本。这些数据将会被存储在测试元素的报文中，除非你使用reset选项。\n脚本也可以读取JMeter的变量通过使用get()和put()方法，如:\nvars.get(\u0026#34;HOST\u0026#34;); vars.put(\u0026#34;MSG\u0026#34;,\u0026#34;Successful\u0026#34;); get()和put()方法仅支持字符串变量，但有getObject()和putObject()方法可以处理其它类型。JMeter变量对于线程是局部的，但可以被所有的测试元素使用（不适用于BeanShell）。\n如果你需要共享变量在线程间，JMeter的属性可以使用:\nimport org.apache.jmeter.util.JMeterUtils; String value = JMeterUtils.getPropDefault(\u0026#34;name\u0026#34;,\u0026#34;\u0026#34;); JMeterUtils.setProperty(\u0026#34;name\u0026#34;, \u0026#34;value\u0026#34;); 样例.bshrc文件包括样例getprop()和setprop()的方法定义。\n其它可用于共享变量的方法，使用bsh.shared共享命名空间。参考:\nif (bsh.shared.myObj == void){ // not yet defined, so create it: myObj = new AnyObject(); } bsh.shared.myObj.process(); 相比在测试元素中创建对象，可通过JMeter的属性beanshell.init.file文件配制在启动时创建。这个仅会执行一次。\n使用BeanShell Javascript Jexl脚本开发功能 像功能一样编写和测试脚本是很困难的。然而，JMeter有JSR223，BSF和BeanShell可用来尝试。\n创建一个简单的测试计划包括JSR223或BSF样例和结果树监听器。在样例板块编写脚本，通过运行测试来测试它。如果有很多错误，这些结果将会被展示在结果树中。同时运行脚本的结果将会被展示像返回内容一样。\n一旦脚本调试通过，可以当一个变量被存储在测试计划中。脚本的变量可被用于创建功能调用。如，支持一个BeanShell脚本被存储在变量RANDOM_NAME。功能调用可以被编写为${__BeanShell($RANDOM_NAME)}。不需要其它的逗号在脚本中，因为在变量值被添加之前，功能调用已经被转化。\n参数化测试 经常对于重复运行一个测试在不同的配制中是很有用的。比如，改变线程数/循环数/改变地址名。\n一种方式是在测试计划中定义变量集，并在测试元素中使用这些变量。比如，一个可以定义变量LOOPS=10，关联${LOOPS}至线程组中。为了运行测试循环20次，只需要调整LOOPS在测试计划中的值。\n这个会快变得糟糕，如果你想在非GUI模式运行的话。一个解决方案是，定义测试计划变量在属性中，如LOOPS=${__P(loop,10)}。这个使用属性loops的值，如果没找到的话默认为10。loops属性也可被JMeter的控制台命令定义:\njmeter ... -Jloops=12 ... 如果有大量的属性在一次变更的话，一种实现方式是使用属性文件。属性文件可通过使用-q在命令行模式下传递至JMeter。\nJSR223元素 为了扩展压力测试，推荐的脚本语言是一种脚本引擎实现可编译接口的脚本语言。Groovy脚本引擎可编译。然而，在JMeter 2.13版本无论是BeanShell还是Javascript都没有实现，因此最好不要使用它们来扩展压力测试。\n提醒: BeanShell继承可编译接口但还没有被实现，方法会抛异常。JMeter有一个明确的说明关于这个问题。 当使用JSR223元素时，经常设置存储一个值至一个唯一的变量中，如果语言支持它。确保脚本没有使用变量${varName}来存储将会获取第一个值，将会获取${varName}的第一个值。替换使用:\nvars.get(\u0026#34;varName\u0026#34;) 你也可以传递他们像参数一样到脚本中，并且像这样使用它们。\n线程组之间共享变量 变量对于线程是局部的;在一个线程中的一个变量集不能被其它线程读取。设计就是这样的。针对变量，可以在测试启动前进行明确，查看参考化测试。如果值直到测试启动都不知道，有如下选项:\n存储变量在属性中 - 属性对于JMter实例是全局的 写变量至文件中，重新读取他们 使用bsh.shared命令空间 - 查看共享变量 写自己的Java类 属性配制管理 当你需要修改JMeter属性，确保你没有修改jmeter.properties文件。替换拷贝属性从jmter.properties并修改在user.properties中的值。 这样做的话，会很容易合并至下一个JMeter版本。 注意jmeter.properties文件中经常涉及但被理解“从jmeter.properties拷贝到user.properties你想修改且这样做的属性。”\nuser.properties file supersedes the properties defined in jmeter.properties 过时的元素 建议不要使用过时的元素(被这样标记在变更记录和在组件相关)，并且合并使用新的元素如果可用的话，或新的方式可以实现相同的事情。 过时的元素被删除从菜单在版本N中，但通过修改user.properties中not_in_menu中属性可被启用，并且从那删除完整的类名。\n请注意过滤时的元素地版本`N`将会被删除在确定的版本`N+1`中，因此尽早确保你没有使用。 原文地址: JMeter best-practices\n本文首发地址: [译]性能测试最佳实践之JMeter\n","permalink":"https://shiyuanjie.cn/posts/PerformanceTest/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E4%B9%8BJMeter/","summary":"\u003ch1 id=\"保持使用最新版本\"\u003e保持使用最新版本\u003c/h1\u003e\n\u003cp\u003eJMeter被经常推荐用来测试性能，鼓励用户使用最新的版本。\u003c/p\u003e\n\u003cp\u003e确保你要经常去阅读\u003ca href=\"http://jmeter.apache.org/changes.html\"\u003e变更记录\u003c/a\u003e中的新功能和模块的提升。你不应该再使用3.0之前的版本了\u003c/p\u003e\n\u003ch1 id=\"使用正确的线程数\"\u003e使用正确的线程数\u003c/h1\u003e\n\u003cp\u003e你硬件设备的能力及测试计划将都会影响你的JMeter可运行的线程数。数量也依赖于你的服务有多快(一个可快速响应的服务可以让JMeter变更更加给力)。像其它性能测试工具一样，如果你没有正确的线程数，你将面对不准备或错误结果的\u003ccode\u003eCoordinated Omission\u003c/code\u003e问题。如果你需要大数量级的压力测试，考虑使用分布式模式在多台机器上运行无GUI的JMeter实例。当使用分布式模式时，结果将被聚合在控制器的结果中，如果使用多个自已的实例，结果文件可以聚合用于持续性分析。对于如何在一个给定的平台上使用JMeter测试，\u003ccode\u003eJavaTest Sampler\u003c/code\u003e可以考虑使用。它不需要任何网络请求便可返回一些信息在最大的吞吐量。\u003c/p\u003e\n\u003cp\u003eJMeter有选项用于延迟线程创建直到线程正常启动，如在其它线程组延迟之后和线程自身的启动时间。这样就允许一个非常大数量级的线程数，不需要太多的线程同时并发。\u003c/p\u003e","title":"性能测试最佳实践之JMeter"},{"content":"封面 书 无声告白\n读后感 本书将每个人物的性格描绘的很到位，特别是每位故事人物的心理想法，让读者有很强的带入感。 身在异乡的中国人在外成长，受到各种排挤。但最终通过自己的努力，成为美国社会中的上层人物-大学老师。并成功娶到了一位漂亮的美国女人，结婚生子。二女儿的自杀，让整个家庭暴露出来各种压抑已久的问题，詹姆斯·李出轨、玛丽琳离家出走、内斯酗酒、汉娜独立生活，大家都不愿相信自杀的真相，但真相经常就是那么残酷。 每个家庭都会自己的小故事，每个家庭成员都有自己的生活与想法，每个人都会有自己小秘密。外人经常会想你成为他们想的样子，家长经常会想孩子成为自己想像中的样子，但其实每个人都想成为自己想像的样子。不要总是强迫别人成为你想的样子。 阅读时间：20160814","permalink":"https://shiyuanjie.cn/posts/Book/%E6%97%A0%E5%A3%B0%E5%91%8A%E7%99%BD/","summary":"\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cimg src=\"https://images-cn-8.ssl-images-amazon.com/images/I/510wzE2j-EL._SX341_BO1,204,203,200_.jpg\" /\u003e","title":"无声告白"},{"content":"目的 将性能测试与持续集成挂接起来 性能测试： JMeter 持续集成： Jenkins JMeter 下载JMeter，官网: http://jmeter.apache.org/ 创建测试计划: 访问 http://www.cnblog.com ，验证Response的返回值中存在cnblog 使用GUI的JMeter查看运行测试结果 使用命令行执行测试 -J 指定生成的结果格式为xml，-t 指定测试文件，-l 测试结果 java -jar ApacheJMeter.jar -Jjmeter.save.saveservice.output_format=xml -n -t /Users/yjshi/Downloads/TestPlan.jmx -l TestPlan.jtl 结果\nWriting log file to: /Users/yjshi/Downloads/apache-jmeter-3.0/bin/jmeter.log Creating summariser \u0026lt;summary\u0026gt; Created the tree successfully using /Users/yjshi/Downloads/TestPlan.jmx Starting the test @ Thu Aug 04 18:41:43 CST 2016 (1470307303526) Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445 summary = 10 in 00:00:01 = 8.3/s Avg: 333 Min: 183 Max: 539 Err: 0 (0.00%) Tidying up ... @ Thu Aug 04 18:41:44 CST 2016 (1470307304767) ... end of run JMeter已经可以通过命令行来执行 Jenkins 配制JMeter 下载Jenkins包，官网： https://jenkins.io/ 启动Jenkins Running from: /Users/yjshi/Downloads/All/Software/jenkins/jenkins.war webroot: $user.home/.jenkins Aug 04, 2016 5:52:13 PM winstone.Logger logInternal INFO: Beginning extraction from war file Aug 04, 2016 5:52:13 PM org.eclipse.jetty.util.log.JavaUtilLog info INFO: jetty-winstone-2.9 Aug 04, 2016 5:52:19 PM org.eclipse.jetty.util.log.JavaUtilLog info INFO: NO JSP Support for , did not find org.apache.jasper.servlet.JspServlet Jenkins home directory: /Users/yjshi/.jenkins found at: $user.home/.jenkins Aug 04, 2016 5:52:26 PM org.eclipse.jetty.util.log.JavaUtilLog info INFO: Started SelectChannelConnector@0.0.0.0:8080 Aug 04, 2016 5:52:26 PM winstone.Logger logInternal INFO: Winstone Servlet Engine v2.0 running: controlPort=disabled Aug 04, 2016 5:52:26 PM jenkins.InitReactorRunner$1 onAttained INFO: Started initialization Aug 04, 2016 5:52:32 PM jenkins.InitReactorRunner$1 onAttained INFO: Listed all plugins Aug 04, 2016 5:52:32 PM jenkins.InitReactorRunner$1 onAttained INFO: Prepared all plugins Aug 04, 2016 5:52:32 PM jenkins.InitReactorRunner$1 onAttained INFO: Started all plugins Aug 04, 2016 5:52:32 PM jenkins.InitReactorRunner$1 onAttained INFO: Augmented all extensions Aug 04, 2016 5:52:35 PM jenkins.InitReactorRunner$1 onAttained INFO: Loaded all jobs Aug 04, 2016 5:52:35 PM hudson.model.AsyncPeriodicWork$1 run INFO: Started Download metadata Aug 04, 2016 5:52:35 PM org.jenkinsci.main.modules.sshd.SSHD start INFO: Started SSHD at port 54488 Aug 04, 2016 5:52:35 PM jenkins.InitReactorRunner$1 onAttained INFO: Completed initialization Aug 04, 2016 5:52:35 PM hudson.UDPBroadcastThread run INFO: Cannot listen to UDP port 33,848, skipping: java.net.SocketException: Can\u0026#39;t assign requested address Aug 04, 2016 5:52:35 PM jenkins.InitReactorRunner$1 onAttained INFO: Started initialization Aug 04, 2016 5:52:35 PM jenkins.InitReactorRunner$1 onAttained INFO: Listed all plugins Aug 04, 2016 5:52:35 PM jenkins.InitReactorRunner$1 onAttained INFO: Prepared all plugins Aug 04, 2016 5:52:35 PM jenkins.InitReactorRunner$1 onAttained INFO: Started all plugins Aug 04, 2016 5:52:35 PM jenkins.InitReactorRunner$1 onAttained INFO: Augmented all extensions Aug 04, 2016 5:52:35 PM jenkins.InitReactorRunner$1 onAttained INFO: Loaded all jobs Aug 04, 2016 5:52:35 PM jenkins.InitReactorRunner$1 onAttained INFO: Completed initialization Aug 04, 2016 5:52:35 PM hudson.WebAppMain$3 run INFO: Jenkins is fully up and running 安装Performance plugin插件: Performance Plugin 配制Jenkins中的JOB echo \u0026#39;begin testing\u0026#39; java -jar /Users/yjshi/Downloads/apache-jmeter-3.0/bin/ApacheJMeter.jar -Jjmeter.save.saveservice.output_format=xml -n -t /Users/yjshi/Downloads/TestPlan.jmx -l TestPlan.jtl echo \u0026#39;testing end\u0026#39; 运行JOB，查看结果 在JOB的workspace下会生成两个文件jmeter.log TestPlan.jtl 配制运行报告 添加测试报告 查看统计结果 后续 可将jmx文件存放到仓库中，便于维护和管理 将JOB添加到版本构建中，在版本构建完成后，自动执行性能，确保每次的版本Build均满足性能需求 参考 JMeter Jenkins Performance Plugin Continuous Integration 101: How to Run JMeter With Jenkins 原文地址： 性能测试与持续集成\n","permalink":"https://shiyuanjie.cn/posts/CICD/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E4%B8%8E%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/","summary":"\u003ch2 id=\"目的\"\u003e目的\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e将性能测试与持续集成挂接起来\u003c/li\u003e\n\u003cli\u003e性能测试： \u003ca href=\"http://jmeter.apache.org/\"\u003eJMeter\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e持续集成： \u003ca href=\"https://jenkins.io/\"\u003eJenkins\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"性能测试与持续集成"},{"content":"目的 E2E测试执行过程中不依赖UI界面 可在*nix系统中运行 为什么不用PhantomJS,Protractor官方不推荐使用PhantomJS来测试 We recommend against using PhantomJS for tests with Protractor. There are many reported issues with PhantomJS crashing and behaving differently from real browsers. Docker \b安装 下载系统所需要的安装包，下载地址：https://www.docker.com/products/docker 注册https://hub.docker.com/账号 使用pull来获取docker 镜像protractor-headless，此过程会比较慢，耐心等待 docker hub地址：https://hub.docker.com/r/webnicer/protractor-headless/ git hub地址：https://github.com/jciolek/docker-protractor-headless docker pull webnicer/protractor-headless E2E之Protractor 可视化运行E2E测试 安装Protractor npm install -g protractor 更新webdriver-manager webdriver-manager update 创建conf.js配制文件 // conf.js exports.config = { framework: \u0026#39;jasmine\u0026#39;, seleniumAddress: \u0026#39;http://127.0.0.1:4444/wd/hub\u0026#39;, specs: [\u0026#39;**/**.js\u0026#39;], capabilities: { browserName: \u0026#39;chrome\u0026#39; }, jasmineNodeOpts: { showColors: true, } }; 创建test-spec.js测试脚本 describe(\u0026#39;angularjs homepage todo list\u0026#39;, function() { it(\u0026#39;should add a todo\u0026#39;, function() { browser.get(\u0026#39;https://angularjs.org\u0026#39;); element(by.model(\u0026#39;todoList.todoText\u0026#39;)).sendKeys(\u0026#39;write first protractor test\u0026#39;); element(by.css(\u0026#39;[value=\u0026#34;add\u0026#34;]\u0026#39;)).click(); var todoList = element.all(by.repeater(\u0026#39;todo in todoList.todos\u0026#39;)); expect(todoList.count()).toEqual(3); expect(todoList.get(2).getText()).toEqual(\u0026#39;write first protractor test\u0026#39;); // You wrote your first test, cross it off the list todoList.get(2).element(by.css(\u0026#39;input\u0026#39;)).click(); var completedAmount = element.all(by.css(\u0026#39;.done-true\u0026#39;)); expect(completedAmount.count()).toEqual(2); }); }); 运行E2E测试: protractor conf.js，会启动chrome浏览器，并在控制台显示对应的执行结果 ➜ protractorHeadless git:(master) ✗ protractor conf.js [17:23:41] I/hosted - Using the selenium server at http://127.0.0.1:4444/wd/hub [17:23:41] I/launcher - Running 1 instances of WebDriver Started . 1 spec, 0 failures Finished in 19.912 seconds [17:24:01] I/launcher - 0 instance(s) of WebDriver still running [17:24:01] I/launcher - chrome #01 passed E2E的可视化测试完成 Headless运行E2E测试 将下面内容保存为可执行程序，shell文件(unix)或bat文件(windows) #!/bin/bashdocker run -it --privileged --rm --net=host -v /dev/shm:/dev/shm -v $(pwd):/protractor webnicer/protractor-headless $@ 进入控制台，输入protractor.sh --version，查看版本号，以确定配制成功。务必要启动docker服务\n修改conf.js文件内容，启用docker镜像内部的selenium server\n// conf.js exports.config = { framework: \u0026#39;jasmine\u0026#39;, // seleniumAddress: \u0026#39;http://127.0.0.1:4444/wd/hub\u0026#39;, specs: [\u0026#39;**/**.js\u0026#39;], capabilities: { browserName: \u0026#39;chrome\u0026#39; }, jasmineNodeOpts: { showColors: true, } }; 进入protractor的脚本根目录，执行protractor.sh conf.js,不会启动chrome浏览器，且在控制台显示对应的执行结果 ➜ protractorHeadless git:(master) ✗ protractor.sh conf.js [09:31:08] I/local - Starting selenium standalone server... [09:31:08] I/launcher - Running 1 instances of WebDriver [09:31:09] I/local - Selenium standalone server started at http://192.168.65.2:37226/wd/hub Started . 1 spec, 0 failures Finished in 11.403 seconds [09:31:23] I/local - Shutting down selenium standalone server. [09:31:23] I/launcher - 0 instance(s) of WebDriver still running [09:31:23] I/launcher - chrome #01 passed E2E的Headless测试完成 详解 Dockerfile文件 FROM node:slim MAINTAINER Yuanjie WORKDIR /tmp RUN npm install -g protractor mocha jasmine \u0026amp;\u0026amp; \\ webdriver-manager update \u0026amp;\u0026amp; \\ apt-get update \u0026amp;\u0026amp; \\ apt-get install -y xvfb wget openjdk-7-jre \u0026amp;\u0026amp; \\ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \u0026amp;\u0026amp; \\ dpkg --unpack google-chrome-stable_current_amd64.deb \u0026amp;\u0026amp; \\ apt-get install -f -y \u0026amp;\u0026amp; \\ apt-get clean \u0026amp;\u0026amp; \\ rm google-chrome-stable_current_amd64.deb \u0026amp;\u0026amp; \\ mkdir /protractor ADD protractor.sh /protractor.sh # Fix for the issue with Selenium, as described here: # https://github.com/SeleniumHQ/docker-selenium/issues/87 ENV DBUS_SESSION_BUS_ADDRESS=/dev/null WORKDIR /protractor ENTRYPOINT [\u0026#34;/protractor.sh\u0026#34;] 镜像主要配制说明\n获取基准镜像: node:slim 安装protractor,mocha,jasmine: E2E测试执行所需 更新driver: webdriver-manager update 安装Xvfb：apt-get install -y xvfb，headless的核心，使用虚拟内存，来模拟UI显示 安装wget，jdk 使用wget下载chrome的deb版本 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 使用dpkg安装chrome 添加Xvfb的运行参数: ADD protractor.sh /protractor.sh,protractor.sh文件内容 #!/bin/bash xvfb-run --server-args=\u0026#39;-screen 0 1280x1024x24\u0026#39; protractor $@ 源代码地址：https://github.com/aimer1124/protractor-headless\n参考 Headless Browser Testing With Xvfb docker hub protractor-headless Protractor browser setting up XVFB 本文首发于简书： E2E测试之Headless browser容器化\n","permalink":"https://shiyuanjie.cn/posts/UITest/E2E%E6%B5%8B%E8%AF%95%E4%B9%8BHeadless-browser%E5%AE%B9%E5%99%A8%E5%8C%96/","summary":"\u003ch1 id=\"目的\"\u003e目的\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eE2E测试执行过程中\u003cstrong\u003e不依赖UI\u003c/strong\u003e界面\u003c/li\u003e\n\u003cli\u003e可在*nix系统中运行\u003c/li\u003e\n\u003cli\u003e为什么不用\u003ccode\u003ePhantomJS\u003c/code\u003e,\u003ca href=\"http://www.protractortest.org/#/browser-setup#setting-up-phantomjs\"\u003eProtractor官方不推荐使用\u003ccode\u003ePhantomJS\u003c/code\u003e来测试\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eWe recommend against using PhantomJS for tests with Protractor. There are many reported issues with PhantomJS crashing and behaving differently from real browsers.\n\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"docker\"\u003eDocker\u003c/h1\u003e\n\u003ch2 id=\"安装\"\u003e\b安装\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e下载系统所需要的安装包，下载地址：\u003ca href=\"https://www.docker.com/products/docker\"\u003ehttps://www.docker.com/products/docker\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e注册\u003ca href=\"https://hub.docker.com/\"\u003ehttps://hub.docker.com/\u003c/a\u003e账号\u003c/li\u003e\n\u003cli\u003e使用\u003ccode\u003epull\u003c/code\u003e来获取docker 镜像\u003ccode\u003eprotractor-headless\u003c/code\u003e，此过程会比较慢，耐心等待\ndocker hub地址：\u003ca href=\"https://hub.docker.com/r/webnicer/protractor-headless/\"\u003ehttps://hub.docker.com/r/webnicer/protractor-headless/\u003c/a\u003e\ngit hub地址：\u003ca href=\"https://github.com/jciolek/docker-protractor-headless\"\u003ehttps://github.com/jciolek/docker-protractor-headless\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edocker pull webnicer/protractor-headless\n\u003c/code\u003e\u003c/pre\u003e","title":"E2E测试之Headless browser容器化"},{"content":"简书爬虫 此功能纯粹为个人意想功能,利用业余时间来学习Node。所有内容均已开源,欢迎各种PR和Fork。最后更新时间: 20161129。\n项目 源代码\nhttps://github.com/aimer1124/JianshuSpider 需求\nTeambition-简书爬虫 效果图\nHome Article Author Collections Search ShowCase\nHome Articles\nAuthors\nCollections Search 代码 启动\nDB: sudo mongod\n程序: gulp\n测试: gulp test\n版本\nNode: 4.4.3\nMongo: 3.0.3\n引用包列表\nBackend\nexpress: http://expressjs.com/,node web框架\nbody-parser: 请求数据体的转换中间件\ncookie-parser: 请求头的cookie管理\ndebug: 调试工具\nmorgan: 日志中间件\nserve-favicon: favicon中间件\nasync: https://github.com/caolan/async,异步框架\ncheerio: https://github.com/cheeriojs/cheerio,加载html元素,并可使用jQuery进行操作\nmoment: http://momentjs.com,轻量级的时间转换库\nmongoose: http://mongoosejs.com/,mongo的对象模型工具\nnode-schedule: https://github.com/node-schedule/node-schedule,Node的任务调度\nSuperAgent: http://visionmedia.github.io/superagent/,模拟客户端HTTP请求\nsleep: https://github.com/erikdubbelboer/node-sleep, 添加sleep等待时间\nFrontEnd\nHighCharts: http://www.highcharts.com,图表控件\njade: http://jade-lang.com/模板引擎\nbootstrap: http://getbootstrap.com/,前端样式处理\nbootstrap-table: 基于http://getbootstrap.com/的Table处理http://bootstrap-table.wenzhixin.net.cn/\nbootstrap-select: 基于http://getbootstrap.com/的select处理https://silviomoreto.github.io/bootstrap-select/\nDevelop\nbrowser-sync: http://browsersync.io浏览器数据同步框架\ngulp: http://gulpjs.com构建工具\ngulp-mocha: 运行mocha测试\ngulp-nodemon: gulp的nodemon工具,用于监控 node文件变化\nTest\ncucumber: https://cucumber.io/,BDD测试\nselenium-webdriver: http://www.seleniumhq.org/projects/webdriver/,用于Web自动化测试\nchromedriver: https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/chrome/ChromeDriver.html,使用Chrome可以在本机运行的WebDriver\nshould: https://github.com/shouldjs/should.js, 断言库\nSuperTest: https://github.com/visionmedia/supertest, 将superagent-HTTP测试简单化\n变更记录\nhistory ","permalink":"https://shiyuanjie.cn/posts/Tools/%E7%AE%80%E4%B9%A6%E7%88%AC%E8%99%AB/","summary":"\u003ch2 id=\"简书爬虫\"\u003e简书爬虫\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e此功能纯粹为个人\u003cstrong\u003e意想\u003c/strong\u003e功能,利用业余时间来学习Node。\u003ccode\u003e所有内容\u003c/code\u003e均已\u003ccode\u003e开源\u003c/code\u003e,欢迎各种\u003ccode\u003ePR\u003c/code\u003e和\u003ccode\u003eFork\u003c/code\u003e。最后更新时间: \u003ccode\u003e20161129\u003c/code\u003e。\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"项目\"\u003e项目\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e源代码\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aimer1124/JianshuSpider\"\u003ehttps://github.com/aimer1124/JianshuSpider\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e需求\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.teambition.com/project/57a1802f767c4b360c918e49/tasks/scrum/57a1802f767c4b360c918e4c\"\u003eTeambition-简书爬虫\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e效果图\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.processon.com/view/link/57a1c693e4b0de6d056db518\"\u003eHome\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.processon.com/view/link/57a2d0f1e4b0358f8ad7f03b\"\u003eArticle\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.processon.com/diagraming/5819751de4b03a76e94bea6f\"\u003eAuthor\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.processon.com/diagraming/5819746ae4b06e7dcfc9b338\"\u003eCollections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.processon.com/apps/58197ab8e4b03400d95e4c62\"\u003eSearch\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eShowCase\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eHome\n\u003cpicture\u003e\u003csource srcset=\"/posts/Tools/%E7%AE%80%E4%B9%A6%E7%88%AC%E8%99%AB/Home_hu_676343e9d700216b.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"HomePage\" loading=\"lazy\" src=\"/posts/Tools/%E7%AE%80%E4%B9%A6%E7%88%AC%E8%99%AB/Home.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eArticles\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAuthors\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCollections\n\u003cpicture\u003e\u003csource srcset=\"/posts/Tools/%E7%AE%80%E4%B9%A6%E7%88%AC%E8%99%AB/Collections_hu_9a6d598cbf36ccab.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"Collections\" loading=\"lazy\" src=\"/posts/Tools/%E7%AE%80%E4%B9%A6%E7%88%AC%E8%99%AB/Collections.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSearch\n\u003cpicture\u003e\u003csource srcset=\"/posts/Tools/%E7%AE%80%E4%B9%A6%E7%88%AC%E8%99%AB/UnSearch_hu_db85b0fd612288ff.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"UnSearch\" loading=\"lazy\" src=\"/posts/Tools/%E7%AE%80%E4%B9%A6%E7%88%AC%E8%99%AB/UnSearch.png\"\u003e\u003c/picture\u003e\n\u003cbr\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/Tools/%E7%AE%80%E4%B9%A6%E7%88%AC%E8%99%AB/Search_hu_23ba1f00b4445d3.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"Search\" loading=\"lazy\" src=\"/posts/Tools/%E7%AE%80%E4%B9%A6%E7%88%AC%E8%99%AB/Search.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"代码\"\u003e代码\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e启动\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eDB: \u003ccode\u003esudo mongod\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e程序: \u003ccode\u003egulp\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e测试: \u003ccode\u003egulp test\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e版本\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNode: 4.4.3\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMongo: 3.0.3\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e引用包列表\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eBackend\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eexpress: \u003ca href=\"http://expressjs.com/\"\u003ehttp://expressjs.com/\u003c/a\u003e,node web框架\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ebody-parser: 请求数据体的转换\u003ccode\u003e中间件\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ecookie-parser: 请求头的\u003ccode\u003ecookie\u003c/code\u003e管理\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003edebug: 调试工具\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003emorgan: 日志中间件\u003c/p\u003e","title":"简书爬虫"},{"content":"Postman helps you develop APIs faster.\n豪华午餐 Postman 构建、管理、文档化API\n在线安装 Chrome插件版 https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop MAC版 https://www.getpostman.com/app/postman-osx 离线\b安装 \b使用已经安装好的Postman\b文件夹，机器默认存放目录：/Library/Application\\ Support/Google/Chrome/Default/Extensions 进入chrome://extensions/，选择Load unpacked extensions，加载Postman的文件夹 Newman Newman is a command-line collection runner forPostman. It allows you to effortlessly run and test a Postman collection directly from the command-line. It is built with extensibility in mind so that you can easily integrate it with your continuous integration servers and build systems.\n安装： newman:npm install -g newman 功能： 直接运行Postman的接口Collection数据(本地或远程) 运行： 本地Postman保存的Collection内容 ➜ Downloads newman -c Demo.postman_collection.json Iteration 1 of 1 200 1479ms Open the url of Baidu. [GET] http://www.baidu.com ✔ Status code is 200 Summary: Parent Pass Count\tFailCount ------------------------------------------------------------- Collection Demo 1\t0 Total 1\t0 运行远程Postman ➜ ~ newman -u https://www.getpostman.com/collections/676a42223e14bf54ad84 Iteration 1 of 1 200 240ms Open the url of Baidu. [GET] http://www.baidu.com ✔ Status code is 200 Summary: Parent Pass Count\tFailCount ------------------------------------------------------------- Collection Demo 1\t0 Total 1\t0 Interceptor Postman interceptor brings the power of your Chrome window to Postman! You can set custom headers (including cookies) from within Postman, and view cookies already set on the domain. You can also capture requests being sent from Chrome and import them into Postman. This makes building APIs a breeze!\n安装 https://chrome.google.com/webstore/detail/postman-interceptor/aicmkgpgakddgnaphhhpliifpcfhicfo/ 功能 记录浏览器请求并直接导入到Postman 可添加Filter，对浏览器中的请求进行过滤 初级使用 录制API-Interceptor 设置浏览器中的Interceptor：打开开关、设置Filter（仅过滤www.jianshu.com） 设置Postman中的Interceptor：打开开关 开始录制：在Chrome浏览器中输入http://www.jianshu.com/p/4a677c5f79f1，回车后，查看Postman的请求录入 回放API-Postman 选择Postman中的API:Get http://www.jianshu.com/p/4a677c5f79f1 点击Send，进行回放。可查看到请求的返回状态码200、数据Body 指定API请求-Postman 在URL输入框中，输入目标地址:http://www.jianshu.com/p/4a677c5f79f1。点击Send按钮 高级使用 \b规划管理API-Postman+Collection 将所有的API进行分类管理，如按模块、系统、类型。\n保存API至Collection 选中需要保存的API，点击请求列表中的Save to collection 可将此API保存至已有的Collection或新增Collection 重命令API请求-便于管理和查看 切换到Collections列表，点击API请求的操作区，选择Edit 常用权限应用尽有-Authorization Postman在请求时，可指定此次请求Auth方式 可设置Auth中的具体内容，完全自行定义。如设置Basic Auth中的用户名和密码 完全自定义的头-header 编辑已有Header中的元素 新增Header中请求时，需要的Key:Value 禁用及启用Header中的元素，对于不清楚API请求时，具体哪些是必须要传递的比较有用 完美的数据体-body 在请求需要发送数据体时，可通过设置body内容 支持form-data/x-www-urlencoded/raw/binary，格式的数据 请求前还能做点事-Pre-request Script 请求发送前，可进行一些脚本设置。如：设置或清除参数、变量 验证API请求结果-Tests Postman提供了常用的测试功能：返回内容处理、状态码判断、请求超时等。点击后自动添加到Test脚本中 进阶使用 带你快速走向各个环境-Environment 添加QA环境的URL地址变量 添加DEV环境的URL地址变量。此时就有两个环境地址 修改请求中的URL地址为：{{URL}}p/4a677c5f79f1，切换环境至QA环境 点击Send，请求QA环境中的数据 使用Evnironment，可设置环境地址及环境中的不同数据，便于在跨环境后， 相同API可快速使用，减少调整API的成本\n分享你的成果-导出/导入 or share 导出-Download Postman中有Download功能（即导出功能），且Download后的可直接导入 可将Collection、Environment的数据进行Download PS：导出的数据其实是JSON数据格式，可随意玩 导入-Import 导入所有导出的数据 被导入的数据格式与内容与导出时，完全一致。 分享-share share功能需要登录后，才能使用。且shared成功后，对应的链接会保存到用户数据中 点击链接，会直接打开share的API设置内容 导出/导入、share，便于在团队内部协作时使用，API的请求及管理团队化\n\b海量执行你的请求-Runner 当你有大量的API时，肯定想一次执行多个、多次执行多个，Postman的Runner可以满足你的需求。\n调整API的结构、添加必要的测试验证 打开Runner，设置执行参数：选择要执行的Collection、执行多少次Interation、请求的延迟Delay、数据文件、变量控件 Start Test查看运行结果RESULTS \bCI挂起来-Newman 直接使用Newman命令，快速把Postman与CI集成起来(直接使用shell命令，即可)。\nnewman -c demo.postman_collection --exitCode 1 PS:\n从3.2.0版本之后，将原来的Jetpack(Runner/Newman)功能免费，以上所提到的功能全部免费使用 本文\b使用版本为4.2.2 参考 Postman官网 http://getpostman.com/ Newman https://www.npmjs.com/package/newman Postman Collection http://www.getpostman.com/docs/collections Postman Environment https://www.getpostman.com/docs/test_multi_environments How to write powerful automated API tests with Postman, Newman and Jenkins http://blog.getpostman.com/2015/09/03/how-to-write-powerful-automated-api-tests-with-postman-newman-and-jenkins/ ","permalink":"https://shiyuanjie.cn/posts/APITest/API%E5%BC%80%E5%8F%91%E7%A5%9E%E5%99%A8-Postman/","summary":"\u003cp\u003e\u003ccode\u003ePostman helps you develop APIs faster.\u003c/code\u003e\u003c/p\u003e\n\u003ch1 id=\"豪华午餐\"\u003e豪华午餐\u003c/h1\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/APITest/API%E5%BC%80%E5%8F%91%E7%A5%9E%E5%99%A8-Postman/Postman_hu_df479b550738d4ad.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"Postman\" loading=\"lazy\" src=\"/posts/APITest/API%E5%BC%80%E5%8F%91%E7%A5%9E%E5%99%A8-Postman/Postman.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003ch2 id=\"postman\"\u003ePostman\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003e构建、管理、文档化\u003c/code\u003eAPI\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e在线安装\u003c/li\u003e\n\u003cli\u003eChrome插件版\n\u003ca href=\"https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop\"\u003ehttps://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMAC版\n\u003ca href=\"https://www.getpostman.com/app/postman-osx\"\u003ehttps://www.getpostman.com/app/postman-osx\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e离线\b安装\n\b使用已经安装好的Postman\b文件夹，\u003ccode\u003e机器\u003c/code\u003e默认存放目录：/Library/Application\\ Support/Google/Chrome/Default/Extensions\n进入\u003ccode\u003echrome://extensions/\u003c/code\u003e，选择\u003ccode\u003eLoad unpacked extensions\u003c/code\u003e，加载Postman的文件夹\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/APITest/API%E5%BC%80%E5%8F%91%E7%A5%9E%E5%99%A8-Postman/Postman-Newman_hu_fb0fb4153d86d0ae.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"Newman(我真的不是MP3)\" loading=\"lazy\" src=\"/posts/APITest/API%E5%BC%80%E5%8F%91%E7%A5%9E%E5%99%A8-Postman/Postman-Newman.png\"\u003e\u003c/picture\u003e\u003c/p\u003e","title":"API开发神器-Postman"},{"content":"什么是Tricky的测试场景？ 测试场景 Scenario testing is a software testing activity that uses scenarios: hypothetical stories to help the tester work through a complex problem or test system. The ideal scenario test is a credible, complex, compelling or motivating story the outcome of which is easy to evaluate.\nTricky的测试场景 作为一名专业或非专业的IT研发人员，你一定遇到过几个步骤：\n\b发现BUG 重现BUG中：方法A、方法B、方法C\u0026hellip;.方法N 没有重现BUG，先提交到缺陷管理工具吧 过了N久之后 回归BUG时，这里怎么有一个BUG，重现不了，算了先关了吧，等后面出现再重新开启 一个BUG就这样被关闭了，他可能还隐藏在系统中的某个位置，等待机会爆发\n为什么会这样 重现步骤太复杂 重现前提要求很多 经常的真相在这里：没有Get到真正的重现步骤 举几个栗子 测试验证码，收到客户投诉 Scenario 作为普通用户,在用户注册时，可通过获取短信码使用手机号进行注册 功能 用户注册时，需要测试手机号码与获取的短信码是否能正常收到且匹配。 短信验证码由本项目生成,但由第三方来发送 验证码发送是由第三方提供的，无法完全Mock 数据库中会记录收到的短信验证码. 测试策略 测试验证码能否匹配时,用了自己的手机号码来测试. 后面再测试是否匹配时,发现没有手机号码可用,就 随机 输入了手机号码进行测试,通过查询数据库来获取验证码 Tricky 如上进行了一阵子测试,由于是国内某银行项目,后面就收到了客户投诉: 客户没有进行任何的操作,便收到了短信验证码 分析 是否每次测试时,都需要通过第三方来发送短信验证码. 仅Mock第三方收到请求,不需要每次都真实的发送短信功能 TIPS 测试中,一定要确保 普通用户 不会收到短信验证码 同样返回内容,在不同的浏览器中显示不同 Scenario 作为普通用户,在浏览页面时,可查看到Title显示的内容 功能 需要从第三方系统中获取指定的内容,返回给浏览器,并显示到Title 测试策略 为确保兼容性,使用不同的浏览器进行查看 涉及浏览器: Chrome,FireFox,IE Tricky 仅Chrome查看正常显示,FireFox/IE查看均会显示 部分 乱码 分析 返回的内容中有 Unicode 值为15的内容,这个返回值引起的显示乱码 TIPS 在对第三方集成时,一定要先针对所有输入/输出内容均进行字符集处理.确保所用的字符集均一致 同样的样式，在同一类浏览器中显示不同 Scenario 作为普通用户，在浏览页面时，可查看到正确的页面显示与布局 功能 在页面布局测试时，需要查看页面的显示与布局的正确性 测试策略 使用浏览器查看页面的显示与布局 Tricky 在测试电脑中，发现页面的布局中的样式有问题（按钮被换行） 在DEV的电脑中完全是好的（使用的同一发布版本进行测试） 分析 浏览器的版本是完全一致 浏览器的 缩放比例 不同，测试电脑的页面被设置为 缩放90% TIPS 在测试页面的显示和样式时，一定要确保页面 浏览器版本、页面缩放 完全一致 PaaS平台部署后，时间出现偏差 Scenario 作为普通用户，在注册新用户时，需要使用获取的验证码在5分钟内进行验证，否则验证码失效 功能 页面前端点击 获取验证码 后，需要在生成验证码5分钟内，进行注册 生成的验证码会存储在 数据库 中 生成验证码是由程序代码生成，有效期的验证是由生成验证码时生成的Createtime和当前时间比较 测试策略 在点击 获取验证码 后，从数据库中查询生成的 验证码 通过查询的验证码，进行用户注册 Tricky 在点击 获取验证码 后，直接去数据库中查询验证码 使用查询获取的验证码，在进行用户注册时，提示验证码已过期(查询与注册的时间操作差，绝对在5分钟内) 分析 此功能在非PaaS平台时完全正常的 部署到Paas平台后，在PaaS平台时，程序代码是部署到一台机器、数据库部署在另外一台机器 验证码的生成时间是由数据库脚本生成，获取的数据库的当前插入时间 验证码有效期验证时，当前时间为从程序代码部署的机器获取当前系统时间 两台部署机器时区设置不一致(程序代码：Asia/Shanghai，数据库:Etc/Zulu)，两个时区相差8小时 TIPS 部署环境时，一定要先确保时间的设置是否会对功能有影响 涉及到时间处理时，一定确保使用的是统一的参考时间 Mock的模块在集成后，Mock相关的功能出错 Scenario 作为普通用户，在查看个人账户时，可查看到账户余额 功能 普通用户在查看个人账户时，需要通过系统去查询第三方系统数据 在开发环境中第三方系统无法直接连接进行调试开发，因此提前做了Mock进行开发 测试策略 测试时，正常使用个人账户查询结果 Tricky 在到ST测试环境时，无法正常查询账户余额。数据解析报错 分析 使用Mock返回的数据时，在ST环境可正常查询 但使用第三方真实返回的数据查询时，在ST便会报错 对真实数据进行分析，发现数据结构已与之前Mock的不同 TIPS 针对Mock系统，一定要有对应的测试，确保接口的正确性及数据正确性 针对需要Mock的功能，一定要定期与集成方沟通，确保开发功能、接口变同的同步 特定文件内容无法上传到生产环境，其它环境均正常 Scenario 作为注册用户，在个人信息中，可上传文档 功能 注册用户，可使用上传文档功能，上传个人文档 针对上传的文件内容及类型均无限制（由于系统是特定人群使用，所以对文件类型均没有限制），文件大小此处不考虑 测试策略 针对上传文件类型进行测试：txt/exe/pdf/doc等 Tricky 上传txt/html时，若文件以**\u0026lt;**开头时，上传功能在其它环境均可正常使用，但在生产环境则上传会失败 分析 生产环配制有网关，会对文件内容进行过滤 若文件html/js/txt文件中以**\u0026lt;开头时，则会被判断为注入**文件 TIPS 作为测试人员，也要对安全测试常出现的问题进行考虑 以上的Scenario只是实际工作中的部分场景，仅用来\b抛出问题\n如何定位Tricky的定位操作 数据源 数据源是要定位问题的根源，确保数据源的完全正确性，才能保证后续流程。如：数据格式、编码格式、字段完整性、字段次序等。 出口数据 出口数据与数据源类似，数据源为被分析软件的数据入口。相对于被分析软件本身，出口数据是需要展示给用户所需要的数据。出口数据是经被分析软件加工过的，只有被正确的加工，才能正确的展示给用户。 环境 软件运行的环境包括：软件环境、硬件环境。软件环境包括：操作系统类型、操作系统版本、浏览器、容器、环境的部署架构等，硬件环境包括：网络环境、网速、硬件设备等。 日志 日志的分析，需要从模块日志、系统日志及网络请求日志来进行。模块日志为出现问题的模块所生成的相关日志，系统日志主要为整个系统运行时生成的日志，网络请求日志主要涉及与网关相关的日志范围。建议排查次序：模块日志\u0026gt;关联模块日志\u0026gt;系统日志\u0026gt;网络请求日志 请求分析 针对请求的内容进行分析，HTTP请求的各种方面均需要考虑。建议排查次序：请求地址\u0026gt;请求数据\u0026gt;请求编码方式，其它的方面也有可能引起Tricky的问题，但主要集中在这几个方面 参考资料 Scenario Test https://en.wikipedia.org/wiki/Scenario_testing PAAS https://en.wikipedia.org/wiki/Platform_as_a_service 时区差 https://en.wikipedia.org/wiki/List_of_tz_database_time_zones Asia/Shanghai https://en.wikipedia.org/wiki/Asia/Shanghai Etc/Zulu http://www.prokerala.com/travel/timezones/Etc/Zulu Mock https://en.wikipedia.org/wiki/MockServer ST测试 https://en.wikipedia.org/wiki/System_testing 安全测试 http://www.ltesting.net/ceshi/ceshijishu/aqcs/2015/0104/207771.html 首发于简书：http://www.jianshu.com/p/4a677c5f79f1\n","permalink":"https://shiyuanjie.cn/posts/QA/%E5%A6%82%E6%AD%A4Tricky%E7%9A%84%E6%B5%8B%E8%AF%95%E5%9C%BA%E6%99%AF%E4%BD%A0%E5%BA%94%E8%AF%A5%E6%80%8E%E4%B9%88%E5%8A%9E/","summary":"\u003ch1 id=\"什么是tricky的测试场景\"\u003e什么是Tricky的测试场景？\u003c/h1\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E5%A6%82%E6%AD%A4Tricky%E7%9A%84%E6%B5%8B%E8%AF%95%E5%9C%BA%E6%99%AF%E4%BD%A0%E5%BA%94%E8%AF%A5%E6%80%8E%E4%B9%88%E5%8A%9E/TestScenario-Tricky_hu_da8686bd7774d587.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"Tricky的测试场景\" loading=\"lazy\" src=\"/posts/QA/%E5%A6%82%E6%AD%A4Tricky%E7%9A%84%E6%B5%8B%E8%AF%95%E5%9C%BA%E6%99%AF%E4%BD%A0%E5%BA%94%E8%AF%A5%E6%80%8E%E4%B9%88%E5%8A%9E/TestScenario-Tricky.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003ch2 id=\"测试场景\"\u003e测试场景\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eScenario testing\u003c/strong\u003e is a software \u003cstrong\u003etesting\u003c/strong\u003e activity that uses \u003cstrong\u003escenarios\u003c/strong\u003e: hypothetical stories to help the tester work through a complex problem or \u003cstrong\u003etest\u003c/strong\u003e system. The ideal \u003cstrong\u003escenario test\u003c/strong\u003e is a credible, complex, compelling or motivating story the outcome of which is easy to evaluate.\u003c/p\u003e","title":"如此Tricky的测试场景,你应该怎么办"},{"content":"目的 如何使用SuperTest测试框架，进行API测试 如何将API测试与构建工具结合 如何将API测试、构建工具与持续集成结合 SuperTest 什么是SuperTest To provide a high-level abstraction for testing HTTP，提供一个高级别的HTTP测试 Github地址：SuperTest 如何安装 命令 npm install supertest --save-dev 样例 describe(\u0026#39;Test Demo.\u0026#39;, function() { it(\u0026#39;Visit URL\u0026#39;, function(done) { request.get(\u0026#39;\u0026#39;) .expect(200) .end(done); }); }); \b样例原理：通过获取请求的结果，对请求结果进行验证。样例中的验证条件为返回的状态码为200。 自动化API测试：Grunt \u0026amp; Gulp Grunt篇 什么是Grunt The JavaScript Task Runner，JavaScript的构建工具 官网：Grunt 安装 命令 npm install -g grunt-cli 功能分析 测试目的：\b请求https://github.com/aimer1124/SuperTestWithGrunt是否能返回状态码200 使用Github来Clonehttps://github.com/aimer1124/SuperTestWithGrunt.git . ├── Gruntfile.js ├── README.md ├── api-test.iml ├── package.json ├── results.txt └── test ├── config │ └── endpoints.js └── module └── demo.js /test/module/demo.js:测试脚本 var config = require(\u0026#39;../config/endpoints\u0026#39;), request = require(\u0026#39;supertest\u0026#39;)(config.host[config.env]); describe(\u0026#39;Test Demo.\u0026#39;, function() { this.timeout(10000); it(\u0026#39;Visit \u0026#39; + config.env, function(done) { request.get(\u0026#39;\u0026#39;) .expect(200) .end(done); }); }); /test/config/endpoints.js:环境配制 module.exports = { host : { master: \u0026#39;https://github.com/aimer1124/SuperTestWithGrunt\u0026#39;, branch: \u0026#39;https://github.com/aimer1124/SuperTestWithGrunt/tree/differentENV\u0026#39; }, env: process.env.NODE_ENV || \u0026#39;master\u0026#39; }; Gruntfile.js:Grunt运行时的命令配制 package.json:npm 安装时所需要的包 results.txt:执行结果存放文件 执行 命令:grunt 运行结果 ➜ SuperTestWithGrunt git:(master) ✗ grunt Running \u0026#34;mochaTest:test\u0026#34; (mochaTest) task Test Demo. ✓ Visit master (1640ms) 1 passing (2s) Done, without errors. 结果分析：✓ Visit master (1640ms)表示测试正常通过；1 passing (2s)表示整个测试所执行的时间和测试所执行的数量 Gulp篇 什么是Gulp Automate and enhance your workflow，自动化并且增强你的工作流 官网：http://gulpjs.com/ 中文官网：http://www.gulpjs.com.cn/ 安装 命令 npm install --global gulp-cli 功能分析 测试目的：\b请求http://aimer1124.github.io/是否能返回状态码200 使用Github来Clonehttps://github.com/aimer1124/SuperTestWithGulp . ├── README.md ├── config │ ├── branch.js │ ├── endpoints.js │ └── master.js ├── gulpfile.js ├── package.json └── test └── test-demo.js /test/config/endpoints.js:环境配制 var host = { master: require(\u0026#39;./master.js\u0026#39;), branch: require(\u0026#39;./branch.js\u0026#39;) }; var ENV; module.exports = function(env) { if (env) { ENV = host[env]; return; } return ENV; }; /test/config/master的具体配制 module.exports = { url: \u0026#39;http://aimer1124.github.io/\u0026#39;, name: \u0026#39;master\u0026#39; }; /test/module/test-demo.js:测试脚本 var data = require(\u0026#39;../config/endpoints\u0026#39;), request = require(\u0026#39;supertest\u0026#39;)(data().url); describe(\u0026#39;Test Demo.\u0026#39;, function() { this.timeout(10000); it(\u0026#39;Visit \u0026#39; + data().url, function(done) { request.get(\u0026#39;\u0026#39;) .expect(200) .end(done); }); console.log(\u0026#39;You are in \u0026#39; + data().name); }); gulpfile.js:Grunt运行时的命令配制 package.json:npm 安装时所需要的包 results.txt:执行结果存放文件 执行 命令 gulp master 结果 ➜ SuperTestWithGulp git:(master) gulp master [17:34:44] Using gulpfile ~/Downloads/SuperTestWithGulp/gulpfile.js [17:34:44] Starting \u0026#39;master\u0026#39;... [17:34:44] Finished \u0026#39;master\u0026#39; after 37 ms You are in master Test Demo. ✓ Visit http://aimer1124.github.io/ (502ms) 1 passing (506ms) 结果分析：✓ Visit http://aimer1124.github.io/ (502ms)表示测试正常通过；1 passing (506ms)表示整个测试所执行的时间和测试所执行的数量 自动化测试的持续集成 持续集成是什么 Continuous Integration (CI) is a development practice that requires developers to integrate code into a shared repository several times a day. Each check-in is then verified by an automated build, allowing teams to detect problems early. Travis CI 在线CI工具 官网：https://travis-ci.org/ Travis与Gulp集成 使用Git项目SuperTestWithGulp 在项目根目录中添加.travis.yml文件，language表示使用的语言为node_js，0.12表示使用node_js的版本，before_script表示运行脚本前执行的脚本命令，script表示启动时的执行脚本 language: node_js node_js: - \u0026#34;0.12\u0026#34; before_script: - npm install -g gulp script: gulp master 在Travis中关联此Github项目SuperTestWithGulp\nTravis会在Github代码有变更时，自动拉取项目的代码并进行在线集成\nJenkins Build great things at any scale 官网：https://jenkins.io/ Jenkins与Grunt集成 安装NodeJS、Git插件\n配制Job的build step中execute shell：npm install \u0026amp;\u0026amp; grunt\n运行Job即可执行API测试\n总结 API自动化测试已经说完了，完全没有太复杂的代码和编写难度。 使用SuperTest可实现多场景、多环境的API场景测试，且执行速度较UI自动化测试快很多。 SuperTest与Grunt/Gulp的集成很方便，即使在本地进行调试也很快捷。 持续集成工具Travis/Jenkins，与API测试集成后，更高效的提高测试效率。 参考 SuperTest https://github.com/visionmedia/supertest Grunt官网 http://gruntjs.com/ NPM官网 https://www.npmjs.com/ Gulp官网 http://gulpjs.com/ Continuous Integration https://www.thoughtworks.com/continuous-integration Travis CI https://travis-ci.org/ Jenkins https://jenkins.io/ NodeJS https://nodejs.org/en/ UI自动化测试 http://www.jianshu.com/p/cb24e7fa8f56 Jenkins with Grunt http://aimer1124.github.io/2016/03/03/Tool-Jenkins-with-SuperTest-and-Grunt/ 首发于简书：http://www.jianshu.com/p/a3e35928a0aa\n","permalink":"https://shiyuanjie.cn/posts/APITest/API%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E4%B8%8E%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/","summary":"\u003ch1 id=\"目的\"\u003e目的\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e如何使用\u003ccode\u003eSuperTest\u003c/code\u003e测试框架，进行API测试\u003c/li\u003e\n\u003cli\u003e如何将API测试与构建工具结合\u003c/li\u003e\n\u003cli\u003e如何将API测试、构建工具与持续集成结合\u003c/li\u003e\n\u003c/ul\u003e","title":"API自动化测试与持续集成"},{"content":"封面 书 别笑，这是大清正史1 别笑，这是大清正史2：鏖兵天下 别笑,这是大清正史3:十全武功 读后感 整本书的风格很诙谐，阅读起来也很轻松，完全没有以往看史书的压抑状态。 正史，跟以往看到的书中的内容完全不一样，正视了整个清朝的发展过程。 历史的王朝中，每个帝王都有自己的过错。当然现在人接触到的信息很多已经被歪曲，或者被抹平，想要正视这些内容，就一定要刨根问底。作者完全从一个客观的观点出发，正视了整个过程。 阅读时间：20160201-20160509","permalink":"https://shiyuanjie.cn/posts/Book/%E5%88%AB%E7%AC%91%E8%BF%99%E6%98%AF%E5%A4%A7%E6%B8%85%E6%AD%A3%E5%8F%B2/","summary":"\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cimg src=\"https://images-cn.ssl-images-amazon.com/images/I/51YRyQX71rL._SX447_BO1,204,203,200_.jpg\" /\u003e","title":"别笑，这是大清正史1,2,3"},{"content":"封面 书 The Cucumber Book: Behaviour-Driven Development for Testers and Developers 读后感 看的是英文原版的，对应的链接也是Amazon上面的英文原版链接，Amazon上面也有中文翻译版本 Cucumber的入门神器，阅读起来很通俗易懂，书中也有完善的例子可以从0开始入门 适应对Cucumber 0基本或者有一定Cucumber经验的 书中针对项目自动化的设计也有总结，针对设计整个项目自动化和自动化场景设计有指导意义(When Cucumbers Go Bad) 书中写的例子有部分已经无法直接使用，所以在使用过程中，有些需要调整后再可运行通过 针对书中部分内容的整理 阅读时间：20160503-20160506","permalink":"https://shiyuanjie.cn/posts/Book/The-Cucumber-Book/","summary":"\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cimg src=\"https://images-cn.ssl-images-amazon.com/images/I/51dKVQPJolL._SX415_BO1,204,203,200_.jpg\" /\u003e","title":"The Cucumber Book: Behaviour-Driven Development for Testers and Developers"},{"content":"Protractor Protractor is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would. 是什么 基于Node.js的程序 使用Jasmine测试框架测试接口,针对AngularJS的应用程序 官网： http://angular.github.io/protractor/#/ Github: https://github.com/angular/protractor 功能 模拟真实的用户操作行为 针对AngularJS中的Element不需要做特殊的处理，普通HTML元素也同样支持 智能等待，不需要为页面中的加载和同步显示做特殊的等待时间处理 安装 安装Node和JDK\nProtractor 3支持NodeJS v4以上 使用NodeJS v0.12,需要使用Protractor 2 安装Protractor: npm install -g protractor\n此命令会同时安装protractor和webdriver-manager webdriver-manager：为于管理所有的webdriver 安装webdriver: webdriver-manager update\n此命令会安装和更新webdriver,其它命令及用法 Usage: webdriver-manager \u0026lt;command\u0026gt; Commands: update: install or update selected binaries start: start up the selenium server status: list the current available drivers clean: removes all downloaded driver files from the out_dir End To End Testing 页面分析-Page Object 页面地址： https://www.angularjs.org/\n功能\n页面中的\u0026#34;The Basics\u0026#34;部分，在右侧的`Name`输入框中输入`Julie`后，下方原有的`Hello !`会变更为`Hello Julie!` 元素分析\nName输入框 元素页面源码：\u0026lt;input type=\u0026quot;text\u0026quot; ng-model=\u0026quot;yourName\u0026quot; placeholder=\u0026quot;Enter a name here\u0026quot; class=\u0026quot;ng-valid ng-touched ng-dirty ng-valid-parse ng-empty\u0026quot;\u0026gt;，元素ng-model可直接使用Protractor的元素定位方法：element(by.model('yourName')), 文本显示 元素源码：\u0026lt;h1 class=\u0026quot;ng-binding\u0026quot;\u0026gt;Hello !\u0026lt;/h1\u0026gt; ,元素class=\u0026quot;ng-binding\u0026quot;可直接使用Protractor的元素定位方法：element(by.binding('yourName')) Page Object设计: AngularHomepage.js\nvar AngularHomepage = function() { var nameInput = element(by.model(\u0026#39;yourName\u0026#39;)); var greeting = element(by.binding(\u0026#39;yourName\u0026#39;)); this.get = function() { browser.get(\u0026#39;http://www.angularjs.org\u0026#39;); }; this.setName = function(name) { nameInput.sendKeys(name); }; this.getGreeting = function() { return greeting.getText(); }; }; module.exports = AngularHomepage; 测试代码：spec.js var pageObject = require(\u0026#39;../pageObject/AngularHomepage.js\u0026#39;); describe(\u0026#39;angularjs homepage\u0026#39;, function() { it(\u0026#39;should greet the named user\u0026#39;, function() { var angularHomepage = new pageObject(); angularHomepage.get(); angularHomepage.setName(\u0026#39;Julie\u0026#39;); expect(angularHomepage.getGreeting()).toEqual(\u0026#39;Hello Julie!\u0026#39;); }); }); pageObject: 加载Page Object var angularHomepage = new pageObject();: 创建一个Page Object对象 angularHomepage.get();: 打问AngularHomepage首页，调用browser.get('http://www.angularjs.org'); angularHomepage.setName('Julie');: 设置nameInput值为Julie，调用nameInput.sendKeys(name); expect(angularHomepage.getGreeting()).toEqual('Hello Julie!');: 测试greeting的值与Hello Julie!是否相等，相等则测试通过,不相等，则测试失败 启动webdriver 启动webdriver: webdriver-manager start\n启动Selenium Server seleniumProcess.pid: 49863 11:24:51.400 INFO - Launching a standalone Selenium Server Setting system property webdriver.chrome.driver to /usr/local/lib/node_modules/protractor/selenium/chromedriver_2.21 11:24:51.452 INFO - Java: Oracle Corporation 25.60-b23 11:24:51.452 INFO - OS: Mac OS X 10.11.2 x86_64 11:24:51.467 INFO - v2.52.0, with Core v2.52.0. Built from revision 4c2593c 11:24:51.549 INFO - Driver provider org.openqa.selenium.ie.InternetExplorerDriver registration is skipped: registration capabilities Capabilities [{ensureCleanSession=true, browserName=internet explorer, version=, platform=WINDOWS}] does not match the current platform MAC 11:24:51.550 INFO - Driver provider org.openqa.selenium.edge.EdgeDriver registration is skipped: registration capabilities Capabilities [{browserName=MicrosoftEdge, version=, platform=WINDOWS}] does not match the current platform MAC 11:24:51.550 INFO - Driver class not found: com.opera.core.systems.OperaDriver 11:24:51.550 INFO - Driver provider com.opera.core.systems.OperaDriver is not registered 11:24:51.656 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub 11:24:51.656 INFO - Selenium Server is up and running 访问：http://127.0.0.1:4444/wd/hub，本地查看是否启动成功 执行Protractor 执行Protractor: protractor conf.js\n执行过程中，会真实的把浏览器挂起，并显示真实的页面信息 执行结束时，会自动把浏览器关闭,且webdriver日志会记录本次执行过程中的日志信息 Protractoc执行过程日志\n[11:32:19] I/hosted - Using the selenium server at http://localhost:4444/wd/hub [11:32:19] I/launcher - Running 1 instances of WebDriver Started . 1 spec, 0 failures Finished in 5.401 seconds [11:32:27] I/launcher - 0 instance(s) of WebDriver still running [11:32:27] I/launcher - firefox #01 passed webdriver启动的Selenium Server中也会记录本次请求的相关日志\n总结 以上涉及的源码已提交到Git: https://github.com/aimer1124/protractorWithPageObject.git,便于查阅 Protractor支持ETE测试，特别是针对AngularJS的项目 Protractor的webdriver-manager将webdriver统一管理，减少测试人员在使用过程中针对webdriver的管理操作，将主要精力集中于ETE的测试 参考 Protractor Tutorial: http://angular.github.io/protractor/#/tutorial Page Object: http://martinfowler.com/bliki/PageObject.html Protractor元素定位：http://angular.github.io/protractor/#/locators Protractor conf配制：https://github.com/angular/protractor/blob/master/docs/referenceConf.js Protractor API: http://angular.github.io/protractor/#/api?view=ElementArrayFinder ","permalink":"https://shiyuanjie.cn/posts/UITest/Protractor-End-to-End-Testing/","summary":"\u003ch1 id=\"protractor\"\u003eProtractor\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eProtractor is an end-to-end test framework for AngularJS applications.\nProtractor runs tests against your application running in a real browser, interacting with it as a user would.\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"是什么\"\u003e是什么\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e基于\u003ccode\u003eNode.js\u003c/code\u003e的程序\u003c/li\u003e\n\u003cli\u003e使用\u003ccode\u003eJasmine\u003c/code\u003e测试框架测试接口,针对\u003ccode\u003eAngularJS\u003c/code\u003e的应用程序\u003c/li\u003e\n\u003cli\u003e官网： \u003ca href=\"http://angular.github.io/protractor/#/\"\u003ehttp://angular.github.io/protractor/#/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eGithub: \u003ca href=\"https://github.com/angular/protractor\"\u003ehttps://github.com/angular/protractor\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"功能\"\u003e功能\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e模拟真实的用户操作行为\u003c/li\u003e\n\u003cli\u003e针对\u003ccode\u003eAngularJS\u003c/code\u003e中的Element不需要做特殊的处理，普通HTML元素也同样支持\u003c/li\u003e\n\u003cli\u003e智能等待，不需要为页面中的加载和同步显示做特殊的等待时间处理\u003c/li\u003e\n\u003c/ul\u003e","title":"Protractor End to End Testing"},{"content":"Gulp Automate and enhance your workflow\n用自动化构建工具增强你的工作流程！\n官网：http://gulpjs.com/ 中文官网：http://www.gulpjs.com.cn/ 简体中文文档: https://github.com/lisposter/gulp-docs-zh-cn 安装npm install --global gulp 验证 ➜ Downloads gulp -v [15:59:38] CLI version 3.9.1 [15:59:38] Local version 3.9.1 SuperTest API测试\nSuperTestWithGulp Use Gulp to run SuperTest API testing scripts\n准备 仅需要clone这个repo demo,就可以了. 运行 使用命令gulp master,查看结果: [15:28:55] Using gulpfile ~/Downloads/SuperTestWithGulp/gulpfile.js [15:28:55] Starting \u0026#39;master\u0026#39;... [15:28:55] Finished \u0026#39;master\u0026#39; after 24 ms You are in master Test Demo. ✓ Visit http://aimer1124.github.io/ (775ms) 1 passing (779ms) 使用命令gulp branch,可以查看到 branch 环境的运行结果: [15:30:34] Using gulpfile ~/Downloads/SuperTestWithGulp/gulpfile.js [15:30:34] Starting \u0026#39;branch\u0026#39;... [15:30:34] Finished \u0026#39;branch\u0026#39; after 22 ms You are in branch Test Demo. ✓ Visit http://aimer1124.github.io/2016/01/17/Tool-SuperTest/ (780ms) 1 passing (784ms) 增强 Modify the visit url,you just need to modify the url property in master.js or branch.js\nAdd more environment,you just need to three steps:\nadd the gulp task in gulpfile.js like this\ngulp.task(\u0026#39;newBranch\u0026#39;, function() { require(\u0026#39;./config/endpoints\u0026#39;)(\u0026#39;newBranch\u0026#39;); runTest(); }); add the host config in endpoints.js\n... var host = { master: require(\u0026#39;./master.js\u0026#39;), branch: require(\u0026#39;./branch.js\u0026#39;), newBranch: require(\u0026#39;./newBranch.js\u0026#39;) }; ... add one javascript file named newBranch under config folder,and config this file like others\n","permalink":"https://shiyuanjie.cn/posts/SuperTest/SuperTestWithGulp/","summary":"\u003ch1 id=\"gulp\"\u003eGulp\u003c/h1\u003e\n\u003cp\u003eAutomate and enhance your workflow\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e用自动化构建工具增强你的工作流程！\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e官网：\u003ca href=\"http://gulpjs.com/\"\u003ehttp://gulpjs.com/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e中文官网：\u003ca href=\"http://www.gulpjs.com.cn/\"\u003ehttp://www.gulpjs.com.cn/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e简体中文文档: \u003ca href=\"https://github.com/lisposter/gulp-docs-zh-cn\"\u003ehttps://github.com/lisposter/gulp-docs-zh-cn\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e安装\u003ccode\u003enpm install --global gulp\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e验证\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e➜  Downloads gulp -v\n[15:59:38] CLI version 3.9.1\n[15:59:38] Local version 3.9.1\n\u003c/code\u003e\u003c/pre\u003e","title":"SuperTestWithGulp"},{"content":" PS:文档备案，以便以后查看\n","permalink":"https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/","summary":"\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.002_hu_586e53c04bcaef5b.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.002.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.003_hu_1dfe63f97a839824.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.003.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.004_hu_bc2c2b40b7e2eab5.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.004.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.005_hu_4a3f0eb370a4c66d.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.005.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.006_hu_153a925494ceb400.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.006.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.007_hu_58d7cd22e5e9e0be.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.007.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.008_hu_89ec004857f98b9a.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.008.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.009_hu_38de37ac9f09846f.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.009.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.010_hu_4a3f0eb370a4c66d.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.010.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.011_hu_ba0ac68fa0ec96f5.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.011.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.012_hu_6766ca1780ba4201.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.012.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.013_hu_6ea8e6f0e2bb174e.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.013.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.014_hu_ae133e5e7bc75863.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.014.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.015_hu_422da9f5e0c87d92.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.015.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.016_hu_66fef99c2cc15934.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.016.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.017_hu_886c9851e6916df4.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.017.jpeg\"\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.018_hu_5950e70adf71a949.webp\" type=\"image/webp\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.018.jpeg\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003ePS:文档备案，以便以后查看\u003c/p\u003e","title":"游戏测试"},{"content":"封面 书 解忧杂货店 读后感 三位青年，在生活所迫的情况下，进行了一次盗窃，后续误入一个杂货店。偶然发现一封奇怪的信，便开展了整个小说。 故事描写的很不错，尽管在中间一直看不到整个书中所有故事线是如何，但慢慢的阅读之后，便会发现书中的所有人物其实都是被浪失杂货店所关联起来的。 晴美虽然是从一个小人物开始，但听从了杂货店中的书信，便开始了自己正确且顺利的人生。后面她开始选择回报曾经生活过的孤儿院，但过程却是曲折的，不被他人所认可。为了感谢写信给他的人，他被三个误入家门的三个人绑架，这三个人就是写信给她的人。 书中的故事是虽然是有穿越性，但里面表达的人性却是真实的。浪失店的老板，虽然生无所恋，但他却为了解忧他人，在一起坚持。 阅读时间：20160321","permalink":"https://shiyuanjie.cn/posts/Book/%E8%A7%A3%E5%BF%A7%E6%9D%82%E8%B4%A7%E5%BA%97/","summary":"\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cimg src=\"http://ec4.images-amazon.com/images/I/51%2B6K7dvYlL._SX333_BO1,204,203,200_.jpg\" /\u003e","title":"解忧杂货店"},{"content":"封面 书 你的灯亮着吗?:发现问题的真正所在 读后感 如何提问 发问前先思考，这是什么类型的问题 谁碰到了问题？ 问题是什么？ 问题的本质是什么？ 解决问题方法的判断 不要把别人的解决方法作为定义问题的方法 如果解决问题过于神速，别人根本不会考虑你真的解决了问题 如果当前的问题解决了，那是不是真的问题就解决了？ 如何定义对问题的理解 至少想到不少于3个有错的地方，否则就是没有真正理解问题在哪 适当的回头，及时的总结问题 如果在解决问题的过程中，发现有些疲惫了，不防适当的回头总结下现在的方向，确认下当前的方向没有错 当别人可以解决问题时，不要越俎代疱 在需求没有讲清楚前，很少有人会真正的理解需求在哪 如果找不到问题在哪，可以试着把问题揽到自己身上，换位思考下 ","permalink":"https://shiyuanjie.cn/posts/Book/%E4%BD%A0%E7%9A%84%E7%81%AF%E4%BA%AE%E7%9D%80%E5%90%97-%E5%8F%91%E7%8E%B0%E9%97%AE%E9%A2%98%E7%9A%84%E7%9C%9F%E6%AD%A3%E6%89%80%E5%9C%A8/","summary":"\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cimg src=\"http://ec4.images-amazon.com/images/I/41AELHN7NXL._SX446_BO1,204,203,200_.jpg\" /\u003e","title":"你的灯亮着吗?:发现问题的真正所在"},{"content":"封面 书 JavaScript核心概念及实践 读后感 因最近项目需求，需要对JavaScript有进一步的了解。所以花了半天时间，把这本书粗略浏览了下。前面部分的看的比较仔细，内容分析的很到位，例子的讲解也很清晰，后面部分只是大概浏览了下，以后有机会还会再读一遍 JavaScript是动态语言、弱类型、基于原型的 JavaScript的MVC模式，降低整个前端开发端的耦合度，提高事个前端的开发效率。Backbone.js框架 单元测试框架：QUnit，Jasmine:测试框架，支持BDD 阅读时间：20160312","permalink":"https://shiyuanjie.cn/posts/Book/JavaScript%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5%E5%8F%8A%E5%AE%9E%E8%B7%B5/","summary":"\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cimg src=\"http://ec4.images-amazon.com/images/I/41tRutArxIL._SX392_BO1,204,203,200_.jpg\" /\u003e","title":"JavaScript核心概念及实践"},{"content":"封面 书 三体全集 读后感 第一次完整的读完一本科幻类小说，而且还是一口气读完了3集(三体、黑暗森林、死神永生)。完全被作者的文笔吸引，不能自拨，极力推荐 作者除了对科幻类知识的认识，对IT、人性、思维、历史的认识也很深刻，相关的举例及引用很到位。 书中的主要三个主人物：叶文洁、罗辑、程心，分别属于不同时期的人物，对人物形象的刻画，生动到位。 三体世界的武器：水滴，第三世界的武器：纸条，看似简单的事物，确有着惊人的杀伤力。整个人类的科技与力量，在这些武器面前，是那么的弱不经风。 面壁者的选择、执剑人的更换，都是整个人类社会的压宝。面壁者、执剑人究竟是否能成功，其实谁也说不好，但这又给整个人类一点希望与寄托。 程心，一个女性角色，在小说的后面基本是主线在进行。从刚当上执剑人不到10分钟，整个人类便被三体世界攻击，到让维德交到星空号的全部控制权后，整个人类对曲率的研究受到一定的影响，但最后也是她的天性，让作者很好的最后，给整体小说画上了完满的句号。程心放弃了小世界，回归了大宇宙。 云天明，一个绝症患者，为了自己的爱情，为心爱的女人买了一颗星星并把自己的大脑交给三体世界进行研究。还通过三个童话故事，很隐晦的想告诉人类应该怎样做，才能逃避强大的外部世界的攻击。最后，又为自己心爱的留下了，一个小世界，可以度过余生的完整世界。 感谢刘慈欣有这么好的作品。 阅读时间：201601-201603","permalink":"https://shiyuanjie.cn/posts/Book/%E4%B8%89%E4%BD%93/","summary":"\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cimg src=\"http://ec4.images-amazon.com/images/I/51aw%2BKCkFvL._SX399_BO1,204,203,200_.jpg\" /\u003e","title":"三体"},{"content":"Developer Tools开发者工具查看网络请求 Windows: F12键 Mac OS: option+command+i键 打开网络请求Network 请求网址http://aimer1124.github.io/后，Network中便会有本次的网络请求内容 点击第一条请求http://aimer1124.github.io/，可查看到此网络请求的详细信息Request/Response 切换到Timing栏中，显示具体的请求时间消耗 切换Headers、Preview、Response、Cookies，也可直接查看对应的信息 设置网络延迟和带宽 点击No throttling会显示出Chrome已提前设置好常用的网络延迟和带宽，供直接选择 网络类型 带宽 延迟 Offline 0kb/s 0ms GPRS 50kb/s 500ms Regular 2G 250kb/s 300ms Good 2G 450kb/s 150ms Regular 3G 750kb/s 100ms Good 3G 1Mb/s 40ms Regular 4G 4Mb/s 20ms DSL 2Mb/s 5ms WiFi 30Mb/s 2ms 选择GRPS，clear网络请求，再次刷新页面，查看请求http://aimer1124.github.io/的Timing 此时，可查看到对应的网络延迟已经生效 自定义网络延迟和带宽 点击No throttling-Custom-add进入Network Throttling Profiles设置页面 设置Profile Name：slow1S，Throughput：10，Latency为：1000 关闭设置框，切换No throttling为slow1S，自定义网络延迟与带宽设置完成 参考 Measure Resource Loading Times:https://developers.google.com/web/tools/chrome-devtools/profile/network-performance/resource-loading#network-panel-overview Device Mode \u0026amp; Mobile Emulation:https://developer.chrome.com/devtools/docs/device-mode ","permalink":"https://shiyuanjie.cn/posts/Tools/Chrome%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F%E4%B8%8E%E5%B8%A6%E5%AE%BD/","summary":"\u003ch1 id=\"developer-tools开发者工具查看网络请求\"\u003eDeveloper Tools\u003ccode\u003e开发者工具\u003c/code\u003e查看网络请求\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eWindows: F12键\u003c/li\u003e\n\u003cli\u003eMac OS: option+command+i键\n\u003cpicture\u003e\u003csource srcset=\"/posts/Tools/Chrome%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F%E4%B8%8E%E5%B8%A6%E5%AE%BD/github.Chrome.DeveoperTools_hu_d2253151396e0f32.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"开发者工具\" loading=\"lazy\" src=\"/posts/Tools/Chrome%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F%E4%B8%8E%E5%B8%A6%E5%AE%BD/github.Chrome.DeveoperTools.png\"\u003e\u003c/picture\u003e\u003c/li\u003e\n\u003cli\u003e打开网络请求\u003ccode\u003eNetwork\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e请求网址\u003ca href=\"http://aimer1124.github.io/\"\u003ehttp://aimer1124.github.io/\u003c/a\u003e后，\u003ccode\u003eNetwork\u003c/code\u003e中便会有本次的网络请求内容\n\u003cpicture\u003e\u003csource srcset=\"/posts/Tools/Chrome%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F%E4%B8%8E%E5%B8%A6%E5%AE%BD/github.Chrome.Networks_hu_2d49ee2d27773704.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"NetWorks\" loading=\"lazy\" src=\"/posts/Tools/Chrome%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F%E4%B8%8E%E5%B8%A6%E5%AE%BD/github.Chrome.Networks.png\"\u003e\u003c/picture\u003e\u003c/li\u003e\n\u003cli\u003e点击第一条请求\u003ccode\u003ehttp://aimer1124.github.io/\u003c/code\u003e，可查看到此网络请求的详细信息Request/Response\u003c/li\u003e\n\u003cli\u003e切换到\u003ccode\u003eTiming\u003c/code\u003e栏中，显示具体的请求时间消耗\n\u003cpicture\u003e\u003csource srcset=\"/posts/Tools/Chrome%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F%E4%B8%8E%E5%B8%A6%E5%AE%BD/github.Chrome.Timing_hu_6db43487e8e44bf2.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"Timing\" loading=\"lazy\" src=\"/posts/Tools/Chrome%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F%E4%B8%8E%E5%B8%A6%E5%AE%BD/github.Chrome.Timing.png\"\u003e\u003c/picture\u003e\u003c/li\u003e\n\u003cli\u003e切换\u003ccode\u003eHeaders\u003c/code\u003e、\u003ccode\u003ePreview\u003c/code\u003e、\u003ccode\u003eResponse\u003c/code\u003e、\u003ccode\u003eCookies\u003c/code\u003e，也可直接查看对应的信息\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- more --\u003e\n\u003ch1 id=\"设置网络延迟和带宽\"\u003e设置网络延迟和带宽\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e点击\u003ccode\u003eNo throttling\u003c/code\u003e会显示出\u003ccode\u003eChrome\u003c/code\u003e已提前设置好常用的网络延迟和带宽，供直接选择\u003c/li\u003e\n\u003c/ul\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth style=\"text-align: center\"\u003e网络类型\u003c/th\u003e\n          \u003cth style=\"text-align: center\"\u003e带宽\u003c/th\u003e\n          \u003cth style=\"text-align: center\"\u003e延迟\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: center\"\u003eOffline\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e0kb/s\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e0ms\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: center\"\u003eGPRS\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e50kb/s\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e500ms\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: center\"\u003eRegular 2G\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e250kb/s\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e300ms\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: center\"\u003eGood 2G\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e450kb/s\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e150ms\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: center\"\u003eRegular 3G\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e750kb/s\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e100ms\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: center\"\u003eGood 3G\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e1Mb/s\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e40ms\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: center\"\u003eRegular 4G\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e4Mb/s\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e20ms\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: center\"\u003eDSL\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e2Mb/s\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e5ms\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: center\"\u003eWiFi\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e30Mb/s\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e2ms\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cul\u003e\n\u003cli\u003e选择\u003ccode\u003eGRPS\u003c/code\u003e，clear网络请求，再次刷新页面，查看请求\u003ccode\u003ehttp://aimer1124.github.io/\u003c/code\u003e的\u003ccode\u003eTiming\u003c/code\u003e\n\u003cpicture\u003e\u003csource srcset=\"/posts/Tools/Chrome%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F%E4%B8%8E%E5%B8%A6%E5%AE%BD/github.Chrome.Latancy_hu_bf1aaf4754d14fa1.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"Latency\" loading=\"lazy\" src=\"/posts/Tools/Chrome%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F%E4%B8%8E%E5%B8%A6%E5%AE%BD/github.Chrome.Latancy.png\"\u003e\u003c/picture\u003e\u003c/li\u003e\n\u003cli\u003e此时，可查看到对应的网络延迟已经\u003ccode\u003e生效\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"自定义网络延迟和带宽\"\u003e自定义网络延迟和带宽\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e点击\u003ccode\u003eNo throttling\u003c/code\u003e-\u003ccode\u003eCustom\u003c/code\u003e-\u003ccode\u003eadd\u003c/code\u003e进入\u003ccode\u003eNetwork Throttling Profiles\u003c/code\u003e设置页面\u003c/li\u003e\n\u003cli\u003e设置\u003ccode\u003eProfile Name\u003c/code\u003e：slow1S，\u003ccode\u003eThroughput\u003c/code\u003e：10，\u003ccode\u003eLatency\u003c/code\u003e为：1000\n\u003cpicture\u003e\u003csource srcset=\"/posts/Tools/Chrome%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F%E4%B8%8E%E5%B8%A6%E5%AE%BD/github.Chrome.setNetwork_hu_f99565a87e06927f.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"setNetwork\" loading=\"lazy\" src=\"/posts/Tools/Chrome%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F%E4%B8%8E%E5%B8%A6%E5%AE%BD/github.Chrome.setNetwork.png\"\u003e\u003c/picture\u003e\u003c/li\u003e\n\u003cli\u003e关闭设置框，切换\u003ccode\u003eNo throttling\u003c/code\u003e为\u003ccode\u003eslow1S\u003c/code\u003e，自定义网络延迟与带宽设置完成\n\u003cpicture\u003e\u003csource srcset=\"/posts/Tools/Chrome%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F%E4%B8%8E%E5%B8%A6%E5%AE%BD/github.Chrome.setCustomNetwork_hu_e9bfbb1b9399b86f.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"setCustomNetwork\" loading=\"lazy\" src=\"/posts/Tools/Chrome%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F%E4%B8%8E%E5%B8%A6%E5%AE%BD/github.Chrome.setCustomNetwork.png\"\u003e\u003c/picture\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"参考\"\u003e参考\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eMeasure Resource Loading Times:\u003ca href=\"https://developers.google.com/web/tools/chrome-devtools/profile/network-performance/resource-loading#network-panel-overview\"\u003ehttps://developers.google.com/web/tools/chrome-devtools/profile/network-performance/resource-loading#network-panel-overview\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDevice Mode \u0026amp; Mobile Emulation:\u003ca href=\"https://developer.chrome.com/devtools/docs/device-mode\"\u003ehttps://developer.chrome.com/devtools/docs/device-mode\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"Chrome设置网络延迟与带宽"},{"content":"Git Ignore 忽略特殊指定的文件\ngitignore - Specifies intentionally untracked files to ignore\n操作 全局忽略 直接使用命令git config --global core.excludesfile ~/.gitignore_global 未添加到仓库的文件 直接在仓库根目录创建.gitignore文件 在文件中配制所需要ignore的文件清单 还原的话，直接在.gitignore中删除对应的配制行即可 已提交到仓库的文件 先更新仓库至最新版本 添加指定指定的忽略文件git update-index --assume-unchanged Gruntfile.js，此处忽略Gruntfile.js文件 还原的话，使用命令git update-index --no-assume-unchanged Gruntfile.js，重新添加对Gruntfile.js文件的追踪 建议 Github官方提供的常用各种ignore文件大全，https://github.com/github/gitignore 将.gitignore文件提交到远程仓库中，便于整个项目的管理 .gitignore添加文件的原则 临时生成的文件 本地调度需要经常变更的文件 日志文件 编译生成的中间文件，如Java的.class文件 参考 Git之ignore文件: http://www.douban.com/note/476292319/?type=like Git官方推荐ignore内容：https://github.com/github/gitignore Git官方配制ignore方法：http://git-scm.com/docs/gitignore ","permalink":"https://shiyuanjie.cn/posts/Tools/Git%E6%B7%BB%E5%8A%A0ignore%E6%96%87%E4%BB%B6/","summary":"\u003ch1 id=\"git-ignore\"\u003eGit Ignore\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003e忽略特殊指定的文件\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003egitignore - Specifies intentionally untracked files to ignore\u003c/code\u003e\u003c/p\u003e\n\u003ch1 id=\"操作\"\u003e操作\u003c/h1\u003e\n\u003ch2 id=\"全局忽略\"\u003e全局忽略\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e直接使用命令\u003ccode\u003egit config --global core.excludesfile ~/.gitignore_global\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- more --\u003e\n\u003ch2 id=\"未添加到仓库的文件\"\u003e未添加到仓库的文件\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e直接在仓库根目录创建\u003ccode\u003e.gitignore\u003c/code\u003e文件\u003c/li\u003e\n\u003cli\u003e在文件中配制所需要\u003ccode\u003eignore\u003c/code\u003e的文件清单\u003c/li\u003e\n\u003cli\u003e还原的话，直接在\u003ccode\u003e.gitignore\u003c/code\u003e中删除对应的\u003ccode\u003e配制行\u003c/code\u003e即可\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"已提交到仓库的文件\"\u003e已提交到仓库的文件\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e先更新仓库至最新版本\u003c/li\u003e\n\u003cli\u003e添加指定指定的忽略文件\u003ccode\u003egit update-index --assume-unchanged Gruntfile.js\u003c/code\u003e，此处忽略\u003ccode\u003eGruntfile.js\u003c/code\u003e文件\u003c/li\u003e\n\u003cli\u003e还原的话，使用命令\u003ccode\u003egit update-index --no-assume-unchanged Gruntfile.js\u003c/code\u003e，重新添加对\u003ccode\u003eGruntfile.js\u003c/code\u003e文件的追踪\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"建议\"\u003e建议\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eGithub\u003c/code\u003e官方提供的常用各种\u003ccode\u003eignore\u003c/code\u003e文件大全，\u003ca href=\"https://github.com/github/gitignore\"\u003ehttps://github.com/github/gitignore\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e将\u003ccode\u003e.gitignore\u003c/code\u003e文件提交到远程仓库中，便于整个项目的管理\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.gitignore\u003c/code\u003e添加文件的原则\u003c/li\u003e\n\u003cli\u003e临时生成的文件\u003c/li\u003e\n\u003cli\u003e本地调度需要经常变更的文件\u003c/li\u003e\n\u003cli\u003e日志文件\u003c/li\u003e\n\u003cli\u003e编译生成的中间文件，如\u003ccode\u003eJava\u003c/code\u003e的\u003ccode\u003e.class\u003c/code\u003e文件\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"参考\"\u003e参考\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eGit之ignore文件: \u003ca href=\"http://www.douban.com/note/476292319/?type=like\"\u003ehttp://www.douban.com/note/476292319/?type=like\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eGit官方推荐\u003ccode\u003eignore\u003c/code\u003e内容：\u003ca href=\"https://github.com/github/gitignore\"\u003ehttps://github.com/github/gitignore\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eGit官方配制\u003ccode\u003eignore\u003c/code\u003e方法：\u003ca href=\"http://git-scm.com/docs/gitignore\"\u003ehttp://git-scm.com/docs/gitignore\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"Git添加ignore文件"},{"content":"Jenkins In a nutshell, Jenkins is the leading open source automation server. Built with Java, it provides hundreds of plugins to support building, testing, deploying and automation for virtually any project Jenkins是一个开源软件项目，旨在提供一个开放易用的软件平台，使软件的持续集成变成可能。 特性 容易安装，提供各种操作系统的安装包及独立的jar包进行安装 容易配制，完善的GUI提供快速的配制操作界面 强大的插件系统，可以满足基本所有的项目需求 可扩展性，个性化定制Jenkins，自行开发插件 分布式构建，可让项目在不同的模块、系统中任意搭配。当然操作系统也可随意搭配 下载 安装包 官网首页提供了支持各种操作系统的安装包，可直接进行下载，http://jenkins-ci.org/\nwar包 直接下载war包\n安装\u0026amp;运行 安装包 直接使用对应平台的安装包，进行安装即可。没有啥可设置的\nwar包 直接使用java -jar jenkins.war来运行war包，即可\n➜ jenkins java -jar jenkins.war Running from: /Users/yjshi/Downloads/All/Software/jenkins/jenkins.war webroot: $user.home/.jenkins Mar 03, 2016 9:21:54 PM winstone.Logger logInternal INFO: Beginning extraction from war file Mar 03, 2016 9:21:54 PM org.eclipse.jetty.util.log.JavaUtilLog info INFO: jetty-winstone-2.9 Mar 03, 2016 9:21:56 PM org.eclipse.jetty.util.log.JavaUtilLog info INFO: NO JSP Support for , did not find org.apache.jasper.servlet.JspServlet Jenkins home directory: /Users/yjshi/.jenkins found at: $user.home/.jenkins Mar 03, 2016 9:21:57 PM org.eclipse.jetty.util.log.JavaUtilLog info INFO: Started SelectChannelConnector@0.0.0.0:8080 Mar 03, 2016 9:21:57 PM winstone.Logger logInternal INFO: Winstone Servlet Engine v2.0 running: controlPort=disabled Mar 03, 2016 9:21:57 PM jenkins.InitReactorRunner$1 onAttained INFO: Started initialization Mar 03, 2016 9:21:57 PM jenkins.InitReactorRunner$1 onAttained INFO: Listed all plugins Mar 03, 2016 9:21:57 PM jenkins.InitReactorRunner$1 onAttained INFO: Prepared all plugins Mar 03, 2016 9:21:57 PM jenkins.InitReactorRunner$1 onAttained INFO: Started all plugins Mar 03, 2016 9:21:57 PM jenkins.InitReactorRunner$1 onAttained INFO: Augmented all extensions Mar 03, 2016 9:21:58 PM jenkins.InitReactorRunner$1 onAttained INFO: Loaded all jobs Mar 03, 2016 9:21:59 PM hudson.model.AsyncPeriodicWork$1 run INFO: Started Download metadata Mar 03, 2016 9:21:59 PM org.jenkinsci.main.modules.sshd.SSHD start INFO: Started SSHD at port 64899 Mar 03, 2016 9:21:59 PM jenkins.InitReactorRunner$1 onAttained INFO: Completed initialization Mar 03, 2016 9:21:59 PM hudson.UDPBroadcastThread run INFO: Cannot listen to UDP port 33,848, skipping: java.net.SocketException: Can\u0026#39;t assign requested address Mar 03, 2016 9:21:59 PM jenkins.InitReactorRunner$1 onAttained INFO: Started initialization Mar 03, 2016 9:21:59 PM jenkins.InitReactorRunner$1 onAttained INFO: Listed all plugins Mar 03, 2016 9:21:59 PM jenkins.InitReactorRunner$1 onAttained INFO: Prepared all plugins Mar 03, 2016 9:21:59 PM jenkins.InitReactorRunner$1 onAttained INFO: Started all plugins Mar 03, 2016 9:21:59 PM jenkins.InitReactorRunner$1 onAttained INFO: Augmented all extensions Mar 03, 2016 9:21:59 PM jenkins.InitReactorRunner$1 onAttained INFO: Loaded all jobs Mar 03, 2016 9:21:59 PM jenkins.InitReactorRunner$1 onAttained INFO: Completed initialization Mar 03, 2016 9:21:59 PM hudson.WebAppMain$3 run INFO: Jenkins is fully up and running 访问 直接访问http://localhost:8080/，即可打开jenkins的界面\n更多安装说明 其它安装说明(https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins) Grunt The JavaScript Task Runner 安装npm 官网下载对应的操作系统版本-NPM，下载完成后，直接进行安装即可\n安装Grunt npm install -g grunt-cli 验证安装 正常显示版本号，则安装成功\n➜ ~ grunt --version grunt-cli v0.1.13 Combine：Jenkins\u0026amp;Grunt 安装NodeJS插件 使用Jenkins安装NodeJS插件，选择[install without restart] 等待安装成功 Jenkins安装Grunt 为执行Grunt时，使用 配制Job 在Jenkins中选择[New Item]，在[Item name]中输入(GruntJob)，并选择[Freestyle project]，点击[OK] 配制build，选择[Save] 在Job处选择[Build Now]，查看构建结果 var sys = require(\u0026#39;sys\u0026#39;); sys.puts(\u0026#39;NodeJS Test\u0026#39;); sys.puts(\u0026#39;***************\u0026#39;); sys.puts(\u0026#39;helloworld\u0026#39;); 添加build step中execute shell npm update grunt 指定的grunt构建配制完成 参考 Jenkins官网:http://jenkins-ci.org/ Jenkins百度百科：http://baike.baidu.com/link?url=pVYPV6gky9E3fCPe1hAvofgKswHkO06S0B6oVYYCQpXWaBrRB5TcOvJEGaOmae6a6tOLo19xCdEW1ovacOcsoq Grunt官网：http://gruntjs.com/ npm:NPM jenkins-integration-with-grunt:http://stackoverflow.com/questions/21765428/jenkins-integration-with-grunt ","permalink":"https://shiyuanjie.cn/posts/CICD/Jenkins-with-SuperTest-and-Grunt/","summary":"\u003ch1 id=\"jenkins\"\u003eJenkins\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eIn a nutshell, Jenkins is the leading open source automation server.\nBuilt with Java, it provides hundreds of plugins to support building,\ntesting, deploying and automation for virtually any project\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eJenkins是一个开源软件项目，旨在提供一个开放易用的软件平台，使软件的持续集成变成可能。\n\u003c/code\u003e\u003c/pre\u003e","title":"Jenkins with Grunt"},{"content":"Header 定义 提供HTTP所需要的信息或发送的信息\nHTTP header fields provide required information about the request or response, or about the object sent in the message body.\n分类 General-header：常用的http请求或响应的header信息\nCache-Control：缓存控制\nConnection：请求后的链接状态，Connection/keep-alive/close\nDate：时间戳，支持这三种格式\nSun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036 Sun Nov 6 08:49:37 1994 ; ANSI C\u0026#39;s asctime() format Pragma：未来将不会使用 Trailer：指定内容将采用何种格式 Transfer-Encoding Content-Length Trailer Transfer-Encoding：传输的编码，与content-encoding不一样\nUpgrade：支持其它的协议HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11\nVia：定义协议和接收者\nWarning：存储额外的信息，如状态或消息\nClient Request-header：仅包括请求部分的header信息\nAccept：接收的内容类型\nAccept-Charset：接收的字符集\nAccept-Encoding：字符编码\nAccept-Language：语言\nAuthorization：权限请求内容，参考SuperTest-header:Auth设置\nCookie：Cookie设置\nExpect：期望的服务器行为\nFrom：请求来源，指定的邮件地址\nIf-Match：请求服务器的执行Match的tag，如果match上，则执行；否则返回412状态\nIf-Modified-Since：与If-Match类似，对比内容为时间\nIf-Range：可定义If-Match与If-Modified-Since两个维度的内容，或一个维度的内容\nIf-Unmodified-Since：如果没有修改，与If-Modified-Since类似\nMax-Forwards：最大代理和网关的跳转次数，防止出现无限循环\nProxy-Authorization：代理的权限\nRange：请求内容的部分次序\nReferer：指定相关的地址\nTE：Transfer-Encoding 的扩展\nUser-Agent：使用的客户端及版本\nServer Response-header：仅包括响应的header信息\nAccept-Ranges：指定接收资源的次序\nAge： 生成response的时间\nETag： 值标签\nLocation： 重定向的URI地址，绝对地址\nProxy-Authenticate： 代理权限\nRetry-After： 状态码503出现后，多久重试\nServer： 说明使用的服务器及一些comments\nSet-Cookie： 设置返回的cookie值\nVary： 定义header中的多个资源\nWWW-Authenticate： 必须在401返回状态中，权限内容\nEntity-header：请求数据body或资源部分\nAllow： 具体的请求方法，Get/POST等\nContent-Encoding： 定义整个资源的媒介类型\nContent-Language\nContent-Length\nContent-Location\nContent-MD5\nContent-Range\nContent-Type\nExpires： 失效时间\nLast-Modified： 最后修改时间\n参考资料 Heder分类：http://www.tutorialspoint.com/http/http_header_fields.htm ","permalink":"https://shiyuanjie.cn/posts/APITest/Http-Header/","summary":"\u003ch1 id=\"header\"\u003eHeader\u003c/h1\u003e\n\u003ch2 id=\"定义\"\u003e定义\u003c/h2\u003e\n\u003cp\u003e提供HTTP所需要的信息或发送的信息\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eHTTP header fields provide required information about the request or response, or about the object sent in the message body.\u003c/code\u003e\u003c/p\u003e","title":"Http-Header"},{"content":"SuperTest SuperTest-API测试 Auth分类 Basic:基本身份认证，直接采用：用户名密码 基本用法 1 2 3 4 5 6 it(\u0026#39;should receive a status code of 200 with login\u0026#39;, function(done) { request(url) .get(\u0026#39;/staging\u0026#39;) .auth(\u0026#39;the-username\u0026#39;, \u0026#39;the-password\u0026#39;) .expect(200, done); }); Base64加密 1 .set(\u0026#34;Authorization\u0026#34;, \u0026#34;basic \u0026#34; + new Buffer(\u0026#34;username:password\u0026#34;).toString(\u0026#34;base64\u0026#34;)) Digest:摘要式身份认证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 request.get(\u0026#39;http://some.server.com/\u0026#39;).auth(\u0026#39;username\u0026#39;, \u0026#39;password\u0026#39;, false); // or request.get(\u0026#39;http://some.server.com/\u0026#39;, { \u0026#39;auth\u0026#39;: { \u0026#39;user\u0026#39;: \u0026#39;username\u0026#39;, \u0026#39;pass\u0026#39;: \u0026#39;password\u0026#39;, \u0026#39;sendImmediately\u0026#39;: false } }); // or request.get(\u0026#39;http://some.server.com/\u0026#39;).auth(null, null, true, \u0026#39;bearerToken\u0026#39;); // or request.get(\u0026#39;http://some.server.com/\u0026#39;, { \u0026#39;auth\u0026#39;: { \u0026#39;bearer\u0026#39;: \u0026#39;bearerToken\u0026#39; } }); OAuth Authentication 例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 var OAuth = require(\u0026#39;openauth\u0026#39;); var request = require(\u0026#39;superagent\u0026#39;); require(\u0026#39;superagent-openauth\u0026#39;)(request); var oauth = new OAuth(consumerKey, consumerSecret, {...}); request.post(\u0026#39;https://api.twitter.com/1.1/statuses/update.json\u0026#39;) .sign(oauth, token, tokenSecret) .type(\u0026#39;urlencoded\u0026#39;) .send({status: \u0026#39;hello world\u0026#39;}) .end(function(res) { console.log(res.status, res.body); }); OAuth 1 1 request.sign(oauth, token, secret); oauth: OAuth instance token: string access token secret: string access token secret\nOAuth 2 1 request.sign(oauth, token); oauth: OAuth2 instance token: string access token\nKerberos 完成二次认证交互，第三次再进行业务交互。传输过程中没有密码 示意图 参考资料 Authentication分类介绍: http://docs.python-requests.org/en/master/user/authentication/ Basic Authentication: https://en.wikipedia.org/wiki/Basic_access_authentication(https://en.wikipedia.org/wiki/Basic_access_authentication) Digest Authentication: https://en.wikipedia.org/wiki/Digest_access_authentication Kerberos：http://searchsecurity.techtarget.com/definition/Kerberos Kerberos Explained:https://msdn.microsoft.com/en-us/library/bb742516.aspx Superagent-openauth:https://www.npmjs.com/package/superagent-openauth ","permalink":"https://shiyuanjie.cn/posts/SuperTest/SuperTest-header-Auth%E8%AE%BE%E7%BD%AE/","summary":"\u003ch1 id=\"supertest\"\u003eSuperTest\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://aimer1124.github.io/2016/01/17/SuperTest/\"\u003eSuperTest-API测试\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"auth分类\"\u003eAuth分类\u003c/h1\u003e\n\u003ch2 id=\"basic基本身份认证直接采用用户名密码\"\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Basic_access_authentication\"\u003eBasic\u003c/a\u003e:基本身份认证，直接采用：用户名密码\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e基本用法\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;should receive a status code of 200 with login\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edone\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/staging\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eauth\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;the-username\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;the-password\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexpect\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003edone\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eBase64加密\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Authorization\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;basic \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eBuffer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;username:password\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003etoString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;base64\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003c!-- more --\u003e\n\u003ch2 id=\"digest摘要式身份认证\"\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Digest_access_authentication\"\u003eDigest\u003c/a\u003e:摘要式身份认证\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;http://some.server.com/\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003eauth\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;username\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;password\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// or\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;http://some.server.com/\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;auth\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s1\"\u003e\u0026#39;user\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;username\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s1\"\u003e\u0026#39;pass\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;password\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s1\"\u003e\u0026#39;sendImmediately\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// or\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;http://some.server.com/\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003eauth\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;bearerToken\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// or\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;http://some.server.com/\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;auth\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s1\"\u003e\u0026#39;bearer\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;bearerToken\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"oauth-authentication\"\u003e\u003ca href=\"http://oauth.net/core/1.0/\"\u003eOAuth Authentication\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e例子\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003eOAuth\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003erequire\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;openauth\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003erequest\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003erequire\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;superagent\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erequire\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;superagent-openauth\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"nx\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003eoauth\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eOAuth\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econsumerKey\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003econsumerSecret\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{...});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;https://api.twitter.com/1.1/statuses/update.json\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esign\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eoauth\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003etokenSecret\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;urlencoded\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esend\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"nx\"\u003estatus\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;hello world\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estatus\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eOAuth 1\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esign\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eoauth\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003esecret\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003ccode\u003eoauth: OAuth instance token: string access token secret: string access token secret\u003c/code\u003e\u003c/p\u003e","title":"SuperTest-header:Auth设置"},{"content":"\n之前梳理的Gauge的资料，存放到这里，便于以后使用。\n","permalink":"https://shiyuanjie.cn/posts/APITest/Gauge%E5%AD%A6%E4%B9%A0/","summary":"\u003cp\u003e\u003cpicture\u003e\u003csource srcset=\"/posts/APITest/Gauge%E5%AD%A6%E4%B9%A0/github.Gauge_hu_f65b12bcecb337b2.webp\" type=\"image/webp\"\u003e\u003cimg alt=\"Gauge脑图\" loading=\"lazy\" src=\"/posts/APITest/Gauge%E5%AD%A6%E4%B9%A0/github.Gauge.png\"\u003e\u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e之前梳理的\u003ca href=\"http://getgauge.io/\"\u003eGauge\u003c/a\u003e的资料，存放到这里，便于以后使用。\u003c/p\u003e","title":"Gauge学习"},{"content":"测试验证码，收到客户投诉 Scenario 作为普通用户,在用户注册时，可通过获取短信码使用手机号进行注册 功能 用户注册时，需要测试手机号码与获取的短信码是否能正常收到且匹配。 短信验证码由本项目生成,但由第三方来发送 验证码发送是由第三方提供的，无法完全Mock 数据库中会记录收到的短信验证码. 测试策略 测试验证码能否匹配时,用了自己的手机号码来测试. 后面再测试是否匹配时,发现没有手机号码可用,就 随机 输入了手机号码进行测试,通过查询数据库来获取验证码 Tricky 如上进行了一阵子测试,由于是国内某银行项目,后面就收到了客户投诉: 没有进行任何的操作,便收到了短信验证码 分析 是否每次测试时,都需要通过第三方来发送短信验证码. 仅Mock第三方收到请求,不需要每次都真实的发送短信功能 TIPS 测试中,一定要确保 普通用户 不会收到短信验证码 同样返回内容,在不同的浏览器中显示不同 Scenario 作为普通用户,在浏览页面时,可查看到Title显示的内容 功能 需要从第三方系统中获取指定的内容,返回给浏览器,并显示到Title 测试策略 为确保兼容性,使用不同的浏览器进行查看 涉及浏览器: Chrome,FireFox,IE Tricky 仅Chrome查看正常显示,FireFox/IE查看均会显示 部分 乱码 分析 返回的内容中有 Unicode 值为15的内容,这个返回值引起的显示乱码 TIPS 在对第三方集成时,一定要先针对所有输入/输出内容均进行字符集处理.确保所用的字符集均一致 同样的样式，在同一类浏览器中显示不同 Scenario 作为普通用户，在浏览页面时，可查看到正确的页面显示与布局 功能 在页面布局测试时，需要查看页面的显示与布局的正确性 测试策略 使用浏览器查看页面的显示与布局 Tricky 在测试电脑中，发现页面的布局中的样式有问题（按钮被换行） 在DEV的电脑中完全是好的（使用的同一发布版本进行测试） 分析 浏览器的版本是完全一致 浏览器的 缩放比例 不同，测试电脑的页面被设置为 缩放90% TIPS 在测试页面的显示和样式时，一定要确保页面 浏览器版本、页面缩放 完全一致 PaaS平台部署后，时间出现偏差 Scenario 作为普通用户，在注册新用户时，需要使用获取的验证码在5分钟内进行验证，否则验证码失效 功能 页面前端点击 获取验证码 后，需要在生成验证码5分钟内，进行注册 生成的验证码会存储在 数据库 中 生成验证码是由程序代码生成，有效期的验证是由生成验证码时生成的Createtime和当前时间比较 测试策略 在点击 获取验证码 后，从数据库中查询生成的 验证码 通过查询的验证码，进行用户注册 Tricky 在点击 获取验证码 后，直接去数据库中查询验证码 使用查询获取的验证码，在进行用户注册时，提示验证码已过期(查询与注册的时间操作差，绝对在5分钟内) 分析 此功能在非PaaS平台时完全正常的 部署到Paas平台后，在PaaS平台时，程序代码是部署到一台机器、数据库部署在另外一台机器 验证码的生成时间是由数据库脚本生成，获取的数据库的当前插入时间 验证码有效期验证时，当前时间为从程序代码部署的机器获取当前系统时间 两台部署机器时区设置不一致(程序代码：Asia/Shanghai，数据库:Etc/Zulu)，两个时区相差8小时 TIPS 部署环境时，一定要先确保时间的设置是否会对功能有影响 涉及到时间处理时，一定确保使用的是统一的参考时间 Mock的模块在集成后，Mock相关的功能出错 Scenario 作为普通用户，在查看个人账户时，可查看到账户余额 功能 普通用户在查看个人账户时，需要通过系统去查询第三方系统数据 在开发环境中第三方系统无法直接连接进行调试开发，因此提前做了Mock进行开发 测试策略 测试时，正常使用个人账户查询结果 Tricky 在到ST测试环境时，无法正常查询账户余额。数据解析报错 分析 使用Mock返回的数据时，在ST环境可正常查询 但使用第三方真实返回的数据查询时，在ST便会报错 对真实数据进行分析，发现数据结构已与之前Mock的不同 TIPS 针对Mock系统，一定要有对应的测试，确保接口的正确性及数据正确性 针对需要Mock的功能，一定要定期与集成方沟通，确保开发功能、接口变同的同步 特定文件内容无法上传到生产环境，其它环境均正常 Scenario 作为注册用户，在个人信息中，可上传文档 功能 注册用户，可使用上传文档功能，上传个人文档 针对上传的文件内容及类型均无限制（由于系统是特定人群使用，所以对文件类型均没有限制），文件大小此处不考虑 测试策略 针对上传文件类型进行测试：txt/exe/pdf/doc等 Tricky 上传txt/html时，若文件以**\u0026lt;**开头时，上传功能在其它环境均可正常使用，但在生产环境则上传会失败 分析 生产环配制有网关，会对文件内容进行过滤 若文件html/js/txt文件中以**\u0026lt;开头时，则会被判断为注入**文件 TIPS 作为测试人员，也要对安全测试常出现的问题进行考虑 参考资料 PAAS：https://en.wikipedia.org/wiki/Platform_as_a_service 时区差：https://en.wikipedia.org/wiki/List_of_tz_database_time_zones Asia/Shanghai:https://en.wikipedia.org/wiki/Asia/Shanghai Etc/Zulu:http://www.prokerala.com/travel/timezones/Etc/Zulu Mock：https://en.wikipedia.org/wiki/MockServer ST测试：https://en.wikipedia.org/wiki/System_testing 安全测试：http://www.ltesting.net/ceshi/ceshijishu/aqcs/2015/0104/207771.html ","permalink":"https://shiyuanjie.cn/posts/QA/Tricky-test/","summary":"\u003ch2 id=\"测试验证码收到客户投诉\"\u003e测试\u003ccode\u003e验证码\u003c/code\u003e，收到客户投诉\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eScenario\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e作为普通用户,在用户注册时，可通过获取短信码使用手机号进行注册\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e功能\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e用户注册时，需要测试手机号码与获取的短信码是否能正常收到且匹配。\u003c/li\u003e\n\u003cli\u003e短信验证码由本项目生成,但由第三方来发送\u003c/li\u003e\n\u003cli\u003e验证码发送是由第三方提供的，无法完全Mock\u003c/li\u003e\n\u003cli\u003e数据库中会记录收到的短信验证码.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e测试策略\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e测试验证码能否匹配时,用了自己的手机号码来测试.\u003c/li\u003e\n\u003cli\u003e后面再测试是否匹配时,发现没有手机号码可用,就 \u003cstrong\u003e随机\u003c/strong\u003e 输入了手机号码进行测试,通过查询数据库来获取验证码\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eTricky\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e如上进行了一阵子测试,由于是国内某银行项目,后面就收到了客户投诉: \u003cstrong\u003e没有进行任何的操作,便收到了短信验证码\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e分析\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e是否每次测试时,都需要通过第三方来发送短信验证码.\u003c/li\u003e\n\u003cli\u003e仅Mock第三方收到请求,不需要每次都真实的发送短信功能\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eTIPS\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e测试中,一定要确保 \u003cstrong\u003e普通用户\u003c/strong\u003e 不会收到短信验证码\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- more --\u003e\n\u003ch2 id=\"同样返回内容在不同的浏览器中显示不同\"\u003e同样\u003ccode\u003e返回内容\u003c/code\u003e,在不同的浏览器中显示不同\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eScenario\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e作为普通用户,在浏览页面时,可查看到Title显示的内容\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e功能\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e需要从第三方系统中获取指定的内容,返回给浏览器,并显示到Title\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e测试策略\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e为确保兼容性,使用不同的浏览器进行查看\u003c/li\u003e\n\u003cli\u003e涉及浏览器: \u003cstrong\u003eChrome,FireFox,IE\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eTricky\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e仅Chrome查看正常显示,FireFox/IE查看均会显示 \u003cstrong\u003e部分\u003c/strong\u003e 乱码\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e分析\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e返回的内容中有 \u003cstrong\u003eUnicode\u003c/strong\u003e 值为15的内容,这个返回值引起的显示乱码\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eTIPS\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e在对第三方集成时,一定要先针对所有输入/输出内容均进行字符集处理.确保所用的字符集均一致\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"同样的样式在同一类浏览器中显示不同\"\u003e同样的\u003ccode\u003e样式\u003c/code\u003e，在同一类浏览器中显示不同\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eScenario\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e作为普通用户，在浏览页面时，可查看到正确的页面显示与布局\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e功能\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e在页面布局测试时，需要查看页面的显示与布局的正确性\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e测试策略\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e使用浏览器查看页面的显示与布局\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eTricky\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e在测试电脑中，发现页面的布局中的样式有问题（按钮被换行）\u003c/li\u003e\n\u003cli\u003e在DEV的电脑中完全是好的（使用的同一发布版本进行测试）\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e分析\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e浏览器的版本是完全一致\u003c/li\u003e\n\u003cli\u003e浏览器的 \u003cstrong\u003e缩放比例\u003c/strong\u003e 不同，测试电脑的页面被设置为 \u003cstrong\u003e缩放90%\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eTIPS\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e在测试页面的显示和样式时，一定要确保页面 \u003cstrong\u003e浏览器版本、页面缩放\u003c/strong\u003e 完全一致\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"paas平台部署后时间出现偏差\"\u003ePaaS平台部署后，时间出现\u003ccode\u003e偏差\u003c/code\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eScenario\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e作为普通用户，在注册新用户时，需要使用获取的验证码在5分钟内进行验证，否则验证码失效\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e功能\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e页面前端点击 \u003cstrong\u003e获取验证码\u003c/strong\u003e 后，需要在生成验证码5分钟内，进行注册\u003c/li\u003e\n\u003cli\u003e生成的验证码会存储在 \u003cstrong\u003e数据库\u003c/strong\u003e 中\u003c/li\u003e\n\u003cli\u003e生成验证码是由程序代码生成，有效期的验证是由生成验证码时生成的\u003cstrong\u003eCreatetime\u003c/strong\u003e和\u003cstrong\u003e当前时间\u003c/strong\u003e比较\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e测试策略\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e在点击 \u003cstrong\u003e获取验证码\u003c/strong\u003e 后，从数据库中查询生成的 \u003cstrong\u003e验证码\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e通过查询的验证码，进行用户注册\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eTricky\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e在点击 \u003cstrong\u003e获取验证码\u003c/strong\u003e 后，直接去数据库中查询\u003cstrong\u003e验证码\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e使用查询获取的\u003cstrong\u003e验证码\u003c/strong\u003e，在进行用户注册时，提示验证码已过期(查询与注册的时间操作差，\u003cstrong\u003e绝对\u003c/strong\u003e在5分钟内)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e分析\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e此功能在非\u003ca href=\"https://en.wikipedia.org/wiki/Platform_as_a_service\"\u003ePaaS\u003c/a\u003e平台时完全正常的\u003c/li\u003e\n\u003cli\u003e部署到Paas平台后，在\u003ca href=\"https://en.wikipedia.org/wiki/Platform_as_a_service\"\u003ePaaS\u003c/a\u003e平台时，程序代码是部署到一台机器、数据库部署在\u003cstrong\u003e另外\u003c/strong\u003e一台机器\u003c/li\u003e\n\u003cli\u003e验证码的生成时间是由数据库脚本生成，获取的数据库的当前插入时间\u003c/li\u003e\n\u003cli\u003e验证码有效期验证时，\u003cstrong\u003e当前时间\u003c/strong\u003e为从\u003cstrong\u003e程序代码\u003c/strong\u003e部署的机器获取\u003cstrong\u003e当前系统时间\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e两台部署机器时区设置不一致(程序代码：\u003cstrong\u003eAsia/Shanghai\u003c/strong\u003e，数据库:\u003cstrong\u003eEtc/Zulu\u003c/strong\u003e)，两个时区相差8小时\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eTIPS\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e部署环境时，一定要先确保时间的设置是否会对功能有影响\u003c/li\u003e\n\u003cli\u003e涉及到时间处理时，一定确保使用的是\u003cstrong\u003e统一\u003c/strong\u003e的参考时间\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"mock的模块在集成后mock相关的功能出错\"\u003eMock的模块在集成后，Mock相关的\u003ccode\u003e功能出错\u003c/code\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eScenario\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e作为普通用户，在查看个人账户时，可查看到账户余额\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e功能\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e普通用户在查看个人账户时，需要通过系统去查询第三方系统数据\u003c/li\u003e\n\u003cli\u003e在开发环境中第三方系统无法直接连接进行调试开发，因此提前做了Mock进行开发\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e测试策略\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e测试时，正常使用个人账户查询结果\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eTricky\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e在到\u003cstrong\u003eST测试\u003c/strong\u003e环境时，无法正常查询账户余额。数据解析报错\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e分析\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e使用Mock返回的数据时，在ST环境可正常查询\u003c/li\u003e\n\u003cli\u003e但使用第三方\u003cstrong\u003e真实\u003c/strong\u003e返回的数据查询时，在ST便会报错\u003c/li\u003e\n\u003cli\u003e对\u003cstrong\u003e真实\u003c/strong\u003e数据进行分析，发现\u003cstrong\u003e数据结构\u003c/strong\u003e已与之前Mock的不同\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eTIPS\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e针对Mock系统，一定要有对应的测试，确保接口的正确性及数据正确性\u003c/li\u003e\n\u003cli\u003e针对需要Mock的功能，一定要定期与集成方沟通，确保开发功能、接口变同的同步\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"特定文件内容无法上传到生产环境其它环境均正常\"\u003e特定文件内容无法上传到\u003ccode\u003e生产环境\u003c/code\u003e，其它环境均正常\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eScenario\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e作为注册用户，在个人信息中，可上传文档\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e功能\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e注册用户，可使用\u003cstrong\u003e上传文档\u003c/strong\u003e功能，上传个人文档\u003c/li\u003e\n\u003cli\u003e针对上传的文件内容及类型均无限制（由于系统是\u003cstrong\u003e特定\u003c/strong\u003e人群使用，所以对文件\u003cstrong\u003e类型\u003c/strong\u003e均没有限制），\u003cstrong\u003e文件大小\u003c/strong\u003e此处不考虑\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e测试策略\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e针对上传文件类型进行测试：txt/exe/pdf/doc等\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eTricky\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e上传txt/html时，若文件以**\u0026lt;**开头时，上传功能在其它环境均可正常使用，但在生产环境则上传会失败\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e分析\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e生产环配制有网关，会对文件内容进行过滤\u003c/li\u003e\n\u003cli\u003e若文件html/js/txt文件中以**\u0026lt;\u003cstrong\u003e开头时，则会被判断为\u003c/strong\u003e注入**文件\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eTIPS\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e作为测试人员，也要对\u003cstrong\u003e安全测试\u003c/strong\u003e常出现的问题进行考虑\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"参考资料\"\u003e参考资料\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePAAS：\u003ca href=\"https://en.wikipedia.org/wiki/Platform_as_a_service\"\u003ehttps://en.wikipedia.org/wiki/Platform_as_a_service\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e时区差：\u003ca href=\"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\"\u003ehttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAsia/Shanghai:\u003ca href=\"https://en.wikipedia.org/wiki/Asia/Shanghai\"\u003ehttps://en.wikipedia.org/wiki/Asia/Shanghai\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEtc/Zulu:\u003ca href=\"http://www.prokerala.com/travel/timezones/Etc/Zulu\"\u003ehttp://www.prokerala.com/travel/timezones/Etc/Zulu\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMock：\u003ca href=\"https://en.wikipedia.org/wiki/MockServer\"\u003ehttps://en.wikipedia.org/wiki/MockServer\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eST测试：\u003ca href=\"https://en.wikipedia.org/wiki/System_testing\"\u003ehttps://en.wikipedia.org/wiki/System_testing\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e安全测试：\u003ca href=\"http://www.ltesting.net/ceshi/ceshijishu/aqcs/2015/0104/207771.html\"\u003ehttp://www.ltesting.net/ceshi/ceshijishu/aqcs/2015/0104/207771.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"Tricky test scenario"},{"content":"20220325 更新hugo版本，重新写起来 更新hugo版本至0.95 添加HCIA文章 20200402 启用网站本地搜索功能 启用本地搜索功能 使用百度搜索 20200401 CodeStyle变更为monokai 调整Code Style为monokai\n20200325 ECS+备案 重大更新\n站点生成从Hexo转移至Hugo 将源公开站点信息拖管至Github的Private仓库 将站点资源部署在阿里云的ECS中，在阿里云中申请SSL证书并关联网站 申请网站备案号 原有busuanzi统计全部失效，重新统计 按类型整理源文章，更新至对应的Folder 20200108 Donate 增加Donate功能(Alipay \u0026amp; wechat) 关闭右侧Tag功能 20200104 icarus主题 添加Theme Module，切换Theme至icarus git submodule add https://github.com/aimer1124/hexo-theme-icarus themes/icarus 20191225 更新Hexo版本 更新Node:12, Hexo:4 20191217 增加HTTPS 增加站点的HTTPS的功能，https://shiyuanjie.cn 20191216 替换留言功能Valine 更新留言功能至Valine，Theme Update git submodule update --init --remote -- themes/themeHexo ga themes/themeHexo gc -m \u0026#39;Update Comments Plugin\u0026#39; gp 20181018 弃用Qiniu 由于qiniu官网的更新 每30天就会更换测试域名的地址，如果继续用未备案的域名的话，每30天就要把整个网站床图地址更新一遍，用了后期便于维护，把所有相关的图片都从qiniu迁移至github进行托管 20181017 启用卜算子统计 更新busuanzi官方链接：busuanzi.ibruce.info 20170322 评论转为Disqus 由于之前用的评论插件多说要关闭服务了，所以将评论的内容转移至Disqus 由于迁移后的原评论无法直接导入，所以原有评论均被清空了 , 20160926 添加本站的累积访问数据 添加页脚的访问总量和访客数\n删除post.jade中的busuanzijs引用\n添加footer.jade中的数据显示\n| Total if theme.busuanzi == true span##busuanzi_container_site_pv span= \u0026#39; \u0026#39; span(rel=\u0026#39;nofollow\u0026#39;)##busuanzi_value_site_pv span(rel=\u0026#39;nofollow\u0026#39;)= \u0026#39; \u0026#39; + __(\u0026#39; hits, \u0026#39;) span##busuanzi_container_site_uv span(rel=\u0026#39;nofollow\u0026#39;)##busuanzi_value_site_uv span(rel=\u0026#39;nofollow\u0026#39;)= \u0026#39; \u0026#39; + __(\u0026#39; vistors.\u0026#39;) 添加after_footer.jade中busuanzi的引用 if theme.busuanzi == true script(src=\u0026#39;https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js\u0026#39;, async) 20160922 调整所有MD源文件命名 取消所有源MD文件的类型分类，源文件分类已无法直接区分文件内容，直接去掉 20160919 修复提交raw分支时，会将domain清除 在theme/source下添加CNAME文件，配制domain: shiyuanjie.cn地址\n添加个人开发者头条信息分享号: 测试之自动化\n20160918 添加域名绑定及数据统计 域名 购买shiyuanjie.cn域名 配制Github解析地址 完成Github站点绑定 测试新地址 统计数据 添加百度关于站点数据统计 新域名会清除原有的卜算子页面请求统计 20160914 部署由Travis来完成 添加新的分支raw,存储所有原文件，便于离线维护 将已修改的theme主题，提交至Github的Repo中https://github.com/aimer1124/blog_theme，便于自行维护，添加.gitmodules文件 配制Travis文件 配制.gitignore将不需要提交的文件添加进来 20160913 取消文章标题中的类型说明 文章标题中的类型有点重复，精简下 20160312 补加几篇去年看书的读后感 文章的创建时间修改的与去年的读完时间基本相符，这样便于回顾 内容都是从自己的笔记和回忆梳理的，以后要在看完书后，及时写下读后感 只加了去年看书的一部分，其它的后面整理好了再加上来 20160309 添加404跳转页面 添加在访问请求资源不存在时，的404跳转页面 20160227 屏蔽RSS功能，添加好友 屏蔽RSS功能，暂时用不上。在theme/maupassant目录中的_config.yml文件中，屏蔽RSS对应的配制 添加link好友sigh的功能 20160224 更换Theme：maupassant Yelee的UI比较不错，但不够简洁。好吧，我是一个俗人 maupassant确实是一个UI比较简洁的Theme，so，更换Theme为maupassant 20160130 更换Theme:Yelee 玩Next有几天，对Next有几点不太满意，可能是还没有玩透彻吧。最终决定换成：Yelle\n标签的链接功能总是不能用 左连的sidebar也总是无法显示出来(已设置sidebar:always) 已经完成更换Theme，对Yelle还挺满意的。\n20160117 搭建并发布第一篇文章 虽然搭建成功有几天，但最终还是想把维护的过程Mark下来\nHexo Hexo,一个简单、快速、功能强大的Blog搭建框架 A fast, simple \u0026amp; powerful blog framework 安装Hexo 1 2 3 4 5 npm install hexo-cli -g hexo init blog cd blog npm install hexo server 脑图 配制 Hexo提供了大量主题，可随意选择（Theme）。最终选择主题Next 图片存储服务器，选择7牛 文章管理，使用Hexo admin 发布第一篇文章 使用Hexo admin创建文章 启动Hexo admin 1 hexo s 新增Post，并完成编写+发布 生成部署文件 hexo g 部署到Github hexo d ","permalink":"https://shiyuanjie.cn/posts/Blog/%E7%AB%99%E7%82%B9%E6%90%AD%E5%BB%BA%E8%BF%87%E7%A8%8B/","summary":"\u003ch2 id=\"20220325-更新hugo版本重新写起来\"\u003e20220325 更新hugo版本，重新写起来\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e更新hugo版本至0.95\u003c/li\u003e\n\u003cli\u003e添加HCIA文章\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"20200402-启用网站本地搜索功能\"\u003e20200402 启用网站本地搜索功能\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e启用本地搜索功能\u003c/li\u003e\n\u003cli\u003e使用\u003ccode\u003e百度\u003c/code\u003e搜索\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"20200401-codestyle变更为monokai\"\u003e20200401 CodeStyle变更为monokai\u003c/h2\u003e\n\u003cp\u003e调整Code Style为\u003ccode\u003emonokai\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"20200325-ecs备案\"\u003e20200325 ECS+备案\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e重大更新\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e站点生成从Hexo转移至Hugo\u003c/li\u003e\n\u003cli\u003e将源公开站点信息拖管至Github的Private仓库\u003c/li\u003e\n\u003cli\u003e将站点资源部署在阿里云的ECS中，在阿里云中申请SSL证书并关联网站\u003c/li\u003e\n\u003cli\u003e申请网站备案号\u003c/li\u003e\n\u003cli\u003e原有busuanzi统计全部失效，\u003ccode\u003e重新统计\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e按类型整理源文章，更新至对应的Folder\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"20200108-donate\"\u003e20200108 Donate\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e增加Donate功能(Alipay \u0026amp; wechat)\u003c/li\u003e\n\u003cli\u003e关闭右侧Tag功能\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"20200104-icarus主题\"\u003e20200104 icarus主题\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e添加Theme Module，切换Theme至\u003ca href=\"https://github.com/ppoffice/hexo-theme-icarus\"\u003eicarus\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egit submodule add https://github.com/aimer1124/hexo-theme-icarus themes/icarus\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"20191225-更新hexo版本\"\u003e20191225 更新Hexo版本\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e更新Node:12, Hexo:4\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"20191217-增加https\"\u003e20191217 增加HTTPS\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e增加站点的HTTPS的功能，\u003ca href=\"https://shiyuanjie.cn\"\u003ehttps://shiyuanjie.cn\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"20191216-替换留言功能valine\"\u003e20191216 替换留言功能Valine\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e更新留言功能至\u003ca href=\"https://valine.js.org/quickstart.html\"\u003eValine\u003c/a\u003e，\u003ca href=\"https://github.com/aimer1124/blog_theme/tree/0416c9baa795a024364c6470b1cedad3450dfc2e\"\u003eTheme Update\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egit submodule update --init --remote -- themes/themeHexo\nga themes/themeHexo\ngc -m \u0026#39;Update Comments Plugin\u0026#39;\ngp\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"20181018-弃用qiniu\"\u003e20181018 弃用Qiniu\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e由于qiniu官网的\u003ca href=\"https://developer.qiniu.com/fusion/kb/1319/test-domain-access-restriction-rules\"\u003e更新\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e每30天就会更换测试域名的地址，如果继续用未备案的域名的话，每30天就要把整个网站床图地址更新一遍，用了后期便于维护，把所有相关的图片都从qiniu迁移至github进行托管\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"20181017-启用卜算子统计\"\u003e20181017 启用卜算子统计\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e更新\u003ccode\u003ebusuanzi\u003c/code\u003e官方链接：busuanzi.ibruce.info\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"20170322-评论转为disqus\"\u003e20170322 评论转为Disqus\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e由于之前用的评论插件多说要关闭服务了，所以将评论的内容转移至\u003ca href=\"https://disqus.com/\"\u003eDisqus\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e由于迁移后的原评论无法直接导入，所以原有评论均被清空了  \u003ccode\u003e,\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"20160926-添加本站的累积访问数据\"\u003e20160926 添加本站的累积访问数据\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e添加页脚的\u003ccode\u003e访问总量\u003c/code\u003e和\u003ccode\u003e访客数\u003c/code\u003e\u003c/p\u003e","title":"站点搭建过程"},{"content":"moment库 专门用于Javascript的时间转化、验证、处理、展示 安装moment npm install moment 使用moment 引用moment 1 var moment = require(\u0026#39;moment\u0026#39;); 转化时间 1 2 3 4 5 6 7 //将时间格式转化为：2016-01-22 21:21:26 moment(new Date()).format(\u0026#34;YYYY-MM-DD HH:mm:ss\u0026#34;); moment().format(\u0026#39;MMMM Do YYYY, h:mm:ss a\u0026#39;); // January 26th 2016, 10:25:00 pm moment().format(\u0026#39;dddd\u0026#39;); // Tuesday moment().format(\u0026#34;MMM Do YY\u0026#34;); // Jan 26th 16 moment().format(\u0026#39;YYYY [escaped] YYYY\u0026#39;); // 2016 escaped 2016 moment().format(); // 2016-01-26T22:25:24+08:00 相对时间 1 2 3 4 5 moment(\u0026#34;20111031\u0026#34;, \u0026#34;YYYYMMDD\u0026#34;).fromNow(); // 4 years ago moment(\u0026#34;20120620\u0026#34;, \u0026#34;YYYYMMDD\u0026#34;).fromNow(); // 4 years ago moment().startOf(\u0026#39;day\u0026#39;).fromNow(); // a day ago moment().endOf(\u0026#39;day\u0026#39;).fromNow(); // in 2 hours moment().startOf(\u0026#39;hour\u0026#39;).fromNow(); 日历时间 1 2 3 4 5 6 7 8 moment().subtract(10, \u0026#39;days\u0026#39;).calendar(); // 01/16/2016 moment().subtract(6, \u0026#39;days\u0026#39;).calendar(); // Last Wednesday at 10:27 PM moment().subtract(3, \u0026#39;days\u0026#39;).calendar(); // Last Saturday at 10:27 PM moment().subtract(1, \u0026#39;days\u0026#39;).calendar(); // Yesterday at 10:27 PM moment().calendar(); // Today at 10:27 PM moment().add(1, \u0026#39;days\u0026#39;).calendar(); // Tomorrow at 10:27 PM moment().add(3, \u0026#39;days\u0026#39;).calendar(); // Friday at 10:27 PM moment().add(10, \u0026#39;days\u0026#39;).calendar(); 其它应用 1 2 3 4 5 6 7 8 moment().format(\u0026#39;L\u0026#39;); // 01/26/2016 moment().format(\u0026#39;l\u0026#39;); // 1/26/2016 moment().format(\u0026#39;LL\u0026#39;); // January 26, 2016 moment().format(\u0026#39;ll\u0026#39;); // Jan 26, 2016 moment().format(\u0026#39;LLL\u0026#39;); // January 26, 2016 10:28 PM moment().format(\u0026#39;lll\u0026#39;); // Jan 26, 2016 10:28 PM moment().format(\u0026#39;LLLL\u0026#39;); // Tuesday, January 26, 2016 10:28 PM moment().format(\u0026#39;llll\u0026#39;); 其它使用：官方文档 API测试应用：Node.js 日期判断、对比 日期格式转化 ","permalink":"https://shiyuanjie.cn/posts/Tools/Node-js%E6%97%B6%E9%97%B4%E6%A0%BC%E5%BC%8F%E5%A4%84%E7%90%86/","summary":"\u003ch2 id=\"moment库\"\u003emoment库\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e专门用于Javascript的时间转化、验证、处理、展示\u003c/li\u003e\n\u003cli\u003e安装moment\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enpm install moment\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"使用moment\"\u003e使用moment\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e引用moment\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003emoment\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003erequire\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;moment\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003c!-- more --\u003e\n\u003cul\u003e\n\u003cli\u003e转化时间\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//将时间格式转化为：2016-01-22 21:21:26\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eDate\u003c/span\u003e\u003cspan class=\"p\"\u003e()).\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;YYYY-MM-DD HH:mm:ss\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;MMMM Do YYYY, h:mm:ss a\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"c1\"\u003e// January 26th 2016, 10:25:00 pm\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;dddd\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e                    \u003cspan class=\"c1\"\u003e// Tuesday\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;MMM Do YY\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e               \u003cspan class=\"c1\"\u003e// Jan 26th 16\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;YYYY [escaped] YYYY\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e     \u003cspan class=\"c1\"\u003e// 2016 escaped 2016\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e                          \u003cspan class=\"c1\"\u003e// 2016-01-26T22:25:24+08:00\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e相对时间\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;20111031\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;YYYYMMDD\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003efromNow\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 4 years ago\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;20120620\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;YYYYMMDD\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003efromNow\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 4 years ago\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003estartOf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;day\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003efromNow\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e        \u003cspan class=\"c1\"\u003e// a day ago\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eendOf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;day\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003efromNow\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e          \u003cspan class=\"c1\"\u003e// in 2 hours\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003estartOf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;hour\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003efromNow\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e      \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e日历时间\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003esubtract\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;days\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003ecalendar\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 01/16/2016\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003esubtract\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;days\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003ecalendar\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e  \u003cspan class=\"c1\"\u003e// Last Wednesday at 10:27 PM\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003esubtract\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;days\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003ecalendar\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e  \u003cspan class=\"c1\"\u003e// Last Saturday at 10:27 PM\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003esubtract\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;days\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003ecalendar\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e  \u003cspan class=\"c1\"\u003e// Yesterday at 10:27 PM\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003ecalendar\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e                      \u003cspan class=\"c1\"\u003e// Today at 10:27 PM\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;days\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003ecalendar\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e       \u003cspan class=\"c1\"\u003e// Tomorrow at 10:27 PM\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;days\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003ecalendar\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e       \u003cspan class=\"c1\"\u003e// Friday at 10:27 PM\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;days\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003ecalendar\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e     \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e其它应用\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;L\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e    \u003cspan class=\"c1\"\u003e// 01/26/2016\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;l\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e    \u003cspan class=\"c1\"\u003e// 1/26/2016\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;LL\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e   \u003cspan class=\"c1\"\u003e// January 26, 2016\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;ll\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e   \u003cspan class=\"c1\"\u003e// Jan 26, 2016\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;LLL\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \u003cspan class=\"c1\"\u003e// January 26, 2016 10:28 PM\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;lll\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \u003cspan class=\"c1\"\u003e// Jan 26, 2016 10:28 PM\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;LLLL\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"c1\"\u003e// Tuesday, January 26, 2016 10:28 PM\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003emoment\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;llll\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e其它使用：\u003ca href=\"http://momentjs.com/docs/\"\u003e官方文档\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"api测试应用nodejs\"\u003eAPI测试应用：Node.js\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e日期判断、对比\u003c/li\u003e\n\u003cli\u003e日期格式转化\u003c/li\u003e\n\u003c/ul\u003e","title":"Node.js时间格式处理"},{"content":"安装Mysql包 npm install mysql 调用 Mysql包 1 var mysql = require(\u0026#39;mysql\u0026#39;); 数据库查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 var mysql = require(\u0026#39;mysql\u0026#39;); var connection = mysql.createConnection({ host : \u0026#39;10.29.10.29\u0026#39;, port : 3307, user : \u0026#39;root\u0026#39;, password : \u0026#39;\u0026#39;, database : \u0026#39;emall\u0026#39;, //charset : \u0026#39;UTF8_GENERAL_CI\u0026#39;, debug : false }); connection.connect(); connection.query(\u0026#34;use emall\u0026#34;); connection.query(\u0026#39;select id from users\u0026#39;, function(err,results) { if (err) { throw err; } }); connection.end(); 数据库插入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 var mysql = require(\u0026#39;mysql\u0026#39;); var connection = mysql.createConnection({ host : \u0026#39;10.29.10.29\u0026#39;, port : 3307, user : \u0026#39;root\u0026#39;, password : \u0026#39;\u0026#39;, database : \u0026#39;emall\u0026#39;, //charset : \u0026#39;UTF8_GENERAL_CI\u0026#39;, debug : false }); connection.connect(); connection.query(\u0026#34;use emall\u0026#34;); var insertUser2 = \u0026#34;INSERT INTO `sms_verification_code` (`phone_number`, `code`) VALUES (\u0026#39;18392520000\u0026#39;, \u0026#39;018227\u0026#39;);\u0026#34;; connection.query(insertUser2,function(err,results,field){ if (err) { throw err; } }); connection.end();\tAPI测试应用：Node.js 初始化数据 数据CRUD 获取部分无返回值的Post结果，如：查询创建用户后，获取用户的ID ","permalink":"https://shiyuanjie.cn/posts/Tools/JS%E8%B0%83%E7%94%A8%E6%95%B0%E6%8D%AE%E5%BA%93/","summary":"\u003ch2 id=\"安装mysql包\"\u003e安装Mysql包\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enpm install mysql\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"调用-mysql包\"\u003e调用 Mysql包\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003emysql\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003erequire\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;mysql\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"数据库查询\"\u003e数据库查询\u003c/h2\u003e\n\u003c!-- more --\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003emysql\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003erequire\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;mysql\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003econnection\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003emysql\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003ehost\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;10.29.10.29\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eport\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e3307\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003euser\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;root\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003epassword\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003edatabase\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;emall\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e//charset : \u0026#39;UTF8_GENERAL_CI\u0026#39;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e    \u003cspan class=\"nx\"\u003edebug\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econnection\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econnect\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econnection\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;use emall\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econnection\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;select id from users\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nx\"\u003eresults\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econnection\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eend\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"数据库插入\"\u003e数据库插入\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003emysql\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003erequire\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;mysql\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003econnection\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003emysql\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003ehost\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;10.29.10.29\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eport\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e3307\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003euser\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;root\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003epassword\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003edatabase\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;emall\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e//charset : \u0026#39;UTF8_GENERAL_CI\u0026#39;,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e    \u003cspan class=\"nx\"\u003edebug\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econnection\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econnect\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econnection\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;use emall\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003einsertUser2\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;INSERT INTO `sms_verification_code` (`phone_number`, `code`) VALUES (\u0026#39;18392520000\u0026#39;, \u0026#39;018227\u0026#39;);\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econnection\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003einsertUser2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nx\"\u003eresults\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nx\"\u003efield\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econnection\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eend\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\t\t\t\t\t\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"api测试应用nodejs\"\u003eAPI测试应用：Node.js\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e初始化数据\u003c/li\u003e\n\u003cli\u003e数据CRUD\u003c/li\u003e\n\u003cli\u003e获取部分无返回值的Post结果，如：查询创建用户后，获取用户的ID\u003c/li\u003e\n\u003c/ul\u003e","title":"Node.js调用数据库:Mysql"},{"content":"find 查找文件，可指定遍历路径\n用法举例 查看当前目录下具体的文件 ~ find a.txt 在指定目录查找文件 ~ find ./Download -name \u0026#34;*.jpg\u0026#34; 查看目录下所有包括a的文件列表 ~ find . -name \u0026#34;Thought*\u0026#34; 查找大于100K的文件表列 ~ find . -name \u0026#34;Thought*\u0026#34; -size +100k 查找创建时间大于2天的 ~ find . -name \u0026#34;*.txt\u0026#34; -mtime +2 查看find的详细用法 FIND(1) BSD General Commands Manual FIND(1) NAME find -- walk a file hierarchy SYNOPSIS find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression] find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression] DESCRIPTION The find utility recursively descends the directory tree for each path listed, evaluating an expression (composed of the ``primaries\u0026#39;\u0026#39; and ``operands\u0026#39;\u0026#39; listed below) in terms of each file in the tree. The options are as follows: -E Interpret regular expressions followed by -regex and -iregex pri- maries as extended (modern) regular expressions rather than basic regular expressions (BRE\u0026#39;s). The re_format(7) manual page fully describes both formats. -H Cause the file information and file type (see stat(2)) returned for each symbolic link specified on the command line to be those of the file referenced by the link, not the link itself. If the referenced file does not exist, the file information and type will be for the link itself. File information of all symbolic links not on the command line is that of the link itself. -L Cause the file information and file type (see stat(2)) returned for each symbolic link to be those of the file referenced by the link, not the link itself. If the referenced file does not exist, the file information and type will be for the link itself. This option is equivalent to the deprecated -follow primary. -P Cause the file information and file type (see stat(2)) returned for each symbolic link to be those of the link itself. This is the default. -X Permit find to be safely used in conjunction with xargs(1). If a file name contains any of the delimiting characters used by xargs(1), a diagnostic message is displayed on standard error, and the file is skipped. The delimiting characters include sin- gle (`` \u0026#39; \u0026#39;\u0026#39;) and double (`` \u0026#34; \u0026#39;\u0026#39;) quotes, backslash (``\\\u0026#39;\u0026#39;), space, tab and newline characters. However, you may wish to consider the -print0 primary in conjunc- tion with ``xargs -0\u0026#39;\u0026#39; as an effective alternative. -d Cause find to perform a depth-first traversal, i.e., directories are visited in post-order and all entries in a directory will be acted on before the directory itself. By default, find visits directories in pre-order, i.e., before their contents. Note, the default is not a breadth-first traversal. This option is equivalent to the -depth primary of IEEE Std 1003.1-2001 (``POSIX.1\u0026#39;\u0026#39;). The -d option can be useful when find is used with cpio(1) to process files that are contained in directories with unusual permissions. It ensures that you have write permission while you are placing files in a directory, then sets the directory\u0026#39;s permissions as the last thing. -f Specify a file hierarchy for find to traverse. File hierarchies may also be specified as the operands immediately following the options. -s Cause find to traverse the file hierarchies in lexicographical order, i.e., alphabetical order within each directory. Note: `find -s\u0026#39; and `find | sort\u0026#39; may give different results. -x Prevent find from descending into directories that have a device number different than that of the file from which the descent began. This option is equivalent to the deprecated -xdev primary. PRIMARIES All primaries which take a numeric argument allow the number to be pre- ceded by a plus sign (``+\u0026#39;\u0026#39;) or a minus sign (``-\u0026#39;\u0026#39;). A preceding plus sign means ``more than n\u0026#39;\u0026#39;, a preceding minus sign means ``less than n\u0026#39;\u0026#39; and neither means ``exactly n\u0026#39;\u0026#39;. -Bmin n True if the difference between the time of a file\u0026#39;s inode cre- ation and the time find was started, rounded up to the next full minute, is n minutes. -Bnewer file Same as -newerBm. -Btime n[smhdw] If no units are specified, this primary evaluates to true if the difference between the time of a file\u0026#39;s inode creation and the time find was started, rounded up to the next full 24-hour period, is n 24-hour periods. If units are specified, this primary evaluates to true if the difference between the time of a file\u0026#39;s inode creation and the time find was started is exactly n units. Please refer to the -atime primary description for information on supported time units. -acl May be used in conjunction with other primaries to locate files with extended ACLs. See acl(3) for more information. -amin n True if the difference between the file last access time and the time find was started, rounded up to the next full minute, is n minutes. -anewer file Same as -neweram. -atime n[smhdw] If no units are specified, this primary evaluates to true if the difference between the file last access time and the time find was started, rounded up to the next full 24-hour period, is n 24-hour periods. If units are specified, this primary evaluates to true if the difference between the file last access time and the time find was started is exactly n units. Possible time units are as fol- lows: s second m minute (60 seconds) h hour (60 minutes) d day (24 hours) w week (7 days) Any number of units may be combined in one -atime argument, for example, ``-atime -1h30m\u0026#39;\u0026#39;. Units are probably only useful when used in conjunction with the + or - modifier. -cmin n True if the difference between the time of last change of file status information and the time find was started, rounded up to the next full minute, is n minutes. -cnewer file Same as -newercm. -ctime n[smhdw] If no units are specified, this primary evaluates to true if the difference between the time of last change of file status infor- mation and the time find was started, rounded up to the next full 24-hour period, is n 24-hour periods. If units are specified, this primary evaluates to true if the difference between the time of last change of file status infor- mation and the time find was started is exactly n units. Please refer to the -atime primary description for information on sup- ported time units. -d Same as depth. GNU find implements this as a primary in mistaken emulation of FreeBSD find(1). -delete Delete found files and/or directories. Always returns true. This executes from the current working directory as find recurses down the tree. It will not attempt to delete a filename with a ``/\u0026#39;\u0026#39; character in its pathname relative to ``.\u0026#39;\u0026#39; for security reasons. Depth-first traversal processing is implied by this option. Following symlinks is incompatible with this option. -depth Always true; same as the -d option. -depth n True if the depth of the file relative to the starting point of the traversal is n. -empty True if the current file or directory is empty. -exec utility [argument ...] ; True if the program named utility returns a zero value as its exit status. Optional arguments may be passed to the utility. The expression must be terminated by a semicolon (``;\u0026#39;\u0026#39;). If you invoke find from a shell you may need to quote the semicolon if the shell would otherwise treat it as a control operator. If the string ``{}\u0026#39;\u0026#39; appears anywhere in the utility name or the argu- ments it is replaced by the pathname of the current file. Utility will be executed from the directory from which find was executed. Utility and arguments are not subject to the further expansion of shell patterns and constructs. -exec utility [argument ...] {} + Same as -exec, except that ``{}\u0026#39;\u0026#39; is replaced with as many path- names as possible for each invocation of utility. This behaviour is similar to that of xargs(1). -execdir utility [argument ...] ; The -execdir primary is identical to the -exec primary with the exception that utility will be executed from the directory that holds the current file. The filename substituted for the string ``{}\u0026#39;\u0026#39; is not qualified. -execdir utility [argument ...] {} + Same as -execdir, except that ``{}\u0026#39;\u0026#39; is replaced with as many pathnames as possible for each invocation of utility. This be- haviour is similar to that of xargs(1). -flags [-|+]flags,notflags The flags are specified using symbolic names (see chflags(1)). Those with the \u0026#34;no\u0026#34; prefix (except \u0026#34;nodump\u0026#34;) are said to be notflags. Flags in flags are checked to be set, and flags in notflags are checked to be not set. Note that this is different from -perm, which only allows the user to specify mode bits that are set. If flags are preceded by a dash (``-\u0026#39;\u0026#39;), this primary evaluates to true if at least all of the bits in flags and none of the bits in notflags are set in the file\u0026#39;s flags bits. If flags are pre- ceded by a plus (``+\u0026#39;\u0026#39;), this primary evaluates to true if any of the bits in flags is set in the file\u0026#39;s flags bits, or any of the bits in notflags is not set in the file\u0026#39;s flags bits. Otherwise, this primary evaluates to true if the bits in flags exactly match the file\u0026#39;s flags bits, and none of the flags bits match those of notflags. -fstype type True if the file is contained in a file system of type type. The lsvfs(1) command can be used to find out the types of file sys- tems that are available on the system. In addition, there are two pseudo-types, ``local\u0026#39;\u0026#39; and ``rdonly\u0026#39;\u0026#39;. The former matches any file system physically mounted on the system where the find is being executed and the latter matches any file system which is mounted read-only. -gid gname The same thing as -group gname for compatibility with GNU find. GNU find imposes a restriction that gname is numeric, while find(1) does not. -group gname True if the file belongs to the group gname. If gname is numeric and there is no such group name, then gname is treated as a group ID. -ignore_readdir_race This option is for GNU find compatibility and is ignored. -ilname pattern Like -lname, but the match is case insensitive. This is a GNU find extension. -iname pattern Like -name, but the match is case insensitive. -inum n True if the file has inode number n. -ipath pattern Like -path, but the match is case insensitive. -iregex pattern Like -regex, but the match is case insensitive. -iwholename pattern The same thing as -ipath, for GNU find compatibility. -links n True if the file has n links. -lname pattern Like -name, but the contents of the symbolic link are matched instead of the file name. Note that this only matches broken symbolic links if symbolic links are being followed. This is a GNU find extension. -ls This primary always evaluates to true. The following information for the current file is written to standard output: its inode number, size in 512-byte blocks, file permissions, number of hard links, owner, group, size in bytes, last modification time, and pathname. If the file is a block or character special file, the device number will be displayed instead of the size in bytes. If the file is a symbolic link, the pathname of the linked-to file will be displayed preceded by ``-\u0026gt;\u0026#39;\u0026#39;. The format is identical to that produced by ``ls -dgils\u0026#39;\u0026#39;. -maxdepth n Always true; descend at most n directory levels below the command line arguments. If any -maxdepth primary is specified, it applies to the entire expression even if it would not normally be evaluated. ``-maxdepth 0\u0026#39;\u0026#39; limits the whole search to the com- mand line arguments. -mindepth n Always true; do not apply any tests or actions at levels less than n. If any -mindepth primary is specified, it applies to the entire expression even if it would not normally be evaluated. ``-mindepth 1\u0026#39;\u0026#39; processes all but the command line arguments. -mmin n True if the difference between the file last modification time and the time find was started, rounded up to the next full minute, is n minutes. -mnewer file Same as -newer. -mount The same thing as -xdev, for GNU find compatibility. -mtime n[smhdw] If no units are specified, this primary evaluates to true if the difference between the file last modification time and the time find was started, rounded up to the next full 24-hour period, is n 24-hour periods. If units are specified, this primary evaluates to true if the difference between the file last modification time and the time find was started is exactly n units. Please refer to the -atime primary description for information on supported time units. -name pattern True if the last component of the pathname being examined matches pattern. Special shell pattern matching characters (``[\u0026#39;\u0026#39;, ``]\u0026#39;\u0026#39;, ``*\u0026#39;\u0026#39;, and ``?\u0026#39;\u0026#39;) may be used as part of pattern. These characters may be matched explicitly by escaping them with a backslash (``\\\u0026#39;\u0026#39;). -newer file True if the current file has a more recent last modification time than file. -newerXY file True if the current file has a more recent last access time (X=a), inode creation time (X=B), change time (X=c), or modifica- tion time (X=m) than the last access time (Y=a), inode creation time (Y=B), change time (Y=c), or modification time (Y=m) of file. In addition, if Y=t, then file is instead interpreted as a direct date specification of the form understood by cvs(1). Note that -newermm is equivalent to -newer. -nogroup True if the file belongs to an unknown group. -noignore_readdir_race This option is for GNU find compatibility and is ignored. -noleaf This option is for GNU find compatibility. In GNU find it dis- ables an optimization not relevant to find(1), so it is ignored. -nouser True if the file belongs to an unknown user. -ok utility [argument ...] ; The -ok primary is identical to the -exec primary with the excep- tion that find requests user affirmation for the execution of the utility by printing a message to the terminal and reading a response. If the response is not affirmative (`y\u0026#39; in the ``POSIX\u0026#39;\u0026#39; locale), the command is not executed and the value of the -ok expression is false. -okdir utility [argument ...] ; The -okdir primary is identical to the -execdir primary with the same exception as described for the -ok primary. -path pattern True if the pathname being examined matches pattern. Special shell pattern matching characters (``[\u0026#39;\u0026#39;, ``]\u0026#39;\u0026#39;, ``*\u0026#39;\u0026#39;, and ``?\u0026#39;\u0026#39;) may be used as part of pattern. These characters may be matched explicitly by escaping them with a backslash (``\\\u0026#39;\u0026#39;). Slashes (``/\u0026#39;\u0026#39;) are treated as normal characters and do not have to be matched explicitly. -perm [-|+]mode The mode may be either symbolic (see chmod(1)) or an octal num- ber. If the mode is symbolic, a starting value of zero is assumed and the mode sets or clears permissions without regard to the process\u0026#39; file mode creation mask. If the mode is octal, only bits 07777 (S_ISUID | S_ISGID | S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO) of the file\u0026#39;s mode bits participate in the comparison. If the mode is preceded by a dash (``-\u0026#39;\u0026#39;), this primary evaluates to true if at least all of the bits in the mode are set in the file\u0026#39;s mode bits. If the mode is preceded by a plus (``+\u0026#39;\u0026#39;), this primary evaluates to true if any of the bits in the mode are set in the file\u0026#39;s mode bits. Otherwise, this primary evaluates to true if the bits in the mode exactly match the file\u0026#39;s mode bits. Note, the first character of a symbolic mode may not be a dash (``-\u0026#39;\u0026#39;). -print This primary always evaluates to true. It prints the pathname of the current file to standard output. If none of -exec, -ls, -print, -print0, or -ok is specified, the given expression shall be effectively replaced by ( given expression ) -print. -print0 This primary always evaluates to true. It prints the pathname of the current file to standard output, followed by an ASCII NUL character (character code 0). -prune This primary always evaluates to true. It causes find to not descend into the current file. Note, the -prune primary has no effect if the -d option was specified. -regex pattern True if the whole path of the file matches pattern using regular expression. To match a file named ``./foo/xyzzy\u0026#39;\u0026#39;, you can use the regular expression ``.*/[xyz]*\u0026#39;\u0026#39; or ``.*/foo/.*\u0026#39;\u0026#39;, but not ``xyzzy\u0026#39;\u0026#39; or ``/foo/\u0026#39;\u0026#39;. -samefile name True if the file is a hard link to name. If the command option -L is specified, it is also true if the file is a symbolic link and points to name. -size n[ckMGTP] True if the file\u0026#39;s size, rounded up, in 512-byte blocks is n. If n is followed by a c, then the primary is true if the file\u0026#39;s size is n bytes (characters). Similarly if n is followed by a scale indicator then the file\u0026#39;s size is compared to n scaled as: k kilobytes (1024 bytes) M megabytes (1024 kilobytes) G gigabytes (1024 megabytes) T terabytes (1024 gigabytes) P petabytes (1024 terabytes) -type t True if the file is of the specified type. Possible file types are as follows: b block special c character special d directory f regular file l symbolic link p FIFO s socket -uid uname The same thing as -user uname for compatibility with GNU find. GNU find imposes a restriction that uname is numeric, while find(1) does not. -user uname True if the file belongs to the user uname. If uname is numeric and there is no such user name, then uname is treated as a user ID. -wholename pattern The same thing as -path, for GNU find compatibility. -xattr True if the file has any extended attributes. -xattrname name True if the file has an extended attribute with the specified name. OPERATORS The primaries may be combined using the following operators. The opera- tors are listed in order of decreasing precedence. ( expression ) This evaluates to true if the parenthesized expression evaluates to true. ! expression -not expression This is the unary NOT operator. It evaluates to true if the expression is false. -false Always false. -true Always true. expression -and expression expression expression The -and operator is the logical AND operator. As it is implied by the juxtaposition of two expressions it does not have to be specified. The expression evaluates to true if both expressions are true. The second expression is not evaluated if the first expression is false. expression -or expression The -or operator is the logical OR operator. The expression evaluates to true if either the first or the second expression is true. The second expression is not evaluated if the first expression is true. All operands and primaries must be separate arguments to find. Primaries which themselves take arguments expect each argument to be a separate argument to find. ENVIRONMENT The LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES and LC_TIME environ- ment variables affect the execution of the find utility as described in environ(7). EXAMPLES The following examples are shown as given to the shell: find / \\! -name \u0026#34;*.c\u0026#34; -print Print out a list of all the files whose names do not end in .c. find / -newer ttt -user wnj -print Print out a list of all the files owned by user ``wnj\u0026#39;\u0026#39; that are newer than the file ttt. find / \\! \\( -newer ttt -user wnj \\) -print Print out a list of all the files which are not both newer than ttt and owned by ``wnj\u0026#39;\u0026#39;. find / \\( -newer ttt -or -user wnj \\) -print Print out a list of all the files that are either owned by ``wnj\u0026#39;\u0026#39; or that are newer than ttt. find / -newerct \u0026#39;1 minute ago\u0026#39; -print Print out a list of all the files whose inode change time is more recent than the current time minus one minute. find / -type f -exec echo {} \\; Use the echo(1) command to print out a list of all the files. find -L /usr/ports/packages -type l -exec rm -- {} + Delete all broken symbolic links in /usr/ports/packages. find /usr/src -name CVS -prune -o -depth +6 -print Find files and directories that are at least seven levels deep in the working directory /usr/src. find /usr/src -name CVS -prune -o -mindepth 7 -print Is not equivalent to the previous example, since -prune is not evaluated below level seven. COMPATIBILITY The -follow primary is deprecated; the -L option should be used instead. See the STANDARDS section below for details. SEE ALSO chflags(1), chmod(1), cvs(1), locate(1), lsvfs(1), whereis(1), which(1), xargs(1), stat(2), acl(3), fts(3), getgrent(3), getpwent(3), strmode(3), re_format(7), symlink(7) STANDARDS The find utility syntax is a superset of the syntax specified by the IEEE Std 1003.1-2001 (``POSIX.1\u0026#39;\u0026#39;) standard. All the single character options except -H and -L as well as -amin, -anewer, -cmin, -cnewer, -delete, -empty, -fstype, -iname, -inum, -iregex, -ls, -maxdepth, -mindepth, -mmin, -path, -print0, -regex and all of the -B* birthtime related primaries are extensions to IEEE Std 1003.1-2001 (``POSIX.1\u0026#39;\u0026#39;). Historically, the -d, -L and -x options were implemented using the pri- maries -depth, -follow, and -xdev. These primaries always evaluated to true. As they were really global variables that took effect before the traversal began, some legal expressions could have unexpected results. An example is the expression -print -o -depth. As -print always evalu- ates to true, the standard order of evaluation implies that -depth would never be evaluated. This is not the case. The operator -or was implemented as -o, and the operator -and was imple- mented as -a. Historic implementations of the -exec and -ok primaries did not replace the string ``{}\u0026#39;\u0026#39; in the utility name or the utility arguments if it had preceding or following non-whitespace characters. This version replaces it no matter where in the utility name or arguments it appears. The -E option was inspired by the equivalent grep(1) and sed(1) options. HISTORY A find command appeared in Version 1 AT\u0026amp;T UNIX. BUGS The special characters used by find are also special characters to many shell programs. In particular, the characters ``*\u0026#39;\u0026#39;, ``[\u0026#39;\u0026#39;, ``]\u0026#39;\u0026#39;, ``?\u0026#39;\u0026#39;, ``(\u0026#39;\u0026#39;, ``)\u0026#39;\u0026#39;, ``!\u0026#39;\u0026#39;, ``\\\u0026#39;\u0026#39; and ``;\u0026#39;\u0026#39; may have to be escaped from the shell. As there is no delimiter separating options and file names or file names and the expression, it is difficult to specify files named -xdev or !. These problems are handled by the -f option and the getopt(3) ``--\u0026#39;\u0026#39; con- struct. The -delete primary does not interact well with other options that cause the file system tree traversal options to be changed. The -mindepth and -maxdepth primaries are actually global options (as documented above). They should probably be replaced by options which look like options. BSD September 28, 2011 BSD ","permalink":"https://shiyuanjie.cn/posts/Tools/find/","summary":"\u003ch1 id=\"find\"\u003efind\u003c/h1\u003e\n\u003cp\u003e查找文件，可指定遍历路径\u003c/p\u003e\n\u003ch1 id=\"用法举例\"\u003e用法举例\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e查看当前目录下具体的文件\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e~ find a.txt\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e在指定目录查找文件\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- more --\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e~ find ./Download -name \u0026#34;*.jpg\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e查看目录下所有包括a的文件列表\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e~  find . -name \u0026#34;Thought*\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e查找大于100K的文件表列\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e~ find . -name \u0026#34;Thought*\u0026#34; -size +100k\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e查找创建时间大于2天的\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e~ find . -name \u0026#34;*.txt\u0026#34; -mtime +2\n\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"查看find的详细用法\"\u003e查看find的详细用法\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\nFIND(1)                   BSD General Commands Manual                  FIND(1)\n\nNAME\n     find -- walk a file hierarchy\n\nSYNOPSIS\n     find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]\n     find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]\n\nDESCRIPTION\n     The find utility recursively descends the directory tree for each path\n     listed, evaluating an expression (composed of the ``primaries\u0026#39;\u0026#39; and\n     ``operands\u0026#39;\u0026#39; listed below) in terms of each file in the tree.\n\n     The options are as follows:\n\n     -E      Interpret regular expressions followed by -regex and -iregex pri-\n             maries as extended (modern) regular expressions rather than basic\n             regular expressions (BRE\u0026#39;s).  The re_format(7) manual page fully\n             describes both formats.\n\n     -H      Cause the file information and file type (see stat(2)) returned\n             for each symbolic link specified on the command line to be those\n             of the file referenced by the link, not the link itself.  If the\n             referenced file does not exist, the file information and type\n             will be for the link itself.  File information of all symbolic\n             links not on the command line is that of the link itself.\n\n     -L      Cause the file information and file type (see stat(2)) returned\n             for each symbolic link to be those of the file referenced by the\n             link, not the link itself.  If the referenced file does not\n             exist, the file information and type will be for the link itself.\n\n             This option is equivalent to the deprecated -follow primary.\n\n     -P      Cause the file information and file type (see stat(2)) returned\n             for each symbolic link to be those of the link itself.  This is\n             the default.\n\n     -X      Permit find to be safely used in conjunction with xargs(1).  If a\n             file name contains any of the delimiting characters used by\n             xargs(1), a diagnostic message is displayed on standard error,\n             and the file is skipped.  The delimiting characters include sin-\n             gle (`` \u0026#39; \u0026#39;\u0026#39;) and double (`` \u0026#34; \u0026#39;\u0026#39;) quotes, backslash (``\\\u0026#39;\u0026#39;),\n             space, tab and newline characters.\n\n             However, you may wish to consider the -print0 primary in conjunc-\n             tion with ``xargs -0\u0026#39;\u0026#39; as an effective alternative.\n\n     -d      Cause find to perform a depth-first traversal, i.e., directories\n             are visited in post-order and all entries in a directory will be\n             acted on before the directory itself.  By default, find visits\n             directories in pre-order, i.e., before their contents.  Note, the\n             default is not a breadth-first traversal.\n\n             This option is equivalent to the -depth primary of IEEE Std\n             1003.1-2001 (``POSIX.1\u0026#39;\u0026#39;).  The -d option can be useful when find\n             is used with cpio(1) to process files that are contained in\n             directories with unusual permissions.  It ensures that you have\n             write permission while you are placing files in a directory, then\n             sets the directory\u0026#39;s permissions as the last thing.\n\n     -f      Specify a file hierarchy for find to traverse.  File hierarchies\n             may also be specified as the operands immediately following the\n             options.\n\n     -s      Cause find to traverse the file hierarchies in lexicographical\n             order, i.e., alphabetical order within each directory.  Note:\n             `find -s\u0026#39; and `find | sort\u0026#39; may give different results.\n\n     -x      Prevent find from descending into directories that have a device\n             number different than that of the file from which the descent\n             began.\n\n             This option is equivalent to the deprecated -xdev primary.\n\nPRIMARIES\n     All primaries which take a numeric argument allow the number to be pre-\n     ceded by a plus sign (``+\u0026#39;\u0026#39;) or a minus sign (``-\u0026#39;\u0026#39;).  A preceding plus\n     sign means ``more than n\u0026#39;\u0026#39;, a preceding minus sign means ``less than n\u0026#39;\u0026#39;\n     and neither means ``exactly n\u0026#39;\u0026#39;.\n\n     -Bmin n\n             True if the difference between the time of a file\u0026#39;s inode cre-\n             ation and the time find was started, rounded up to the next full\n             minute, is n minutes.\n\n     -Bnewer file\n             Same as -newerBm.\n\n     -Btime n[smhdw]\n             If no units are specified, this primary evaluates to true if the\n             difference between the time of a file\u0026#39;s inode creation and the\n             time find was started, rounded up to the next full 24-hour\n             period, is n 24-hour periods.\n\n             If units are specified, this primary evaluates to true if the\n             difference between the time of a file\u0026#39;s inode creation and the\n             time find was started is exactly n units.  Please refer to the\n             -atime primary description for information on supported time\n             units.\n\n     -acl    May be used in conjunction with other primaries to locate files\n             with extended ACLs.  See acl(3) for more information.\n\n     -amin n\n             True if the difference between the file last access time and the\n             time find was started, rounded up to the next full minute, is n\n             minutes.\n\n     -anewer file\n             Same as -neweram.\n\n     -atime n[smhdw]\n             If no units are specified, this primary evaluates to true if the\n             difference between the file last access time and the time find\n             was started, rounded up to the next full 24-hour period, is n\n             24-hour periods.\n\n             If units are specified, this primary evaluates to true if the\n             difference between the file last access time and the time find\n             was started is exactly n units.  Possible time units are as fol-\n             lows:\n\n             s       second\n             m       minute (60 seconds)\n             h       hour (60 minutes)\n             d       day (24 hours)\n             w       week (7 days)\n\n             Any number of units may be combined in one -atime argument, for\n             example, ``-atime -1h30m\u0026#39;\u0026#39;.  Units are probably only useful when\n             used in conjunction with the + or - modifier.\n\n     -cmin n\n             True if the difference between the time of last change of file\n             status information and the time find was started, rounded up to\n             the next full minute, is n minutes.\n\n     -cnewer file\n             Same as -newercm.\n\n     -ctime n[smhdw]\n             If no units are specified, this primary evaluates to true if the\n             difference between the time of last change of file status infor-\n             mation and the time find was started, rounded up to the next full\n             24-hour period, is n 24-hour periods.\n\n             If units are specified, this primary evaluates to true if the\n             difference between the time of last change of file status infor-\n             mation and the time find was started is exactly n units.  Please\n             refer to the -atime primary description for information on sup-\n             ported time units.\n\n     -d      Same as depth.  GNU find implements this as a primary in mistaken\n             emulation of FreeBSD find(1).\n\n     -delete\n             Delete found files and/or directories.  Always returns true.\n             This executes from the current working directory as find recurses\n             down the tree.  It will not attempt to delete a filename with a\n             ``/\u0026#39;\u0026#39; character in its pathname relative to ``.\u0026#39;\u0026#39; for security\n             reasons.  Depth-first traversal processing is implied by this\n             option.  Following symlinks is incompatible with this option.\n\n     -depth  Always true; same as the -d option.\n\n     -depth n\n             True if the depth of the file relative to the starting point of\n             the traversal is n.\n\n     -empty  True if the current file or directory is empty.\n\n     -exec utility [argument ...] ;\n             True if the program named utility returns a zero value as its\n             exit status.  Optional arguments may be passed to the utility.\n             The expression must be terminated by a semicolon (``;\u0026#39;\u0026#39;).  If you\n             invoke find from a shell you may need to quote the semicolon if\n             the shell would otherwise treat it as a control operator.  If the\n             string ``{}\u0026#39;\u0026#39; appears anywhere in the utility name or the argu-\n             ments it is replaced by the pathname of the current file.\n             Utility will be executed from the directory from which find was\n             executed.  Utility and arguments are not subject to the further\n             expansion of shell patterns and constructs.\n\n     -exec utility [argument ...] {} +\n             Same as -exec, except that ``{}\u0026#39;\u0026#39; is replaced with as many path-\n             names as possible for each invocation of utility.  This behaviour\n             is similar to that of xargs(1).\n\n     -execdir utility [argument ...] ;\n             The -execdir primary is identical to the -exec primary with the\n             exception that utility will be executed from the directory that\n             holds the current file.  The filename substituted for the string\n             ``{}\u0026#39;\u0026#39; is not qualified.\n\n     -execdir utility [argument ...] {} +\n             Same as -execdir, except that ``{}\u0026#39;\u0026#39; is replaced with as many\n             pathnames as possible for each invocation of utility.  This be-\n             haviour is similar to that of xargs(1).\n\n     -flags [-|+]flags,notflags\n             The flags are specified using symbolic names (see chflags(1)).\n             Those with the \u0026#34;no\u0026#34; prefix (except \u0026#34;nodump\u0026#34;) are said to be\n             notflags.  Flags in flags are checked to be set, and flags in\n             notflags are checked to be not set.  Note that this is different\n             from -perm, which only allows the user to specify mode bits that\n             are set.\n\n             If flags are preceded by a dash (``-\u0026#39;\u0026#39;), this primary evaluates\n             to true if at least all of the bits in flags and none of the bits\n             in notflags are set in the file\u0026#39;s flags bits.  If flags are pre-\n             ceded by a plus (``+\u0026#39;\u0026#39;), this primary evaluates to true if any of\n             the bits in flags is set in the file\u0026#39;s flags bits, or any of the\n             bits in notflags is not set in the file\u0026#39;s flags bits.  Otherwise,\n             this primary evaluates to true if the bits in flags exactly match\n             the file\u0026#39;s flags bits, and none of the flags bits match those of\n             notflags.\n\n     -fstype type\n             True if the file is contained in a file system of type type.  The\n             lsvfs(1) command can be used to find out the types of file sys-\n             tems that are available on the system.  In addition, there are\n             two pseudo-types, ``local\u0026#39;\u0026#39; and ``rdonly\u0026#39;\u0026#39;.  The former matches\n             any file system physically mounted on the system where the find\n             is being executed and the latter matches any file system which is\n             mounted read-only.\n\n     -gid gname\n             The same thing as -group gname for compatibility with GNU find.\n             GNU find imposes a restriction that gname is numeric, while\n             find(1) does not.\n\n     -group gname\n             True if the file belongs to the group gname.  If gname is numeric\n             and there is no such group name, then gname is treated as a group\n             ID.\n\n     -ignore_readdir_race\n             This option is for GNU find compatibility and is ignored.\n\n     -ilname pattern\n             Like -lname, but the match is case insensitive.  This is a GNU\n             find extension.\n\n     -iname pattern\n             Like -name, but the match is case insensitive.\n\n     -inum n\n             True if the file has inode number n.\n\n     -ipath pattern\n             Like -path, but the match is case insensitive.\n\n     -iregex pattern\n             Like -regex, but the match is case insensitive.\n\n     -iwholename pattern\n             The same thing as -ipath, for GNU find compatibility.\n\n     -links n\n             True if the file has n links.\n\n     -lname pattern\n             Like -name, but the contents of the symbolic link are matched\n             instead of the file name.  Note that this only matches broken\n             symbolic links if symbolic links are being followed.  This is a\n             GNU find extension.\n\n     -ls     This primary always evaluates to true.  The following information\n             for the current file is written to standard output: its inode\n             number, size in 512-byte blocks, file permissions, number of hard\n             links, owner, group, size in bytes, last modification time, and\n             pathname.  If the file is a block or character special file, the\n             device number will be displayed instead of the size in bytes.  If\n             the file is a symbolic link, the pathname of the linked-to file\n             will be displayed preceded by ``-\u0026gt;\u0026#39;\u0026#39;.  The format is identical to\n             that produced by ``ls -dgils\u0026#39;\u0026#39;.\n\n     -maxdepth n\n             Always true; descend at most n directory levels below the command\n             line arguments.  If any -maxdepth primary is specified, it\n             applies to the entire expression even if it would not normally be\n             evaluated.  ``-maxdepth 0\u0026#39;\u0026#39; limits the whole search to the com-\n             mand line arguments.\n\n     -mindepth n\n             Always true; do not apply any tests or actions at levels less\n             than n.  If any -mindepth primary is specified, it applies to the\n             entire expression even if it would not normally be evaluated.\n             ``-mindepth 1\u0026#39;\u0026#39; processes all but the command line arguments.\n\n     -mmin n\n             True if the difference between the file last modification time\n             and the time find was started, rounded up to the next full\n             minute, is n minutes.\n\n     -mnewer file\n             Same as -newer.\n\n     -mount  The same thing as -xdev, for GNU find compatibility.\n\n     -mtime n[smhdw]\n             If no units are specified, this primary evaluates to true if the\n             difference between the file last modification time and the time\n             find was started, rounded up to the next full 24-hour period, is\n             n 24-hour periods.\n\n             If units are specified, this primary evaluates to true if the\n             difference between the file last modification time and the time\n             find was started is exactly n units.  Please refer to the -atime\n             primary description for information on supported time units.\n\n     -name pattern\n             True if the last component of the pathname being examined matches\n             pattern.  Special shell pattern matching characters (``[\u0026#39;\u0026#39;,\n             ``]\u0026#39;\u0026#39;, ``*\u0026#39;\u0026#39;, and ``?\u0026#39;\u0026#39;) may be used as part of pattern.  These\n             characters may be matched explicitly by escaping them with a\n             backslash (``\\\u0026#39;\u0026#39;).\n\n     -newer file\n             True if the current file has a more recent last modification time\n             than file.\n\n     -newerXY file\n             True if the current file has a more recent last access time\n             (X=a), inode creation time (X=B), change time (X=c), or modifica-\n             tion time (X=m) than the last access time (Y=a), inode creation\n             time (Y=B), change time (Y=c), or modification time (Y=m) of\n             file.  In addition, if Y=t, then file is instead interpreted as a\n             direct date specification of the form understood by cvs(1).  Note\n             that -newermm is equivalent to -newer.\n\n     -nogroup\n             True if the file belongs to an unknown group.\n\n     -noignore_readdir_race\n             This option is for GNU find compatibility and is ignored.\n\n     -noleaf\n             This option is for GNU find compatibility.  In GNU find it dis-\n             ables an optimization not relevant to find(1), so it is ignored.\n\n     -nouser\n             True if the file belongs to an unknown user.\n\n     -ok utility [argument ...] ;\n             The -ok primary is identical to the -exec primary with the excep-\n             tion that find requests user affirmation for the execution of the\n             utility by printing a message to the terminal and reading a\n             response.  If the response is not affirmative (`y\u0026#39; in the\n             ``POSIX\u0026#39;\u0026#39; locale), the command is not executed and the value of\n             the -ok expression is false.\n\n     -okdir utility [argument ...] ;\n             The -okdir primary is identical to the -execdir primary with the\n             same exception as described for the -ok primary.\n\n     -path pattern\n             True if the pathname being examined matches pattern.  Special\n             shell pattern matching characters (``[\u0026#39;\u0026#39;, ``]\u0026#39;\u0026#39;, ``*\u0026#39;\u0026#39;, and\n             ``?\u0026#39;\u0026#39;) may be used as part of pattern.  These characters may be\n             matched explicitly by escaping them with a backslash (``\\\u0026#39;\u0026#39;).\n             Slashes (``/\u0026#39;\u0026#39;) are treated as normal characters and do not have\n             to be matched explicitly.\n\n     -perm [-|+]mode\n             The mode may be either symbolic (see chmod(1)) or an octal num-\n             ber.  If the mode is symbolic, a starting value of zero is\n             assumed and the mode sets or clears permissions without regard to\n             the process\u0026#39; file mode creation mask.  If the mode is octal, only\n             bits 07777 (S_ISUID | S_ISGID | S_ISTXT | S_IRWXU | S_IRWXG |\n             S_IRWXO) of the file\u0026#39;s mode bits participate in the comparison.\n             If the mode is preceded by a dash (``-\u0026#39;\u0026#39;), this primary evaluates\n             to true if at least all of the bits in the mode are set in the\n             file\u0026#39;s mode bits.  If the mode is preceded by a plus (``+\u0026#39;\u0026#39;),\n             this primary evaluates to true if any of the bits in the mode are\n             set in the file\u0026#39;s mode bits.  Otherwise, this primary evaluates\n             to true if the bits in the mode exactly match the file\u0026#39;s mode\n             bits.  Note, the first character of a symbolic mode may not be a\n             dash (``-\u0026#39;\u0026#39;).\n\n     -print  This primary always evaluates to true.  It prints the pathname of\n             the current file to standard output.  If none of -exec, -ls,\n             -print, -print0, or -ok is specified, the given expression shall\n             be effectively replaced by ( given expression ) -print.\n\n     -print0\n             This primary always evaluates to true.  It prints the pathname of\n             the current file to standard output, followed by an ASCII NUL\n             character (character code 0).\n\n     -prune  This primary always evaluates to true.  It causes find to not\n             descend into the current file.  Note, the -prune primary has no\n             effect if the -d option was specified.\n\n     -regex pattern\n             True if the whole path of the file matches pattern using regular\n             expression.  To match a file named ``./foo/xyzzy\u0026#39;\u0026#39;, you can use\n             the regular expression ``.*/[xyz]*\u0026#39;\u0026#39; or ``.*/foo/.*\u0026#39;\u0026#39;, but not\n             ``xyzzy\u0026#39;\u0026#39; or ``/foo/\u0026#39;\u0026#39;.\n\n     -samefile name\n             True if the file is a hard link to name.  If the command option\n             -L is specified, it is also true if the file is a symbolic link\n             and points to name.\n\n     -size n[ckMGTP]\n             True if the file\u0026#39;s size, rounded up, in 512-byte blocks is n.  If\n             n is followed by a c, then the primary is true if the file\u0026#39;s size\n             is n bytes (characters).  Similarly if n is followed by a scale\n             indicator then the file\u0026#39;s size is compared to n scaled as:\n\n             k       kilobytes (1024 bytes)\n             M       megabytes (1024 kilobytes)\n             G       gigabytes (1024 megabytes)\n             T       terabytes (1024 gigabytes)\n             P       petabytes (1024 terabytes)\n\n     -type t\n             True if the file is of the specified type.  Possible file types\n             are as follows:\n\n             b       block special\n             c       character special\n             d       directory\n             f       regular file\n             l       symbolic link\n             p       FIFO\n             s       socket\n\n     -uid uname\n             The same thing as -user uname for compatibility with GNU find.\n             GNU find imposes a restriction that uname is numeric, while\n             find(1) does not.\n\n     -user uname\n             True if the file belongs to the user uname.  If uname is numeric\n             and there is no such user name, then uname is treated as a user\n             ID.\n\n     -wholename pattern\n             The same thing as -path, for GNU find compatibility.\n\n     -xattr  True if the file has any extended attributes.\n\n     -xattrname name\n             True if the file has an extended attribute with the specified\n             name.\n\nOPERATORS\n     The primaries may be combined using the following operators.  The opera-\n     tors are listed in order of decreasing precedence.\n\n     ( expression )\n             This evaluates to true if the parenthesized expression evaluates\n             to true.\n\n     ! expression\n     -not expression\n             This is the unary NOT operator.  It evaluates to true if the\n             expression is false.\n\n     -false  Always false.\n     -true   Always true.\n\n     expression -and expression\n     expression expression\n             The -and operator is the logical AND operator.  As it is implied\n             by the juxtaposition of two expressions it does not have to be\n             specified.  The expression evaluates to true if both expressions\n             are true.  The second expression is not evaluated if the first\n             expression is false.\n\n     expression -or expression\n             The -or operator is the logical OR operator.  The expression\n             evaluates to true if either the first or the second expression is\n             true.  The second expression is not evaluated if the first\n             expression is true.\n\n     All operands and primaries must be separate arguments to find.  Primaries\n     which themselves take arguments expect each argument to be a separate\n     argument to find.\n\nENVIRONMENT\n     The LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES and LC_TIME environ-\n     ment variables affect the execution of the find utility as described in\n     environ(7).\n\nEXAMPLES\n     The following examples are shown as given to the shell:\n\n     find / \\! -name \u0026#34;*.c\u0026#34; -print\n             Print out a list of all the files whose names do not end in .c.\n\n     find / -newer ttt -user wnj -print\n             Print out a list of all the files owned by user ``wnj\u0026#39;\u0026#39; that are\n             newer than the file ttt.\n\n     find / \\! \\( -newer ttt -user wnj \\) -print\n             Print out a list of all the files which are not both newer than\n             ttt and owned by ``wnj\u0026#39;\u0026#39;.\n\n     find / \\( -newer ttt -or -user wnj \\) -print\n             Print out a list of all the files that are either owned by\n             ``wnj\u0026#39;\u0026#39; or that are newer than ttt.\n\n     find / -newerct \u0026#39;1 minute ago\u0026#39; -print\n             Print out a list of all the files whose inode change time is more\n             recent than the current time minus one minute.\n\n     find / -type f -exec echo {} \\;\n             Use the echo(1) command to print out a list of all the files.\n\n     find -L /usr/ports/packages -type l -exec rm -- {} +\n             Delete all broken symbolic links in /usr/ports/packages.\n\n     find /usr/src -name CVS -prune -o -depth +6 -print\n             Find files and directories that are at least seven levels deep in\n             the working directory /usr/src.\n\n     find /usr/src -name CVS -prune -o -mindepth 7 -print\n             Is not equivalent to the previous example, since -prune is not\n             evaluated below level seven.\n\nCOMPATIBILITY\n     The -follow primary is deprecated; the -L option should be used instead.\n     See the STANDARDS section below for details.\n\nSEE ALSO\n     chflags(1), chmod(1), cvs(1), locate(1), lsvfs(1), whereis(1), which(1),\n     xargs(1), stat(2), acl(3), fts(3), getgrent(3), getpwent(3), strmode(3),\n     re_format(7), symlink(7)\n\nSTANDARDS\n     The find utility syntax is a superset of the syntax specified by the IEEE\n     Std 1003.1-2001 (``POSIX.1\u0026#39;\u0026#39;) standard.\n\n     All the single character options except -H and -L as well as -amin,\n     -anewer, -cmin, -cnewer, -delete, -empty, -fstype, -iname, -inum,\n     -iregex, -ls, -maxdepth, -mindepth, -mmin, -path, -print0, -regex and all\n     of the -B* birthtime related primaries are extensions to IEEE Std\n     1003.1-2001 (``POSIX.1\u0026#39;\u0026#39;).\n\n     Historically, the -d, -L and -x options were implemented using the pri-\n     maries -depth, -follow, and -xdev.  These primaries always evaluated to\n     true.  As they were really global variables that took effect before the\n     traversal began, some legal expressions could have unexpected results.\n     An example is the expression -print -o -depth.  As -print always evalu-\n     ates to true, the standard order of evaluation implies that -depth would\n     never be evaluated.  This is not the case.\n\n     The operator -or was implemented as -o, and the operator -and was imple-\n     mented as -a.\n\n     Historic implementations of the -exec and -ok primaries did not replace\n     the string ``{}\u0026#39;\u0026#39; in the utility name or the utility arguments if it had\n     preceding or following non-whitespace characters.  This version replaces\n     it no matter where in the utility name or arguments it appears.\n\n     The -E option was inspired by the equivalent grep(1) and sed(1) options.\n\nHISTORY\n     A find command appeared in Version 1 AT\u0026amp;T UNIX.\n\nBUGS\n     The special characters used by find are also special characters to many\n     shell programs.  In particular, the characters ``*\u0026#39;\u0026#39;, ``[\u0026#39;\u0026#39;, ``]\u0026#39;\u0026#39;,\n     ``?\u0026#39;\u0026#39;, ``(\u0026#39;\u0026#39;, ``)\u0026#39;\u0026#39;, ``!\u0026#39;\u0026#39;, ``\\\u0026#39;\u0026#39; and ``;\u0026#39;\u0026#39; may have to be escaped from\n     the shell.\n\n     As there is no delimiter separating options and file names or file names\n     and the expression, it is difficult to specify files named -xdev or !.\n     These problems are handled by the -f option and the getopt(3) ``--\u0026#39;\u0026#39; con-\n     struct.\n\n     The -delete primary does not interact well with other options that cause\n     the file system tree traversal options to be changed.\n\n     The -mindepth and -maxdepth primaries are actually global options (as\n     documented above).  They should probably be replaced by options which\n     look like options.\n\nBSD                           September 28, 2011                           BSD\n\u003c/code\u003e\u003c/pre\u003e","title":"find"},{"content":"什么是SuperTest The motivation with this module is to provide a high-level abstraction for testing HTTP, while still allowing you to drop down to the lower-level API provided by super-agent. 简单说明：用来测试HTTP请求，提供简单的super-agent来实现API请求 安装SuperTest npm安装 官网下载对应的操作系统版本-NPM，下载完成后，直接进行安装即可 cnpm,若翻墙网络比较慢或访问不了的话，可以尝试使用cnpm(国内的镜像)。CNPM SuperTest安装 npm install supertest --save-dev grunt安装 npm install -g grunt-cli 使用Grunt来管理和运行SuperTest Git Clone SuperTestDemo。此项目针对访问的URL的返回状态进行验证。\n进入目录，执行grunt命令。查看执行结果\n组装SuperTest测试API 多个API测试：添加多个it，进行多个API测试 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 describe(\u0026#39;司机信息.\u0026#39;, function() { it(\u0026#39;能够获取通过司机的列表.\u0026#39;, function(done) { request.get(\u0026#39;/driver?status=PASSED\u0026amp;page_size=10\u0026amp;page_index=0\u0026#39;) .expect(200) .expect(\u0026#39;Content-Type\u0026#39;, \u0026#39;application/json;charset=utf-8\u0026#39;) .end(done); }); it(\u0026#39;能够获取接单司机的信息.\u0026#39;, function(done) { request.get(\u0026#39;/driver/driver-info?order_id=ce0a5279-6a7a-42d1-87d5-d396eb60c4bc\u0026#39;) .expect(200, { \u0026#34;uuid\u0026#34;: \u0026#34;222222\u0026#34; }, done); }) }); 测试场景：利用上面的多个API测试，达到测试场景的组装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 describe(\u0026#39;司机信息.\u0026#39;, function() { it(\u0026#39;能够获取通过司机的列表.\u0026#39;, function(done) { request.get(\u0026#39;/driver?status=PASSED\u0026amp;page_size=10\u0026amp;page_index=0\u0026#39;) .expect(200) .expect(\u0026#39;Content-Type\u0026#39;, \u0026#39;application/json;charset=utf-8\u0026#39;) .end(done); }); it(\u0026#39;能够获取接单司机的信息.\u0026#39;, function(done) { request.get(\u0026#39;/driver/driver-info?order_id=ce0a5279-6a7a-42d1-87d5-d396eb60c4bc\u0026#39;) .expect(200, { \u0026#34;uuid\u0026#34;: \u0026#34;222222\u0026#34; }, done); }) }); 获取API的返回数据：定义一个变量(var)，在其它it中使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 describe(\u0026#39;司机信息.\u0026#39;, function() { var id; it(\u0026#39;能够获取通过司机的列表.\u0026#39;, function(done) { request.get(\u0026#39;/driver?status=PASSED\u0026amp;page_size=10\u0026amp;page_index=0\u0026#39;) .expect(200) .expect(\u0026#39;Content-Type\u0026#39;, \u0026#39;application/json;charset=utf-8\u0026#39;) .end(done); }); it(\u0026#39;能够获取接单司机的信息.\u0026#39;, function(done) { request.get(\u0026#39;/driver/driver-info?order_id=ce0a5279-6a7a-42d1-87d5-d396eb60c4bc\u0026#39;) .expect(function(res){ id=res.body.uuid; }) .expect(200, { \u0026#34;uuid\u0026#34;: \u0026#34;222222\u0026#34; }, done); }) }); Jenkins集成 配制command line调用grunt即可 参考[Tool]Jenkins with Grunt](http://aimer1124.github.io/2016/03/03/Tool-Jenkins-with-SuperTest-and-Grunt/) ","permalink":"https://shiyuanjie.cn/posts/SuperTest/SuperTest/","summary":"\u003ch2 id=\"什么是supertest\"\u003e什么是SuperTest\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eThe motivation with this module is to provide a high-level abstraction for testing HTTP, while still allowing you to drop down to the lower-level API provided by super-agent.\u003c/li\u003e\n\u003cli\u003e简单说明：用来测试HTTP请求，提供简单的super-agent来实现API请求\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"安装supertest\"\u003e安装SuperTest\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003enpm安装\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e官网下载对应的操作系统版本-\u003ca href=\"https://nodejs.org/en/download/\"\u003eNPM\u003c/a\u003e，下载完成后，直接进行安装即可\u003c/li\u003e\n\u003cli\u003ecnpm,若翻墙网络比较慢或访问不了的话，可以尝试使用cnpm(国内的镜像)。\u003ca href=\"https://github.com/cnpm/cnpm\"\u003eCNPM\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eSuperTest安装\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enpm install supertest --save-dev\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003egrunt安装\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enpm install -g grunt-cli\n\u003c/code\u003e\u003c/pre\u003e\u003c!-- more --\u003e\n\u003ch2 id=\"使用grunt来管理和运行supertest\"\u003e使用Grunt来管理和运行SuperTest\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eGit Clone \u003ca href=\"https://github.com/aimer1124/SuperTestDemo\"\u003eSuperTestDemo\u003c/a\u003e。此项目针对访问的URL的返回状态进行验证。\u003c/p\u003e","title":"SuperTest-API测试"},{"content":"封面 书 Google 软件测试之道 在线试读，点这里 角色划分 SWE：软件开发工程师 SET：软件测试开发工程师 专注于质量提升和测试覆盖率的增加 为SWE提供测试 TE 测试工程师 把用户放到第一位 组织整体质量实践 分析解释测试运行结果 驱动测试执行 构建端到端的自动化测试 测试类型 小型测试 单一的代码测试 一般运行在Fake环境 中型测试 多个模块间的测试 一般运行在Fake或真实的环境 大型测试 任意多个模块 运行在真实的环境 比例：70%/20%/10% ACC ACC Attribute Component Capability,特质、组件、能力 A：特质 系统的形容词，代表产品的品质和特色 区别于竞争对手的关键 C：组件 系统的名词。构成待建系统的模块 使一个软件之所以如此的核心要素和代码块 C：能力 系统的动词。代表着系统在用户指令下完成的动作 对输入的响应、对查询的应答及代表用户完成的活动 指导原则 减少散漫的文字 不必推销 简洁 不要把不重要的、无法执行的内容放入到测试计划 渐进式的描述 指导计划者的思路 最终结果应该是测试用例 提升测试影响力 与团队内成员多沟通 提升自身价值 提高团队效率 与团队成员share知识 阅读时间：201509-201510","permalink":"https://shiyuanjie.cn/posts/Book/Google-%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E4%B9%8B%E9%81%93/","summary":"\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cimg src=\"http://ec4.images-amazon.com/images/I/51860F9X9pL._SX394_BO1,204,203,200_.jpg\" /\u003e","title":"Google 软件测试之道"},{"content":"封面 书 重来:更为简单有效的商业思维 读后感 自已做产品的话，一定要做出自己愿意用的产品。如果做的产品自己都不想用，那么别人也不会买账 如果可以的话，找一个自己感兴趣的方向去研究，deep 有好的想法，一定要落地，作起来，要不它真的就只是一个idea 有的放矢，有时也是不错的选择，不要过于撑hero，放弃有时也是一种成功 有任务的时候，一定要细化，尽量细化。这样才能做好细节性、可执行的规划 如果有什么对公司的负面消息，一定不要试图去隐藏它，把消息与你的team、同事公布。并一定要由职位最高的人员来公布。当然这不是想让大家承担什么，只是把实际的情况公布出去，不至于出现蝴蝶效应 单一的追求快、好，那只是在为后面的事情挖坑。绝对不是一种明智的选择。就算有很多的事情要去做，列好优先级，再去处理 阅读时间：201507-201508","permalink":"https://shiyuanjie.cn/posts/Book/Rework/","summary":"\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cimg src=\"http://ec4.images-amazon.com/images/I/515IS5SArOL._SX365_BO1,204,203,200_.jpg\" /\u003e","title":"Rework 重来:更为简单有效的商业思维"},{"content":"封面 书 乖,摸摸头 读后感 整本书通过12个故事，不同角度的讲解了人性、人与人之间的关系。 记得最深刻的，那条在丽江被主人丢弃的小狗，在流浪了几年后，终于有位好心的姑娘愿意收养它，看到了生活的希望。但就在这里，它原来的主人出现了，它第一眼就认出了自己以前主人。但原来的主人却嫌弃它又脏又臭，而不认它，更甚假装从来没有见过它。最后狗的命运时被无情的城管以清理社会中的不良，而被活活打死。 老兵，一个退伍军人，在丽江开了一家卖酒的。对军队生活的不舍，一直体现在与作者相聚时的场面，大家畅谈部队。老兵也是一个比较抠门的人，也经常被人冷眼，但最后他去用的省的钱，建立了一个私人的消防队。 摘抄 世上没有什么命中注定，所谓的命中注定，都基于你过去和当下的有意无意的选择 时间无情第一，它才不在乎你是否还是一个孩子，你只要稍一耽搁、稍一犹豫，它立马帮你决定故事的结局。 它会把你欠下的对不起，变成还不起。 又会把很多对不起，变成来不及。 阅读时间：201507-201508","permalink":"https://shiyuanjie.cn/posts/Book/%E4%B9%96%E6%91%B8%E6%91%B8%E5%A4%B4/","summary":"\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cimg src=\"http://ec4.images-amazon.com/images/I/51T1flXckQL._SX352_BO1,204,203,200_.jpg\" /\u003e","title":"乖，摸摸头"},{"content":"","permalink":"https://shiyuanjie.cn/archives/","summary":"","title":"归档"}]