Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

数据字典结构设计方法

发表于 2023-01-17

数据字典(Data dictionary)是描述数据的信息集合,是对系统中使用的所有数据元素的定义的集合。

什么是数据字典

什么是数据字典? 字典的英文是 Dict, 翻译过来是字典、词典。

和字典同类的东西呢,就是 Map。 Map 就是地图、映射的意思。

所以字典的本质就是 映射,对应。

字典一般分为两部分: 名称 和 描述信息。 用计算机术语说,就是 键-值对(Key-Value pair), 名值对、还有 Code-Name 等。

在系统中,因为有很多标准、规范、约定, 为了执行这些规范,对数据分类、数据状态进行精确定位,又或者因为多个系统之间需要进行数据交换,但叫法和显示上有差别,在存储数据时需要存储码值,而不能只存储显示时使用的名称。

例如状态值和状态名称。标准做法是只存储 VALUE, 不存储名称。 如果考虑优化,减少数据表的关联查询(join),那么可以在存储 VALUE 的同时冗余存储 NAME。 当然,需要根据具体情况来设计, 如果 NAME 或者描述信息太长,占用空间较大,那么可能就不会进行冗余。 顺便提一句, 减少空间占用 也是使用数据字典的一个原因。

数据字典作用是什么

在平时开发的过程中,特别是在遇到表单时候,我们经常需要为前端提供一些下拉选项的信息,这时候我们需要为前端提供下拉菜单的信息,让前端进行渲染。同时我们在数据库中存储的只可能是对应的编码。

如果前端直接将value值写死在前端代码中,那么就破坏了低耦合原则,如果未来清查状态有增加或者管理员想要修改,那么需要修改前端代码,会带来非常大的麻烦。

为解决该问题,就需要设计数据字典,其实就是数据库中的一张表。

数据字典的设计

最简设计

名称-值。

通用设计

如果状态、类型都有对应的字典表,那么随着系统规模的扩大,字典表会越来越多,可能200张表里面有30-50个是字典表。 这就很烦人了,这些表的字段都是差不多的。这时候比较好的办法就是合表。合表就会涉及到数据类型和如何区分的问题。

将相似的表结构合并时,添加一个字段来进行区分是常见的做法。数据字典的区分,我们一般使用 分类这个字段。分类的英文单词,大致有: type、class、classify、category 等。因为分类是给系统后台或者程序员看的,所以一般是使用字符串类型(String, VARCHAR(32))。

同时,为了避免再引入一个分类类型说明的表,我们做一点冗余: 使用2个字段: 分类编码(category_code) 和 分类说明(category_desc)。

简单优化

ID、排序

运维审查方便

创建时间、更新时间、创建人、修改人

