迈瑞BC系列出图汇总

迈瑞的几个仪器出图需要画图,搞的很费劲,没办法,厂商自己不改,明明有图发Base64串的,就非两个图要自己画,画的方法又描述不清。每个LIS厂商都要浪费很多时间,没什么必要浪费在这种没意义的事情上,共有5800系列,BC3000系列,2600系列,分享给大家。

示例代码和程序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
6800型号

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LIS.BLL.ImageCore;
using System.Drawing;
using System.Data;
using System.IO;
using System.Drawing.Drawing2D;
namespace LIS.Mach.ImageDeal
{///<summary  NoteObject="Class">/// [功能描述:M调用绘图测试] <para/>/// [创建者:zlz] <para/>/// [创建时间:2018年03月22日] <para/>///<说明>///  [说明:[功能描述:M调用绘图测试,配合M处理仪器绘图]<para/>///</说明>///<修改记录>///    [修改时间:本次修改时间]<para/>///    [修改内容:本次修改内容]<para/>///</修改记录>///<修改记录>///    [修改时间:本次修改时间]<para/>///    [修改内容:本次修改内容]<para/>///    M端触发代码,其他的和监听程序一样///    s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDrawImageAsyncHandlerSoap).%New()///    s ret=retObj.DrawImage("1","绘图数据","仪器","处理M","传输次数","其他参数","LIS.Mach.ImageDeal.ImageDealTest,LIS.Mach.ImageDeal")///    s ret=$$DealImage^MI.MIF000(epis,"RBC绘图数据串",mi,"和监听一样的有保存图片的M类","-1","Histogram#RBC#RBC######10#10#320#138","LIS.Mach.ImageDeal.Imagebc6800,LIS.Mach.ImageDeal")///    s ret=$$DealImage^MI.MIF000(epis,"RBC带背景绘图数据串",mi,"和监听一样的有保存图片的M类","-1","Histogram#RBC#RBCH.bmp######10#10#320#138","LIS.Mach.ImageDeal.Imagebc6800,LIS.Mach.ImageDeal")///    s ret=$$DealImage^MI.MIF000(epis,"PLT绘图数据串",mi,"和监听一样的有保存图片的M类","-1","Histogram#PLT#PLT######10#10#320#138","LIS.Mach.ImageDeal.Imagebc6800,LIS.Mach.ImageDeal")///    s ret=$$DealImage^MI.MIF000(epis,"PLT带背景绘图数据串",mi,"和监听一样的有保存图片的M类","-1","Histogram#PLT#PLT.bmp######10#10#320#138","LIS.Mach.ImageDeal.Imagebc6800,LIS.Mach.ImageDeal")///    s ret=$$DealImage^MI.MIF000(epis,"DIFF绘图数据串",mi,"和监听一样的有保存图片的M类","-1","DiffPlot#DIFF#######10#10#320#138","LIS.Mach.ImageDeal.Imagebc6800,LIS.Mach.ImageDeal")///    s ret=$$DealImage^MI.MIF000(epis,"Baso绘图数据串",mi,"和监听一样的有保存图片的M类","-1","DiffPlot#Baso#######10#10#320#138","LIS.Mach.ImageDeal.Imagebc6800,LIS.Mach.ImageDeal")///</修改记录>///</summary>public class Imagebc6800 : IDrawImage{/// <summary>/// 绘图方法/// </summary>/// <param name="epis">流水号</param>/// <param name="result">结果</param>/// <param name="machID">仪器ID</param>/// <param name="dealProcess">处理M</param>/// <param name="index">-1认为传到最后</param>/// <param name="otherPara">其他参数</param>/// <param name="dealClass">C#处理类格式:类全名,不带后缀的动态库名</param>/// <returns>是否成功</returns>public bool DrawImage(string epis, string result, string machID, string dealProcess, string index, string otherPara, string dealClass){//string epis = row["Epis"].ToString();//1.1从其他参数中获取所需要的参数string[] paraList = otherPara.Split('#');string graphType = "";string imgClass = "";string label = "";string title = "";string maxDot = "";string maxValue = "";string memo = "";string foreColor = "";string top = "";string left = "";string width = "";string height = "";if (paraList.Length > 1){graphType = paraList[0];imgClass = paraList[1];}else{return true;}if (paraList.Length > 11){title = paraList[2];label = paraList[3];maxDot = paraList[4];maxValue = paraList[5];memo = paraList[6];foreColor = paraList[7];top = paraList[8];left = paraList[9];width = paraList[10];height = paraList[11];}//#2.1校验必要参数是否存在if (String.IsNullOrEmpty(width)){width = "330";}if (String.IsNullOrEmpty(height)){height = "140";}if (String.IsNullOrEmpty(foreColor)){foreColor = "0";}//#2.2取得画图所需要的元素double imageWidth = Convert.ToDouble(width);double imageHeight = Convert.ToDouble(height);//#2.3分不同类型的图形来进行绘图//画直方图if (graphType == "Histogram"){//先把串转比特数组byte[] imageBytes = Convert.FromBase64String(result);float[] dot = new float[imageBytes.Length];int imgMaxDot = 0;float imgMaxValue = 0;for (int j = 0; j < imageBytes.Length; j++){dot[j] = imageBytes[j];if (dot[j] > imgMaxValue){imgMaxValue = dot[j];}imgMaxDot++;}Bitmap image = null;//使用背景画图if (title == "PLT.bmp" || title == "RBCH.bmp"){image = CreateImage(title, imgMaxValue, dot, null);}else{Dictionary<int, string> xshow = new Dictionary<int, string>();if (imgClass == "RBC"){xshow.Add(10, "0");xshow.Add(60, "50");xshow.Add(110, "100");xshow.Add(160, "150");xshow.Add(210, "200");xshow.Add(260, "250");xshow.Add(310, "fL");}if (imgClass == "PLT"){xshow.Add(10, "0");xshow.Add(50, "5");xshow.Add(100, "10");xshow.Add(150, "15");xshow.Add(200, "20");xshow.Add(250, "25");xshow.Add(300, "fL");}//按十进制结果画图Histogram histogram = new Histogram(label, title, imgMaxDot, imgMaxValue, foreColor, Convert.ToInt32(width), Convert.ToInt32(height), xshow);histogram.Values = dot;image = histogram.CreateImage();}//判断C盘trak是否存在string tmpPath = @"c:\trak\tmpMach";if (!Directory.Exists("C:\\trak")){Directory.CreateDirectory("C:\\trak"); //新建文件夹   if (!Directory.Exists(tmpPath)){Directory.CreateDirectory(tmpPath); //新建文件夹   }}//先删除临时目录里面的所有文件DeleteFolder(tmpPath);image.Save(tmpPath + "\\" + imgClass + epis + ".bmp");image.Dispose();string ftpPath = "";//FtpService ftp = GetFtpHelper(machID, dealProcess, out ftpPath);//上传图片//ftp.Upload(tmpPath + "\\" + imgClass + epis + ".bmp");//保存图片//SaveImg(machID, epis, imgClass, ftpPath.Split('^')[3] + imgClass + epis + ".bmp", dealProcess);}//散点图就是图片的Base64串表示,直接还原else if (graphType == "DiffPlot"){Bitmap image = null;try{byte[] arr = Convert.FromBase64String(result);MemoryStream ms = new MemoryStream(arr);image = new Bitmap(ms);ms.Dispose();ms.Close();Bitmap imgTMP = new Bitmap(image.Width, image.Height);Graphics g = Graphics.FromImage(imgTMP);g.DrawImage(image, 0, 0, image.Width, image.Height);image.Dispose();image = imgTMP;//判断C盘trak是否存在string tmpPath = @"c:\trak\tmpMach";if (!Directory.Exists("C:\\trak")){Directory.CreateDirectory("C:\\trak"); //新建文件夹   if (!Directory.Exists(tmpPath)){Directory.CreateDirectory(tmpPath); //新建文件夹   }}//先删除临时目录里面的所有文件DeleteFolder(tmpPath);//反转底色GraphUtil.GrayReverse(image);image.Save(tmpPath + "\\" + imgClass + epis + ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);image.Dispose();string ftpPath = "";//FtpService ftp = GetFtpHelper(machID, dealProcess, out ftpPath);//上传图片//ftp.Upload(tmpPath + "\\" + imgClass + epis + ".bmp");//保存图片//SaveImg(machID, epis, imgClass, ftpPath.Split('^')[3] + imgClass + epis + ".bmp", dealProcess);}catch (Exception ex){throw new Exception("Base64String到图片转换失败\n异常:"+ex.Message);}}return true;}/// 清空指定的文件夹,但不删除文件夹/// </summary>/// <param name="dir"></param>public static void DeleteFolder(string dir){foreach (string d in Directory.GetFileSystemEntries(dir)){if (File.Exists(d)){FileInfo fi = new FileInfo(d);if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1)fi.Attributes = FileAttributes.Normal;File.Delete(d);//直接删除其中的文件  }else{DirectoryInfo d1 = new DirectoryInfo(d);if (d1.GetFiles().Length != 0){DeleteFolder(d1.FullName);递归删除子文件夹}Directory.Delete(d);}}}/// <summary>/// 获得图片流/// </summary>/// <param name="name"></param>/// <returns></returns>public Stream GetImageStram(string name){return this.GetType().Assembly.GetManifestResourceStream("iMedicalLISBCIMage.Image." + name);}/// <summary>/// 画图逻辑/// </summary>public Bitmap CreateImage(string bgName, float MaxValue, float[] Values, Bitmap imageold){//#1.画坐标系,先简单画两条线,暂时不做细节Bitmap img = null;//#1.2获得画图句柄Graphics g = null;if (imageold != null){img = imageold;g = Graphics.FromImage(img);}else{Image imgtmp = Image.FromStream(GetImageStram(bgName)) as Bitmap;img = new Bitmap(imgtmp.Width, imgtmp.Height);g = Graphics.FromImage(img);g.Clear(Color.White);//+抗锯齿g.SmoothingMode = SmoothingMode.AntiAlias;g.DrawImage(imgtmp, 0, 0, img.Width, img.Height);}int Height = img.Height;//#1.3偏移int x = 1;int y = 20;//画横纵坐标线Pen pen = new Pen(Color.Black);pen.Width = 2;//#3.开始进点的数据,进行绘图double radix = (img.Width - 30) * 1.0 / Values.Length;if (Values.Length == 256){radix = radix * 2;}float preY = -1;int curindex = 0;double radiy = 1;if (MaxValue != 0){radiy = (Height - 40) * 1.0 / MaxValue;}foreach (var d in Values){if (preY == -1){pen = new Pen(Color.Black);pen.Width = 1;}else{pen = new Pen(Color.Black);pen.Width = 1;if (10 + x * radix > img.Width){continue;}if (Height - d * radiy - y > img.Height || Height - d * radiy - y < 0){continue;}g.DrawLine(pen, 10 + (int)(x * radix), Height - (int)(d * radiy) - y, 10 + (int)((x - 1) * radix), preY - y);}preY = Height - (int)(d * radiy);x += 1;curindex++;}return img;}}
}

