Python 3.9 新特性回顾

Python 3.10 虽已于 2021/10/04 发布,但目前主要使用的 Python 版本仍然是 3.9。之前有两篇介绍了 Python 3.7 和 3.8 带来的新特性

  1. Python 3.7 所带来的新特性
  2. 体验一下 Python 3.8 带来的主要新特性

于此,再补充一下 Python 3.7 和 3.8 各自的发布日期是 2018/06/27 和 2019/10/14。Python 3.9 是在 2020/10/05 发布,由此看出 Python 是每年一发布。

每个版本的主要新特性就是它们的亮点,不关注新特性也就不能很好的掌握这种语言,除非是直接使用汇编或字节码指令,他们的变迁比较缓慢。

对于以 Python 3.9 为现阶段基准版本使用来说,更有必要了解一下 Python 3.9 的新特性,不然别人一见代码就仿佛是以二战时的打法应对现代战争。

Python 3.9 主要有哪些新特征呢?总结起来就是

字典的更新/合并, 字符串新增删除前/后缀的方法,datetime 支持时区了, Executor.shutdown() 可取消未执行的任务,类型提示可直接用 list[str], dict[str, int] 这样表示泛型 阅读全文 >>

构建 AWS AMI 镜像(EC2 Image Builder + Terraform)

使用到 AWS 的 EC2 服务时,选择一个基础镜像后,要定制的话需要在 userdata 中写上一堆脚本。如果不想每次重复 userdata,或者要更快速的初始化一个虚拟机,就应该定制自己的 AMI,特别是在 Batch, ECS, EKS 选择的基础镜像还不方便使用 userdata。

定制一个 AMI, 我们可以用 aws create-image 命令,或是 HashiCorp 提供的 Packer(它不仅支持 AWS, 还能为 阿里云,Azure, Google 云,vmware, docker, Vagrant 等定制镜像)。而我们这里将要介绍的仍然是 HashiCorp 公司的 Terraform 并结合 AWS 的 EC2 Image Builder 服务来构建 AMI 镜像。

EC2 Image Builder 是 2019 年 12 月 1 日推出来的服务,见 Introducing EC2 Image Builder

构建一个镜像的基本过程是选择一个基础镜像来启动一个实例,然后在该实例中做一系列的操作,再保存操作后的状态为自己的镜像。这和用 Dockerfile 定制自己的 Docker 镜像是类似的。 阅读全文 >>

macOS 如何定位 JAVA_HOME

多数的 Java 入门教程都是要求同时设置 JAVA_HOME 和 PATH(包含 $JAVA_HOME/bin) 两个环境变量,反正两个都有了就保险。其实一般情况下系统能在 PATH 中找到 java 程序时就知道 JAVA_HOME, 基本上只要配置 PATH 就行,而 JAVA_HOME 环境变量是可选的。但也有例外,比如 TOMCAT 就可能要求有 JAVA_HOME 环境变量。

在 macOS 下,JAVA_HOME 与 PATH 的关系又显得有点微妙了。一个新的 macOS 系统,它自带有 java 命令

$ which java
/usr/bin/java

你要直接执行它的话

$ java
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.

所以它实际上只是执行 java 的辅助入口,没有实际的 JDK 或 JRE 是没用的。 阅读全文 >>

使用原生的 Windows Docker 容器

一谈到 Docker 容器,按照以往的惯性思维,那就是 Linux 容器(LXC),和 Windows 没多大关系,顶多也就是在 Windows 的 Linux 虚拟机中跑 Docker 容器。

不过自从 Windows Server 2016 开始,出现了 Windows 原生的 Docker 容器,它再也不只是 Linux 下的专利了。Docker 容器中可以运行 Windows 系统了, 每个 Windows 容器共享宿主机的 Windows 内核(--isolation=process,),或使用一个高度优化虚拟机中的 Windows 内核(--isolation=hyperv)。

我们说自 Windows Server 2016 开始,包括现在的 Windows Server 2019, Windows Server 2022, 还有桌面系统的 Windows 10 和  11 上 借助于 Docker Desktop 也能跑 Windows 容器。

原本在 Windows 桌面版上安装 Docker Desktop 就能用来运行 Linux 容器,由此可知在 Windows 桌面版上(如 Windows 7, 10, 11) 可运行两种类型的容器

  1. Linux 容器: 每个容器运行的是 Linux 实例,用 cgcroups 命名空间隔离资源。默认的,使用 Docker Desktop 的 LinuxEngine
  2. Windows 容器:容器中运行的是 Windows 实例,进程隔离模式是容器共享主 机的 Windows 内核,Hyper-V 隔离模式是容器使用高度优化虚拟机的内核。需启用 Windows 的 Hyper-V 特性,并切换 Docker Desktop 使用 WindowsEngine

阅读全文 >>

Python 连接和操作 DB2 和 Oracle 数据库

使用 Python 就难免要应对到不同数据库连接的问题,Python 目前也没有 Java 使用 JDBC 瘦客户端驱动那么方便。本人在用 Python 连接 SQL Server 时经常还是会有些问题,此文只着力于如何用 Python 连接 DB2 和 Oracle 数据库。

