跳转至

博客

您需要了解的 8 个基本项目管理文档

项目管理涉及创建大量文档。如果您研究项目管理标准,您会发现至少有十几个不同的计划、多种类型的报告以及许多其他文档。好消息是项目经理不必编写所有内容 - 想法是仅编译对工作流程效率至关重要且利益相关者需要的内容。

XML 读书笔记

XML 文件是由标记及其所标记的内容构成的文本文件,与 HTML 文件不同的是,这些标记可自由定义,其目的是使得 Internet 网络上的数据交互更方便,让文件的内容更加通俗易懂。

Gitlab CI/CD 配置手册

产物

gitlab 支持将作业完成时生成的文件或文件夹保存下来,这也产物可以在后续的作业中使用或下载,以实现资源的传递和共享。

他的关键字时 artifacts

使用方式

build_job:
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - dist/

在上面的示例中,build_job 作业执行构建过程后会生成一个名为 dist/ 的目录作为产物。这个目录中包含了构建后的静态文件。这些产物可以在后续的作业中使用,例如部署到服务器上或者进行测试。

产物路径

paths 关键字用于指定需要保留的产物路径。可以是文件或者目录。在示例中,dist/ 表示保留整个 dist 目录及其下的所有文件。

其他属性

除了 paths 关键字外,还可以通过其他属性对产物进行更详细的配置,如 expire_in 用于设置产物过期时间、name 用于指定产物的名称等。

作用域

产物默认是作业级别的,即只能在同一个作业流程中的后续作业中使用。如果希望跨作业流程共享产物,可以使用 dependencies 关键字将产物传递给其他作业。

通过使用 artifacts 关键字,可以方便地将作业生成的产物保留下来,以供后续作业使用。这种机制实现了作业之间的数据共享和传递,使得 CI/CD 流程更加灵活和高效。

Shell 脚本编程【循环】

#!/bin/bash

clear

for var in Cloks Alabama Alaska Arizona Arkansas California Colorado
do
  echo $var
done | sort

# for var in Cloks Alabama Alaska Arizona Arkansas California Colorado; do echo $var; done | sort

echo $var

sleep 1 && clear

list="Alabama Alaska Arizona Arkansas California Colorado"
# list = append(list, "Connecticut")
list=$list" Connecticut"

for state in $list; do
  echo "have you ever visited $state?"
done

sleep 1 && clear

# reading values from a file

file="./states"

cat << EOF > $file
Alabama cloaks
Alaska
Arizona
Arkansas
California
Colorado
EOF

IFS_OLD=$IFS
IFS=$'\n'

for state in $(cat $file); do
  echo "Visit beautiful $state"
done

IFS=$IFS_OLD

rm -rf $file

sleep 1 && clear

