SPC与六西格玛

SPC (Statistical Process Control) 统计过程控制,是六西格玛工业管理理论的其中一个重要模块。SPC的控制图 (control chart) 是数据可视化的一个重要手段。而控制图的选择应该根据实际需求来,这里不展开讲控制图,关于控制图的细节可以查找其他资料。(7 种控制图,8 个判异准则。)

简单介绍一下六西格玛,就是 6 sigma 的音译,sigma 是什么?接触过统计的人应该会有印象,σ\sigmaσ 这个符号就是 sigma,一般代表偏差。

先介绍一下生产质量控制中常用的一个概念 DPMO (Defects Per Million Opportunities),就是在生产过程中每 100 万个机会中出现的缺陷数。比如在 100 万个焊点里,出现了 1 个缺陷,那么 DPMO 就等于 1。可见 DPMO 是越小越好,最好是为 0。当然在大量的生产过程中这种理想状态出现的几率是非常非常小的。DPMO 的取值会作为衡量生产质量的一个重要指标,下面是 DPMO 对应 sigma 水平的对照表。

sigma level DPMO yield
6 3.4 99.99966%
5 230 99.977%
4 6210 99.38%
3 66800 93.32%
2 308000 69.15%
1 690000 30.85%

如果 DPMO 为 3.4 ,对应的 sigma 水平是 6,也就是可以达到 99.99966% 的合格率。所以 sigma 水平就可以作为生产质量的一个评判标准,达到 6 sigma 水平的生产就是非常牛逼的水准了!

6 个 σ\sigmaσ 的介绍就到这里,不过六西格玛管理理论远不止于此,除了统计学的知识,大部分是关于精益生产管理。

U Chart 案例

这是当时工作中遇到的实际需求,要观察生产产品的单位缺陷数。拿到检测机器的测试记录,包括每天检测的产品编号、检测时间、残次件的维修时间、维修人员等等。冗余信息非常多,用 Excel 处理,只提取检测的产品数量和缺陷件数量,按月份统计整理。(现在看回头当时为什么会弄了两个表示时间的列也是百思不得其解。。。。)n 列表示当月检测的产品数量,c 列表示当月的缺陷数。

因为每个月的产品数量是不同的,所以采用用于可变样本量的 U-chart。如果每个月的产品数量相同,用 C-chart。

Defects per unit: u=cnu=\frac{c}{n}u=nc​

Central Limit: CL=uˉ=∑ci∑niCL=\bar{u}=\frac{\sum c_i}{\sum n_i}CL=uˉ=∑ni​∑ci​​

Upper Central Limit: UCL=uˉ+3uˉniUCL=\bar{u}+3\sqrt{\frac{\bar{u}}{n_i}}UCL=uˉ+3ni​uˉ​​

(开方里的是 uˉ\bar{u}uˉ,好像叠起来看不见了)本来还应该算下界的,但是因为 u 肯定是大于 0,且越小越好,所以下界不需要考虑。

用 pandas 导入整理好的数据命名为 defect_test。计算好3个需要展示的数据:u,CL,UCL。

time = defect_test['Month']
u = defect_test['c']/defect_test['n']
cl = sum(defect_test['c'])/sum(defect_test['n'])
ucl = cl + 3*np.sqrt(cl/defect_test['n'])

用 matplotlib 可视化

cl_s = np.ones(12)*cl
plt.style.use('ggplot')
plt.figure(figsize=(15,6))
plt.plot(time,u,'k',marker='o',markersize=10,lw=3,label='u=c/n')
plt.plot(time,cl_s,'r',label='CL')
plt.plot(time,ucl,'b--',label='UCL')
plt.legend()
plt.title('U chart');

从上图可以看出,缺陷数u一直在CL附近波动。大部分的u都在UCL以下,但是有两个月是在控制以外 (out of control),二月和三月。二月份的u值是0.005277,三月份的是0.006198。对应的DPMO值5277和6198,对应了4 sigma的水平,对应Cpk值(工程能力,要求达到1.33以上)是1.33。总而来说,在二月和三月,缺陷数在控制以外,但Cpk还是达到了应有的期望值1.33。整一年生产过程是达到要求的,但是还是需要注意质量控制,需要保持所有的缺陷数在控制范围内。

对于超出上界限UCL的点判断为异常,在图表上显示出来:

