Rocky Linux/Centos的跨大版本直接yum/dnf更新

理论上redhat系列较新的版本都可以这样更新,使用旧版本yum的发行版大概也可以。下面以 rocky linux 8.x 直接更新成rocky linux 9.x 示例

1. 先安装上基础包(release,repos,gpg-key)其包文件名,可以到该目录下查看,因为这几个包名里的版本号会随时更新。

dnf install https://download.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os/Packages/r/rocky-release-9.2-1.6.el9.noarch.rpm
dnf install --skip-broken https://download.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os/Packages/r/rocky-repos-9.2-1.6.el9.noarch.rpm
dnf install --skip-broken https://download.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os/Packages/r/rocky-gpg-keys-9.2-1.6.el9.noarch.rpm

2.执行更新

dnf --releasever=9 --allowerasing --setopt=deltarpm=false distro-sync

如果期间有报 GPG 错误,可以在本行命令中加上 --nogpgcheck 参数,不检查 gpg

3. 重建rpm数据库

rpm --rebuilddb

4. 重启 reboot

参考  https://www.starwindsoftware.com/blog/upgrade-from-rocky-linux-8-x-to-rocky-linux-9-0

可能存在的问题

a. 如果yum报如下的警告消息

 Problem 1: conflicting requests
- nothing provides module(platform:el8) needed by module mysql:8.0:8080020230517025647:fd72936b.x86_64
Problem 2: conflicting requests
- nothing provides module(platform:el8) needed by module perl:5.26:8050020211109115414:b4937e53.x86_64
...
 Problem 6: conflicting requests
- nothing provides module(platform:el8) needed by module python36:3.6:8080020230329212447:683b2e54.x86_64
Problem 7: conflicting requests
- nothing provides module(platform:el8) needed by module python38:3.8:8080020230625053205:0d9ba776.x86_64
Problem 8: conflicting requests
- nothing provides module(platform:el8) needed by module python39:3.9:8080020230703194939:aed85c85.x86_64

应该是以前设置过一些 yum module,这些module在新版本里已经无效,也就是在 /etc/dnf/modules.d/ 下有相关模块的配置文件,删掉对应的文件就是了,再运行 yum check 时就没了。或者 运行 module reset mysql 等相应的模块也可。

Windows下次启动时删除文件的原理及应用

Windows 下删除文件、尤其卸载程序时,有时会提示“下次启动时删除”,这是Windows底层提供的一个功能,具体来说是,把要删除的文件路径写到注册表里一个特定位置,下次Windows启动时,会自动检测这个位置里写的文件路径,删除它们。

这个位置在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager

下的 PendingFileRenameOperations ,是一个长文本数据,如果已经写入了待删除文件列表,大致如下

\??\C:\Users\feng\AppData\Local\Temp\Au_.exe

\??\C:\Users\feng\AppData\Local\Temp\~nsuA.tmp\Un_A.exe

\??\C:\Users\feng\AppData\Local\Temp\~nsuA.tmp

更具体的说,这个注册表项是由win32 api 函数 moveFileExW 函数 (winbase.h) 写入的,该函数调用时第三个参数指定了 MOVEFILE_DELAY_UNTIL_REBOOT 标志。https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-movefileexw

这样就会造成一个问题:有时卸载程序后提示某个文件要重启后删除,但又不想重启系统,并且,已经找到相关文件是哪个进程在占用并结束掉了,然后手工删掉了相关文件。

这时,如果还想重新安装该程序,安装向导很可能会提示,需要重启系统才能继续。但又不想重启系统。那么,该怎么办呢?

这时,只要到上述注册表项里,把相关行删掉,再运行安装程序,就可以继续了。其实最好是把所有行里的待删除文件都手工删除掉,再清空该注册表项。

docker 基本使用总结

照总结文档原样发出来,等基本定型后再改格式吧

起步 docker run 
    示例 docker run -i -t ubuntu /bin/bash
    会自动创建一个容器(Run a command in a new container)
命令格式
    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用参数
    -i -t   一般联用,分别为保持 STDIN、分配伪tty,效果为:运行后直接进入交互式环境
    --rm    容器运行结束后自动删除
    --name  指定一个名称,不指定会自动命名;
            多数命令中要指定具体的容器,可用容器ID或名称 (docker ps 输出的 CONTAINER ID, NAMES两栏)


运行容器/运行着的容器
    1. docker run       新建容器并在其中执行命令,有非常非常多参数
    2. docker ps        列出容器,默认列出运行中的;参数: -a 所有(--all); -l 最近运行的一个(--latest)
    3. docker start     运行一个或多个已经存在的容器;默认在后台执行,不附着(可 docker attach 之)
    4. docker attach    附着一个在后台运行的容器;不过不能优雅的断开,而且并不很推荐交互使用
    5. docker logs      查看容器内部的输出,默认所有行,最好用 --tail 指定行数; -t 为每行带时间戳
                        还可 -f 参数类似 tail -f, Ctrl+c 退出;
    6. docker top       查看容器内进程,与 top 类似,只是一刻静态;动态的话 docker stats
    7. docker exec      在运行中的容器中,运行一条命令;参数 -d 为后台模式 daemon;
                        参数 -t -i 交互模式(退出后不会造成容器停止); -u 指定以某用户身份运行

几个运行参数:
    --log-driver=x      启动时(run/start)指定该参数,用于将输出重定向到指定文件x; docker logs 将失效
    --restart=always, --restart=on-failure:5   容器(异常退出时)自动重启(:5次)
    --publish list, -p  如 -p 127.0.0.1:8080:80  宿主机 lo:8080 ~ 容器的 80 端口,ip: 可省略
    --publish-all, -P   暴露所有端口,Publish all exposed ports to random ports

管理容器
    1. docker start/restart/stop   启动/重启/停止
    2. docker rm        删除容器
    3. docker inspect   容器的深入信息(low-level information)
    4. docker create    非常非常多参数,跟 run 类似
    5. docker port      查看端口映射情况
    6. docker cp        在容器与本地环境间复制文件




镜像相关 images

镜像从仓库下载,本地存储在 /var/lib/docker/ 下,具体目录要要视采用的存储驱动而定。
仓库存在于 Registry 中,默认为 Docker 公司的公共 Registry 服务(即 DockerHub https://hub.docker.com)
线上镜像分公共

镜像相关操作命令
    1. docker images            列出本地镜像
    2. docker rmi               删除镜像
    3. docker search KEYWORD    搜索线上镜像
    4. docker pull IMAGE-NAME[:TAG|@DIGEST]     拉取指定镜像
    5. docker commit CONTAINER  从容器打包构建镜像,事实上是增量式, 并不常用
    6. docker build             构建镜像,要编写文件 Dockerfile, 这是常用的方式
    7. docker history IMAGE     镜像的历史,包含其每一层的构建历史及其 Dockerfile 指令
    8. docker push              推送到


构建镜像:通过 docker commit <不推荐>
    命令 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    方法相当于把容器 CONTAINER 打包成镜像,应该指定 名称:标签 以便后面引用


构建镜像:通过 Dockerfile 步骤及要点
    1. 在一个目录(构建环境, build environment)里,放置 Dockerfile 文件
    2. 命令 docker build [OPTIONS] PATH | URL | -
    3. Dockerfile 文件默认在 PATH/Dockerfile,  也可用 -f 指定文件名, 文件必须在构建环境中
    4. PATH 还可以是一个 git 仓库地址
    5. 最好指定 -t=IMAGE_NAME 为镜像命名,名称中可以为带前缀目录与标签 prefix/websvr:v1 
    6. 如果执行失败,将得一个可以使用的镜像,可调试之(以之创建一个交互式的容器)
    7. 构建环境根目录中支持 .dockerignore
    8. 默认缓存,从开头起未修改的部分,结果将直接复用;可 --no-cache 关闭这一特性

Dockerfile 示例
    ---------------------------
    # sample Dockerfile
    FROM ubuntu:15.04
    MAINTAINER Someone Name "sn@example.com"
    ENV REFERSHED_AT 2014-07-10
    RUN apt-get -qq update
    RUN apt-get install -y nginx
    # RUN apt-get -qq update && apt-get install -y nginx
    # RUN [ "apt-get", " install", "-y", "nginx"]
    EXPOSE 80
    ---------------------------

Dockerfile 格式(上示例说明)
    0. # 开头的注释行(可选)
    1. 第一条指令行必须是 FROM, 指定一个已存在的镜像(称为 基础镜像, base image)
    2. MAINTAINER 声明维护人信息
    3. ENV 设置环境变量,这里的 REFRESHED_AT ,模板最后更新时间,用于刷 apt 缓存; 对 yum 也有效
    4. RUN 指令在 shell 里执行时,默认由 /bin/sh -c 来执行;
    5. 接上,如不希望由 shell 包装(出于避免 shell 字符转义麻烦等考虑),可用 exec 格式写法(数组式)
    6. 每行指令都会创建镜像层,所以可以将多条指令合并在同一行一次性 RUN ,以简化层级
    7. EXPOSE 指令用于向外公开端口; docker 默认不开端口

Dockerfile 指令
    1.  CMD     容器启动时运行的命令,在 docker run 时可以被参数覆盖; 只允许一条/仅最后一条有效
                最好只使用数组式写法,如 CMD ["/bin/bash", "-l"]
    2.  ENTRYPOINT   与 CMD 类似,但不被 docker run 覆盖;二者组合可以实现一些特别功能
    3.  WORKDIR     容器内的工作目录,RUN, ENTRYPOINT, CMD 等的程序在此执行
    4.  ENV     设置环境变量,可一行设置多个;使用时 $ENVNAME 引用类似 BASH 里的
    5.  USER    指定(切换)执行用户,如 USER nginx, 可 user:group 组合,支持 uid,gid
    6.  VOLUME  一个或多个卷,如 VOLUME ["/opt/proj"] 将为基于此镜像的任何容器创建一个挂载点
                启动容器时以 -v 参数设定挂载点: -v /path/to/develop:/opt/proj , 可再加 rw 或 ro
    7.  ADD     将构建目录下的文件复制到镜像中指定位置(文件或目录皆可)如 ADD file.ext /opt/app/
                源文件支持 URL;源文件名如是 gzip, bzip2, xz,将自动解压缩到目标处
    8.  COPY    与 ADD 类似,但并不自动解压缩
    9.  LABEL   为镜像添加(键值对形式的)元数据,如有多个推荐一次性指定; 在 docker inspect 查看
    10. STOPSIGNAL  指定停止容器时发送给容器的系统信号,如果 9, SIGKILL
    11. ARG     定义变量,仅在 docker build 中可用;还可通过 --build-arg 传递给构建运行时
                如,定义了 ARG build 及 ARG app_user=user, 且 docker build --build-arg build=1404 
                则构建时, build 为 1404,, app_user 为默认值 user
    12. ONBUILD 触发器,好像挺复杂的,先忽略


私有 Registry 服务
    Docker 官方提供私服镜像,可容器化运行:
    docker run -d -p 5000:5000 --restart always --name registry registry:2
    使用上,先给本地镜像打 tag ,然后 push 上去
    docker tag my_image localhost:5000/my_image
    docker push localhost:5000/my_image


sed正则的扩展与非扩展区别

sed的正则表达式,有扩展正则与基本正则(或叫非扩展正则)之分,默认非扩展。两者区别主要是对几个特殊字符的定义上:即 问号‘?’,加号 ‘+’, 圆括号‘()’, 花括号‘{}’, 竖线管道符 ‘|

这是个坑,尤其对习惯使用扩展正则语法的用户而言。

我们一般用的是 GNU 的 sed ,以之为例。

具体来说,两者区别是,在基本正则中,上述几个字符本身没有定义特殊功能,与其它普通字符一样,只代表它们字面上的字符。而在扩展正则上,则有相应的定义。

不过,事实上,在基本正则模式下,还是能让这几个字符表示相应的正则符号定义,方法是用反斜线\转义一下。这样就显得有点怪异了,扩展与非扩展功能完全一致,除了这几个字符的转义与否正好相反。猜测,在基本正则里的这个约定是GNU sed干的。其他版本的sed的基本模式下,完全不支持扩展语法。

所以了,最佳的使用习惯是,准确的区分是否用扩展正则的语法,如果用了,那就指定  -E 参数以启用扩展。否则,就完全不要用,尤其最好不要用依赖GNU sed里基本正则定义的怪异的扩展语法。

GNU sed 的手册有如下

In GNU sed, the only difference between basic and extended regular expressions is in the behavior of a few special characters: ‘?’, ‘+’, parentheses, braces (‘{}’), and ‘|’.

With basic (BRE) syntax, these characters do not have special meaning unless prefixed with a backslash (‘\’); While with extended (ERE) syntax it is reversed: these characters are special unless they are prefixed with backslash (‘\’).

 

 

[收集帖] 常用入声字表

http://wx.shangdiguo.com/blog.asp?wenzhangid=35658

常用入声字表

最常用的入声字(431个)

B  八白百北捌笔剥薄柏伯别勃逼钵拔鳖憋跋钹舶帛泊渤脖博搏膊驳卜佰雹拨

C  擦察插撮吃出戳拆撮

D 答搭达得夺德敌碟蝶独迭叠褡滴夺度跌读督咄的沓笛迪狄荻嫡镝籴喋堞牒涤犊牍渎毒铎踱度癖撇匹朴笃谍耋督

E  额

F  发福法幅乏璞仆伐筏阀罚佛弗拂彿伏茯服蝠辐

G  格隔阁革搁骨疙胳割鸽刮聒郭膈国帼虢葛骼鹄

H  喝活黑合忽核盒曷阖劾阂貉涸翮斛滑曷斛滑豁

J  节迹洁吉击急及极积极级激即觉绝杰捷决绩缉楫屐夹荚颊揭截结接菊掬鞠及级汲岌笈亟急即脊瘠疾嫉蒺集籍藉辑楫缉棘桀洁絜拮诘劫桀傑栉婕睫截局跼菊橘竭偈抉诀玦倔掘崛厥蕨蹶爵嚼棘瘠碣局角

K  磕搕哭窟咳壳窟

L  拉勒

M  摸抹膜没

N  捏霓捏

P  泼劈撇瞥扑仆拍霹泊

Q  七切曲屈缺柒漆戚沏掐

S  俗十石食拾实识说杀刷撒缩塞虱湿失叔淑菽什蚀舌折孰熟秫赎勺芍虱塾缩

T  塔帖塌踏剔踢贴秃托脱突

W  屋挖

X  学夕惜昔吸悉蟋析息熄汐锡晰薛浙晰膝瞎歇楔蠍戌削席媳习袭檄挟侠狭峡狎黠辖协胁颉撷穴匣歇蝎胁

Y  一压曰约壹押鸭噎揖掖翕揖约

Z  杂砸则竹直浊烛逐责贼只汁足拙昨桌执灼哲昨酌着琢值卒族择泽织扎卓倬捉琢拙摘粥侄植殖执姪职铡闸宅折辙辄谪蛰竺轴妯匝凿织斫

(上表是最基本最常用的表,下面提供的各种资料可供不同需要的参考。)

分部入声字(823个)

入声,一屋[-uk]
屋木竹目服福禄熟谷肉咒鹿腹菊陆轴逐牧伏宿读犊渎牍椟黩毂复粥肃育六缩哭幅斛戮仆畜蓄叔淑菽独卡馥沐速祝麓镞蹙筑穆睦啄覆鹜秃扑鬻辐瀑竺簇暴掬濮郁矗复塾朴蹴煜谡碌毓舳柚蝠辘夙蝮匐觫囿苜茯髑副孰谷

入声,二沃[-uuk]
沃俗玉足曲粟烛属录辱狱绿毒局欲束鹄蜀促触续督赎浴酷瞩躅褥旭欲渌逯告仆

入声,三觉[-eok]
觉角桷较岳乐捉朔数卓汲琢剥趵爆驳邈雹璞朴确浊擢镯濯幄喔药握搦学

入声,四质[-it]
质日笔出室实疾术一乙壹吉秩密率律逸佚失漆栗毕恤蜜橘溢瑟膝匹黜弼七叱卒虱悉谧轶诘戌佶栉昵窒必侄蛭泌秫蟀嫉唧怵帅聿郅桎茁汨尼蒺

入声,五物[-ot]
物佛拂屈郁乞掘讫吃绂弗诎崛勿熨厥迄不屹芴倔尉蔚

入声,六月[-jat]
月骨发阙越谒没伐罚卒竭窟笏钺歇突忽勃蹶筏厥蕨掘阀讷殁粤悖兀碣猝樾羯汨咄渤凸滑孛核饽垡阏堀曰讦

入声,七曷[-at]
曷达末阔活钵脱夺褐割沫拔葛渴拨豁括聒抹秣遏挞萨掇喝跋獭撮剌泼斡捋袜适咄妲

入声,八黠[-aet]
黠札拔猾八察杀刹轧刖戛秸嘎瞎刮刷滑

入声,九屑[-et]
屑节雪绝列烈结穴说血舌洁别裂热决铁灭折拙切悦辙诀泄咽噎杰彻别哲设劣碣掣谲窃缀阅抉挈捩楔蹩亵蔑捏竭契疖涅颉撷撤跌蔑浙澈蛭揭啜辍迭呐侄冽掇批橇

入声,十药[-ak]
药薄恶略作乐落阁鹤爵若约脚雀幕洛壑索郭博错跃若缚酌托削铎灼凿却络鹊度诺橐漠钥著虐掠获泊搏勺酪谑廓绰霍烁莫铄缴谔鄂亳恪箔攫涸疟郝骆膜粕礴拓蠖鳄格昨柝摸貉愕柞寞膊魄烙焯厝噩泽矍各猎昔芍踱迮

入声,十一陌[-eak]
陌石客白泽伯迹宅席策碧籍格役帛戟璧驿麦额柏魄积脉夕液册尺隙逆画百辟赤易革脊获翮屐适剧碛隔益栅窄核掷责惜僻癖辟掖腋释舶拍择摘射斥弈奕迫疫译昔瘠赫炙谪虢腊硕螫藉翟亦鬲骼鲫借啧蜴帼席貊汐摭咋吓剌百莫蝈绎霸霹

入声,十二锡[-ek]
锡壁历枥击绩笛敌滴镝檄激寂翟逖籴析晰溺觅摘狄荻戚涤的吃霹沥惕踢剔砾栎适嫡阋觋淅晰吊霓倜

入声,十三职[-jik]
职国德食蚀色力翼墨极息直得北黑侧饰贼刻则塞式轼域殖植敕饬棘惑默织匿亿忆特勒劾仄稷识逼克蜮唧即拭弋陟测冒抑恻肋亟殛忒嶷熄穑啬匐鲫或愎翌

入声,十四缉[-ip]
缉辑立集邑急入泣湿习给十拾什袭及级涩粒揖汁蛰笠执隰汲吸熠岌歙熠挹

入声,十五合[-op]
合塔答纳榻杂腊蜡匝阖蛤衲遝鸽踏飒拉盍搭溘嗑

入声,十六叶[-ep]
叶帖贴牒接猎妾蝶箧涉捷颊楫摄蹑谍协侠荚睫慑蹀挟喋燮褶靥烨摺辄捻婕聂霎

入声,十七洽[-aep]
洽狭峡法甲业邺匣压鸭乏怯劫胁插押狎掐夹恰眨呷喋札钾

入声是古代汉语的一种声调,属仄声,指一个音节以破音/p/、/t/、/k/作结,发出短而急促的子音。入声已经在现代普通话不复存在。现代江浙、福建、广东、广西、江西等处都还保存着入声。北方也有不少地方(如山西、内蒙古)保存着入声。

入声字的分类

说明:
古入声字,有的方言今仍读入声。如广州、上海、苏州、南京、太原、张家口等;有的方言这类古入声字,今不读入声,分别归到其他声调里去了。古入声字,郑州今大部分归阴平,少部分归阳平,重庆今归阳平,普通话分别归入今阴平、阳平、上声、去声四个声调。为便于查检,本表入声字按普通话的阴平、阳平、上声、去声的次序排列。同声调的字按声母的次序排列。有些字加小注,如发~生,“~”符号,表示省略。

(一)普通话今读阴平字

b 八捌钵拔剥逼鳖憋擘~开
p 泼劈撇瞥扑仆拍霹泊湖~
m 摸抹~桌子
f 发~生
d 答~理搭褡滴跌督掇剟裰咄
t 塌踏~实剔踢帖贴怗秃托脱突
n 捏
l 拉勒~住
c 擦撮轻~
s 撒~手缩塞堵~
zh 隻汁织扎~营桌卓倬捉琢拙摘粥
ch 吃插出戳拆~开
sh 虱湿失杀刷说叔淑菽
j 激迹击墼积绩勣缉屐夹~攻揭结~实接噘撅撧锔掬鞠
q 七柒漆戚沏掐切曲~线屈缺麯
x 吸翕歙悉蟋窻析息熄惜昔夕汐锡晰浙晰膝瞎歇楔蠍戌薛削
g 搁~下疙胳割鸽刮聒郭
k 磕搕磕哭窟
h 喝~水忽惚唿豁劐黑
o 一壹揖押鸭噎掖屋挖曰约压

(二)普通话今读阳平字

b 拔跋钹魁白舶帛伯泊停~箔勃渤脖鹁博薄厚~礴搏膊驳别蹩醭
P 璞僕仆~人濮
m 膜没~有
f 乏伐筏阀垡罚佛弗拂彿绋茀伏茯袱服~从菔韨绂福幅蝠辐
d 答问~瘩沓达鞑妲靼怛得德笛迪狄荻敌嫡镝觌翟滌籴的~确碟蝶喋堞牒迭叠独读犊牍渎毒夺铎踱度忖~
z 杂砸则择泽责啧帻箦贼足卒族镞昨
s 俗
zh 直值植殖稙执姪职扎挣~剳铡闸宅折辙摺哲辄谪蛰詟竹竺烛躅逐轴妯酌浊镯琢啄濯擢茁斫斲
ch 察
sh 十什拾石食蚀实识舌折弄~孰熟秫赎勺
j 及级汲岌笈亟极殛吉急即脊~梁瘠疾嫉蒺集籍藉狼~辑楫戢棘夹~衣荚郏颊洁絜结~局拮诘劼颉劫桀傑杰羯碣竭竭偈节栉捷婕睫截局跼菊橘决抉诀玦倔~强掘崛桷厥蕨蹶一~不振獗橛谲觉爵嚼绝矍攫躩钁
x 席媳习袭檄侠狭峡狎辖黠协勰胁颉撷穴学
g 格阁路革隔膈国帼虢骨~头
k 咳壳
h 合盒曷运转阖劾核阂貉涸翮斛觳滑猾活
o 额

(三)普通话今读上声字

b 笔卜百佰柏北
p 癖撇匹朴~素蹼
m 抹~药
f 发理~法
d 笃
t 塔獭铁贴柬~庹
s 撒~种靸索
zh 嘱瞩眨窄
ch 尺
sh 蜀属
r 辱
j 戟给脊屋~甲岬胛蹶
q 乞曲歌~
x 雪血宿
g 骨~骼鹘谷毂嫴鹄汩葛姓~
k 渴
o 恶~心乙

(四)普通话今读去声字

b 必毖辟薜~荔壁璧毕跸哔筚弼碧滗彆~扭不薄~荷
p 迫粕珀魄僻闢瀑曝
m 末抹~石灰沫茉秣莫寞漠默墨麦没~落脈殁陌泌秘蜜密谧觅幂汩灭蔑篾木沐霂幕目苜牧睦穆
f 复復腹覆蝮服吃~药缚
d 度踱的目~
t 踏~步搨榻遢蹋挞特惕倜拓萚
n 纳衲讷呐匿暱溺逆涅隉聂蹑颞镊臬孽蘖齧诺搦虐疟
l 辣瘌蜡腊鑞肋仂勒~令乐快~力立粒笠栗慄溧历枥沥疬雳栎砾郦列冽烈裂猎躐鬣劣鹿漉麓辘菉绿录禄碌録逯戮陆六洛雒络落酪烙骆珞律率略掠
z 仄作柞酢凿
c 侧测恻厕策册猝促蹴簇蹙踧
s 飒萨瑟塞啬穑涩色肃鹔速觫簌宿粟谡夙
zh 窒桎铚蛭郅秩紩陟炙质锧浙祝
ch 斥赤彻撤澈畜~生搐觸怵黜绌矗绰辍龊
sh 式拭栻室释适饰煞歃霎设慑摄涉述术沐束妁朔蒴槊烁铄硕蟀
r 日热肉褥入若箬弱
j 鲫稷剧倔~脾气寂
q 迄汔泣恰洽怯契惬箧切~记窃妾却确搉榷壳悫阙阕鹊雀
x 隙吓~人绁泄燮亵屑恤卹畜~牧蓄勗旭续穴血
g 各
k 克剋客恪嗑榼酷喾阔括扩廓
h 赫郝喝~采鹤褐笏或惑获蠖镬霍藿壑
o 恶善~萼愕鄂鳄噩厄扼轭遏亦奕易邑浥轶役疫亿忆臆绎译驿益镒翼翊熠佾逸屹抑腋液揠叶页业邺谒烨兀杌勿物沃襪握幄玉钰域蜮浴欲慾峪毓育郁昱煜狱月刖悦阅钺樾乐音~药耀跃粤岳嶽鬰钥

(说明:以上是从网上的《平水韵部》一文中摘录下来的,希望对联友们有用。在使用时如有疑问,请以《辞源》或其他工具书为准。《辞源》是对其收录的每一个汉字都标明了平上去入的。)

2016-10-22

平仄及入声字简单的辩别方法

现在很多人都搞不清楚怎么样区别平仄,有的网友也提到这个问。

因为现代汉语没有入声,把入声字分别转变成了一、二、三、四各个声调去了。

大致说来,汉语的第一、二声,相当于平声,第三、四声,相当于仄声。

但是,第一、二声当中,仍杂有不少的入声字,作诗的时候,仍旧要归到仄声里去的。

所以我们只要把这部份入声字识别出来就可以了。

(一)凡b、d、g、j、zh、z六母的第二声字(阳平),都是古入声字。例如:
b:拔跋白帛薄荸别蹩脖舶伯百勃渤博驳。
d:答达得德笛敌嫡觌翟跌迭叠碟牒独读牍渎毒夺铎掇。
g:格阁蛤胳革隔葛国虢。
j:及级极吉急击棘即脊疾集籍夹夹嚼洁结劫杰杰竭截局菊掬橘决诀掘角厥橛脚镢觉爵绝。
zh:札扎扎铡宅择翟着折折蜇轴竹妯竺烛筑逐浊镯琢濯啄拙直值殖质执侄职。
z:杂凿则择责贼足卒族昨。

(二)凡d、t、L、z、c、s等六母跟韵母e拼合时,不论国语读何声调,都是古入声字。例如:
de:得德。
te:特忒慝螣。
Le:勒肋泐乐埒垃。
ze:则择泽责啧赜笮迮窄舴贼仄昃。
ce:侧测厕策策册。
se:瑟色塞啬穑濇涩圾。

(三)凡k、zh、ch、sh、R五母与韵母uo拼合时,不论国语读何声调,都是古入声字。例如:
kuo:阔括廓鞹扩。
zhuo:桌捉涿着酌浊镯琢啄濯擢卓焯倬踔拙斲斫斮鷟浞梲。
chuo:戳绰歠啜辍醊惙龊婼。
shuo:说勺芍妁朔搠槊箾铄硕率蟀。
ruo:若鄀箬爇蒻。

(四)凡b、p、m、d、t、n、L七母跟韵母ie拼时,无论国语读何声调,都是古入声字,只有

「爹」die字例外。例如:
bie:鳖憋别蹩瘪别。
pie:撇瞥。
mie:灭蔑篾蔑蠛。
die:碟牒喋堞蹀谍鲽跌迭瓞昳垤耋绖咥叠。
tie:帖贴怗铁餮。
nie:捏陧聂镊臬闑镍涅蘖孽啮啮。
Lie:列冽烈裂洌猎躐捩劣。
(五)凡d、g、h、z、s五母与韵母ei拼合时,不论国语读何声调,都是古入声字。例如:
dei:得。
gei:给。
hei:黑嘿。
zei:贼。
sei:塞。

(六)凡声母f,跟韵母a、o拼合时,都是古入声字。例如:
fa:法发伐砝乏伐阀罚发。
fo:佛缚。

(七)凡读ue韵母的字,都是古入声字。只有「嗟」jue,「瘸」queˊ,「靴」xue三字除外。

例如:
ue:曰约哕月刖玥悦阅钺乐药耀曜跃龠钥钥瀹爚禴礿粤岳岳鸑軏。
nue:虐疟谑。
Lue:略掠。
jue:噘撅决抉鴃诀玦掘桷崛角劂蕨厥橛蹶獗噱臄谲鐍珏孓脚觉爵嚼爝绝蕝矍攫躩屩。
que:缺阙却怯确榷壳悫埆确阙鹊雀碏。
xue:薛穴学雪血削。

(八)一字有两读,读音为开尾韵,语音读i或u韵尾的,也是古入声字。例
如:
读音为e,语音为ai的:色册摘宅翟窄择塞。
读音为o,语音为ai的:白柏伯麦陌脉。
读音为o,语音为ao的:薄剥摸。
读音为uo,语音为ou:肉粥轴舳妯熟。
读音为u,语音为iu:六陆衄。
读音为ue,语音为ao:药疟钥嚼脚角削学。

根据上面的分析,大部分的入声字,都可从国语的读音来加以辨识,能如此,则对于诗的格律,

自也不会觉得有什么困难了。

常见入声字表

汉字的字音有调,这是大家都知道的。普通话的语音有阴平、阳平、上(读如赏)声、去声,通常说一、二、三、四声。而古音则分平、上、去、入四个声调,上、去、入都是仄声。普通话的阴平、阳平属平声,上声、去声属仄声。但是阴平、阳平中有些古入声字要注意,如福,普通话是阳平,而古音是入声。国、决、歇、逼、敌、集等都是古入声字,都要归入仄声中去。这些字如果处在可平可仄的位置上倒也无关紧要,如果处在关键位置(韵脚、音节的第二字)上就要特别注意。讲川、粤、湘方言的人,可借助方言音来区别入声字,但需对声韵有一定基础的人才能办到。所以入声字的识别主要靠记忆,记熟了,对入声字的发音特点比较熟悉了,就善于识别了。下面这个入声字表供大家记忆用,这些字尽量不用在平声音节的第二字处和韵脚处(押入声韵例外)。
此外,还要注意有些字古音与今音的不同,因而平仄和韵部都不相同。如斜,古读xia,音霞;车,古读ju,音居;又读cha,音差;等等。不过只在读古诗词时需注意,我们写诗词时不必管它。

* 常见入声字(按笔画) *
一画:一
二画:七八十
三画:兀孑勺习夕
四画:仆曰什及
五画:扑出发札失石节白汁匝
六画:竹伏戍伐达杂夹杀夺舌诀决约芍则合宅执吃汐
七画:秃足卒局角驳别折灼伯狄即吸劫匣
八画:叔竺卓帛国学实直责诘佛屈拔刮拉侠狎押胁杰迭择拍迪析极刷
九画:觉(觉悟)急罚
十画:逐读哭烛席敌疾积脊捉剥哲捏酌格核贼鸭
十一画:族渎孰斛淑啄脱掇郭鸽舶职笛袭悉接谍捷辄掐掘
十二画:菊犊赎幅粥琢厥揭渤割葛筏跋滑猾跌凿博晰棘植殖集逼湿黑答插颊
十三画:福牍辐督雹厥歇搏窟锡颐楫睫隔谪叠塌
十四画:漆竭截牒碣摘察辖嫡蜥
十五画:熟蝠膝瘠骼德蝶瞎额
十六画:橘辙薛薄缴激
十七画:擢蟋檄
十九画:蹶
二十画:籍黩嚼

辨别入声字的方法

现在很多人都搞不清楚怎么样区别平仄,有的网友也提到这个问。因为现代汉语没有入声,把入声字分别转变成了一、二、三、四各个声调去了。大致说来,汉语的第一、二声,相当于平声,第三、四声,相当于仄声。但是,第一、二声当中,仍杂有不少的入声字,作诗的时候,仍旧要归到仄声里去的。所以我们只要把这部份入声字识别出来就可以了。
(一)凡b、d、g、j、zh、z六母的第二声字(阳平),都是古入声字。例如:
b:拔跋白帛薄荸别蹩脖舶伯百勃渤博驳。 (“鼻”例外,是中古去声字。)
d:答达得德笛敌嫡觌翟跌迭叠碟牒独读牍渎毒夺铎掇。
g:格阁蛤胳革隔葛国虢。
j:及级极吉急击棘即脊疾集籍夹夹嚼洁结劫杰杰竭截局菊掬橘决诀掘角厥橛脚镢觉爵绝。
zh:札扎扎铡宅择翟着折折蜇轴竹妯竺烛筑逐浊镯琢濯啄拙直值殖质执侄职。
z:杂凿则择责贼足卒族昨。
(二)凡d、t、n、l、z、c、s等六母跟韵母e拼合时,不论国语读何声调,都是古入声字。(“厕”例外。)例如:
de:得德。
te:特忒慝螣。
ne:讷。
le:勒肋泐乐埒垃。
ze:则择泽责啧赜笮迮窄舴贼仄昃。
ce:侧测策策册。
se:瑟色塞啬穑濇涩圾。

(三)凡k、zh、ch、sh、R五母与韵母uo拼合时,不论国语读何声调,都是古入声字。例如:
kuo:阔括廓鞹扩。
zhuo:桌捉涿着酌浊镯琢啄濯擢卓焯倬踔拙斲斫斮鷟浞梲。
chuo:戳绰歠啜辍醊惙龊婼。
shuo:说勺芍妁朔搠槊箾铄硕率蟀。
ruo:若鄀箬爇蒻。
(四)凡b、p、m、d、t、n、l七母跟韵母ie拼时,无论国语读何声调,都是古入声字,只有「爹」die字例外。例如:
bie:鳖憋别蹩瘪别。
pie:撇瞥。
mie:灭蔑篾蔑蠛。
die:碟牒喋堞蹀谍鲽跌迭瓞昳垤耋绖咥叠。
tie:帖贴怗铁餮。
nie:捏陧聂镊臬闑镍涅蘖孽啮啮。
lie:列冽烈裂洌猎躐捩劣。

(五)凡d、g、h、z、s五母与韵母ei拼合时,不论国语读何声调,都是古入声字。例如:
dei:得。
gei:给。
hei:黑嘿。
zei:贼。
sei:塞。

(六)凡声母f,跟韵母a、o拼合时,都是古入声字。例如:
fa:法发伐砝乏伐阀罚发。
fo:佛缚。

(七)凡读üe韵母的字,都是古入声字。只有「嗟」jue,「瘸」que,「靴」xue三字除外。例如:
yue:曰约哕月刖玥悦阅钺乐药耀曜跃龠钥钥瀹爚禴礿粤岳岳鸑軏。
nüe:虐疟谑。
lüe:略掠。
jue:噘撅决抉鴃诀玦掘桷崛角劂蕨厥橛蹶獗噱臄谲鐍珏孓脚觉爵嚼爝绝蕝矍攫躩屩。
que:缺阙却怯确榷壳悫埆确阙鹊雀碏。
xue:薛穴学雪血削。

(八)一字有两读,读音为开尾韵,语音读i或u韵尾的,也是古入声字。例如:
读音为e,语音为ai的:色册策摘宅翟窄择塞。
读音为e,语音为ei的:贼肋勒北克黑得忒。
读音为o,语音为ai的:白百柏伯麦陌脉。
读音为o,语音为ao的:薄剥摸。
读音为uo,语音为ao的:着凿落烙。
读音为uo,语音为ou:肉粥轴舳妯熟。
读音为u,语音为iu:六陆衄。
读音为üe,语音为ao:乐药疟跃钥觉嚼脚角削学雀。
否定法

1.凡是有鼻音韵尾n和ng的字,不是入声字。
2.读zi、ci、si三个音节的字,不是入声字。
3.读uei音节的字,不是入声字。
4.读uai音节的字,不是入声字(少数除外,如“率”字等)。
5.声母为m、n、l、r,而读阴平、阳平或上声的字,不是入声字。(少数例外:捏nie1,辱ru3)
6.韵母为er的也不是入声字。
7.韵母为ai、ei、ao、iao、ou、iou的字,大多数不是入声字。
8.声母为p、t、k、q、c、ch的阳平(二声)字,不是入声字。(少数例外:咳ke2,壳ke2,察cha2,仆pu2,璞pu2)
根据上面的分析,大部分的入声字,都可从国语的读音来加以辨识,能如此,则对于诗的格律,自也不会觉得有什么困难了。

如何记忆入声字

(选自甘棠诗词基础讲座)

我们写作诗词,要求会分辨平上去入四声。平上去好办,关键是入声。因为现代普通话里没有入声,而且大部分北方方言里的入声也早已消失了。这就为我们广大的北方诗友学习诗词带了一个特殊的难题,就是如何分辨和记住入声字。
关于分辨入声字,有学者通过研究,在现代普通话的拼音基础上,总结了七八条规则,据说能分辨出90%的入声字。但是,实践表明,对于毫无音韵学知识的初学者来说,这一方法还不如直接记忆来得效果明显。
下面我们就来讲讲如何记忆入声字。
根据有关的韵书,入声字大约有1300--1400个,其中常用的有五六百个。这五六百个中,诗词中最常用的又有一二百个。这样,我们就把它们分成了最常用、次常用、不常用三个等级,这与英语单词按出现频度分级是一样的道理。
我们首先要记住的,是这最常用的一二百个入声字。那么,我们如何来记住它们呢?最笨的办法当然是死记了。但这样效率实在是太低,我们还是要想些办法的。这里提供一些可行的办法:
1 组词法。将两个最常用的入声字组成一个常用的词组,这比单独记要容易得多。
比如,我们可以看看下面这些词组:
日月,出入,得失,学习,积极,北国,博客,克服,哭泣,独立,急切,曲折,合适,激烈,压迫,剥削,骨肉,黑白,熄灭,恶毒,吃喝,袭击,发达,决裂,物质,德育,脱落,阅读,结束,笔力。
上面这30个词组,都是由两个最常用的入声字组成的。多看几遍,或者按照某一定的规律排列起来,记住这些词组不难。记住了这30个词组,就记住了60个最常用的入声字。这样的词组还有,诗友可以自己归纳。
2 分类法。将最常用的入声字分门别类。
数字:一六七八十百亿
颜色:黑白碧绿赤色
材质:铁石木竹
天体:日月雪
建筑:屋宅室壁阁阙
身体:血肉骨骼发目额舌脖肋脊腹膝脚足甲角
植物:菊柏桔橘栗棘荻麦核稷穑木叶竹植
动物:虱蟋鲫蝎蝶雀鸽鸭(注意没有大动物)
入声发音短,故常用来表快速或破坏性的动作
如:速疾逐越突忽,杀伐击灭夺割。等等。
通过以上分类法,多记几遍,除去与组词法重复的少数字,我们又能记住70个入声字。
3 人名法。将你所熟悉的、含有常用入声字的人名列个表,会有利于记忆。
如:屈原,李白,蒋介石,毛泽东,朱德,黄菊。
这个不多举例,每个人都可以列出自己熟悉的名人或同事亲友的名单。
4 诗词法。选择你所喜欢的押入声韵的诗词,背熟它。这里推荐几首大家最熟悉的词。
岳飞的《满江红》(歇,烈,月,切,雪,灭,缺,血,阙)
怒发冲冠,凭栏处、潇潇雨歇。抬望眼,仰天长啸,壮怀激烈。三十功名尘与土,八千里路云和月。莫等闲、白了少年头,空悲切。
靖康耻,犹未雪;臣子恨、何时灭?驾长车、踏破贺兰山缺。壮士饥餐胡虏肉,笑谈渴饮匈奴血。待从头、收拾旧山河,朝天阙。

苏东坡的《念奴娇》(物,壁,雪,杰,发=發,灭,发=髪,月)
大江东去,浪淘尽,千古风流人物。故垒西边,人道是、三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰。
遥想公谨当年,小乔初嫁了,雄姿英发。羽扇纶巾,谈笑间、强虏灰飞烟灭。故国神游,多情应笑我,早生华发。人间如梦,一尊还酹江月。

李清照的《声声慢》(戚,息,急,识,积,摘,黑,滴,得)
寻寻觅觅,冷冷清清,凄凄惨惨戚戚。乍暖还寒时候,最难将息。三杯两盏淡酒,怎敌他、晚来风急?雁过也,正伤心,却是旧时相识。
满地黄花堆积。憔悴损,如今有谁堪摘?守著窗儿,独自怎生得黑?梧桐更兼细雨,到黄昏、点点滴滴。这次第,怎一个、愁字了得!

李白的《忆秦娥》(咽,月,别,节,绝,阙)
箫声咽,秦娥梦断秦楼月。秦楼月,年年柳色,灞陵伤别。 乐游原上清秋节,咸阳古道音尘绝。音尘绝,西风残照,汉家陵阙。

如果你记忆力好,而且有足够的耐心,不妨背杜甫的《北征》,有70个入声字的韵。
皇帝二载秋,闰八月初吉。杜子将北征, 苍茫问家室。维时遭艰虞, 朝野少暇日。
顾惭恩私被, 诏许归蓬荜。拜辞诣阙下, 怵惕久未出。虽乏谏诤姿, 恐君有遗失。
君诚中兴主, 经纬固密勿。东胡反未已, 臣甫愤所切。挥涕恋行在, 道途犹恍惚。
乾坤含疮痍, 忧虞何时毕!靡靡逾阡陌, 人烟眇萧瑟。所遇多被伤, 呻吟更流血。
回首凤翔县, 旌旗晚明灭。前登寒山重, 屡得饮马窟。豳郊入地底, 泾水中荡潏。
猛虎立我前, 苍崖吼时裂。菊垂今秋花, 石戴古车辙。青云动高兴, 幽事亦可悦。
山果多琐细, 罗生杂橡栗。或红如丹砂, 或黑如点漆。雨露之所濡, 甘苦齐结实。
缅思桃源内, 益叹身世拙。坡陀望鄜畤, 岩谷互出没。我行已水滨, 我仆犹木末。
鸱枭鸣黄桑, 野鼠拱乱穴。夜深经战场, 寒月照白骨。潼关百万师, 往者散何卒?
遂令半秦民, 残害为异物。况我堕胡尘, 及归尽华发。经年至茅屋, 妻子衣百结。
恸哭松声回, 悲泉共幽咽。平生所娇儿, 颜色白胜雪。见耶背面啼, 垢腻脚不袜。
床前两小女, 补缀才过膝。海图拆波涛, 旧绣移曲折。天吴及紫凤, 颠倒在短褐。
老夫情怀恶, 数日卧呕泄。那无囊中帛, 救汝寒凛栗?粉黛亦解苞, 衾裯稍罗列。
瘦妻面复光, 痴女头自栉。学母无不为, 晓妆随手抹。移时施朱铅, 狼籍画眉阔。
生还对童稚, 似欲忘饥渴。问事竞挽须, 谁能即嗔喝?翻思在贼愁, 甘受杂乱聒。
新妇且慰意, 生理焉得说?至尊尚蒙尘, 几日休练卒?仰观天色改, 坐觉妖氛豁。
阴风西北来, 惨澹随回纥。其王愿助顺, 其俗善驰突。送兵五千人, 驱马一万匹。
此辈少为贵, 四方服勇决。所用皆鹰腾, 破敌过箭疾。圣心颇虚伫, 时议气欲夺。
伊洛指掌收, 西京不足拔。官军请深入, 蓄锐可俱发。此举开青徐, 旋瞻略恒碣。
昊天积霜露, 正气有肃杀。祸转亡胡岁, 势成擒胡月。胡命其能久? 皇纲未宜绝。
忆昨狼狈初, 事与古先别。奸臣竟菹醢, 同恶随荡析。不闻夏殷衰, 中自诛褒妲。
周汉获再兴, 宣光果明哲。桓桓陈将军, 仗钺奋忠烈。微尔人尽非, 于今国犹活。
凄凉大同殿, 寂寞白兽闼。都人望翠华, 佳气向金阙。园陵固有神, 洒扫数不缺。
煌煌太宗业, 树立甚宏达!
5 形声法。一个字是入声字,那么它的形声字也是入声字。
如:直——值;亿——乙,忆;十——什,汁,拾
喝——渴,竭,蝎,揭,谒,褐,葛,歇,曷,遏
但是,一个字是入声字,它的会意字就不一定是入声字。
如立是入声字,它的形声字泣也是入声字,但它的会意字位就不是入声字。
有些字在普通话中的韵母已发生改变,那么如何判断它是形声字还是会意字呢。
这个有时还得借助于方言。
如“白”是入声字,“柏”显然是它的形声字,故也是入声,但“伯”是它的形声字还是会意字呢?从普通话看,伯(bo阳平)与白(bai阳平)的韵母差别很大,但只要稍微想一下,就知道在北方很多方言里,大伯的“伯”读作bai(阴平),与“白”的声母和韵母均相同,只是声调或有不同,故由此可以判断“伯”与“白”是形声字,古音同是入声。
有时两个字的声母和韵母都不同,这时要判断它们是不是形声字就更难了,可能要借助于某些南方方言。比如说“百”(bai上声)和“陌”(mo去声),在四川方言里,“百”读bei(阴平),“陌”读mei(阴平)。韵母相同,故它们是形声字,古音同是入声。
那么,北方诗友不懂南方方言怎么办呢?遇到这种情况,可以回忆同事亲友中的南方人平常讲话时说这两个字是怎样说的,也可回忆电影电视中的蒋介石、毛泽东、邓小平、***等领导人说这两个字是怎么说的。呵呵,反正是有点费劲了。
还要注意,因简化字的原因,导致有些字的偏傍部首发生变化。如卜是入声字,与它发音相近的补却不是入声字。原因在于,补的繁体是補,它是甫的形声字,而不是卜的形声字。
另外,注意夜不是入声字,但掖、液、腋都是入声字。这种形声字不一致的情况是极个别的。

通过词组法、分类法、诗词法等,先掌握100个左右基本的入声字,然后通过形声法以一带多,就可以掌握200-300个常用入声字了。有了这个基础,再通过多读前人作品,进阶到完全掌握入声字就不是那么困难了。

入声字表

[ 作者:贺魏    整理制作:恶人谷珠楼    ]

古入声字,有的方言今仍读入声。如广州、上海、苏州、南京、太原、张家口等;有的方言这类古入声字,今不读入声,分别归到其他声调里去了。古入声字,郑州今大部分归阴平,少部分归阳平,重庆今归阳平,普通话分别归入今阴平、阳平、上声、去声四个声调。为便于查检,本表入声字按普通话的阴平、阳平、上声、去声的次序排列。同声调的字按声母的次序排列。有些字加小注,如发~生,“~”符号,表示省略。

(一)普通话今读阴平字
b 八捌钵拔剥逼鳖憋擘~开
p 泼劈撇瞥扑仆拍霹泊湖~
m 摸抹~桌子
f 发~生
d 答~理搭褡滴跌督掇剟裰咄
t 塌踏~实剔踢帖贴怗秃托脱突
n 捏
l 拉勒~住
c 擦撮轻~
s 撒~手缩塞堵~
zh 隻汁织扎~营桌卓倬捉琢拙摘粥
ch 吃插出戳拆~开
sh 虱湿失杀刷说叔淑菽
j 激迹击墼积绩勣缉屐夹~攻揭结~实接噘撅撧锔掬鞠
q 七柒漆戚沏掐切曲~线屈缺麯
x 吸翕歙悉蟋窻析息熄惜昔夕汐锡晰浙晰膝瞎歇楔蠍戌薛削
g 搁~下疙胳割鸽刮聒郭
k 磕搕磕哭窟
h 喝~水忽惚唿豁劐黑
o 一壹揖押鸭噎掖屋挖曰约压
(二)普通话今读阳平字
b 拔跋钹魁白舶帛伯泊停~箔勃渤脖鹁博薄厚~礴搏膊驳别蹩醭
P 璞僕仆~人濮
m 膜没~有
f 乏伐筏阀垡罚佛弗拂彿绋茀伏茯袱服~从菔韨绂福幅蝠辐
d 答问~瘩沓达鞑妲靼怛得德笛迪狄荻敌嫡镝觌翟滌籴的~确碟蝶喋堞牒迭叠独读犊牍渎毒夺铎踱度忖~
z 杂砸则择泽责啧帻箦贼足卒族镞昨
s 俗
zh 直值植殖稙执姪职扎挣~剳铡闸宅折辙摺哲辄谪蛰詟竹竺烛躅逐轴妯酌浊镯琢啄濯擢茁斫斲
ch 察
sh 十什拾石食蚀实识舌折弄~孰熟秫赎勺
j 及级汲岌笈亟极殛吉急即脊~梁瘠疾嫉蒺集籍藉狼~辑楫戢棘夹~衣荚郏颊洁絜结~局拮诘劼颉劫桀傑杰羯碣竭竭偈节栉捷婕睫截局跼菊橘决抉诀玦倔~强掘崛桷厥蕨蹶(一~不振)獗橛谲觉爵嚼绝矍攫躩钁
x 席媳习袭檄侠狭峡狎辖黠协勰胁颉撷穴学
g 格阁路革隔膈国帼虢骨~头
k 咳壳
h 合盒曷运转阖劾核阂貉涸翮斛觳滑猾活
o 额
(三)普通话今读上声字
b 笔卜百佰柏北
p 癖撇匹朴~素蹼
m 抹~药
f 发理~法
d 笃
t 塔獭铁贴柬~庹
s 撒~种靸索
zh 嘱瞩眨窄
ch 尺
sh 蜀属
r 辱
j 戟给脊屋~甲岬胛蹶
q 乞曲歌~
x 雪血宿
g 骨~骼鹘谷毂嫴鹄汩葛姓~
k 渴
o 恶~心乙
(四)普通话今读去声字
b 必毖辟薜~荔壁璧毕跸哔筚弼碧滗彆~扭不薄~荷
p 迫粕珀魄僻闢瀑曝
m 末抹~石灰沫茉秣莫寞漠默墨麦没~落脈殁陌泌秘蜜密谧觅幂汩灭蔑篾木沐霂幕目苜牧睦穆
f 复復腹覆蝮服吃~药缚
d 度踱的目~
t 踏~步搨榻遢蹋挞特惕倜拓萚
n 纳衲讷呐匿暱溺逆涅隉聂蹑颞镊臬孽蘖齧诺搦虐疟
l 辣瘌蜡腊鑞肋仂勒~令乐快~力立粒笠栗慄溧历枥沥疬雳栎砾郦列冽烈裂猎躐鬣劣鹿漉麓辘菉绿录禄碌録逯戮陆六洛雒络落酪烙骆珞律率略掠
z 仄作柞酢凿
c 侧测恻厕策册猝促蹴簇蹙踧
s 飒萨瑟塞啬穑涩色肃鹔速觫簌宿粟谡夙
zh 窒桎铚蛭郅秩紩陟炙质锧浙祝
ch 斥赤彻撤澈畜~生搐觸怵黜绌矗绰辍龊
sh 式拭栻室释适饰煞歃霎设慑摄涉述术沐束妁朔蒴槊烁铄硕蟀
r 日热肉褥入若箬弱
j 鲫稷剧倔~脾气寂
q 迄汔泣恰洽怯契惬箧切~记窃妾却确搉榷壳悫阙阕鹊雀
x 隙吓~人绁泄燮亵屑恤卹畜~牧蓄勗旭续穴血
g 各
k 克剋客恪嗑榼酷喾阔括扩廓
h 赫郝喝~采鹤褐笏或惑获蠖镬霍藿壑
o 恶善~萼愕鄂鳄噩厄扼轭遏亦奕易邑浥轶役疫亿忆臆绎译驿益镒翼翊熠佾逸屹抑腋液揠叶页业邺谒烨兀杌勿物沃襪握幄玉钰域蜮浴欲慾峪毓育郁昱煜狱月刖悦阅钺樾乐音~药耀跃粤岳嶽鬰钥

古入今平字表

作者:朝云

一画:一
二画:七八十
三画:兀孑勺习夕
四画:仆曰什及
五画:扑出发札失石节白汁匝
六画:竹伏戍伐达杂夹杀夺舌诀决约芍则合宅执吃汐
七画:秃足卒局角驳别折灼伯狄即吸劫匣
八画:叔竺卓帛国学实直责诘佛屈拔刮拉侠狎押胁杰迭择拍迪析极刷
九画:觉(觉悟)急罚
十画:逐读哭烛席敌疾积脊捉剥哲捏酌格核贼鸭
十一画:族渎孰斛淑啄脱掇郭鸽舶职笛袭悉接谍捷辄掐掘
十二画:菊犊赎幅粥琢厥揭渤割葛筏跋滑猾洳┪仓臣剖诖鸩寮?BR>

十三画:福牍辐督雹厥歇搏窟锡颐楫睫隔谪叠塌
十四画:漆竭截牒碣摘察辖嫡蜥
十五画:熟蝠膝瘠骼德蝶瞎额
十六画:橘辙薛薄缴激
十七画:擢蟋檄
十九画:蹶
二十画:籍黩嚼

入声字表:全部入声字新编

1、【一屋】屋竹服福熟族菊逐伏哭戮仆叔独秃扑国谷木目禄肉鹿漉腹陆轴苜蓿宿牧夙读犊渎牍椟黩毂复粥肃碌骕鬻育六缩幅斛畜蓄淑倏卜馥沐速祝麓辘镞蹙筑穆睦縠覆辐瀑郁舳掬踘蹴跔茯袱鵩鹆髑槲匐簌蔟煜复蝠菔孰塾矗竺曝鞠嗾谡簏副
2、【二沃】足鹄督北沃俗玉曲粟烛属录辱狱绿毒局欲束蜀促触续浴酷躅褥旭欲笃赎渌纛碡瞩嘱勖溽缛梏
3、【三觉】觉角捉卓啄驳浊擢濯学(角色的“角”为平声) 桷榷岳乐朔数琢剥雹璞朴壳确渥幄握龌龊槊搦镯喔邈荦
4、【十药】阁!脚!酌!托!削!铎!橐!着!泊!箔!搏!博!昨!灼!膊!嚼!格!(脚色的“脚”为平声) 药薄恶作乐落鹤爵弱约雀幕洛壑索郭错跃若凿鹊诺萼度钥龠瀹著虐掠获藿勺谑廓绰霍镬莫箨缚貉各略骆寞膜鄂柝拓轹铄烁疟蒻箬芍躇却噱矍攫醵踱魄酪络烙珞粕簿柞漠摸酢怍涸郝垩谔鳄噩锷颚缴扩椁陌
5、【四质】出!实!疾!一!吉!失!漆!膝!七!卒!悉!嫉!茁! 质日笔出室术乙壹吉秩率律逸佚栗毕恤密蜜桔溢瑟匹述黜弼跸叱虱戌帅蒺侄踬怵蟋筚篥必泌荜秫栉唧帙溧谧昵轶聿诘耋垤捽觱鹬窒苾
6、【十一陌】石!白!泽!伯!迹!席!格!帛!柏!积!夕!百!革!脊!隔!掷!惜!择!昔!瘠!舶!帼!蝈!螫! 陌客宅策册碧籍役戟璧驿麦额魄脉液尺隙逆画[动词]辟赤易翮屐获适索厄益窄核舄责坼癖僻掖腋释译峄摘弈奕迫疫赫谪亦硕貊跖鹡碛蹐只炙踯斥穸鬲骼珀吓磔拆喀蚱舴剧檗擘栅啧帻箦扼划蜴辟刺嵴汐藉螫蓦摭襞虢哑绎射
7、【十二锡】击!绩!笛!敌!滴!激!荻!戚!涤!吃!析!晰!淅!皙!踢! 锡壁历枥勣镝檄寂觌溺觅狄幂鷁的沥雳霹惕剔砾翟籴倜蜥劈甓嫡轹栎阋菂迪裼逖蜺阒汨
8、【十三职】国!德!食!极!息!熄!亟!殛!直!值!得!北!逼!匐! 职蚀色力翼墨黑侧贼饰刻则塞式轼域蜮殖植敕棘惑忒默织匿慝亿忆臆薏特勒肋幅仄昃稷识克即唧弋拭陟恻测翊洫啬穑鲫抑或
9、【十四缉】辑!楫!集!急!湿!习!十!什!拾!袭!及!级!汁!蛰!执!吸!揖!岌!笈! 缉戢立邑入泣给涩粒笠隰汲絷挹浥悒熠葺廿煜歙圾褶翕
10、【五物】佛!拂!屈!掘!吃! 物郁乞讫绂弗勿迄不怫绋沸茀厥倔黻崛尉蔚契屹熨绂
11、【六月】发!阙!伐!罚!卒!窟!歇!突!忽!惚!曰!筏!掘!核!勃!蝎!揭!碣!凸!咄! 月骨越谒没竭笏钺袜阀鹘厥蹶蕨殁橛渤悖孛粤樾鳜脖饽鹁捽猝兀讷羯矻
12、【七曷】 达!钵!脱!夺!割!拔!拨!泼!喝!磕!活! 曷末阔褐沫葛闼渴豁括抹遏挞跋撮秣掇聒獭刺蘖瘌袜鸹斡怛钹捋
13、【八黠】黠!拔!八!察!杀!瞎!刮!刷!滑!辖!猾!扎!茁 刹轧戛铩捌叭札帕鹘揠萨捺
14【九屑】节!绝!结!穴!说!舌!洁!别!缺!决!折!拙!哲!鳖!截!孑!颉!撷!碣!瞥!迭!跌!耋!捏!蹩!杰! 屑雪列烈血裂热铁灭切悦辙诀泄锲咽轶噎彻澈设啮劣玦窃孽浙桔拮揭褐缬挈抉亵薛拽爇冽阅餮垤页阕觖谲夬撇蹩篾楔惙辍啜缀撤绁桀涅霓批
15、【十六叶】帖!贴!接!蝶!牒!谍!堞!喋!碟!鲽!蹀!捷!睫!婕!颊!侠!挟!铗!浃!荚!叠!楫!协!摺!笈! 叶猎妾箧惬涉鬣聂摄慑镊蹑厌靥躞燮辄霎嗫捻晔躐
16、【十五合】合!盒!答!杂!匝!咂!鸽! 塔纳榻閤腊阖蛤衲沓踏拓(拉?)盍塌卅搭褡飒磕榼遢蹋蜡溘邋趿
17、【十七洽】洽!狭!峡!匣!压!鸭!乏!劫!胁!插!押!狎!呷!夹!蛱!掐!劄!闸!袷! 法甲业邺怯锸恰硖眨胛歃霎

 

MySQL/MariaDB已被锁表运行中热复制为副本/innodb表错误Table xx doesn't exist in engine处理

从数据表热复制说起。

在执行特别慢的语句时,mysql经常会锁表。这时如果想并行执行另一个语句,但表被锁而该语句只能排队。这种情况下,希望能将被锁的表复制个副本,就可以“假”并行执行;然而杀死前语句又太可惜。所以,运行中热复制的技巧(奇技淫巧)还是有用的。

对于MyISAM表,直接复制三个文件到另一数据库中,即时生效,很方便。为了稳妥起见,最好先检查表看是否有异常;有时会因为写入而提醒表损坏,repair table 修复一下就好。

但对于InnoDB表,就要复杂一些。首先,step-0) 确保已通过MySQL服务的匹配文件,启用单文件选项 innodb_file_per_table=1 ,这样每个表会生成两个文件。但你并不能直接复制它们了,因为你将在新表上得到一条错误 Table xx doesn't exist in engine,所以这样不行。而是,step-1) 你应该在目标数据库里创建一张完全相同的表,然后 step-2) 修改新表丢弃其表空间,语句如 ALTER TABLE `xx` discard tablespace; 之后,step-3) 把源表的 .ibd文件复制过来覆盖新表的同名文件。step-4) 重新导入新表空间 ALTER TABLE `xx` import tablespace;  step-5) 最好也检查下表,至此新表正常可用。