for file in ./*; do
  if [ -d "$file" ];then
    echo "$file is a directory"
  elif [ -f "$file" ];then
      echo "$file is a file"
  fi
done

sleep 1 && clear

for (( i = 1; i <= 10; i++ )); do
  echo "the number is $i"
done

sleep 1 && clear

var1=10

while [ $var1 -gt 0 ]; do
    echo $var1
    var1=$[ $var1 - 1 ]
done

sleep 1 && clear

var1=10

while echo $var1
  [ $var1 -ge 0 ]; do
    echo "this is inside loop"
    var1=$[ $var1 - 1 ]
done

sleep 1 && clear

var1=10

until [ $var1 -eq 0 ]; do
    echo $var1
    var1=$[ $var1 - 1 ]
done

IFS_OLD=$IFS
IFS=$'\n'
for entry in $(cat /etc/passwd); do
  echo "Values in $entry -"
  IFS=:
  for value in $entry; do
    echo " $value"
  done >> output.txt
done > output-1.txt

IFS=$IFS_OLD

sleep 1 && clear

for (( i = 0; i < 10; i++ )); do
    echo "start loop $i"
    for (( j = 0; j < i; j++ )); do
       if [ $i -gt 5 ]; then
         break 2
       else
         echo $i-$j
       fi
    done
done

sleep 1 && clear

IFS_OLD=$IFS
IFS=:

for folder in $PATH; do
  echo "start folder: $folder"
  for file in $folder/*; do
    if [ -x $file ]; then
      echo "    $file"
    fi
  done
done

IFS=$IFS_OLD

sleep 1 && clear

input="users.csv"

cat << EOF > $input
rich,Richard Blum
christine,Christine Bresnahan
barbara,Barbara Blum
tim,Timothy Bresnahan
EOF

while IFS=',' read -r userid name; do
  echo "adding $userid-$name"
#  useradd -c "$name " -m $userid
done < "$input"

rm $input

关闭程序后执行命令:

rm -rf ~/.config/navicat
rm -rf ~/.config/dconf/user

关于 golang 的条件编译个人实践

在 Go 中,当你遇到 “build constraints exclude all Go files” 错误时,意味着在某个包中没有符合当前构建条件的文件。

核心是诊断触发的条件

项目中遇到一个服务需要调用 Cplus 开发的库函数实现某些功能,但是仅提供了 Windows 和 Linux 两个平台,导致我们无法在 Darwin 环境运行该服务,算是业务驱动我去更精细化的了解技术了。

我期望的条件编译规则如下:

  1. Linux 和 Windows 编译包含库函数的代码;
  2. Darwin 不编译;
  3. 可以选择是否调用库函数;

规则 1, 2 可以使用平台条件编译实现:

// 规则一触发
//go:build !darwin

// 规则二触发
//go:build darwin

规则 3 需要依赖与 -tags 配置进一步控制编译结果

// 符合规则 1, 2 且允许规则 3 时编译
//go:build !darwin && tag01

// 符合规则 2 或不满足规则 3
//go:build darwin || !tag

这样配置已经没有问题了,但是仍然提示 “build constraints exclude all Go files” 错误?

我们可以使用 go list 命令来查看哪些文件被包括在内以及哪些被排除:

go list -tags ${TAG_NAME} -json ${PACKAGE_NAME}

示例输出如下:

{
    "Dir": "",
    "ImportPath": "",
    "Name": "bitanswer",
    "Files": [],
    "GoFiles": [],
    "IgnoredGoFiles": [
        "file1.go",
        "file2.go"
    ],
    "GoFilesExclude": [
        "file1.go",
        "file2.go"
    ]
}

结论

golang 文件夹命名也有条件编译的功能,当文件夹命名符合 filename_os 时,文件中的 //go:build 规则会失效。

指标体系搭建方法论

什么是指标体系

指标体系=指标+体系,简言之,就是一系列相互关联的用于衡量业务发展状况的指标的集合。

  • 指标:是对业务单元的度量值,使业务可以描述、度量和拆解;

  • 体系:往往由一系列观察和思考业务的角度组成,即一系列的维度构成。

在数据分析领域,维度是不可缺少的一部分,离开维度谈指标可谓耍流氓。

可以朴素的理解为:希望以什么视角(维度)分析什么数据(指标),如果以日常监控或分析为目的,运营一般会选择按日进行监控,如每天注册用户数、日活等;如果是汇报或者宣发场景,可能会有按月、年、历史累计等维度做汇总,如某年度新增注册用户数等。

为什么要搭建指标体系

  • 衡量业务发展状况:通过监控指标体系看清业务发展,并针对性调整业务策略,确保业务良性增长;
  • 统一公司内各部门间的业务口径,减少沟通成本;
  • 指导基础数据搭建,从数仓到数据报表、数据产品的应用层面,严格参考数据指标体系建设,确保指标一致性;
  • 指导数据分析,各业务部门自行分析数据时,可在一致性的 指标体系的基础上搭建场景化的分析模型、报表。

常用数据指标体系搭建方法论

科学分析思维搭建——OSM模型

  • O(Object): 即业务目标,在搭建模型之前,我们先思考一个问题:我们的业务、产品、甚至是其中的一个功能存在的目的是什么、能够解决用户什么问题、满足用户的什么需求?
  • S(Strategy): 策略,清楚业务目标之后,为了达成上述目标,我们应当采取什么样的业务策略;
  • M(Measure): 度量,即选择合适的指标用于衡量我们的策略是否有效,反应目标的达成情况。

举个例子:在一个文件转换服务中,核心功能是实现一个类型自动转换的服务,并通过提升文件转换效率和稳定性来提升用户体验。

影响转换效率的主要是任务调度策略,比如分级调度

数据分析模型搭建——AARRR模型

AARRR 模型就是业界知名的海盗模型,这是一个从获取客户开始到最终形成收益和口碑传播为目的的一个业务运营的思考过程,整个过程一共有五大环节,AARRR就是由这五个环节的英文名首字母组成,基本流程如下:

A(Acquisition)-> A(Activation)-> R(Retention)-> R(Revenue)-> R(Referral)

即获取、激活、留存、挖掘(变现)、传播。总之,AARRR 模型的核心思路就是从获客到获取收益的整个过程上量化数据、分析数据并反哺业务;相对而言,该模型更适用于渴望增长的创业公司的数据指标体系搭建参考,当然了,该模型对业务覆盖面较广,成熟公司若按该思路搭建的指标体系也会比较全面。事实上,AARRR模型是《增长黑客》这本书里抽象出来的概念,感兴趣的同学可以去看看,书中还有大量的产品设计和运营案例讲解,包含facebook,谷歌,微软还有uber等企业曾经走过的或成功或失败的案例,很值得产品、运营和数据分析师们一读!

场景化搭建——人、货、场分析模型

大数据平台层级结构

本文主要介绍大数据的应用层级划分,帮助自己梳理数据在大数据平台的生命周期。

根据大数据平台中的数据流入流出,可分为原始数据层、数据仓库、数据应用层。

我对 Context 包的理解

引言

讲真的,我一直不明白 go 的 context 怎么用,之前在用 Java 开发时就不清楚,所以这次专门花时间把 go 的 context 弄清楚。

我记得第一次接触 context 时,文档上说这个是用来做并发控制的,可以设置超时时间,超时就会快快速返回,可以携带一些信息,在生命周期中共享。生命周期这个概念很重要,我们在开发时需要掌控程序的生命周期。

我们不能简单的认为只要函数中带着 context 参数往下传递就可以做到超时取消,快速返回,其实这是一个错误的思想,其取消机制采用的也是通知机制,但出的透传并不会起作用,比如你这么写代码:

func main()  {
    ctx,cancel := context.WithTimeout(context.Background(),10 * time.Second)
    defer cancel()
    go Monitor(ctx)

    time.Sleep(20 * time.Second)
}

func Monitor(ctx context.Context)  {
    for {
        fmt.Print("monitor")
    }
}

我们需要学会正确的使用 context。

Clash 源码详解系列集锦

众所周知,Clash for Windows 衫裤跑路了,让我默哀一分钟,For Freedom!!!

所以一个奇怪的想法出现了,我能否扛起大旗走下去!...我瞎说的,第一步就先读懂源码吧。