def uchart_test(c,n,time):import numpy as npimport matplotlib.pyplot as pltu = c/ncl = sum(c)/sum(n)ucl = cl + 3 * np.sqrt(cl/n)cl_s = np.ones(len(time))*cl# out of control pointsofc = u[u >= ucl]ofc_ind = list(ofc.index)ofc_time = time[ofc_ind]print("Out of Control:")if len(ofc) == 0:print("All under control.")else:for i,j in zip(ofc_ind,range(len(ofc))):print(str(j+1) + " - " + str(ofc_time[i]) + ", " + str(ofc[i]))plt.style.use('ggplot')plt.figure(figsize=(15,6))# plot out of control pointsfor i in ofc_ind:plt.scatter(ofc_time[i],ofc[i],c='r',s=200)# plot u chartplt.plot(time,u,'k',marker='o',markersize=8,lw=3,label='u=c/n')plt.plot(time,cl_s,'g',label='CL')plt.plot(time,ucl,'b--',label='UCL')plt.legend()plt.ylim((0,max(u)+0.001))plt.title('U chart');

用定义好的函数 uchart_test,输入残缺件数c,总件数n,时间time,就可以画出 U chart,并且找出异常点:

I-MR Chart 案例

使用 I-MR 控制图 可以在拥有连续数据且这些数据是不属于子组的单个观测值的情况下监视过程的均值和变异。使用此控制图可以监视过程在一段时间内的稳定性,以便您可以标识和更正过程中的不稳定性。

例如,一家医院的管理员想确定门诊疝气手术所用的时间是否稳定,以及手术时间的变异性是否稳定。由于数据不是以子组形式收集的,因此管理员使用 I-MR 控制图监视手术时间的均值和变异性。

实际看看下面这个数据案例:

I-MR Chart 是有两个图:一个是 I Chart (Individual Chart),一个是 MR Chart (Moving Range Chart)。

和所有控制图一样,重点是找到 CL,UCL,LCL。

Tabular values for X and range charts

Subgroup Size E2 D4
1 2.660 3.268
2 2.660 3.268
3 1.772 2.574
4 1.457 2.282
5 1.290 2.114
6 1.184 2.004
7 1.109 1.924
8 1.054 1.864
9 1.010 1.816
10 0.975 1.777

subgroup 的大小可以调整,这里我们默认选 1。

I Chart:XXX

CLX=Xˉ=1n∑i=1nXiCL_X=\bar{X}=\frac{1}{n}\sum_{i=1}^n X_iCLX​=Xˉ=n1​i=1∑n​Xi​

UCLX=Xˉ+E2×MRˉUCL_X=\bar{X}+E_2\times \bar{MR}UCLX​=Xˉ+E2​×MRˉ

LCLX=Xˉ−E2×MRˉLCL_X=\bar{X}-E_2\times \bar{MR}LCLX​=Xˉ−E2​×MRˉ

MR Chart:MR=∣Xi−Xi−1∣MR=|X_i-X_{i-1}|MR=∣Xi​−Xi−1​∣ (维度比 X 少 1)

CLMR=1n−1∑i=2n(Xi−Xi−1)CL_{MR}=\frac{1}{n-1}\sum_{i=2}^n (X_i-X_{i-1})CLMR​=n−11​i=2∑n​(Xi​−Xi−1​)

UCLMR=D4×MRˉUCL_{MR}=D_4\times \bar{MR}UCLMR​=D4​×MRˉ

LCLMR=0LCL_{MR}=0LCLMR​=0