BC3000型号

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LIS.BLL.ImageCore;
using System.Drawing;
using System.Data;
using System.IO;
using System.Drawing.Drawing2D;
namespace LIS.Mach.ImageDeal
{///<summary  NoteObject="Class">/// [功能描述:M调用绘图测试] <para/>/// [创建者:zlz] <para/>/// [创建时间:2018年03月22日] <para/>///<说明>///  [说明:[功能描述:M调用绘图测试,配合M处理仪器绘图]<para/>///</说明>///<修改记录>///    [修改时间:本次修改时间]<para/>///    [修改内容:本次修改内容]<para/>///</修改记录>///<修改记录>///    [修改时间:本次修改时间]<para/>///    [修改内容:本次修改内容]<para/>///    M端触发代码,其他的和监听程序一样///    s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDrawImageAsyncHandlerSoap).%New()///    s ret=retObj.DrawImage("1","绘图数据","仪器","处理M","传输次数","其他参数","LIS.Mach.ImageDeal.ImageDealTest,LIS.Mach.ImageDeal")///    s ret=$$DealImage^MI.MIF000(epis,"整个BC3000的数据,绘图自己提取绘图数据",mi,"和监听一样的有保存图片的M类","-1","","LIS.Mach.ImageDeal.ImageDealBC3000Plus,LIS.Mach.ImageDeal")///</修改记录>///</summary>public class ImageDealBC3000Plus : IDrawImage{/// <summary>/// 绘图方法/// </summary>/// <param name="epis">流水号</param>/// <param name="result">结果</param>/// <param name="machID">仪器ID</param>/// <param name="dealProcess">处理M</param>/// <param name="index">-1认为传到最后</param>/// <param name="otherPara">其他参数</param>/// <param name="dealClass">C#处理类格式:类全名,不带后缀的动态库名</param>/// <returns>是否成功</returns>public bool DrawImage(string epis, string result, string machID, string dealProcess, string index, string otherPara, string dealClass){if (result.Length > 2304){string imgStr = result.Substring(result.Length - 2304, 2304);//每个图256*3表示  依次是WBC RBC PLTfor (int i = 0; i < 3; i++){string oneImgStr = imgStr.Substring(i*768,768);float maxVal = 0;float [] points = new float[256];for (int j = 0; j < 256; j++){string onePoint = oneImgStr.Substring(j*3,3);float curVal = Convert.ToInt32(onePoint);if(maxVal<curVal){maxVal=curVal;}points[j]=curVal;}//图片类别string imgClass = "";if (i == 0){imgClass = "WBC";}else if (i == 1){imgClass = "RBC";}else if (i == 2){imgClass = "PLT";}Dictionary<int, string> xshow = new Dictionary<int, string>();if (imgClass == "RBC"){xshow.Add(10, "0");xshow.Add(60, "50");xshow.Add(110, "100");xshow.Add(160, "150");xshow.Add(210, "200");xshow.Add(260, "250");xshow.Add(310, "fL");}if (imgClass == "PLT"){xshow.Add(10, "0");xshow.Add(50, "5");xshow.Add(100, "10");xshow.Add(150, "15");xshow.Add(200, "20");xshow.Add(250, "25");xshow.Add(300, "fL");}//按十进制结果画图Histogram histogram = new Histogram("", imgClass, 256, maxVal, "0", 329, 128, xshow);histogram.Values = points;Bitmap img = histogram.CreateImage();//判断C盘trak是否存在string tmpPath = @"c:\trak\tmpMach";if (!Directory.Exists("C:\\trak")){Directory.CreateDirectory("C:\\trak"); //新建文件夹   if (!Directory.Exists(tmpPath)){Directory.CreateDirectory(tmpPath); //新建文件夹   }}//先删除临时目录里面的所有文件DeleteFolder(tmpPath);img.Save(tmpPath + "\\" + imgClass + epis + ".bmp");img.Dispose();}}return true;}/// 清空指定的文件夹,但不删除文件夹/// </summary>/// <param name="dir"></param>public static void DeleteFolder(string dir){foreach (string d in Directory.GetFileSystemEntries(dir)){if (File.Exists(d)){FileInfo fi = new FileInfo(d);if ((DateTime.Now - fi.CreationTime).Minutes > 10){if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1){fi.Attributes = FileAttributes.Normal;}File.Delete(d);//直接删除其中的文件  }}else{DirectoryInfo d1 = new DirectoryInfo(d);if (d1.GetFiles().Length != 0){DeleteFolder(d1.FullName);递归删除子文件夹}Directory.Delete(d);}}}}
}

