Avery's Blog

Work on Web Dev, Infra Dev & ML

0%

笔记摘录于《Spring Boot 实战》第四版,结合个人总结与思考。

Spring Boot简介

Spring Boot 提供了四个主要的特性,能够改变开发 Spring 应用程序的方式:

  • 自动配置:Spring Boot 的自动配置特性利用了 Spring 4 对条件化配置的支持,合理地推测应用所需的 bean 并自动化配置它们。
  • Spring Boot Starter:将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的 Maven 或 Gradle 构建中。
  • 命令行接口 (Command-line interface, CLI):Spring Boot 的 CLI 发挥了 Groovy 编程语言的优势,并结合自动配置进一步简化 Spring 应用的开发。
  • Actuator:深入运行中的 Spring Boot 应用程序,在运行时检视应用程序内部情况。

Spring Boot 采用自动配置和 Starter 来消除 Spring 项目中的样板式配置。

自动配置指:如果 Spring Boot 在应用程序的 classpath 里发现了 H2 数据库的库,那么它就会自动配置一个嵌入式 H2 数据库。如果在 classpath 中发现 JdbcTemplate,那么它还会配置一个 JdbcTemplate 的 Bean。

Spring Boot 可以把 Web 应用程序变为可自执行的 JAR 文件,不用部署到传统 Java 应用服务器里就能在命令行里运行。Spring Boot 在应用程序里嵌入了一个 Servlet 容器(Tomcat、Jetty 或 Undertow)。从根本上来说,Spring Boot 项目只是普通的 Spring 项目,只是它们正好用到了 Spring Boot 的起步依赖和自动配置而已(没有 Spring Boot 程序员自己也会去做)。

Read more »

笔记摘录于《Spring 实战》第四版,结合个人总结与思考。

Spring 是一个轻量级的控制反转 (IoC) 和面向切面 (AOP) 的容器框架。Spring 不仅仅局限于服务器端开发,任何 Java 应用都能在简易性、可测试性和松耦合等方面从 Spring 中获益。

版本变更

Spring 2.5 引入了基于注解的组件扫描,大量消除了显式 XML 配置。
Spring 3.0 引入了基于 Java 的配置,可以替代 XML。
Spring 4.0 引入了条件化配置。Spring Boot 就是利用条件化配置实现自动配置的。

POJO

POJO (Plain Old Java Object),简单老式 Java 对象。Spring 竭力避免因自身的 API 弄乱你的应用代码。Spring 不会强制你实现 Spring 规范的接口或继承 Spring 规范的类,相反,在基于 Spring 构建的应用中,它的类通常没有任何痕迹表明你使用了 Spring。最坏的场景是,一个类或许会使用 Spring 注解,但它仍然是 POJO。

Read more »

我最近从把服务器从 CentOS 迁移到了 Ubuntu(我为什么选择放弃CentOS),本文记录一下其中踩的坑。

使用OneinStack配置LNMP

我是使用的一键包配置的LNMP,自己手动配置比较繁琐,也容易有失当之处。我用的一键包是OneinStack,Github有开源项目,官网是 https://oneinstack.com/

我使用如下的配置自动安装:

1
wget -c http://mirrors.linuxeye.com/oneinstack-full.tar.gz && tar xzf oneinstack-full.tar.gz && ./oneinstack/install.sh --nginx_option 1 --php_option 4 --phpcache_option 1 --phpmyadmin  --db_option 4 --dbinstallmethod 1 --dbrootpwd <passwd>

基于性能考虑,我使用了MySQL 5.5 和 PHP 5.6,分别可以通过 service mysqldservice php-fpm 管理。此外,Nginx通过 service nginx 管理。

Read more »

ORM 与 MyBatis

Object Relational Mapping (ORM),对象关系映射,用于实现数据库系统和面向对象编程语言类型系统之间的数据转换。效果上,它创建了一个可在编程语言中使用的“虚拟对象数据库”。