xs = data.iloc[:,[1,3,5,7,9]]
observation = data.iloc[:,[0,2,4,6,8]]
x = []
for i in range(xs.shape[1]):x.extend(xs.iloc[:,i])
x = np.array(x)obs = []
for i in range(observation.shape[1]):obs.extend(observation.iloc[:,i])
obs = np.array(obs)x_bar = x.mean()# move range
x_1 = x[:-1]
x_2 = x[1:]
mr = np.array(np.array(list(abs(v - u) for u, v in zip(x, x[1:]))))mr_bar = mr.mean()# E2 = 2.660
x_ucl = x_bar + 2.660 * mr_bar
x_ucl_c = x_bar + 2.660 * mr_bar * (1/3)
x_ucl_b = x_bar + 2.660 * mr_bar * (2/3)
x_lcl = x_bar - 2.660 * mr_bar
x_lcl_c = x_bar - 2.660 * mr_bar * (1/3)
x_lcl_b = x_bar - 2.660 * mr_bar * (2/3)# D4 = 3.268
mr_ucl = 3.268 * mr_bar
mr_ucl_c = mr_bar + (mr_ucl - mr_bar) * (1/3)
mr_ucl_b = mr_bar + (mr_ucl - mr_bar) * (2/3)
mr_lcl = 0
mr_lcl_c = mr_bar - (mr_ucl - mr_bar) * (1/3)
mr_lcl_b = mr_bar - (mr_ucl - mr_bar) * (2/3)   # <0n = len(x)x_ucl = np.ones(n)*x_ucl
x_ucl_c = np.ones(n)*x_ucl_c
x_ucl_b = np.ones(n)*x_ucl_b
x_lcl = np.ones(n)*x_lcl
x_lcl_c = np.ones(n)*x_lcl_c
x_lcl_b = np.ones(n)*x_lcl_bplt.style.use('ggplot')
plt.figure(figsize=(15,8))plt.subplot(2,1,1)
plt.plot(obs,x, 'k',marker='o',markersize=5,lw=2,label='X')
plt.plot(obs,np.ones(n)*x_bar,'r',label='CL')
plt.plot(obs,x_ucl,'b',lw=1)
plt.plot(obs,x_ucl_c,'b-.',lw=1)
plt.plot(obs,x_ucl_b,'b-.',lw=1)
plt.plot(obs,x_lcl,'b',lw=1)
plt.plot(obs,x_lcl_c,'b-.',lw=1)
plt.plot(obs,x_lcl_b,'b-.',lw=1)
plt.legend()
plt.title('I chart')mr_ucl = np.ones(n-1)*mr_ucl
mr_ucl_c = np.ones(n-1)*mr_ucl_c
mr_ucl_b = np.ones(n-1)*mr_ucl_b
mr_lcl = np.ones(n-1)*mr_lcl
mr_lcl_c = np.ones(n-1)*mr_lcl_c
mr_lcl_b = np.ones(n-1)*mr_lcl_bplt.subplot(2,1,2)
plt.plot(obs[1:],mr, 'k',marker='o',markersize=5,lw=2,label='MR')
plt.plot(obs[1:],np.ones(n-1)*mr_bar,'r',label='CL')
plt.plot(obs[1:],mr_ucl,'b',lw=1)
plt.plot(obs[1:],mr_ucl_c,'b-.',lw=1)
plt.plot(obs[1:],mr_ucl_b,'b-.',lw=1)
plt.plot(obs[1:],mr_lcl,'b',lw=1)
plt.plot(obs[1:],mr_lcl_c,'b-.',lw=1)
plt.legend()
plt.title('MR chart');

判异的规则有 8 条:

Rule Rule Name Pattern             Example           
1 Beyond Limits 1个点落在A区外
2 Zone A 连续3点中有2点落在中心线同一侧的Zone B以外
3 Zone B 连续5点有4点落在中心线同一侧的Zone C以外
4 Zone C 连续9个以上的点落在中心线同一侧(Zone C或以外)
5 Trend 连续7点递增或递减
6 Mixture 连续8点无一点落在Zone C
7 Stratification 连续15点落在中心线两侧的Zone C内
8 Over-control 连续14点相邻交替上下

加入8条判异规则:

def rules(data, obs, cl, ucl, ucl_b, ucl_c, lcl, lcl_b, lcl_c):n = len(data)ind = np.array(range(n))# rule 1ofc1 = data[(data > ucl) | (data < lcl)]ofc1_obs = obs[(data > ucl) | (data < lcl)]    # rule 2ofc2_ind = []for i in range(n-2):d = data[i:i+3]index = ind[i:i+3]if ((d>ucl_b).sum()==2) | ((d<lcl_b).sum()==2):ofc2_ind.extend(index[(d>ucl_b) | (d<lcl_b)])ofc2_ind = list(sorted(set(ofc2_ind)))ofc2 = data[ofc2_ind]ofc2_obs = obs[ofc2_ind]# rule 3ofc3_ind = []for i in range(n-4):d = data[i:i+5]index = ind[i:i+5]if ((d>ucl_c).sum()==4) | ((d<lcl_c).sum()==4):ofc3_ind.extend(index[(d>ucl_c) | (d<lcl_c)])ofc3_ind = list(sorted(set(ofc3_ind)))ofc3 = data[ofc3_ind]ofc3_obs = obs[ofc3_ind]# rule 4ofc4_ind = []for i in range(n-8):d = data[i:i+9]index = ind[i:i+9]if ((d>cl).sum()==9) | ((d<cl).sum()==9):ofc4_ind.extend(index)ofc4_ind = list(sorted(set(ofc4_ind)))ofc4 = data[ofc4_ind]ofc4_obs = obs[ofc4_ind]# rule 5ofc5_ind = []for i in range(n-6):d = data[i:i+7]index = ind[i:i+7]if all(u <= v for u, v in zip(d, d[1:])) | all(u >= v for u, v in zip(d, d[1:])):ofc5_ind.extend(index)ofc5_ind = list(sorted(set(ofc5_ind)))ofc5 = data[ofc5_ind]ofc5_obs = obs[ofc5_ind]# rule 6ofc6_ind = []for i in range(n-7):d = data[i:i+8]index = ind[i:i+8]if (all(d>ucl_c) | all(d<lcl_c)):ofc6_ind.extend(index)ofc6_ind = list(sorted(set(ofc6_ind)))ofc6 = data[ofc6_ind]ofc6_obs = obs[ofc6_ind]# rule 7ofc7_ind = []for i in range(n-14):d = data[i:i+15]index = ind[i:i+15]if all(lcl_c<d) and all(d<ucl_c):ofc7_ind.extend(index)ofc7_ind = list(sorted(set(ofc7_ind)))ofc7 = data[ofc7_ind]ofc7_obs = obs[ofc7_ind]# rule 8ofc8_ind = []for i in range(n-13):d = data[i:i+14]index = ind[i:i+14]diff = list(v - u for u, v in zip(d, d[1:]))if all(u*v<0 for u,v in zip(diff,diff[1:])):ofc8_ind.extend(index)ofc8_ind = list(sorted(set(ofc8_ind)))ofc8 = data[ofc8_ind]ofc8_obs = obs[ofc8_ind]return ofc1, ofc1_obs, ofc2, ofc2_obs, ofc3, ofc3_obs, ofc4, ofc4_obs, ofc5, ofc5_obs,ofc6, ofc6_obs, ofc7, ofc7_obs, ofc8, ofc8_obsdef imrchart_test(obs,x,subgroup=1):import numpy as npimport matplotlib.pyplot as plt# depend on subgroup valueE2 = [2.660, 2.660, 1.772, 1.457, 1.290, 1.184, 1.109, 1.054, 1.010, 0.975]D4 = [3.268, 3.268, 2.574, 2.282, 2.114, 2.004, 1.924, 1.864, 1.816, 1.777]e2 = E2[subgroup-1]d4 = D4[subgroup-1]n = len(x)x_bar = x.mean()mr = np.array(list(abs(v - u) for u, v in zip(x, x[1:])))mr_bar = mr.mean()# I chartx_ucl = x_bar + e2 * mr_barx_ucl_c = x_bar + e2 * mr_bar * (1/3)x_ucl_b = x_bar + e2 * mr_bar * (2/3)x_lcl = x_bar - e2 * mr_barx_lcl_c = x_bar - e2 * mr_bar * (1/3)x_lcl_b = x_bar - e2 * mr_bar * (2/3) # MR chartmr_ucl = d4 * mr_barmr_ucl_c = mr_bar + (mr_ucl - mr_bar) * (1/3)mr_ucl_b = mr_bar + (mr_ucl - mr_bar) * (2/3)mr_lcl = 0mr_lcl_c = mr_bar - (mr_ucl - mr_bar) * (1/3)mr_lcl_b = mr_bar - (mr_ucl - mr_bar) * (2/3)if mr_lcl_c < 0: mr_lcl_c = 0if mr_lcl_b < 0: mr_lcl_b = 0# 8 rulesx_ofc = rules(x, obs, x_bar, x_ucl, x_ucl_b, x_ucl_c, x_lcl, x_lcl_b, x_lcl_c)print("========== I chart test ==========")for r in range(8):print("Against Rule %d:" %(r+1))if len(x_ofc[r*2]) == 0:print("None.")else: for num,i,j in zip(range(len(x_ofc[r*2])), x_ofc[r*2+1], x_ofc[r*2]):print("\t%d -> %s, %f" %(num+1, str(i), j))mr_ofc = rules(mr, obs[1:], mr_bar, mr_ucl, mr_ucl_b, mr_ucl_c, mr_lcl, mr_lcl_b, mr_lcl_c)print("========== MR chart test ==========")for r in range(8):print("Against Rule %d:" %(r+1))if len(mr_ofc[r*2]) == 0:print("None.")else: for num,i,j in zip(range(len(mr_ofc[r*2])), mr_ofc[r*2+1], mr_ofc[r*2]):print("\t%d -> %s, %f" %(num+1, str(i), j))      # plotplt.style.use('ggplot')plt.figure(figsize=(15,8))plt.subplot(2,1,1)plt.plot(obs,x, 'k',marker='o',markersize=5,lw=2,label='X')plt.plot(obs,np.ones(n)*x_bar,'r',label='CL')plt.plot(obs,np.ones(n)*x_ucl,'b',lw=1)plt.plot(obs,np.ones(n)*x_ucl_c,'b-.',lw=1)plt.plot(obs,np.ones(n)*x_ucl_b,'b-.',lw=1)plt.plot(obs,np.ones(n)*x_lcl,'b',lw=1)plt.plot(obs,np.ones(n)*x_lcl_c,'b-.',lw=1)plt.plot(obs,np.ones(n)*x_lcl_b,'b-.',lw=1)for r in range(8):for i in range(len(x_ofc[r*2])):plt.scatter(x_ofc[r*2+1][i],x_ofc[r*2][i],c='r',s=70)plt.legend()plt.title('I chart')plt.subplot(2,1,2)plt.plot(obs[1:],mr, 'k',marker='o',markersize=5,lw=2,label='MR')plt.plot(obs[1:],np.ones(n-1)*mr_bar,'r',label='CL')plt.plot(obs[1:],np.ones(n-1)*mr_ucl,'b',lw=1)plt.plot(obs[1:],np.ones(n-1)*mr_ucl_c,'b-.',lw=1)plt.plot(obs[1:],np.ones(n-1)*mr_ucl_b,'b-.',lw=1)plt.plot(obs[1:],np.ones(n-1)*mr_lcl,'b',lw=1)plt.plot(obs[1:],np.ones(n-1)*mr_lcl_c,'b-.',lw=1)for r in range(8):for i in range(len(mr_ofc[r*2])):plt.scatter(mr_ofc[r*2+1][i],mr_ofc[r*2][i],c='r',s=70)plt.legend()plt.title('MR chart');imrchart_test(obs,x)