BC2600型号

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LIS.BLL.ImageCore;
using System.Drawing;
using System.Data;
using System.IO;
using System.Drawing.Drawing2D;
namespace LIS.Mach.ImageDeal
{///<summary  NoteObject="Class">/// [功能描述:M调用绘图测试] <para/>/// [创建者:zlz] <para/>/// [创建时间:2018年03月22日] <para/>///<说明>///  [说明:[功能描述:M调用绘图测试,配合M处理仪器绘图]<para/>///</说明>///<修改记录>///    [修改时间:本次修改时间]<para/>///    [修改内容:本次修改内容]<para/>///</修改记录>///<修改记录>///    [修改时间:本次修改时间]<para/>///    [修改内容:本次修改内容]<para/>///    M端触发代码,其他的和监听程序一样///    s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDrawImageAsyncHandlerSoap).%New()///    s ret=retObj.DrawImage("1","绘图数据","仪器","处理M","传输次数","其他参数","LIS.Mach.ImageDeal.ImageDealTest,LIS.Mach.ImageDeal")///    s ret=$$DealImage^MI.MIF000(epis,"整个BC3000的数据,绘图自己提取绘图数据",mi,"和监听一样的有保存图片的M类","-1","","LIS.Mach.ImageDeal.ImageDealBC3000Plus,LIS.Mach.ImageDeal")///</修改记录>///</summary>public class ImageDealBC2600 : IDrawImage{/// <summary>/// 绘图方法/// </summary>/// <param name="epis">流水号</param>/// <param name="result">结果</param>/// <param name="machID">仪器ID</param>/// <param name="dealProcess">处理M</param>/// <param name="index">-1认为传到最后</param>/// <param name="otherPara">其他参数</param>/// <param name="dealClass">C#处理类格式:类全名,不带后缀的动态库名</param>/// <returns>是否成功</returns>public bool DrawImage(string epis, string result, string machID, string dealProcess, string index, string otherPara, string dealClass){result = result.Replace(" ","").Replace("\n","");string[] paraList = otherPara.Split('#');string imgClass = "";if (paraList.Length > 1){imgClass = paraList[1];if (imgClass == "PLT"){result = result.Substring(0,result.Length/2);}}float[] dot = new float[result.Length / 2];float imgMaxValue = 0;int indexD = 0;for (int i = 0; i < result.Length - 2; i = i + 2){dot[indexD] = Convert.ToInt32(result[i] + "", 16) * 16 + Convert.ToInt32(result[i + 1] + "", 16);if (dot[indexD] > imgMaxValue){imgMaxValue = dot[indexD];}indexD++;}Dictionary<int, string> xshow = new Dictionary<int, string>();if (imgClass == "RBC"){xshow.Add(10, "0");xshow.Add(60, "50");xshow.Add(110, "100");xshow.Add(160, "150");xshow.Add(210, "200");xshow.Add(260, "250");xshow.Add(310, "fL");}if (imgClass == "WBC"){xshow.Add(10, "0");xshow.Add(60, "50");xshow.Add(110, "100");xshow.Add(160, "150");xshow.Add(210, "200");xshow.Add(260, "250");xshow.Add(310, "fL");}if (imgClass == "PLT"){xshow.Add(10, "0");xshow.Add(50, "5");xshow.Add(100, "10");xshow.Add(150, "15");xshow.Add(200, "20");xshow.Add(250, "25");xshow.Add(300, "fL");}Histogram histogram = new Histogram("", imgClass, dot.Length, imgMaxValue, "0", 339, 130, xshow);histogram.Values = dot;Bitmap img = histogram.CreateImage();//判断C盘trak是否存在string tmpPath = @"c:\trak\tmpMach";if (!Directory.Exists("C:\\trak")){Directory.CreateDirectory("C:\\trak"); //新建文件夹   if (!Directory.Exists(tmpPath)){Directory.CreateDirectory(tmpPath); //新建文件夹   }}//先删除临时目录里面的所有文件DeleteFolder(tmpPath);img.Save(tmpPath + "\\" + imgClass + epis + ".bmp");img.Dispose();return true;}/// 清空指定的文件夹,但不删除文件夹/// </summary>/// <param name="dir"></param>public static void DeleteFolder(string dir){foreach (string d in Directory.GetFileSystemEntries(dir)){if (File.Exists(d)){FileInfo fi = new FileInfo(d);if ((DateTime.Now - fi.CreationTime).Minutes > 10){if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1){fi.Attributes = FileAttributes.Normal;}File.Delete(d);//直接删除其中的文件  }}else{DirectoryInfo d1 = new DirectoryInfo(d);if (d1.GetFiles().Length != 0){DeleteFolder(d1.FullName);递归删除子文件夹}Directory.Delete(d);}}}}
}

