What is plans, estimates, and schedules in project management?
Click to expand!
Plans: A project plan outlines the objectives, scope, deliverables, resources, and timelines of a project. It serves as a roadmap that guides the project team throughout the project lifecycle. A project plan includes various sections such as project scope, milestones, work breakdown structure (WBS), resource allocation, risk management, and communication plan.
Estimates: Project estimates involve estimating the time, effort, and cost required to complete project activities. These estimates are crucial for budgeting, resource allocation, and determining project feasibility. Estimation techniques such as expert judgment, analogous estimating, parametric estimating, and three-point estimating are commonly used to predict project durations, costs, and resource requirements.
Schedules: A project schedule is a timeline that details the start and end dates of project activities. It helps in visualizing the project’s progress and ensuring that tasks are completed in a logical sequence. Gantt charts, network diagrams (e.g., PERT/CPM), and critical path analysis are tools commonly used to create and manage project schedules. Schedules also consider dependencies between tasks, resource availability, and project constraints to ensure timely completion.
II. 代码实现阶段
这个阶段主要是根据软件需求文档、软件设计文档和开发流程规范文档进行项目代码开发。
主要的工作:
配置服务器。具体包括:购买服务器,搭建项目运行环境,部署项目。
配置域名。具体包括:购买域名,DNS 解析,Nginx 反向代理,HTTPS。
搭建持续集成(CI/CD)。具体包括:创建 Git 仓库,添加 gitignore,搭建或购买 CI 服务,配置 Docker,配置 Jenkins。
Union rule。 If α → β holds and α → γ holds, then α → βγ holds.
Decomposition rule。If α → βγ holds, then α → β holds and α → γ holds.
Pseudotransitivity rule。 If α → β holds and γβ → δ holds, then αγ → δ holds.
Formal Forms
常见的范式(Formal Forms)有:第一范式,第二范式,第三范式,BC 范式,和第四范式。
Atomic Domains and First Normal Form
为了减少单个属性的数据冗余,我们常用的方法是:对于组合属性,如 address 由 street,city,state 和 zip 等组成,我们创建一个单独的表来表示这些属性。对于多值属性,我们让每一个多值属性中的每一项作为一个单独的属性。
在关系模型中,我们通过形式化(Formalize)来实现一个属性没有任何子结构。如果一个 domain 是不可再分的单元称这个 domain is atomic。我们定义:如果一个 relation schema R 中的所有属性的 domain 是 atomic,则称这个 schema R 是在 First Normal Form (1NF,第一范式) 中的。
Boyce-Codd Normal Form
Boyce-Codd Normal Form (BCNF) 它消除了可以基于 functional dependencies 发现的所有数据冗余。但是可能存在一些其它类型的的冗余,需要用其它的方法来解决,如 multivalue dependencies。
如果对于来自 α → β, a ⊆ R, β ⊆ R 的 F+ 中的所有 functional dependencies 满足以下至少一项条件,则 relation schema R 的 functional dependencies F 在BCNF中:
常见的集合操作(Set Operations)如:组合 union,相交intersect 和排除 except。集合操作默认会去除重复的记录,添加 all 关键字,可以允许重复的记录。如 union all,intersect all, except all 等。一个集合操作的 SQL 语句例子如下:
(select course_id from section where semester = ’Fall’ and year= 2009) union (select course_id from section where semester = ’Spring’ and year= 2010);
select course_id from section as S where semester = ’Fall’ and year= 2009 and exists (select * from section as T where semester = ’Spring’ and year= 2010 and S.course_id= T.course_id);
select * from student natural left outer join takes;
join 用在子查询中:
select * from (select * from student where dept_name= ’Comp. Sci’) natural full outer join (select * from takes where semester = ’Spring’ and year = 2009);
使用 where 子句代替 on 的断言
select * from student left outer join takes on true where student.ID= takes.ID;
create function instructors_of (dept_name varchar(20)) returns table ( ID varchar (5), name varchar (20), dept_name varchar (20), salary numeric (8,2)) return table (select ID, name, dept_name, salary from instructor where instructor.dept_name = instructor of.dept_name);
create procedure dept_count_proc(in dept name varchar(20), out d_count integer) begin select count(*) into d_count from instructor where instructor.dept_name= dept_count_proc.dept_name end
create trigger timeslot_check1 after insert on section referencing new row as nrow for each row when (nrow.time_slot_id not in ( select time_slot_id from time_slot)) begin rollback end;
标准化(Normalization)可以让我的数据减少不必要的冗余。它使用范式(Normal Form)来设计数据库的模式(Schema)。常见的范式有:First normal form (1NF), Second normal form (2NF), Third normal form (3NF), Boyce-Codd normal form (BCNF).
借助第三方软件服务攻击系统。1. 利用 Redis 将 SSH 密钥写入到 authorized_keys config set dir /root/.ssh, config set dbfilename authorized_keys。2. 利用 Redis 设置挖矿定时任务 config set dir /etc, config set dbfilename crontab。
操作系统防护措施
系统和软件包更新,防止低版本漏洞攻击。保持操作系统打上最新的补丁,保证使用最新版本的软件。
手动定期更新,或者设置自动更新(Unattended Upgrades)。
设置系统防火墙
仅开放必要端口,如:22 for SSH,80 for HTTP,443 for HTTPS,VPS 端口等。其它端口设置 IP 白名单。
boolisSafe(char mat[][N], int row, int col) { for (int i = 0; i < row; i++) { if (mat[i][col] == 'Q') { returnfalse; } } for (int i = row, j = col; i >= 0 && j >= 0; i--, j--) { if (mat[i][j] == 'Q') { returnfalse; } } for (int i = row, j = col; i >= 0 && j < N; i--, j++) { if (mat[i][j] == 'Q') { returnfalse; } } returntrue; }
voidNQueen(char mat[][N], int row) { if (row == N) { cout << ++count << endl; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cout << mat[i][j] << " "; } cout << endl; } cout << endl; return; } // place Queen at every square in current row r // and recur for each valid movement for (int k = 0; k < N; k++) { if (isSafe(mat, row, k)) { // place queen on current square mat[row][k] = 'Q'; // recur for next row NQueen(mat, row+1); // backtrack and remove queen from current square mat[row][k] = '-'; } } return; }
intmain() { // mat[][] keeps track of position of Queens in current configuration char mat[N][N]; // initalize mat[][] by '-' memset(mat, '-', sizeof mat); int row = 0; NQueen(mat, row); // N=8 has 92 possible N-Queen result return0; }