SQL计算用户留存率,原理及流程拆解

问题及分析

根据用户记录,按一定时间周期,计算用户留存量、留存率。

留存率 = 留存量 / 初始量 * 100%

从某一个时间段作为起点,作为初始用户,一年后这些用户还有多少,两年后还有多少... 以此即可做计算。这里有个问题,就是这个起点的用户,是否也是从更早以前即存在、并留存到现在的;如果把本身即是“留存”而来的,留存率是不准确的。所以,通常要以用户首次出现开始计算。

简单来说,就是从新用户开始,计算其N一个时间段后留存;而每个时间段,都有新用户,所以这是个斜三角形的表。

以客户的销售记录为例,分步拆解计算原理。

已有原始数据表,包含了每个客户的销售记录,包括销售时间、销售数量、销售金额等。按年计算客户留存。

第一步,计算出初级表。

按年(yr)计算每个客户(cust)的统计信息,销量(sales)、销售金额(amount)。逻辑上,该结果表有个惟一键 (yr+cust),后续所有计算都从该表出发。

表结构如下

CREATE TABLE `yrept` (
  `cust` int(11) NOT NULL DEFAULT 0 COMMENT '客户',
  `yr` int(11) NOT NULL DEFAULT 0 COMMENT '年份',
  `sales` int(11) NOT NULL DEFAULT 0 COMMENT '销量',
  `amount` decimal(30,2) NOT NULL DEFAULT 0.00 COMMENT '金额',
  UNIQUE KEY `cust_yr` (`cust`,`yr`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
 COMMENT='每个客户cust在每个年份yr上的统计';
-- 数据表见附件
每个客户cust在每个年份yr上的统计

每个客户cust在每个年份yr上的统计

从原始数据表计算出一张每个时间段里每个用户的统计信息,

第二步,计算每个客户首次出现的年份。

SELECT cust,min(yr) as yr FROM `yrept` GROUP BY `cust`;

第三步,从原表yrept入手,扩展表,联入每个行对应客户的首次出现年份,预览数据。

原表yrept是每客户在各年份上的统计,那为该表增加一个字段,该行客户cust的首次出现的年份yr_1st ,语句如下

SELECT a.*,'|' as s,b.*,'|' as p, a.yr-b.yr_1st AS `later_yr`
FROM `yrept` a INNER JOIN (
    SELECT cust,min(yr) as yr_1st FROM `yrept` GROUP BY `cust`
) b ON a.cust=b.cust
WHERE 1
ORDER BY b.cust, b.yr_1st
;

另加一个计算列,相对于客户首次出现后的年数 later_yr。

汇总统计

上步结果表,关注其中的 cust, yr_1st, yr 三列,即是客户cust首次出现起,之后每年留存的客户信息(有对应记录即是留存)。对 yr_1st + yr 做汇总统计,即是每个年份新增客户数目、及之后每个年份的留存统计。

SELECT b.yr_1st,a.yr AS in_yr,count(*) as cnt
  ,count(DISTINCT a.cust) as unq_cust, SUM(a.sales) as sales 
  -- ,SUM(a.amount) as amount
FROM yrept a INNER JOIN (
    SELECT cust,min(yr) as yr_1st FROM yrept GROUP BY cust 
) b ON a.cust=b.cust 
WHERE 1 
GROUP BY b.yr_1st,in_yr 
ORDER BY b.yr_1st,in_yr
;

换个形式,以 将 yr 换成later_yr做统计,即客户cust首次出现起,N年后的留信息。事实这两种形式是等价的。

SELECT b.yr_1st,a.yr-b.yr_1st AS later_yr,count(*) as cnt
  ,count(DISTINCT a.cust) as unq_cust, SUM(a.sales) as sales
  -- ,SUM(a.amount) as amount
FROM yrept a INNER JOIN (
    SELECT cust,min(yr) as yr_1st FROM yrept GROUP BY cust
) b ON a.cust=b.cust
WHERE 1
GROUP BY b.yr_1st,later_yr
ORDER BY b.yr_1st,later_yr
;

以上两个结果,其中的 cnt 与unq_cust 两列,事实上也是等价的,就是惟一客户人数。上两条语句中,还有注释掉的一行是对总金额的计算,可以按销售金额来计算留存,有需要可选用。

按需要平摊成需要的形式

比如以yr_1st为行、按later_yr或in_year 分成多列展示。

计算留存率

观察上面平摊表,从新客户开始逐年的留存率的计算就很直观了。

如果对按右表整列求和,得到按年的所有新客户、逐年总留存率,可视为多年的新客户整体留存率,也是有意义的。虽然不太直观。

甚至,还可以对右表整列求和,并计算留率,可视为每年的所有客户(包括新客与留存客户)在之后每年的留存率。

postgres中执行DELETE ... LEFT/RIGHT JOIN

问题:有两张表 users, addrs,需要从users表中删除一些行,条件为在“addrs"表中没有对应id的行。

table-users

table-users

table-addrs

table-addrs

事实上很简单,只是个left join查询,SELECT a.*,'|' s,b.* FROM users a LEFT JOIN addrs b ON a.id=b.id;,预览如下:

overview-join

overview-join

然而,postgres本身不支持 DELETE ... LEFT JOIN ... 这样的语句,这点不像MySQL那样方便。

有一个曲线救国方法:

把上面LEFT JOIN的结果表视为一张中间表,把原users表、按主键 inner join 到中中间表,然后从users表中按删除指定行。语句如下

DELETE FROM users
USING users a LEFT JOIN addrs b ON a.id=b.id
WHERE users.id=a.id AND b.name IS NULL;

问题得解。

当然也可以使用子查询,从中间表中取出id主键,以子查询形式删除。不推荐。

前文用表及数据

CREATE TABLE users (
    id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY,
    name character varying(255)
);
ALTER TABLE users ADD CONSTRAINT users_pkey PRIMARY KEY (id);

CREATE TABLE addrs (
    id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY,
    addr character varying(255)
);
ALTER TABLE addrs ADD CONSTRAINT addrs_pkey PRIMARY KEY (id);

INSERT INTO "users" VALUES (1, 'Tom');
INSERT INTO "users" VALUES (2, 'Jarry');
INSERT INTO "users" VALUES (3, 'Alias');
INSERT INTO "users" VALUES (4, 'Bob');
INSERT INTO "users" VALUES (5, 'somebody');

INSERT INTO "addrs" VALUES (1, 'Luoyang');
INSERT INTO "addrs" VALUES (2, 'Shanghai');
INSERT INTO "addrs" VALUES (3, 'Hongkong');

EOF.

 

MySQL/MariaDB下索引基数cardinality的更新问题

起因与问题

使用MySQL做数据,有时会隐约感觉到一些语句执行速度极其慢,而理论上应该是很快的。通常使用phpMyAdmin作为客户端,在表结构页里可以方便的看到索引状态,对基数cardinalyty一知半解,隐约理解为惟一值个数。

但前两天写一条查询语句执行速度非常非常慢,看到一个索引的基数竟然是空的,而且明明应该有很多值。猜测MySQL出bug了,于是删除并重建了索引,基数正常了,语句也飞快跑完。于是稍多留意了一下索引基数。同一天,看到一个基数为1的索引,也是很多惟一值的字段,这也不正常。因为是MyISAM表,直接打包了对应的.frm, .MYD, MYI 三个文件,保留一个现场,有时间再做研究。

回顾了问题表生成语句,整理出一个简单化的重现过程,下面讨论。

问题重现

测试平台为 MySQL 5.5, MariaDB 10.3,其它版本应该也是类似。直接上语句

/* ************************************************* */
-- 一张数据表,并填充一些数据,稍微大一些
DROP  TABLE IF EXISTS `d_src` ;
CREATE TABLE `d_src` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `org` char(32) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`),
 KEY `org` (`org`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

INSERT INTO `d_src`(org) VALUES (md5('abcdefg'));
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;
INSERT INTO `d_src`(org) SELECT md5(concat(org,id,rand()*id)) FROM `d_src`;

-- 新建一张表,这里先使用 MyISAM 存储引擎,用来重现问题。插入数据,加字段及索引,UPDATE
DROP TABLE IF EXISTS `d_making`;
CREATE TABLE `d_making` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `org` varchar(50) NOT NULL DEFAULT '',
 `cnt` int(10) unsigned NOT NULL DEFAULT 0,
 PRIMARY KEY (`id`),
 KEY `org` (`org`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into `d_making`(`org`)
SELECT `org` FROM `d_src` 
ORDER BY id desc;

ALTER TABLE `d_making` ADD org_fix varchar(50) NOT NULL DEFAULT '', ADD INDEX (org_fix);

UPDATE `d_making` SET org_fix=left(org,2 );

-- watch the index status, the Cardinality of Key org_fix is 1
SHOW index FROM d_making;

此时查看索引状态,注意org_fix索引的基数,竟然是1 !  删除并重建索引,再看

-- rebuild index and show key again, the Cardinality NOT 1 
ALTER TABLE `d_making` DROP INDEX `org_fix`, ADD INDEX `org_fix` (`org_fix`); 
SHOW index FROM d_making;

org_fix的基数应该是256左右(因为是原始数据是随机数,大概在256的附近)。

按上脚本,只d_making表改用InnoDB存储引擎,结果也类似,也许不是1,但也明显不对。

不过,在MySQL 8.0 (CentOS 8默认配置)下,得到了 258,比真实值256要大。

原因探求

最早注意到索引基数时,搜索过相关资料,但仍是一知半解。这次通过 "mysql cardinality rebuild index" 查询,找到stackoverflow上有类似问题,最终找到mysql官方手册的一段说明

Cardinality

An estimate of the number of unique values in the index. To update this number, run ANALYZE TABLE or (for MyISAM tables) myisamchk -a.

Cardinality is counted based on statistics stored as integers, so the value is not necessarily exact even for small tables. The higher the cardinality, the greater the chance that MySQL uses the index when doing joins.

理解下来,说是索引基数只是个估算值,并不一定可靠,可以用 ANALYZE TABLE 表 更新。事实上,删除并重建索引并不一定奏效。SQL语句执行时,优化器会依据索引基数决定是否使用索引,于是,基数不正确(过小)的索引,就不能被选用,于是这个索引事实上无效了。

结论

  1.  MySQL索引基数,可能不准确(过大过小都有可能),从而可能造成语句执行时忽略该索引(索引失效)。
  2.  要想让该值准确,得在表数据有改动后跑一遍 ANALYZE TABLE table_name

对使用者来说,这是个潜在的坑。手工运行SQL语句前,可以事先关注一下索引基数是否正常(或先 explain一下)。如果是在线生产环境,可能就要自求多福了,或者搞一大群的计划任务,跑ANALYZE TABLE. 不过,理论上,没有大面积UPDATE的字段的索引,这个问题不大。

后记

再深入一点,索引基数即是MySQL统计信息,关系型数据库的查询优化器要依据统计信息确定是否使用某个索引;而统计信息并非实时更新的。本问题的即是统计信息未及时更新的一个极端案例。也就是说,这个问题并非MySQL本身的缺陷,应该在关系型数据库中普遍存在。