观察 I chart,对照输出的具体异常点:

  • Rule 1 - 第76个观测值32,在A区以外,比UCL大;
  • Rule 2 - 第19,20,64,65,76,77,连续三个点中有两个落在同一侧的B区以外;(76已经是Rule1异常)
  • Rule 3 - 第13,14,15,17,18,19,20,76,77,78,79,连续五个点中有四个落在同一侧的C区外;(19,20,76,77已经是Rule1和Rule2异常)
  • Rule 4 - 第8至20,连续九个点落在中心线同一侧;(13,14,15,17,18,19,20已经在前面的Rule检测到)
  • Rule 5 至 8 均未发现异常。

观察 MR chart,对照输出的具体异常点:

  • Rule 1 - 第46,66,71,76,91异常,在UCL以外;
  • 其余Rule均未发现异常。

针对不同的场景选择不同的控制图。每个控制图,按照计算公式编写对应的代码,确定上下界和判异规则,将异常点在图上用红点表示出来。

用Python实现SPC统计过程控制相关推荐

  1. SPC 统计过程控制

    1. 简介 统计过程控制(Statistical Process Control,SPC)是一种借助数理统计方法的过程控制工具.它对生产过程进行分析评价,根据反馈信息及时发现系统性因素出现的征兆,并采 ...

  2. SPC统计过程控制应用

    SPC主要是指应用统计分析技术对生产过程进行实时监控,科学的区分出生产过程中产品质量的随机波动于异常波动,从而对生产过程的异常趋势进行预警,以便生产管理人员及时采取措施,消除异常,恢复过程的稳定,从而 ...

  3. matlab怎样做单值spc,统计过程控制_spc_及MATLAB实现_宋景涛.pdf

    统计过程控制_spc_及MATLAB实现_宋景涛 理 论 与 实 践 质 量 工 程 卷 Quality Engineering T h e o r y 统计过程控制(spc)及MATLAB实现 &a ...

  4. python画spc控制图_手把手教你SPC控制图怎么做以及SPC控制图分类

    01.什么是SPC控制图?SPC控制图怎么做以及SPC控制图分类. SPC控制图是SPC统计过程控制的核心工具,是对过程质量加以测定.记录从而进行控制管理的一种用科学方法设计的图,是用于分析和判断工序 ...

  5. spc统计过程控制系统架构模型

    SPC(统计过程控制)是指一种应用统计方法监测.评估和控制生产过程的技术.SPC系统的架构模型通常包括以下几个部分: 数据采集:这一部分包括从生产过程中采集数据的方法. 数据处理:这一部分包括将采集的 ...

  6. [SPC]生产统计过程控制一

    很多人都变化很大,很高兴.他们有这样的成就.但回想自己感觉到很窝囊.很多事情都是环境决定的,目前我在一家制造的工厂上班,所以程式方面.只要能够满足工厂的需要就可以了.所以技术没更新那么快.不像很多同学 ...

  7. 从冲咖啡看统计过程控制

    昨天,徐毅-Kaveri发了一条微博. @徐毅-Kaveri:怎么#冲咖啡#?先倒水再放咖啡,还是先放咖啡再冲水? 后续对话中提到他在强调统计过程控制,要用数据说话,并且at @拯救与逍遥 @张克强- ...

  8. python画spc控制图_实施SPC控制图的八个步骤详解

    企业在实行SPC品质管理时,需要对过程控制的关键工序进行监控分析,而这一监控分析工具就是spc控制图,下面盈飞无限给大家主要介绍实施SPC控制图的八个步骤. 图示:实施SPC控制图的八个步骤 什么是S ...

  9. 【统计学】【2009.03】【含源码】时间序列分析和统计过程控制工具在财务数据中的应用

    本文为加拿大多伦多大学(作者:Mohammed Siyam Ibrahim)的学士论文,共122页. 时间序列分析在金融数据中的应用仍然是日内交易员.定量金融专家和精选投资专家感兴趣领域.作者成功地将 ...