提倡一下分享精神

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/7805.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对于大连企业而言如何提升网站的曝光率

对于大连企业而言&#xff0c;提升网站的曝光率是非常重要的&#xff0c;可以通过以下几种方式来实现&#xff1a; 1. 优化网站结构和内容&#xff1a;确保网站的结构清晰&#xff0c;布局合理&#xff0c;并且内容丰富、有吸引力。网站的页面加载速度也要快&#xff0c;以提升…

windows 如何ping ip 加端口号

先在系统中找到 勾选上 和平时的pingip命令不一样了 现在是telnet ip 端口号 先看一组无法ping通端口号的案例 若telnet 127.0.0.1 6379 跳转至一个空白界面 代表ping此ip的端口号成功

JMeter安装RabbitMQ测试插件

目录 前言&#xff1a; 具体实现步骤&#xff1a; 1、ant环境搭建 2、AMQP源码下载 3、拷贝JMeter_core.jar包到JMeter-Rabbit-AMQP插件根目录下 4、修改AMQP插件的配置文件 5、打包 6、RabbitMQ客户端插件下载 7、完成以上&#xff0c;重启JMeter创建线程组就可以看到…

Python 数据类型转换

文章目录 每日一句正能量前言隐式类型转换实例实例 显式类型转换实例实例实例实例 每日一句正能量 在人生的道路上&#xff0c;即使一切都失去了&#xff0c;只要一息尚存&#xff0c;你就没有丝毫理由绝望。因为失去的一切&#xff0c;又可能在新的层次上复得。 前言 有时候&…

