using UnityEngine; using System.Collections; using UnityEngine.UI; public class SliderColor : MonoBehaviour { public Color[] colors = new Color[] { Color.red, Color.yellow, Color.green }; Slider slider; void Start() { slider = GetComponent(); slider.fillRect.transform.GetComponent().color = Color.green; } void Update() { float val = slider.value; val *= (colors.Length - 1); int startIndex = Mathf.FloorToInt(val); Color color = colors[0]; if (startIndex >= 0) { if (startIndex + 1 < colors.Length) { float factor = (val - startIndex); color = Color.
一 概念及作用 1. IL代码:
1)概念:.NET框架中的中间语言(Intermediate Language)的缩写,IL还有另外的2种叫法:CIL,Common Intermediate Language;MSIL, MicrosoftIntermediate Language。
作用:使用.NET框架提供的编译器(例如VS)可以直接将源程序(例如C++,VB.NET,C#)编译为.exe或.dll文件,但此时编译出来的程序代码并不是CPU能直接执行的机器代码,而是一种中间语言IL(Intermediate Language)的代码。因此还需要通过JIT编译器进行二次编译,将IL代码转化成机器代码。
2)优点:使用中间语言的优点有两点,一是可以实现平台无关性,即与特定CPU无关,意思是对平台没有依赖性,不指定特定的CPU,可以跨平台跨系统,具有一定通用性;二是只要把.NET框架某种语言编译成IL代码,就实现.NET框架中语言之间的交互操作。
3)IL与程序集的关系:IL代码是程序集的核心部分。
4).NET程序集的构成
从结构上看,一个.NET程序集(*.dll或者*.exe)包含以下几个部分:
Windows文件首部
Windows文件首部使程序集被Windows系列操作系统加载和操作。这些首部信息标识了应用程序将以什么类型(是基于控制台、基于图形用户界面还是*.dll代码库)驻留在Windows操作系统中。
CLR文件首部
为了驻留于CLR中,所有的.NET文件都必须含有CLR首部数据块,简单地讲,CLR文件首部定义了多个标记,它们使得运行时环境可以了解到托管文件的布局。
IL代码
IL代码是程序集的核心部分,是独立于平台和CPU的中间语言。在运行时,程序集内部的IL代码只在绝对必需的情况下才被(实时的JIT编译器)编译成特定平台和CPU的指令。”绝对必需”通常是指一段IL指令(例如一个方法实现)被CLR引用时。在这种机制下,.NET程序集可以在多种不同的架构、设备和操作系统下运行。
类型元数据
类型元数据完整地描述了程序集内含类型和引用外部类型的格式。.NET运行时环境利用元数据在内存的二进制布局类型中解析类型(以及类型的成员)的位置,使远程方法调用更便利。
程序集清单
清单(manifest,也称程序集元数据,是对程序集本身的自描述)详细记录了程序集中的每一个模块、构建程序集的版本以及该程序集引用的所有外部程序集。它提供有关程序集的类型、版本、区域性和安全要求等信息。
可选的嵌入资源
.NET程序集还可以包含一些嵌入资源,如应用程序图标、图像文件、声音片段或者字符串表。事实上,.NET平台支持卫星程序集(satellite assembly),这些程序集只包含本地化资源。在构建国际化软件系统的时候,我们可能想基于特定区域(英语、德语等)来对资源进行分类打包,这时候附属程序集就显得非常有用。
5)程序集加载流程:
IL 代码与资源(例如位图和字符串)一起作为一种称为程序集的可执行文件存储在磁盘上,通常具有的扩展名为 .exe 或.dll。 执行 C# 程序时,程序集将加载到 CLR 中,这可能会根据清单中的信息执行不同的操作。然后,如果符合安全要求,CLR 就会执行实时 (JIT) 编译以将 IL 代码转换为本机机器指令。
2. JIT编译器: 概念:JIT编译器,英文写作Just-In-Time Compiler,中文意思是即时编译器。
作用:JIT编译器能够将MSIL代码进行二次编译后成为各种不同的机器代码,以适应对应的系统和平台,最终使得程序在目标系统中得到顺利地运行。(帮助IL实现跨系统)
3. CTS: 公共类型系统(Common Type System)
CTS(通用类型系统)是一个正式的规范,它规定了类型必须如何定义才能被CLR承载。通过正式的规范来描述类型的定义和行为,所有.net框架下的目标语言定义的语言都要与CTS的类型进行映射对应,这样才能保证各语言之间的互操作性。
4.CLS:公共语言规范(Common Language Specification)
CLS限制了由各种语言不同特性而引发的互操作性问题,CLS制定了一种以.NET平台为目标的语言所必须支持的最小特征,
以及该语言与其他.NET语言之间实现互操作性所需要的完备特征。即.NET框架下的目标语言如果要实现互操作性,至少需要对CLS规范进行完全支持。
由图总结: 1) CTS定义类型,CLS定义规范,在共同定义的环境下实现以.Net平台为目标的各语言之间的互操作性。
2)CLS是各语言间实现互操作性的最低规范。但是内部使用语言时可以只满足CTS不满足CLS。 3) CRL严格按照CTS进行实现。
5.CLR:公共语言运行时(Common Language RunTime)
晚上睡不着觉又a不动题,干脆看看书……
学校课上讲的C++刚到面向对象就结束了,简直比吃鸡剩两个人时天命圈刷到自己脚底下突然屏幕一暗中间出现一个
图标上面写着一行”网络延迟检测”还要难受。没得办法,自己看看书做做笔记学一学了。
图像增强:多尺度的图像细节提升(multi-scale detail boosting)实现方法 看到一篇博客介绍基于多尺度的图像的细节提升算法,其参考论文《Dark image enhancement based onpairwise target contrast and multi-scale detail boosting》,下图是该论文的核心算法过程。然后自己在Matlab和OpenCV实现了该算法,最终实现的效果还是不错的,可以增强图像的细节部分。 论文的核心算法过程:
论文的核心思想类似于Retinex,使用了三个尺度的高斯模糊,再和原图做减法,获得不同程度的细节信息,然后通过一定的组合方式把这些细节信息融合到原图中,从而得到加强原图信息的能力:请参考这一篇博客介绍:http://www.cnblogs.com/Imageshop/p/7895008.html,该博客给出了SSE的实现过程。 算法实现很容易,下面,我给出本人的OpenCV和Matlab实现方法: OpenCV实现方法: #include #include #include using namespace std; using namespace cv; cv::Mat multiScaleSharpen(cv::Mat Src, int Radius) { int rows = Src.rows; int cols = Src.cols; int cha = Src.channels(); cv::Mat B1, B2, B3; GaussianBlur(Src, B1, Size(Radius, Radius), 1.0, 1.0);//高斯模糊 GaussianBlur(Src, B2, Size(Radius*2-1, Radius*2-1), 2.0, 2.0); GaussianBlur(Src, B3, Size(Radius*4-1, Radius*4-1), 4.0, 4.0); double w1 = 0.
6.1树莓派基本操作 目前提供了三个应用程序,分别为:raspistill、raspivid、raspistillyuv。其中 raspistill 和 raspistillyuv 非常相似,并且都是用于捕捉图像,而 raspivid 用于捕捉视频。
所有应用程序均基于命令行方式运行,通过 OpenMAX 的 mmal API 进行编写。OpenMAX 的 mmal API 提供了更易使用的系统组件。注意,mmal 是一个由 Broadcom 为 Videocore 4 系统定制的 API。
应用程序使用了四个 OpenMAX(mmal)组件:camera(摄像)、preview(预览)、encoder(编码)、null_sink。所有应用程序均使用了摄像组件,raspistill 使用了图像编码组件,raspivid 使用了视频编码组件,raspistillyuv 没有使用编码组件,而是直接将 YUV 或 RGB 从摄像组件输出到文件。
预览显示为可选参数,但是可以用于全屏或输出到指定的显示器显示区域进行显示。如果预览被禁用,那么 null_silk 组件将会对预览帧进行“吸收”。这是由于尽管不需要摄像头生成供显示所用的的预览帧,但是仍需要使用它们进行曝光计算和白平衡设置的缘故。
此外,还可以省略文件名参数,这样既可以直接预览显示而不写入文件,或者直接输出到标准输出设备上。命令行帮助可以通过直接输入应用程序名称获得。
6.1.1安装摄像头硬件 警告:摄像头对静电非常敏感。如果您在安装摄像头电路板时没有防静电手环,可以尝试触摸一下水龙头、金属水槽或其它类似的东西即可。
摄像头电路板与 Raspberry Pi 通过一条 15 芯的排线进行连接。仅有两个连接座需要连接,排线需要安装到摄像头电路板和 Raspberry Pi 上。您需要正确安装,否则摄像头无法工作。对于摄像头电路板,排线末端的蓝色标记应该背对着电路板。而 Raspberry Pi 部分,蓝色标记应该正对着网络接口方向。
尽管两部分连接座不尽相同,但它们的工作方式很相似。对于 Raspberry Pi,拉起连接座两端的卡扣。它应该很容易拉起,并能够轻微活动。把排线完全插入到连接座中,并保证竖直,然后轻轻按下两端的卡扣。摄像头电路板方面,也需要您将卡扣向电路板相反方向拉开,然后轻轻插入排线,最后将卡扣推回。摄像头电路板的连接座与 Pi 上的区别就在这里。
6.1.2安装摄像头软件 执行下文介绍的命令行进行下载并安装最新的内核,GPU 固件及应用程序。您需要连接到互联网才可以实现以下操作。
$sudo apt-get update $sudo apt-get upgrade 接下来,您首先需要在 Raspberry Pi 的 raspi-config 程序中启用摄像头的支持。
Hello!This is my first blog for DL,now I will shape some great Webs which may better and efficiently learn DL. 1 NOTE paper and code for tracking:
http://blog.csdn.net/cyh_24/article/details/51592156
2 Deep Learning papers reading roadmap for anyone who are eager to learn this amazing tech:
https://github.com/songrotek/Deep-Learning-Papers-Reading-Roadmap
3 CS231n course learn:
https://zhuanlan.zhihu.com/p/21930884
to be continued…
原理: (经典)tcp粘包分析
场景: 此项目是处理实时监测数据,一旦tcp socket建立连接,会不间断实时发送数据,峰值输数据量在3M/秒,这样的数据量必然会造成数据粘包。
目的: TCP连接面向流,读取网络的一包数据不一定正好是协议里定义的完整的一包,有可能是多包,有可能是半包,也有可能是一包半,现在要将每次读取的数据进行分包,也就是粘包处理,提取出完整的一包数据供上层使用,上层需要将完整的一包数据里的数据根据协议定义的格式提取出来。
实现: 将收到的数据copy到缓存区,在缓存区里循环从起始位按照协议找出完整的一包数据提取出来。 关键点在于根据协议找出完整一包数据的长度。
从网络读取数据后拷贝到缓存区 判断:缓存区里数据占位,长度小于某个值n,return再次读取网络数据。这个值n长度的数据内要能解析出单个完整包的长度,以便后续处理 循环:如果缓存区长度大于解析出来的完整一包的长度 执行: 取出完整一包数据后,然后剔除这包,将缓存区剩余数据放置起始位 循环里再次判断: 长度小于某个值n,return再次读取网络数据。 这个值n长度的数据内要能解析出单个完整包的长度,以便后续处理 如果协议定义了帧头,可以在取包的长度之前校验帧头,确保数据正确。
这里说明定义缓冲区buffer的长度大小:必须要大于可能收到的最大数据包的长度加上read读取一次网络最大数据长度 原因是缓冲区里可能剩下不到一包数据,下一次读取网络数据后要将数据copy至缓冲区,如果超过缓冲区大小就无法进行处理。可在copy时加一层判断,如果超过缓存区,就直接返回,断开连接。代表这种数据包不能进行处理。如果缓存区设计合理,不会出现此种情况。read读取一次网络最大数据长度是在read到的buffer定义的长度。缓冲区的buffer不要设置过大,占用太多内存。 数据源说明:第一位固定#。第二位表示之后有几位代表了之后的数据的长度,比如第一条数据的第二位4,代表之后的四位3350是从0:开始共有3350个字节长度的数据。之后的数据跟业务相关。
主要代码: Java实现: 不可用于生产环境,理解思想后根据业务数据处理粘包
private static int MAXDATALEN = 500000; //处理数据缓冲池的长度 private static int RECEIVEDATALEN = 200000;//读取网络数据包最大长度 private int SiglePackageLen = 0;//提取出包的长度 private int SequenceLen = 0;//当前缓冲区内数据长度 private byte BuffSequencePackage[] = new byte[MAXDATALEN];//数据缓冲池 public void readData() { //读取网络数据长度 int RecvLen; //缓存区 byte ReceiveData[] = new byte[RECEIVEDATALEN]; try { while (AdapterManager.
1.首先下载luasocket库 可以直接下载编译好的库,也可以去github上下载源码后自己自己编译: 编译好的库下载地址:
http://files.luaforge.net/releases/luasocket/luasocket 源码下载地址:
https://github.com/diegonehab/luasocket 到官网上看了一下luasocket 的install方案,有几点还是值得注意的,luasocket库包含了以下文件,如果下载的库里面的文件少了,可能造成某些功能无法使用: ‘’ 然后贴一张这边编译好的库的层次结构: 主要这三个文件夹,其他的可以不要,再贴一下这几个文件夹内部的层级结构: 这样的话几个目录的层级结构就很清楚了 还有一点需要注意的就是这里面的文件是依赖于lua5.1.x的,如果lua的版本与此不匹配也可能出现问题(我试了下lua5.3不行),这一切准备完毕后就可以继续下一步了。 2.将luasocket库嵌入lua 我们先来认识一下里面的一些文件,编译好的库里面包含两个dll文件,其余的都是lua文件,如果我们了解lua中的require的机制,那么下面的内容应该很easy了,lua中的require加载一个模块时,会先从它的全局环境中去拿两个变量的值,一个是LUA_PATH,另一个是LUAC_PATH,(注意大小写),如果第一个值不为空,那么lua会以其值提供的一个路径模式去匹配相应路径下的文件,如果第二个值不为空,lua会以同样的方式去相应路径下去加载c的库,(比如我们下载的文件中的dll),我们可以通过系统的环境变量来设置上述两个变量的值,这样的话,只要我们把这两个环境变量的值设置成我们下载的库中的相应路径,那就ok了。下面来看图: 这里说明一下,我是把库里面的文件放到了我lua的解释器文件夹下(D:Lua5.1),你们也可以放到任意地方,再看我的环境变量(LUA_CPATH)的值:我的luasocket库的上一级目录路径(我的在D:\Lua5.1)+?.dll,这里的问号会被require的参数替换掉,再看我的环境变量(LUA_PATH)的值:我的luasocket库的上一级目录路径(我的在D:\Lua5.1)+lua\?.lua,这里的lua就是上面图片中的那个lua的文件夹,问号会被require的参数替换掉,因为那个lua的文件夹里面还有一个socket的文件夹,所以我们需要再添luasocket库的上一级目录路径(我的在D:\Lua5.1)+lua\socket\?.lua,注意LUA_PATH中的这两个路径要用;隔开。简单解释一下,上面配置的路径的意思就是当我require一个lua的模块时,他会从我们前面luasocket库的lua文件夹中和lua文件夹下的socket文件夹中寻找相应的lua文件,当我们require一个c的库的时候,会从我们的luasocket库的mime文件夹和socket文件夹下去加载相应的库文件,为什么这里没有针对mime和socket文件夹分开设置路径?打开luasocket库中的socket.lua文件会发现,它帮我们加载时填写的路径里面已经包含了相应的目录(一个是socket.core另一个是mim.core)这个点在c下面会被翻译为目录分隔符,所以我们不需要分开处理,好的,到这里,如果前面的工作没问题的话我们的配置工作就完成了,下面我们就来打开一下我们的luasocket库: lua的解释器程序中直接编辑require(”socket”),然后打印返回值的_VERSION 就可以看到当前luasocket的版本信息了,下面是运行效果图: 到这里,luasocket库怎么添加到windows环境中的方法就已经说完了,博主水平有限,如有不正确的地方欢迎批评指正
极品工业控件Iocomp 在VB6.0平台使用 绘制曲线 iXYPlotX1全面解析
1新建工程 要把Form1的界面拉宽一点,增加分辨率。
2加载iocomp部件 3新建 iXYPlotX1 部件 选择这个图标在Form1中拉伸出一个范围。如下图所示。
4 更改标题栏的字体与颜色,并可实现汉语显示 注:Margin 为标题距离表格线的距离,可正负,双精度。 5、背景颜色设置 背景颜色默认为黑色,一般情况下是可以使用的,而且对比度很高。但是有些情况需要打印图形,这个时候黑色的底色就哭了。怎么办?调整底色方法如下图。
6 增加显示通道 7改变通道标题字颜色 8改变横纵坐标的标线与标数的颜色 9 改变表格细分栏颜色,调整最佳对比度 10 标题栏、横纵坐标、通道指示栏汉字输入程序段 Private Sub Form_Load()
‘//=== 曲线绘制窗口参数修改 ===
iXYPlotX1.Channel(0).TitleText = ” 通道一风速 m/s”
iXYPlotX1.Channel(1).TitleText = ” 通道2 压差x100Pa”
iXYPlotX1.Channel(2).TitleText = ” 通道Ⅲ扭矩 N·m”
iXYPlotX1.Channel(3).TitleText = ” 通道④转速 x1000rpm”
iXYPlotX1.TitleText = “这是曲线显示标题栏”
iXYPlotX1.XAxis(0).Title = “这是横坐标”
iXYPlotX1.YAxis(0).Title = “这是纵坐标”
End Sub
11 模拟绘制曲线程序与显示效果图 Private Sub Timer1_Timer()
‘//—— 绘制曲线 ——
这几天学习了一下GD扩展库,昨天写了一个图片验证码,今天继续写了一个给图片增加水印的类。
什么是图片水印 先来看一下什么是水印:
水印,是指在造纸过程中形成的,“夹”在纸中而不是在纸的表面,迎光透视时可以清晰看到有明暗纹理的图形、人像或文字,它是纸张在生产过程中用改变纸浆纤维密度的方法而制成的。通常人民币、购物卷、粮票、证劵等等,都采用此方式,以防止造假
类似的,图片水印就是在自己制作的图片或自己网站的图片上贴上一个标签 , 表明作者信息或网站信息,也可以防止别人盗用。 通常水印可以是文字或者另一图片,并且有一定透明度,不影响原图的查看。
PHP生成水印图的步骤 这里的水印可以是文字或者是图片。 1. 打开需要处理的图片 2. 计算水印的位置 3. 增加水印(文字或图片) 4. 保存新图片 5. 释放资源(可以省略,php可以自动释放)
所使用的GD函数 打开和关闭图片就不说了,这里说的是处理图片水印所需要的GD函数
1.计算文本框大小所需要的函数:
array imageftbbox ( float $size , float $angle , string