最新文章

  1. RedHat/CentOS 7通过nmcli命令管理网络教程
  2. poj1511(SPFA算法)
  3. 太牛了!30 年开源老兵,10 年躬耕 OpenStack,开源 1000 万行核心代码!
  4. mac hdmi 不能调整音量_搭配这几个软件,你的 AirPods 在安卓、Mac 上会更好用
  5. 自己动手写一个服务网关
  6. html中显示变量的数组,javascript如何判断变量是不是数组?
  7. 递归算法详细分析- C
  8. java ee无法安装_为什么要导入javax.servlet。*; 安装Java EE仍无法解决 面向Java EE开发人员的Eclipse...
  9. 【IoT平台技术对接分享】如何上传正确的消息推送证书
  10. HCIE Security 防火墙转发流程及相关知识点 备考笔记(幕布)
  11. python 读取access_python读取数据access出错
  12. 【2019杭电多校第二场1009=HDU6599】I Love Palindrome String(回文树的fail树)
  13. K3销售订单携带批号至销售出库单
  14. java接口压力测试
  15. Log4j有哪几种日志级别呢?
  16. 关于快速幂与快速积取模实现的尝试
  17. 英飞凌TC264学习(三)定时器
  18. web高级前端面试实战总结
  19. matlab bfs函数,Matlab脚本和函数
  20. 一套简单实用的SQL脚本,总有你需要的

热门文章

  1. 全球与中国低温锂电池市场现状及未来发展趋势2022-2028
  2. Android(以太坊)生成助记词
  3. Oracle APEX 系列文章5:在阿里云上打造属于你自己的APEX完整开发环境 (进一步优化)
  4. 【STM32F429】第6章 RL-TCPnet V7.X底层驱动说明
  5. android获取LTE中tac、pci、ci、enb、cellid等信息
  6. K歌宝全国产化电子元件推荐方案
  7. macbook怎么清理磁盘空间 macbook的steam游戏怎么卸载
  8. 被was坑惨了,websphere下面报webapp.WebApp logError SRVE0293E: [Servlet Error]-[null]错误。
  9. Python网络爬虫基础进阶到实战教程
  10. 走x86路线的海光如今怎么样了?