Unity与Android交互(4)——接入SDK

【前言】 unity接入Android SDK有两种方式&#xff0c;一种是把Unity的工程导出google project的形式进行接入&#xff0c;另一种是通过把Android的工程做成Plugins的形式进行接入。我们接入SDK基本都是将SDK作为插件的形式接入的。 对我们接入SDK的人来说&#xff0c;SDK也是…

谷歌浏览器Crx插件库-https://crxdl.com/

地址&#xff1a;https://crxdl.com/ postman插件&#xff1a;talend json插件库&#xff1a;csdn插件 抓取视频&#xff1a;猫抓

科技富豪抑郁了

原美团二当家王慧文据说抑郁了 什么能解决抑郁问题&#xff1f; 趣讲大白话&#xff1a;科技富豪也抑郁 【趣讲信息科技216期】 **************************** 王富豪创立光年之外AI公司2个月就休息了 知识解决不了抑郁问题 抑郁是现代社会一个常见的症状 是压力所带来的综合症…

MySql入门操作

一.前节回顾 1.web项目环境配置 2.通用增删改&#xff0c;通用查询方法 3.前台&#xff0c;后台代码显示效果 所有你都理解了吗&#xff1f; 二.Mysql数据库介绍 1.什么是MySQL&#xff1f; MySQL是一种开源的关系型数据库管理系统。它是目前最流行和广泛使用的数据库之一&…

