0%

我们在计算金额时,难免存在保留位数有限,计算结果需要取舍的情况。往往在电商、银行系统中,金额是以整数形式保存,单位为货币最小单位,例如分。但是在结算时额外的参数如折扣、利率、税率等存在着大量的浮点数,计算结果则需要转换为整数。

简单处理一般是四舍五入,但是这样存在很明显的问题,就是 “入” 的概率大于 “舍”,明显的,遇到 1、2、3、4 舍,遇到 5、6、7、8、9 入,粗看这种就可以发现问题。如果想要两边平衡,则 “四舍六入” 才是合理的,但是,5 怎么办?

有趣的推理

转自知乎用户给出的一个例子(知乎答案地址

某实数 r = 0.4445。也就是说,比九分之四稍微大一点点。(构造其他小数也可以,有限小数还是无限小数、纯小数还是带小数都没关系)

好了,根据四舍五入算法 f,直接把这个 r 保留到整数。那么,明显,结果是 0,小数点后第一位是 4 么。

这时,请开放一下脑洞。有一群科学家拿到了这个数字。然后……

科学家 s3 把 r 保留到小数点后第 3 位,得 r3 = 0.445。第 4 位是 5 么,按四舍五入的精神,把这个 1 进到第 3 位,使之变成 5。

阅读全文 »

Version

Hexo 3.3.8

传统建立文章方式

一般我们都会使用 hexo new <title> 来建立文章,这种建立方法会将新文章建立在 source/_posts 目录下,当使用 hexo generate 编译 markdown 文件时,会将其 HTML 结果编译在 public 目录下,之后 hexo deploy 将会把 public 目录下所有文章部署到 GitHub,这是我们熟悉的 Hexo 流程。

这种建立文章方式的缺点是:若我们同时编辑多篇文章,只要其中一篇文章尚未编辑完成,也会随着 hexo deploy 一起部署到 GitHub,也就是 GitHub 可能会看到我们尚未完成的文章。

建立文章草稿

1
$ hexo new draft <title>

Hexo 另外提供 draft 机制,它的原理是新文章将建立在 source/_drafts 目录下,因此 hexo generate 并不会将其编译到 public 目录下,所以 hexo deploy 也不会将其部署到 GitHub。

阅读全文 »

单一入口

单一入口的概念其实很好理解,我们可以把整个应用想象为一个黑色的盒子,整个盒子只有一个入口,这个入口由一个文件把守,它要求所有的请求必须通过这个入口文件检验才能进入。

在聊单一入口的应用之前,我们先来看一看传统应用的多入口模式,这里我们参考一下 ECSHOP 的网站根目录的部分目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- article.php 文章内容
- article_cat.php 文章分类
- auction.php 拍卖前台文件
- brand.php 品牌列表
- captcha.php 生成验证码
- catalog.php 列出所以分类及品牌
- category.php 商品分类
- comment.php 提交用户评论
- compare.php 商品比较程序
- cycle_image.php 轮播图片程序
- feed.php RSS Feed 生成程序
- flow.php 购物流程
- gallery.php 商品相册
- goods.php 商品详情
- goods_script.php 生成商品列表
- group_buy.php 团购商品前台文件
- index.php 首页文件
- myship.php 支付配送DEMO
- pick_out.php 选购中心
- receive.php 处理收回确认的页面
- index.php 首页文件

你可以看到上述目录就是网站的根目录,这个目录下存放着相应页面的响应代码,如果我们想要访问首页,我们就在网址中访问 index.php,如果我们想要访问商品页,那么我们就需要访问 goods.php 文件,这就是传统应用的多入口模式,我们可以通过不同的文件入口来得到应用响应。

阅读全文 »

快捷键

控制光标位置

  • ctrl + m 将光标定位到文件中心
  • alt + j 多列模式进行选中,只会选择相同的单词
  • alt + shift + j 取消多列模式
  • home, end 移动到行首或行末
  • ctrl + shift + m 匹配括号的位置,会将光标移动到对应正括号和反括号位置
  • ctrl + [ 或 ] 具有相似功能
  • ctrl + shift + [ 或 ] 可已选中对应的括号区域
  • ctrl + pageup 将光标移动到页面顶头
  • ctrl + pagedown 将光标移动到页面底部
  • ctrl + g 输入:行号:列号快速定位文件位置

编辑文档

删除

  • ctrl + y 删除一行
  • ctrl + delete 删除光标后内容
  • ctrl + backspace 删除光标前一个字的内容
  • ctrl + enter 在行首会在该行前创建新行,行末会在改行后创建新行

复制

  • ctrl + d 复制选中块,若没有则只是复制当前行
  • ctrl + shift + v 粘贴文档时可以选择行数,多选时按住 shift,也可以显示剪切板历史
阅读全文 »

在 CentOS7.x 之前的版本都是通过修改 /etc/inittab 文件来设置启动顺序,具体可参考这里
但是此种方法并不适应于 CentOS7.x 版本,在该版本中,我们查看 /etc/inittab 文件可得

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[centos@localhost ~]$ vim /etc/inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target

该文件中已经详细说明了,不再使用 inittab 文件而是使用 systemd 代替,并且还指出,现在只有 multi-user 相当于运行级别是 3,graphical 相当于运行级别是 5,
现在可以使用如下命令设置默认启动级别了,注意要以 root 用户,或者是使用 sudo 权限。

如果用户没有 sudo 权限,参考这里进行设置。

1
2
3
[centos@localhost ~]$ sudo systemctl set-default multi-user.target
rm '/etc/systemd/system/default.target'
ln -s '/usr/lib/systemd/system/multi-user.target' '/etc/systemd/system/default.target'

设置成功之后 reboot 一下,即可顺利进入命令行界面了。
如果想要再次进入图形界面,在命令行中运行

1
[centos@localhost ~]$ sudo systemctl set-default graphical.target

当 PHP 引擎试图实例化未知类的操作时,就会调用 __autoload() ,并将类名当做字符串传递给它。但 __autoload() 有个缺点,就是 一个进程中只能定义一次。它是全局唯一的,如果框架占了这个名字,便会导致框架的用户用不了其它的 __autoload() 了,包括用户自定义的和其它类库带的。这时候就可以使用 spl_autoload_register() 函数。它可以把函数注册到 __autoload 队列中。

Version

Composer version 1.5.1

原理

以 Laravel 项目为例,composer.json 文件:

1
2
3
4
5
6
7
8
{
"autoload": {
"classmap" : [
"app/controllers",
"app/models"
]
}
}
阅读全文 »

Version

git version 2.14.1.windows.1

默认情况下 git 使用 https 在输入账号密码后会保存到 windows 凭据下。

查看配置信息

1
$ git config --global -l

可以看到类似如下的信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
core.symlinks=false
core.autocrlf=input
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
rebase.autosquash=true
http.sslcainfo=D:/Program Files (x86)/Git/mingw64/ssl/certs/ca-bundle.crt
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.required=true
filter.lfs.process=git-lfs filter-process
credential.helper=manager // 重点看这个

禁止自动保存密码

1
2
3
4
5
$ git config --global --unset credential.helper



$ git config --system --unset credential.helper

恢复自动保存密码

删除掉保存密码的配置就行。如果需要保存的话,可以使用:

1
$ git config --global credential.helper manager

全局安装

1
$ composer global require symfony/var-dumper 2.7.*

加上固定版本号是因为如果本地低版本的 Laravel 项目(比如 Laravel 5.1),它里面依赖的版本是 2.7.* ,如果不指定版本会安装最新的 3.3.*,由于在 Laravel 项目中:

1
2
3
4
5
if (! function_exists('dd')) {
function dd(){

}
}

的缘故,导致使用全局定义的 dd function 。会出现不兼容报错的情况。

配置 php.ini

在 php.ini 中找到 auto_prepend_file,然后写上你相对应的路径,比如我的路径:

1
auto_prepend_file = "C:/Users/Administrator.N27NDU1NHONBOGF/AppData/Roaming/Composer/vendor/autoload.php"

更新 composer

1
$ composer global update

这样一来就可以使用 dump() 了。不过还不够,我们还要把 dd() 的代码放进来。

阅读全文 »