How to decode cmd output correctly?

ProcessStartInfo startInfo = new ProcessStartInfo("CMD.exe");
startInfo.Arguments = "/c " + URL;
Process p = new Process();
startInfo.RedirectStandardInput = true;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.CreateNoWindow = true;
p = Process.Start(startInfo);
string xxx = p.StandardOutput.ReadToEnd();

获得标准输出的正确结果,需要增加以下代码

startInfo.StandardOutputEncoding = Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.OEMCodePage)

在苹果OSX系统下,使用jenkins shell时判断Unity是否在运行的方法

打包时,如果打包机(苹果OSX系统)的Unity正在运行,则会打包失败。为了尽早捕获这种异常,需要判定Unity是否在运行。 经过一番搜索,还是使用了最原始的判断进程关键字的方法。Unity在mac上运行时,ps 查看进程通常有/xx/xx/Unity -projectPath xxx特征,提取最精简部分,统计进程数量(wc -l输出行数),即可。使用如下方式进行判定,目前准确率还行,用一段时间试试看。

#!/bin/bash
if [ $(ps -ef | grep "Unity -projectPath" | wc -l) = "2" ]; then
    echo "The Unity instance is running, exit now!"
    exit 1
fi

你真的了解C#中的Math.Round么?

开发者为了实现小数点后 2 位的四舍五入,编写了如下代码,

var num = Math.Round(12.125, 2); 代码非常的简单,开发者实际得到的结果是12.12, 这与其所预期的四舍五入结果12.13相悖。

其实产生这个结果的原因是由于Math.Round 默认使用的并非是四舍五入的原则,而是四舍六入五成双的原则。

四舍六入五成双

所谓的四舍六入五成双,就是说当确定有效位数之后,有效位数的下一位如果小于等于4就舍去,如果大于等于6就进一,当有效位数的下一位是5的时候

如果5前为奇数,就舍五进一 如果5前为偶数,就舍五不进(0是偶数) 从统计学上将,四舍六入五成双比四舍五入要更精确,因为大量计算的情况下,四舍五入逢五进一,会导致结果偏向大数。

例如:

1.15+1.25+1.35+1.45 = 5.2

如果有效位数是小数点后一位,使用四舍五入原则得到的结果

1.2 + 1.3 + 1.4 + 1.5 = 5.4

而使用四舍六入五成双原则得到的结果是

1.2 + 1.2 + 1.4 + 1.4 = 5.2

由此可见四舍六入五成双原则得到的结果更为精确。

Math.Round的四舍五入 那么如何使用Math.Round实现预期的四舍五入呢?

其实C#中的Math.Round提供了非常多的重载方法,其中有两个重载方法是,

public static double Round (double value, int digits, MidpointRounding mode);
public static decimal Round (decimal d, int decimals, MidpointRounding mode);

这两个方法都提供了第三个参数mode, mode是一个MidpointRounding的枚举变量,它有2个可选值

AwayFromZero - 四舍五入 ToEven - 四舍六入五成双 所以如果我们希望的到一个理想中四舍五入的结果,,我们可以改用如下代码:

var num = Math.Round(12.125, 2, MidpointRounding.AwayFromZero);

什么是鲁棒?

鲁棒是Robust的音译,也就是健壮和强壮的意思。它是在异常和危险情况下系统生存的关键。比如说,计算机软件在输入错误、磁盘故障、网络过载或有意攻击情况下,能否不死机、不崩溃,就是该软件的鲁棒性。所谓“鲁棒性”,是指控制系统在一定(结构,大小)的参数摄动下,维持其它某些性能的特性。

Lua元方法(Metamethod)

方法名 含义
__index 这是 metatable 最常用的键。当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的index 键。如果index包含一个表格,Lua会在表格中查找相应的键
__newindex newindex 元方法用来对表更新。当你给表的一个缺少的索引赋值,解释器就会查找 newindex 元方法:如果存在则调用这个函数而不进行赋值操作。
__add + 操作。 如果任何不是数字的值(包括不能转换为数字的字符串)做加法, Lua 就会尝试调用元方法。 首先、Lua 检查第一个操作数(即使它是合法的), 如果这个操作数没有为 "__add" 事件定义元方法, Lua 就会接着检查第二个操作数。 一旦 Lua 找到了元方法, 它将把两个操作数作为参数传入元方法, 元方法的结果(调整为单个值)作为这个操作的结果。 如果找不到元方法,将抛出一个错误。
__sub - 操作。 行为和 "add" 操作类似。
__mul * 操作。 行为和 "add" 操作类似。
__div / 操作。 行为和 "add" 操作类似。
__mod % 操作。 行为和 "add" 操作类似。
__pow ^ (次方)操作。 行为和 "add" 操作类似。
__unm - (取负)操作。 行为和 "add" 操作类似。
__idiv // (向下取整除法)操作。 行为和 "add" 操作类似。
__band & (按位与)操作。 行为和 "add" 操作类似, 不同的是 Lua 会在任何一个操作数无法转换为整数时 (参见 §3.4.3)尝试取元方法。
__bor (按位或)操作。 行为和 "band" 操作类似。
__bxor ~ (按位异或)操作。 行为和 "band" 操作类似。
__bnot ~ (按位非)操作。 行为和 "band" 操作类似。
__shl << (左移)操作。 行为和 "band" 操作类似。
__shr >> (右移)操作。 行为和 "band" 操作类似。
__concat .. (连接)操作。 行为和 "add" 操作类似, 不同的是 Lua 在任何操作数即不是一个字符串 也不是数字(数字总能转换为对应的字符串)的情况下尝试元方法。
__len # (取长度)操作。 如果对象不是字符串,Lua 会尝试它的元方法。 如果有元方法,则调用它并将对象以参数形式传入, 而返回值(被调整为单个)则作为结果。 如果对象是一张表且没有元方法, Lua 使用表的取长度操作(参见 §3.4.7)。 其它情况,均抛出错误。
__eq == (等于)操作。 和 "add" 操作行为类似, 不同的是 Lua 仅在两个值都是表或都是完全用户数据 且它们不是同一个对象时才尝试元方法。 调用的结果总会被转换为布尔量。
__lt < (小于)操作。 和 "add" 操作行为类似, 不同的是 Lua 仅在两个值不全为整数也不全为字符串时才尝试元方法。 调用的结果总会被转换为布尔量。
__le <= (小于等于)操作。 和其它操作不同, 小于等于操作可能用到两个不同的事件。 首先,像 "lt" 操作的行为那样,Lua 在两个操作数中查找 "le" 元方法。 如果一个元方法都找不到,就会再次查找 "lt" 事件, 它会假设 a <= b 等价于 not (b < a)。 而其它比较操作符类似,其结果会被转换为布尔量。
__index 索引 table[key]。 当 table 不是表或是表 table 中不存在 key 这个键时,这个事件被触发。 此时,会读出 table 相应的元方法。