如何禁用usb接口 禁用usb端口的九种方法

USB&#xff08;通用串行总线&#xff09;接口是一种常见的连接设备和计算机的方式。然而&#xff0c;有时候我们可能需要禁用USB接口&#xff0c;以保护电脑上重要数据的安全性或限制用户的访问权限。本文将介绍几种禁用USB接口的方法&#xff0c;包括硬件方法、软件方法、物理…

什么是内存溢出,什么是内存泄漏?

文章目录 一、什么是内存溢出&#xff1f;二、什么是内存泄漏&#xff1f;三、如何避免&#xff1f; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、什么是内存溢出&#xff1f; 假设我们 JVM 中可用的内存空间只剩下 3M&#xff0c;但是我们要创…

测试员眼中的____是____

- 1 - 测试员眼中的开发是淘气的孩子 只有靠哄、豁、骗 才能让其完成“作业” - 2 - 测试员眼中的产品经理是女票 不管大小事&#xff0c;只要意见有出入 都得与其商量&#xff0c;才能最终拍板 - 3 - 测试员眼中的UI是艺术家 每天都操着画板&#xff08;苹果显示器&#xff…

DatenLord前沿技术分享 No.29

达坦科技专注于打造新一代开源跨云存储平台DatenLord&#xff0c;通过软硬件深度融合的方式打通云云壁垒&#xff0c;致力于解决多云架构、多数据中心场景下异构存储、数据统一管理需求等问题&#xff0c;以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。BSV的…