最终结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE IF NOT EXISTS `dict_common` (
`id` bigint(20) unsigned NOT NULL COMMENT '自增ID',
`dict_code` varchar(64) NOT NULL COMMENT '编码',
`dict_desc` varchar(64) NOT NULL COMMENT '名称',
`category_code` varchar(64) NOT NULL COMMENT '分类编码',
`category_desc` varchar(64) DEFAULT NULL COMMENT '分类说明',
`sort_no` int(8) unsigned NOT NULL DEFAULT '999' COMMENT '排序编号',
`data_type` varchar(64) NOT NULL DEFAULT 'STRING' COMMENT '数据类型',
`remark` varchar(128) DEFAULT NULL COMMENT '附加说明',
`locate_code` varchar(64) DEFAULT NULL COMMENT '检索标识',
`create_id` bigint(20) unsigned DEFAULT '0' COMMENT '创建人ID',
`update_id` bigint(20) unsigned DEFAULT '0' COMMENT '修改人ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`version` int(8) NOT NULL DEFAULT '0' COMMENT '乐观锁版本号',
PRIMARY KEY (`id`),
UNIQUE KEY `dict_code_category_code` (`dict_code`,`category_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='通用数据字典';

参考链接

  1. 通用数据字典表结构设计,by Jessicahust.
  2. 数据库设计之数据字典的使用与设计,by 沉默终止.
  3. 数据字典,by baidu.

AutoCAD简单教程

发表于 2023-01-15

最近需要将一个autocad的dwg文件转成pdf,简单记录流程。

确定生成dwg的autocad版本

使用vscode打开dwg二进制文件,查看其文件头。参考AutoCAD的图形格式版本代号确定生成该dwg文件的autocad版本,并下载autocad2017。

打印cad图纸

先跟随教程AutoCAD快速上手,只需要10分钟!简单熟悉一下autocad的界面,了解基本概念,如模型、布局等。

打印cad图纸的步骤参考AutoCAD如何设置打印想要的区域输出jpg等格式,具体为:

  1. 使用鼠标左键选中要打印的模型,使用鼠标右键打开图纸的上下文菜单,选择“隔离对象”后,模型窗口中就只剩需要打印的模型。
  2. 点击“打印”,打开打印窗口,将模型打印成pdf。
  3. 结束对象隔离。
  4. 选择新的要打印的模型,重复步骤1到3。

参考链接

  1. AutoCAD的图形格式版本代号,by autodesk.
  2. AutoCAD快速上手,只需要10分钟!,by CAD君.
  3. AutoCAD如何设置打印想要的区域输出jpg等格式,by autocad.

3D相关文件扩展名汇总

发表于 2023-01-12 | 更新于 2023-01-17
  • .flt

OpenFlight(或 .flt)是一种 3d 几何模型文件格式,最初由 Software Systems Inc. 在 1988 年为其MultiGen实时 3d 建模包开发。最初称为 Flight,该格式被设计为非专有 3d供实时 3D视觉模拟图像生成器使用的模型格式。

OpenFlight 相对于许多 3d 几何模型文件格式(.obj、.dxf、.3ds)的早期优势是其特定的实时 3d 图形行业设计。 这意味着格式是基于多边形的(而不是NURB曲面),并提供实时 IG 系统所必需的实时树结构。

OpenFlight格式是实时三维视景仿真领域中最为流行的图像生成格式。OpenFlight格式由Presagis(以前称为MultiGen-Paradigm)开发和维护,现在已被3D视觉仿真社区广泛采用为标准格式。3DSMax和Blender等3D建模软件都提供了对FLT文件类型的支持。

  • .tif

Tag Image File Format,缩写为TIFF或TIF,是一种用于存储光栅图形图像的图像文件格式,在图形艺术家、出版业、和摄影师中很流行。TIFF 被扫描、传真、文字处理、光学字符识别、图像处理、桌面出版和页面布局应用程序广泛支持。该格式由Aldus Corporation创建,用于桌面出版。它于 1992 年发布了最新版本 6.0,随后更新了Adobe Systems版权在后者于 1994 年收购了 Aldus 之后。一些 Aldus 或 Adob​​e 技术说明已发布,对格式进行了较小的扩展,并且一些规范已基于 TIFF 6.0,包括TIFF/EP (ISO 12234-2)、TIFF/ IT (ISO 12639)、 TIFF-F (RFC 2306) 和 TIFF-FX (RFC 3949)。

TIFF 是一种灵活、适应性强的文件格式,用于在单个文件中处理图像和数据,包括定义图像几何形状的标题标签(大小、定义、图像数据排列、应用的图像压缩)。例如,TIFF 文件可以是包含JPEG(有损)和PackBits(无损)压缩图像的容器。TIFF 文件还可以包含基于矢量的剪切路径(轮廓、剪裁、图像帧)。无损存储图像数据的能力格式使 TIFF 文件成为有用的图像存档,因为与标准 JPEG 文件不同,使用无损压缩(或无压缩)的 TIFF 文件可以在不损失图像质量的情况下进行编辑和重新保存。

可用Adobe PhotoShop软件打开。

  • .hdr

高动态范围成像(英语:High Dynamic Range Imaging,简称HDRI或HDR),在计算机图形学与电影摄影术中,是用来实现比普通数位图像技术更大曝光动态范围(即更大的明暗差别)的一组技术。高动态范围成像的目的就是要正确地表示真实世界中从太阳光直射到最暗的阴影这样大的范围亮度。

高动态范围成像最初只用于纯粹由计算机生成的图像。之后又开发出一些从不同曝光范围照片中生成高动态范围图像的方法。随着数字相机的日渐流行以及桌面软件变得易于使用,许多业余摄影师使用高动态范围成像的方法生成高动态范围场景的照片,但是,实际上高动态范围还有许多其它的应用。

可用Adobe PhotoShop软件打开。

  • .mip

.mip文件最初为Paint Shop Pro创建的图像文件,这是一个图像编辑程序,现在称为PaintShop Photo Pro。 包含相同的多个分辨率 BMP。 图片; 通常用于纹理映射。MIP文件允许用户存储针对特定大小优化的图形。 这样,就不必拉伸或压缩图像以适合图像。 例如,512x512像素MIP图像还可以包含用于缩略图徽标的32x32像素版本。

可用Adobe PhotoShop软件打开。

  • .gdb

ESRI 文件地理数据库 (FileGDB) 是磁盘上文件夹中的文件集合,其中包含相关地理空间数据,例如要素数据集、要素类和关联表。它需要某些其他文件与 .gdb 文件一起保存在同一目录中才能工作。可以在 .gdb 文件上执行查询以管理空间和非空间数据。

查看.gdb文件需要安装arcgis系列软件,使用其中的catalog软件打开。或者参考Open Source Tool capable of reading Esri File Geodatabase (.gdb)?。

参考链接

  1. OpenFlight .flt,by wikipedia.
  2. TIFF,by wikipedia.
  3. HDR,by wikepedia.
  4. Mipmap,by wikepedia.
  5. .gdb,by fileformat.
  6. .gdb文件如何查看,by baidu.
  7. Open Source Tool capable of reading Esri File Geodatabase (.gdb)?,by stackexchange.

Oracle即时客户端连接方法

发表于 2023-01-10 | 更新于 2023-02-26

记录Oracle即时客户端连接Oracle服务器端的方法。

下载Oracle即时客户端

对应Oracle11数据库,下载如下Oracle即时客户端:

  • instantclient-basic-windows.x64-12.1.0.2.0.zip
  • instantclient-sqlplus-windows.x64-12.1.0.2.0.zip

将instantclient-basic和instantclient-sqlplus两个安装包放在同一个目录下,解压到同一个文件夹内。

修改系统变量

  • 将Oracle即时客户端的路径E:\Oracle\instantclient_12_1添加到系统环境变量PATH中。
  • 新增系统变量NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 –>> 服务器端字符集
  • TNS_ADMIN=E:\Oracle\instantclient_12_1 –>> 指定tnsnames.ora所在位置

新建tnsnames.ora

在E:\Oracle\instantclient_12_1 下新建tnsnames.ora配置文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
orcl_service_name =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVICE_NAME = bookstore.company.com)
)
)

orcl_sid =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.11)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = orcl)
)
)

用SQL*Plus登陆测试

Connect via SERVICE_NAME

sqlplus username/password@host:port/SERVICE_NAME

例如:

1
sqlplus admin/123456@192.168.1.11:1521/ORCL

Connect via SID

sqlplus username/password@host:port:SID,注意该方式在oracle instant client 12.1版本中没有验证通过,具体原因未知。

sqlplus system/password@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.0.49)(Port=1521))(CONNECT_DATA=(SID=ORCL)))

例如:

1
sqlplus admin/123456@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.0.49)(Port=1521))(CONNECT_DATA=(SID=ORCL)))

sqlplus命令

sqlplus登录后,使用如下sql命令查询相关信息:

  • 查看数据库名
1
SQL> select name from v$database;
  • 查询当前数据库实例名
1
SQL> select instance_name from v$instance;
  • 数据库中所有表
1
SQL> SELECT TABLE_NAME FROM DBA_TABLES;
  • 显示数据库对象结构
1
SQL> desc emp

使用node-oracledb连接数据库

连接字符串的网络服务名方法

1
2
3
4
5
6
7
8
9
10
const oracledb = require('oracledb');

const connection = await oracledb.getConnection(
{
user : "admin",
password : "123456",
connectStringForServiceName1 : "Ora11"
connectStringForServiceName2 : "192.168.0.49/ORCL",
}
);

对应的tnsnames.ora内容为:

1
2
3
4
5
6
7
8
Ora11 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.49)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)

连接字符串的网络服务标识方法

该方式可连接使用sid的oracle实例:

1
2
3
4
5
6
7
8
const connection = await oracledb.getConnection(
{
user : "admin",
password : "123456",
connectStringForSid1 : "Ora11",
connectStringForSid2 : "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.0.49)(Port=1521))(CONNECT_DATA=(SID=ORCL)))"
}
);

对应的tnsnames.ora内容为:

1
2
3
4
5
6
7
8
Ora11 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.49)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = ORCL)
)
)

oracledb读取Blob和Clob字段

请参考nodejs使用oracledb时,读取Blob和Clob字段遇到的问题。

参考链接

  1. 如何安装Oracle客户端(Oracle Instant Client),by whatday.
  2. Oracle Instant Client(即时客户端) 安装与配置,by 长烟慢慢.
  3. 使用 SQL *Plus 管理 Oracle 数据库,by Node.
  4. nodejs使用oracledb时,读取Blob和Clob字段遇到的问题,by 欢欢2776479680.
  5. CLOB data type,by oracle.
  6. Oracle的CLOB大数据字段类型,by Grand-Jon.

简明教学设计11讲读书笔记

发表于 2023-01-05 | 更新于 2023-11-14

教学法分类

  • 讲授法
  • 直导式
  • 指导发现式
  • 探究式

三大学习理论

  • 吸收理论
  • 行为理论
  • 认知理论

教学目标

布鲁姆教学目标分类:

  • 知道
  • 理解
  • 应用
  • 分析
  • 综合
  • 评价

学习内容分类:

  • 知识

分为事实性知识和概念性知识。事实性知识分为事实和程序,概念性知识分为概念和原理。

  • 技能

分为动作技能、认知技能、交互技能。

  • 情感

情感、态度和价值观。

教学过程设计

准备

  • 安心学习
  • 激发学习动机

输入

  • 抓住注意力
  • 激活旧知
  • 组织教学内容
  • 轻教学

加工

  • 以问题开始
  • 以对话维持
  • 以反思检视

输出

反思

参考链接

  1. 简明教学设计11讲,by 郑杰.

新版Chrome对JavaScript的Array.sort()不支持

发表于 2022-12-20

碰到一个JavaScript的Array.sort函数排序失败的奇怪问题,具体解决方案请参考新版Chrome对JavaScript的Array.sort()不支持。

参考链接

  1. 新版Chrome对JavaScript的Array.sort()不支持,by chrome.
  2. Array.prototype.sort(),by mozilla.

计算机安全的理论知识笔记

发表于 2022-12-20

计算机安全、网络安全(网络安全)或信息技术安全(IT 安全)是保护计算机系统和网络免受恶意行为者的攻击,这些攻击可能导致未经授权的信息泄露、盗窃或损坏硬件、软件或数据,以及他们提供的服务的中断或误导。

CIA三要素

保密性又称机密性,其与Integrity(完整性)和 Availability(可用性)并称为信息安全的CIA三要素。

信息安全三要素之间存在互相牵制的关系,例如:过度强化机密性时,将造成完整性与可用性的降低,需要高可用性的系统则会造成机密性与完整性的降低,因此在有限资源的前提下,在信息安全三要素中获取适当的平衡是信息安全管理层次结构的重要课题。

保密性

机密性(Confidentiality)确保资料传递与存储的隐密性,避免未经授权的用户有意或无意的揭露资料内容。

完整性

完整性是指在传输、存储信息或数据的过程中,确保信息或数据不被未授权的篡改或在篡改后能够被迅速发现。在信息安全领域使用过程中,常常和保密性混淆。通常使用数字签名、散列函数等手段保證數據完整性。

可用性

在信息安全领域,可用性(Availability)是成功的信息安全项目应具备的需求,意及当用户需透过信息系统进行操作时,资料与服务须保持可用状况(能用),并能满足使用需求(够用)。

认证、授权和记录

认证(Authentication)

识别信息用户的身份,可记录信息被谁所访问使用,例如:透过密码或证书方式验证用户身份。身份认证主要有三种方式:

  • 你所知道的(Something you know):账号/密码
  • 你所拥有的(Something you have):IC卡、数字设备、数字签名、一次性密码(OTP)
  • 你所具备的(Something you are):指纹、虹膜、声纹、脸部特征、静脉脉纹、DNA

授权(Authorization)

依照实际需求给予实体适当的权限,一般建议采最小权限(Least privilege),意即仅给予实际作业所需要的权限,避免过度授权可能造成的信息暴露或泄漏。

信息系统层面的实用访问控制方法分类如下:

  • 强制访问控制(Mandatory Access Control)
  • 自由选定访问控制(Discretionary Access Control)
  • 以角色为基础的访问控制(Role-Based Access Control)
  • 以规则为基础的访问控制(Rule-Based Access Control)

纪录(Accounting)

内容项目包含量测(Measuring)、监控(Monitoring)、报告(Reporting)与日志案(Logging),以便提供未来作为审核(Auditing)、计费(Billing)、分析(Analysis)与管理之用,主要精神在于收集用户与系统之间交互的资料,并留下轨迹纪录。

威胁建模

威胁建模是一个过程,通过该过程可以识别和列举潜在威胁,例如结构漏洞或缺乏适当的保护措施,并确定对策的优先级。威胁建模的目的是根据系统的性质、可能的攻击者概况、最可能的攻击向量以及攻击者最需要的资产,为防御者提供系统分析,说明需要包括哪些控制或防御措施攻击者。威胁建模回答诸如“我在哪里最容易受到攻击?”之类的问题,“最相关的威胁是什么?” ,以及“我需要做什么来防范这些威胁?”

参考链接

  1. Crash Course Computer Science,by Crash Course.
  2. Computer security,by wikipedia.
  3. 信息安全,by wikipedia.

金句摘抄

发表于 2022-12-16 | 更新于 2023-02-11

中国教材的最大问题,并不是知识点的讲解,而是缺乏得出结论的过程。

– 《为什么医学教材不好用?》

我不善于当众演讲,在人多的场合发言,我会紧张。但是后来,我发现听众真的不在乎,如果你讲得很糟糕,他们可能会发笑片刻,但很快就会忘记。

事实是我们放大了别人的想法。有人说的很对:我们在想象中比在现实中,遭受更多的痛苦。

– Hacker News 读者

参考链接

  1. GitHub 上这个「计算机科学」自学指南火了!,by 吴师兄.

软件行业的思考

发表于 2022-12-08

中国软件三十年:烟尘隐入,夹缝重生这篇文章对中国软件行业的历史、发展规律和现状认识比较深刻,因此摘抄一下:

中国软件的三大顽疾:一是企业数字化认识低,认为软件没用;二是定制化需求多且杂,「项目」导向而非「产品」导向;三是用户付费意愿和能力不足,软件公司难以积累利润投入研发。

大约是在2002年左右,雷军为了求证用户到底在意什么, 专门请了一家调查公司,在4个城市作了样本调查, 在4个城市作了用户专访, 最后结果让金山的工程师们很伤心:用户最在意的就是使用习惯,并不在意那些「创新」。

软件行业最终还是要靠「产品」说话。无论2C还是2B,软件好不好用,是用户选择最简单直接的一个标准。

参考链接

  1. 中国软件三十年:烟尘隐入,夹缝重生,by 饭统戴老板.

CPlusPlus之Socket网络编程

发表于 2022-12-07 | 更新于 2022-12-09

inet_pton和inet_ntop

这两个函数是随IPv6出现的函数,对于IPv4地址和IPv6地址都适用,函数中p和n分别代表表达(presentation)和数值(numeric)。地址的表达格式通常是ASCII字符串,数值格式则是存放到套接字地址结构的二进制值。

1
2
3
4
5
6
7
//将点分十进制的ip地址转化为用于网络传输的数值格式
//返回值:若成功则为1,若输入不是有效的表达式则为0,若出错则为-1
int inet_pton(int family, const char *strptr, void *addrptr);

//将数值格式转化为点分十进制的ip地址格式
//返回值:若成功则为指向结构的指针,若出错则为NULL
const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);

参考链接

  1. C++高性能网络编程,by huangwang.
  2. inet_pton()和inet_ntop()函数详解,by QvQ是惊喜不是哭泣.
  3. 2021-07-07使用winsock2.h中函数还需要链接静态库ws2_32.lib,by 杨晴朗Solo.
上一页1…121314…53下一页

Jack Huang

528 日志
68 标签
© 2025 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse