
本章节原标题:干将莫邪(yé) 前言 就工具而言,即使是现在(作书时),每位软件的公司的骨干人员都像五金店老板一样,仔细的保管着自己工作生涯中搜集的一套工具,这些工具是个人能力的直观证明。 这种方法对软件项目来说是愚蠢的,项目的关键问题是沟通,个性化的工具只会妨碍而非促进沟通。 随着技术的变化,所有个性化的工具生命周期都是很短的。开发和维护公共的通用编程工具效率更高。 仅仅通用是不够的,建议为每个团队配备一名工具管理人员。 项目经理应该制定一套策略,并且为通用工具开发分配资源。与此同时,他还必须意识到专业工具的需求。 目标机器 就目前服务器的发展速度而言,本节内容已经不具备具体的参考价值,但仍然有一些优秀的思想 使用机器进行调试的时间是爆发式的,几位程序员可能同时开发好自己的模块,需要使用机器进行调试。 需要安排一名系统程序员,保证机器上的软件是最新且可用的。 主程序库应该被划分为:(1)一系列独立的私有开发库;(2)正处于系统测试下的系统集成子库;(3)发布版本 在开发过程中,节省最大工作量的工具可能是文本编辑系统(强调沟通和文档)。 系统文档中存在大量不容易理解的问题,但仍然比未能详细描述系统特性的短小文章更可取。 自上而下、彻底的开发一个性能测试工具,尽可能早的开始这件事情,并听取“它的意见”。 高级语言和交互式编程 只有懒散和惰性会妨碍高级语言和交互式编程的应用(生产率和调试方面的优势是势不可挡的,要坚持使用新的技术)。 高级语言bug更少而且更容易寻找。 传统的反对意见——无法实现想要的功能、代码量太大、高级语言代码执行速度慢,随着语言和编译器的进步已不再成为问题。 某些应用上,批处理系统并不会被交互式系统所取代(现在依然成立)。 调试是系统编程中较漫长和较困难的部分,漫长的调试时间是调试的祸根。 有限的数据表明,系统软件开发中,交互式编程的效率起码是传统的两倍。 旧有的编程模式:编辑,保存,编译,运行和调试交互式编程:直接输入脚本语句,回车执行,立即显示结果,不用经过复杂的保存和编译阶段,很多脚本语言都提供类似的控制台(PHP,Python) 以上就是《人月神话》第12章——干将莫邪的所有内容 本章主要说明了工具对于软件产业的重要性,工具需要做到通用,需要专人进行维护。看一看当下github的受欢迎程度,jetbrain这类工具提供商的地位,以及阿里云等服务器提供商的发展速度,还有当前对于新技术(ReactNative,Vue)新框架(ROR,Laravel)的推崇,完全印证了作者当年的观点。我们有理由相信阻碍高级工具发展的只有人们的懒散和惰性,这样的观点时至今日都是铁律。 个性化的工具是个愚蠢的选择,但也是顺其自然的选择,如果管理者不加以干预就必然会存在的。某种程度上具有合理性使得这种缺陷很难被管理人员重视。 不被重视的另一个重要原因是成本,通用工具的创造和维护是需要调配精英资源的。通用与个性化的实现难度不在同一个层面上,可以理解为通用是个性化的一种特殊形式,开发人员从无数个矩形中需要找到某个正方形。与成本相比,通用工具的收益是隐含的甚至是不可预计的,有可能需要多次迭代之后才能带来收益。 通用工具需要带来效率提升是有前提的,那就是通过该工具有效的降低了沟通成本。这就意味着通用工具应该是体系,而不是部件。通用工具需要迭代,但一定不是积累而来,工具同样需要具备概念完整性,需要团队意识到专业工具的需求。 综上,通用编程工具的出现有下面几个条件: 1、 管理者意识到通用工具的重要性 2、通用工具需要系统规划,而不是渐渐积累 3、公司能够承担开发的成本 4、工具维护人员具备技术实力 上面理解的工具是开发工具,另外还可以理解为开发环境。开发环境的问题随着虚拟技术的发展现在已经是过去式了,即便使用不同的电脑不同的操作系统,也能统一开发环境(VirtualBox)。 本章中提到的主程序库的划分,现在看来就是Git的一种使用策略罢了,不再需要专人维护而且十分好用,可以视为被解决掉的问题。但即便如此,为什么人月依然是个神话? 自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
肥炮,辅助(买出来就行了) 吃个苹果(左1,升满) 大胃王(左4,升满) 锤妹,核心输出(6级) 回收(左3,升满) 收集晶石(右5,升满)、气沉丹田(右4,升满) 速度与欢愉(左1,升满)、疯狂女孩(右3,升满) 冲击波(终极技能、升满)、刻苦训练(左2,升满)、地震(左5,升满) 乡村姑娘(右2,随意) 胖锤男,吸收伤害(7级) 回弹(右3,升满) 嘲讽(右1,升满)、午餐时间(左1,1) 坚韧意志(左3,升满)、再生(左5,升满)、鲜肉(左4,升满) 大块头(右5,随意) 贼妞V,金币加成(8级) 城市神偷(右4,升满) 寻宝猎人(左2,升满) 飞猫探云手(左1,升满) 敏捷的小猫(左3,升满) 弓娘,宝箱加成(8级) 追踪大师(左4,升满) 也可以换用弓娘做核心输出,锤妹辅助提供金币加成(只升满回收) 弓娘技能 - 追踪大师(左4,升满) 打靶练习(终极技能,升满)、多重箭(左5,升满) 精准术(左2,升满)、耳听八方(右3,升满) 致命一击(右5,随意)、狙击(右1,随意)、瞬移(左1,随意) 500关之后完全打不动换套路 阵容及技能 雷德罗——大招,右五,右二(大招结合右五10秒内增加敌方承受伤害70%,右二开局减老怪伤害34%) 盾叔——格挡,护盾加成(简单直白) 潇洒——大招,右四右五,左四(大招快速减英雄冷却,极限关时开启可放两次大招,以及确保弓娘右一的触发,右四过关后 12秒加70%伤害,右五伤害豁免20%,左四减少被击) 枪叔——大招,右三(大招开启20秒全英雄200%伤害提升,右三16秒内承伤减70%) 弓娘——本阵容核心输出,大招,右一,左二,右三 (后期核心右一,80秒冷却,6k的伤害,弓娘大招18秒期间增加伤害250%,大枪大招200%加成,雷德70%承伤,极限关开启潇洒大招加速冷却,确保右一在大招期间至少触发一次) 首饰搭配 四个辅助带全伤,其中两个诅咒增伤,两个deuff减伤,输出点带单体伤 离线阵容核心——偷钱。充分利用离线的800%收入,在推关打不动时换上5个首饰离线偷钱。 戒指选择 电戒 符文——加钱的元气满满,增伤的呆滞,自动攻击
后端 后端分为两部分: 统一下单 二次签名 // 统一下单 $payment = app('payment'); $result = $payment->order->unify([ 'body'=>self::$typeMap[$this->type].'订单', 'out_trade_no'=>$this->no, 'total_fee'=>$this->price * 100, 'trade_type' => 'JSAPI', 'openid'=>$this->user->weapp_openid ]); 小程序和公众号的的统一下单是相同的,类型传的参数都是JSAPI 曾经也自己看着支付文档封装过通用支付类,不过现在成熟的库已经很多了,这里用的是easywechat use function EasyWeChat\Kernel\Support\generate_sign; ... // 二次签名 $params = false; if($result['return_code'] === 'SUCCESS'){ $params = [ 'appId' => env('WECHAT_PAYMENT_APPID'), // 小程序的AppId 'timeStamp' => time(), 'nonceStr' => $result['nonce_str'], // 统一下单返回的随机字符串 'package' => 'prepay_id=' . $result['prepay_id'], // 统一下单Id 'signType' => 'MD5', // 签名方法 ]; // 注意这里用的是商户平台的Key进行二次签名 $params['paySign'] = generate_sign($params, env('WECHAT_PAYMENT_KEY')); } 按照文档的要求准备好参数之后,使用easywechat中的签名方法generate_sign 注意一下perpay_id的处理方式,需要拼接为查询字符串放倒package中 曾经也自己写过签名方法,错了很多次,现在PHP的开发氛围真的比以前好太多了 前端 let responsePayment = await wepy.requestPayment({ timeStamp: params.timeStamp.toString(), nonceStr: params.nonceStr, package: params.package, signType: params.signType, paySign: params.paySign }) if (responsePayment.errMsg === 'requestPayment:ok') { // 用户付款成功 } 从服务器接到签名好的支付参数后调用requestPayment方法 如果这里做了await处理的话,判断用户支付操作成功可以用errMsg属性,否则用success回调函数 无论如何不能以此作为业务支付成功的判断 结果回调 和公众号支付回调相同
根据保存的数据类型不同,有不同的处理方式,常见的有两种保存形式: 时间戳int 日期时间datetime 时间戳 早期一直在使用的方式,缺点: 在数据库中不直观 查询的时候涉及到转换 例如在查询的时候需要将日期时间转化为时间戳:where created_at < UNIX_TIMESTAMP('2018-9-28 00:00:00') UNIX_TIMESTAMP()可以直接表示当前的时间戳 时间戳转化为日期时间:SELECT FROM_UNIXTIME(875996580) FROM_UNIXTIME第二个参数用于指定日期格式,例如: SELECT SUM(price), FROM_UNIXTIME(created_at, '%m%d') as day FROM table GROUP BY day ... WHERE FROM_UNIXTIME(created_at, '%Y') = '2018' 常用的格式是这样的:%Y%m%d%H%i%s 日期时间 可以直接进行比较 格式转化: DATE_FORMAT() SELECT SUM(price), DATE_FORMAT(created_at, '%m%d') as day FROM table GROUP BY day
在阿里云找到SSL证书页面,阿里云提供免费的SSL证书 image.png 选择品牌 image.png 选择免费型 image.png 进入控制台就可以看到已经购买的证书了 image.png 补全信息 image.png 后面忘了截图,大概有以下几个步骤: 将文件上传到服务器指定位置,需要URL能够访问到(非https) 指定位置是一个隐藏文件夹,window下需要用mkdir命令创建 上传文件过一会就会自动验证成功 第3步很容易失败,建议直接在服务器上下载验证文件,多试几次 配置Apache或者Nginx # 添加 SSL 协议支持协议,去掉不安全的协议 SSLProtocol all -SSLv2 -SSLv3 # 修改加密套件如下 SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM SSLHonorCipherOrder on # 证书公钥配置 SSLCertificateFile cert/public.pem # 证书私钥配置 SSLCertificateKeyFile cert/215045620450170.key # 证书链配置,如果该属性开头有 '#'字符,请删除掉 SSLCertificateChainFile cert/chain.pem server { listen 443; server_name localhost; ssl on; root html; index index.html index.htm; ssl_certificate cert/215045620450170.pem; ssl_certificate_key cert/215045620450170.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } } 分享一下我最终的配置(Apache虚拟站点) <VirtualHost *:443> SSLEngine on ServerName demo.com:443 SSLCertificateKeyFile "${SRVROOT}/conf/ssl_dict/215045620450170.key" SSLCertificateFile "${SRVROOT}/conf/ssl_dict/public.pem" SSLCertificateChainFile "${SRVROOT}/conf/ssl_dict/chain.pem" DocumentRoot "E:\wwwroot\demo.com\public" ServerName demo.com ServerAlias demo.com #START-ERROR-PAGE ErrorDocument 403 /403.html ErrorDocument 404 /404.html ErrorDocument 502 /502.html #END-ERROR-PAGE #startPHP <Files ~ "\.php$"> Options FollowSymLinks ExecCGI AddHandler fcgid-script .php FcgidWrapper "E:/BtSoft/WebSoft/php/7.1/php-cgi.exe" .php </Files> #endPHP #start301 #end301 #REFERER-START #REFERER-END #PROXY-START #PROXY-END <Directory "E:\wwwroot\demo.com\public"> Options FollowSymLinks ExecCGI AllowOverride All Require all granted DirectoryIndex index.php default.php index.html index.htm default.html default.htm </Directory> ErrorLog "logs/demo.com-error.log" CustomLog "logs/demo.com-access.log" common </VirtualHost> 推荐一个https相关的资料站 https://github.com/cheaphttps/https-start