Inspirer

文章列表

为什么重启后 /run 下的文件不在了?

摘自 https://serverfault.com/questions/546966/whats-removing-stuff-from-var-run-at-reboots-from-a-fedora-machine

The software should define what directories it needs in /run (which replaced /var/run in Fedora 15) by placing a configuration file in /usr/lib/tmpfiles.d. During the boot process, systemd-tmpfiles populates /run based on that confguration.

其中解释了 /run 是挂载在临时文件的系统里的,即在系统启动后,添加在里面的数据、文件都是写入内存的,因此重启后自然不存在。

懒得去翻的,本文直接给出一个便于快速查阅的方案。

四舍五入不可取!结算金额,如何保证精确?

今天在 SegmentFault 看到了类似问题,查资料回答那个问题后,决定留个笔记。

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

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

laravel 学习笔记 —— 查询构造器(下)

来继续填坑(上个月没发,因此这个月至少两篇)。

上一篇 laravel 学习笔记 —— 查询构造器(下) 中我们正在开始分析查询构造器的 where 方法,作为出场率最高的方法,其中相关的玩意儿足以帮助我们去理解整个组件大致的设计思路和实现细节。由于整体分析实在是太过麻烦(我其实就是懒),因此我们在上一篇的末尾提了三个问题,本文也将顺着这三个问题来进行解析,当然其余的思路类似的,就不在赘述,毕竟精力有限。

上一篇提到的问题是:

  • where 方法中多余的参数是干什么的
  • 方法中的代码为什么要拆分(或者封装)的那么细 ?
  • Expression 这个类是干嘛的 ?

我们就从多余的参数是做什么的开始吧。

laravel 学习笔记 —— 查询构造器(上)

当下所有包含数据库组件的框架,都提供了一套流畅的操作方式去生成查询语句,这一部分我们称作 查询构造器 。查询构造器的存在,使得在数据库操作这一层面彻底的和原生开发区分开来。原生开发中,查询语句都是人为地根据业务需求手工写的,没有对查询语句进行规范的封装(即使有也不是人人能够做得到且做得好),随着项目扩展,这种原生的写法会导致项目愈发难以维护,而且由于操作原始,更加容易引发很多不必要的 BUG 以及安全隐患。查询构造器针对每一类语句关键字进行封装,通过流畅的链式方法组合,形成一个树状的数据结构,最终由生成器生成目标查询语句。

我向来认为 Laravel 框架的组件永远不是最优秀的,但由于其他框架或多或少不优雅、实现差、功能残缺,才使得 Laravel 的每个组件无论是单个拿出来看还是组合起来看,都是那么的好用,这其中的典型就是 查询构造器

laravel 学习笔记 —— 数据和模型之数据连接层

所谓万丈高楼平地起,再强大的功能组件,也是建立在许多功能很基础的模块之上。而且越是强大、富有扩展性,则拆分越细,分层越明显。Laravel 的许多组件都是这样,数据库组件当然更能直观体现出来这种设计思路。关于分层,我在上文已经给出了一定的解释,不再赘述。本文是对数据库的连接层进行讲述,在此,希望各位确保对 PDO 已经有了一定的认识和理解。

laravel 学习笔记 —— 数据和模型起步篇

自上一篇 《laravel 学习笔记 —— 神奇的服务容器》 已经有一年了,很多人都问过关于数据库部分的文章什么时候出来。其实不是不想写,而是没法写,因为当时大部分特性都没用到,以至于我无法以笔记形式给出。经过一年时间,laravel 已被我运用在很多类型的项目里,或多或少也对数据库组件了解的比较完整了,是时候完善学习笔记序列重要的环节之一 —— 数据库 部分。

Laravel 有三宝,路由、容器和 Eloquent ORM,Eloquent ORM 实际上是 Laravel 框架数据库组件的一个部分,也是最为重要和常用的,所以我们在说 Laravel 数据库组件时,往往指的是 Eloquent ORM。当然,数据库篇的文章肯定要全面讲述,这样有助于理解,也能帮助一些在这一块遇到问题的朋友。

数据库组件是一个比较独立的组件,只依赖很少的东西,通过 composer 安装的话,可以在任意一个项目里使用该组件的全部功能,而不需要安装 laravel 框架。具体使用方法可到其 github 主页获取:https://github.com/illuminate/database

由于篇幅有限,且平时很忙,我将会将数据库部分文章拆成包括本篇在内的多篇文章,本文作为概览和文章预告,会对整个数据库组件的构成做一个大致的讲解。

MySQL5.7 的编译安装

一直嫌弃 MySQL 的编译安装,原因很简单,依赖复杂、容易出错,总之就是麻烦。但这些天由于需要必须编译安装,被迫阅读相关文档,发现现在的 MySQL 安装变得十分简单和容易。

直接开始吧。

一切从必要依赖开始。

yum install -y gcc gcc-c++ ncurses-devel perl

本文中系统为 CentOS 7,不同系统的软件包管理器可能用法不同,但需求类似,请准备好 gcc gcc++ ncurses 及 perl 相关编译器或依赖库即可。

扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题

最近由于项目开发需要,手机客户端和网页端统一使用一套接口,为保证 会话(Session) 能够正常且在各类情况下兼容,我希望能够改变 SessionID 的获取方式。默认情况下,所有网站都是通过 HTTP 请求的 Header 头部中的 Cookie 实现的,通过 Cookie 中指定的 SessionID 来关联到服务端对应数据,从而实现会话功能。

但对于手机客户端,可能并不会支持原始的 Cookie,亦或者根据平台需要而屏蔽,因此开发中要求通过增加一个请求头 X-Session-Token 来标识 SessionID。在 Laravel 框架中,实现 Session 初始化、读取和启动,都是通过 Illuminate\Session\Middleware\StartSession 这个中间件实现的,该中间件有一个关键方法 getSession,这个方法就是获取 SessionId 从而告知 Session 组件以什么凭据恢复 Session 数据。

该中间件注册于 app/Http/Kernel.php 文件下。

我新建了一个类继承该中间件,同时替换了在 app/Http/Kernel.php 下的注册的地方,原来的 getSession 方法源码如下:

public function getSession(Request $request)
{
    $session = $this->manager->driver();
    $session->setId($request->cookies->get($session->getName()));
    return $session;
}

在新的中间件中,我修改为:

public function getSession(Request $request)
{
    $session = $this->manager->driver();
    // 判断是否是接口访问并根据实际情况选择 SessionID 的获取方式
    if ($request->headers->has('x-session-token')) {
        $sessionId = $request->headers->has('x-session-token');
    } else {
        $sessionId = $request->cookies->get($session->getName());
    }
    $session->setId($sessionId);
    return $session;
}

但是麻烦也随之而来。。。

HTTP 中的幂等操作

在做 web 端开发,常常和各种请求打交道。HTTP 协议中,常见的请求不外乎是 GETPOSTPUTDELETEHEAD。其中,GET、PUT、DELTE、HEAD 都是幂等操作,而 POST 则不是。那么什么是幂等操作?其存在的意义和网站的设计与架构有什么关系呢?

笔记

学习笔记,各种杂七杂八的学习笔记。记录着各类小知识,不一定很高大上,但都是给自己提供了帮助的知识。

分类
标签