从本文中我们将会学到

  1. Python 围绕着 ibm_db 来操作 DB2
  2. 以 Python DB-API 2.0 规范来操作 DB2
  3. cx_Oracle Python 库 + Oracle Instant Client 操作 Oracle
  4. 用 Oracle 的  SID 还是 Service Name 来连接数据库
  5. Python 中借助 JayDeBeApi 使用 JDBC 驱动来操作数据库(以 Oracle 为例)
  6. 从 JayDeBeApi 中我们了解到 JPype 有助于我们在 Python 中调用 Java 

Python 操作 DB2

连接 DB2 数据库要简单的多,只要安装 ibm-db 库 阅读全文 >>

DB2 "The transaction log for the database is full" 问题的解决

在使用 DB2 的 Community 版本的 Docker 镜像 ibmcom/db2 进行测试,启动 Docker 容器的命令是

$ docker run -name db2server --privileged=true -p 50000:50000 \
    -e LICENSE=accept \
    -e DB2INSTANCE=db2user \
    -e DB2INST1_PASSWORD=password123 \
    -e DBNAME=test \
    ibmcom/db2

当使用多线程以及 JDBC 的 Batch Update 时,出现 "The transaction log for the database is full" 问题,一旦出现这个问题时,用数据库客户端连接后即使执行一条简单的 insert/update 语句也会报同样的错误。于是只能减少线程数和 Batch Update 时的记录来勉强过关,但性能上与其他数据库就有很大的差别了。 阅读全文 >>

Windows 下的软件包管理(Chocolatey)

在 Mac OS X 或各个 Linux 发行版都有自己的软件包管理工具,如

  1. Mac OS X: brew,  MacPorts 已鲜有人使用了
  2. Debian 系列: apt, 或 apt-get, 还有用 snap 的
  3. RedHat 系列: yum, 或 dnf
  4. Arch 系: pacman
  5. SUSE 系: YaST 或  Zypper
  6. Alpine 系: apk, 如 apk add openssh

基于现代的远程服务器管理,还总是用 RDP(远程桌面)来连接就显得有点那个了,效率上与命令行终端连接方式也无法企及,更不消说同时管理多台服务器。所以在命令行下或 PowerShell 中的 Windows  包管理工具也应运而生,让我们也能用远程 SSH 或 PowerShell 来管理 Windows 服务器,进行安装配置 阅读全文 >>

AWS Windows EC2 实例的 userdata 应用笔记

因为平常主要是使用 EC2 的 Linux 实例,所以之前写过的一篇关于 UserData 的日志 创建 AWS EC2 实例时 userdata 的一些知识 默认就是讲的有关 Linux 实例的 UserData。本文补充上 Windows 的 EC2 实例 UserData 的基本使用,参考自 AWS 官方文档 Run commands on your Windows instance at launch

Windows 的 UserData 被谁执行,依据所选择 AMI 的不同有以下三种方式

  1. EC2Launch v2: 最新方式,只是被当前预览版的 AMI 所支持,它支持 YAML 配置的脚本
  2. EC2Launch: 当前方式,Windows Server 2016 及更新版
  3. EC2Cofnig: 旧有方式, Windows Sever 2012 R2 及旧版本

阅读全文 >>

流畅的 Python 读书笔记(四)

Python 的函数是一等对象

因为它符合编程语言理论家对 "一等对象 -- first-class object" 的定义

  1. 运行时创建
  2. 可赋值给变量或数据结构的属性
  3. 能作为函数参数
  4. 能被函数返回 

依据这种定义,还有我们最为熟悉的 JavaScript 的函数也是一等对象,Java 的函数都是依附于类或对象存在的,不是一等对象。

Python 的文档字符串(docstring) 是放在模块,函数,类中的第一个纯字符串。可用单个引号(单引号或双引),通常因为有大段的文字会用三引号的字符串,比如

def foo():
    '''doing nathing'''
    pass

代码中用 foo.__doc__ 能查看到到 docstring,或用 help(foo), doc(foo) 都能输出包含 docstring 的信息 阅读全文 >>

流畅的 Python 读书笔记(三)

书中的数据结构还差文本和字节序列那一章未阅读完。Python 的 str 是 unicode 类型,编码在应用方面基本上就是 .decode(), .encode() 方法的调用,默认编解码时用 UTF-8 就行,差不多就不用太深入了。

Python 的 bytes 和 bytearray 中的元素都是介于 0 ~ 255(含) 之间的整数,即一个字节,bytes 的切片是 bytes, bytearray 的切片还是 bytearray。bytes 和 bytearray 的输出(__repl__) 

  1. 可打印的 ASCII 码以 ASCII 字符贵
  2. 特殊字转义,如 \r, \n, \r, 和 \\
  3. 其他字符以十六进制转义输出,如 \xc3

像 endswith, replace, strip, translate, upper 等函数可以直接用来处理 bytes,如 阅读全文 >>