MyBatis 是 ORM 的一种实现框架,对 JDBC 进行了又一层的封装。和 Hibernate 这种重量级的 ORM 框架相比,MyBatis 非常轻量,其源码可以在数天之间就全部看完。这是因为和 Hibernate 提供了全套映射机制、自动生成 SQL 语句相比,MyBatis 选择了拥抱 SQL,让程序员自己写 SQL,只是把查询结果转换到 POJO 中。

Maven

Apache Maven,是一个软件项目管理及自动构建工具,使用项目对象模型 (Project Object Model, POM) 进行配置。

代码分层

一般而言,一个 Web 项目,自顶向下的访问顺序为:Controller -> Service -> Dao -> MyBatis -> Database

Controller 用作 URL 映射;Service 写业务逻辑;Dao 即 Data Access Object,数据访问对象,用途正如其名;Model 定义实体类,即 MyBatis 从数据库中取出的数据对应的 POJO。

此外,Controller 和 Service 命名相对固定,Dao 常被命名为 Mapper 或者 Repository,Model 还常被命名为 Entity 或者 Domain。以下使用 Controller -> Service -> Dao -> Model 的命名。

Read more »

官方英文文档链接

不同数据维度对应的类

从一维、二维到三维数据对应的类分别为:SeriesDataFramePanel,索引方式分别为:s.loc[indexer]df.loc[row_indexer, column_indexer]p.loc[item_indexer, major_indexer, minor_indexer]

用常见的 Excel 来举例的话,Series 就是一行数据(一维)、DataFrame 就是一整张表(二维),而 Panel 则是整个Excel文件(三维,可能包含多张表)。

缺省切片

实际上,DataFrame 切片也不一定要传两个参数,Panel 切片也不一定要传三个参数,省略参数默认为空切片。例如,p.loc['a'] 等价于 p.loc['a', :, :],效果是选择了一张数据表。

双引号

双引号指明间隔顺序,例如 s[::2] 表明从第一个元素开始每隔一个元素选择,而 s[::-1] 表明从最后一个开始往前选择。

Read more »

字符与字节

要搞清楚Python的字符编码问题,首先要区分两个概念:字符和字节。

字符(character)是一个符号,例如”a”、“中”就是字符。而字节是计算机的储存单位,同样一个字符,例如”中”,在不同的编码下,对应的字节就不同。GBK编码下为双字节 \xd6\xd0,而UTF8编码下为三字节 \xe4\xb8\xad

所以,字符是对符号的抽象,而字节是字符在计算机上的实现。不仅对于Python,对于任何编程语言都是这样。

u

u"sample-string" 表明字符串为Unicode字符串,UTF-8也是Python3的默认字符串编码。因为历史原因(Python诞生的时候Unicode标准还没有确定),Python2是不支持Unicode编码的,因此存储中文、Emoji等符号就依赖于各个用户自己的实现,导致了很多的混乱。这一点在C++上体现的“淋漓尽致”,C++字符串的变种之多之杂,是一般程序员很难想象的。

而另一门我们熟知的语言,Java就乘上了Unicode的东风。Java中所有的字符串都采用UTF-16编码,因此很少有程序员在Java中遇到字符串编码的问题。

Read more »

在进行数据处理时,经常需要遍历一个文件夹,在 Python 中最简单的解决办法是使用 os.walk()

函数声明

函数声明如下:

1
def walk(top, topdown=True, onerror=None, followlinks=False):

top 为传入的根目录。

os.walk() 函数会递归地为根目录下的每一个文件夹(包括根目录本身),产生一个三元组 (dirpath, dirnames, filenames)

dirpath 为当前文件夹路径;dirnamesdirpath 下所有文件夹的名称(非递归,类似于资源管理器中或 Finder 中看到的文件夹);filenamesdirpath 下所有文件的名称(同样非递归)。

Read more »