精华内容
下载资源
问答
  • IPC通信陷阱之六万五千分之一 【摘要】在本文中,作者剖析了IPC通信机制,通过对系统函数源码分析,指出了其中存在的1/65535几率可能出现的隐患, 并结合实际的案例给出了解决方案.在本文中,我们可以了解到针对...

    IPC通信陷阱之六万五千分之一

    【摘要】在本文中,作者剖析了IPC通信机制,通过对系统函数源码分析,指出了其中存在的1/65535几率可能出现的隐患, 并结合实际的案例给出了解决方案.在本文中,我们可以了解到针对IPC通信常见问题 。在我们之后的测试工作中,可以有选择针对这些注意事项和易错点设计测试case,让bug无处藏身。由于作者能力有限,文中如果有一些不够清晰不够全面的地方,欢迎指正。
    【关键词】IPC,共享内存

    1 IPC通信概述

    IPC(InterProcess Communication) 进程间通信,通常在同一台主机各个进程间的IPC主要有:管道,FIFO,消息队列,信号量,以及共享内存,而不同主机上各个进程间IPC通信可以通过套接字和stream.

    (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
    (2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。
    (3)信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。
    (4)消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺
    (5)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
    (6)内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
    (7)信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
    (8)套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

    2 XSI IPC: 消息队列,信号量以及共享内存
    每由于篇幅关系,在这里着重讨论 XSI IPC,消息队列,信号量以及共享存储器,他们之间有很多共同之处
    一个内核中的IPC结构(消息队列,信号量和共享存储器)都用一个非负整数的标识符(identifier)加以引用。例如,为了对一个消息队列发 送消息或取消息,只需知道其队列标识符。当一个IPC结构被创建,以后又被删除时,与这种结构相关的标识符连续加1,直至达到一个整型数的最大值,然后又 回到0。
    标识符是IPC对象的内部名。键(key)是IPC对象的外部名。无论何时创建IPC结构(调用msgget,semget或shmget),都应该指定一个键。键的数据类型是基本系统数据类型key_t,通常在<sys/types.h>中被定义为长整型。键由内核变成标识符。
    客户进程和服务器进程认同一个路径名和项目ID(项目ID是0~255之间的字符值),接着调用ftok将这两个值变成为一个键。然后用该键创建一个新的IPC结构或得到一个的IPC结构。ftok提供的唯一服务就是由一个路径名和项目ID产生一个键。
    #include <sys/ipc.h>
    key_t ftok(const char *path, int id);
    path参数必须引用一个现存文件。当产生键时,只使用id参数的低八位。
    三个get函数(msgget,semget和shmget)都有两个类似的参数:一个key和一个整型flag。如果满足以下两个条件之一,则创建一个新的IPC结构:
    1). key是IPC_PRIVATE;
    2). key当前未与特定类型的IPC结果相结合,并且flag中指定IPC_CREAT位。
    为访问现存的队列(通常是客户进程),key必须等于创建该队列时所指定的键,并且不应该指定IPC_CREAT。
    如果希望创建一个新的IPC结构,而且要确保不是引用具有同一标识符的一个现行IPC结构,则必须在flag中同时指定IPC_CREAT和IPC_EXCL位。这样做,如果IPC结构已经存在就会出错,返回EEXIST。
    XSI IPC为每个IPC结构设置了一个ipc_perm结构。该结构规定了权限和所有者。
    struct ipc_perm{
    uid_t uid;      // owner’s effective user id
    gid_t gid;      // owner’s effective group id
    uid_t cuid;     // creator’s effective user id
    gid_t cgid;     // creator’s effective group id
    mode_t mode; // access modes
    };
    在创建IPC结构时,对所有字段都附初值。调用msgctl、semctl或shmctl修改uid、gid和mode字段。为了改变这些值,调用进程必须是IPC结构的创建者或超级用户。更改这些字段类似于文件调用chown和chmod。
    字段mode的值如下所示的值,但是对于任何IPC结构都不存在执行权限。另外,消息队列和共享内存使用术语读(read)和写(write),而信号量则用术语读(rend)和更改(alter)。

    3 不同IPC通信方式大比拼
           XSI IPC的主要问题是:IPC结构是在系统范围内起作用,没有访问计数。例如:如果进程创建了一个消息队列,在该队列中放入了几则消息,然后终止,但是该消 息队列及其内容并不会被删除。它们留在系统中直至出现下述情况:由某个进程调用msgrcv或msgctl读消息或删除消息队列;或某个进程执行 ipcrm命令删除该消息队列;或是由正在启动的系统删除消息队列。与管道相比,当最后一个访问管道的进程终止时,管道就被完全删除了。对于FIFO而 言,当最后一个引用FIFO的进程终止时,其名字仍保留在系统中,直至显示地删除它,但是留在FIFO中的数据却在此时全部被删除了。
    XSI IPC的另一问题:这些IPC结构在文件系统中没有名字,不得不增加新的命令ipcs和ipcrm。
    因为这些XSI IPC不使用文件描述符,所以不能对它们使用多路转接I/O函数:select和poll。这使得难于一次使用多个IPC结构,以及文件或设备I/O中使 用IPC结构。例如,没有某种形式的忙-等待循环,就不能使一个服务器进程等待将要放在两个消息队列任一个中的消息。

    4 1/65553的陷阱
           刚才提到,系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。通常情况下,该id值通过ftok函数得到。比如: if (-1 == (conf.shm_key = ftok(conf.chnl_shm_path, ‘l’)));
    看一下ftok函数
    * 原型: key_t ftok( char * fname, int id )
    * 头文件: <sys/ipc.h>
    * 返回值: 成功则返回key, 出错则返回(key_t)-1.
    * 参数: fname参数必须引用一个现存文件. fname就时你指定的文件名,id是指定的值。
           Keys:
    1)pathname一定要在系统中存在并且进程能够访问的
    3)proj_id是一个1-255之间的一个整数值,典型的值是一个ASCII值。
    一切看上去都是那么合理。

    在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。
    让我们在看下ftok代码到底如何获取key的呢,果然很撮

    // ftok库实现为
    // key_t ftok(const char* path, int project_id)
    // {
    // struct stat st;
    // if ( lstat(path, &st) < 0 )
    // return -1;
    // return (key_t)( (st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16) | ((id & 255) << 24) );
    // }
    st.st_ino 是inode节点
    st.st_dev是文件系统设备号
    id是程序指定的0-255值
    ftok调用返回的整数IPC键由proj_id的低序8位,st_dev成员的低序8位,st_info的低序16位组合而成。

    可就会出现以下的风险:
    当project_id相同时, 及时inode不同,但是只要inode的低序16相同时,就会映射到同一个key中,而如果恰巧这个key中也有IPC访问权限,那么这会导致程序可能访问了本不应该访问的key,即访问了本不该通信的区域获取错误的信息,那么这种事情发生的概率是多少呢?答案是1/65535如何得来?低16bit最多可以表示65536个数。所以65537个文件里面一定是有两个文件的inode号的最低两位相同。 请读者朋友们想一想是不是酱紫的.

    这么巧的事情真的会发生么?答案很悲剧的是的,这个世界就是无巧不成书的,这种情况在复杂的线上系统上会无情的发生的。

    5 血案实例
     背景:
    1.线上A程序需要和同时和B,C两个程序通过两段不同的共享内存进行IPC通信
    2.BC之间没有关系,但B和A,C和A之间发生关系:B,C需要写各自的内存,A去读,从中获取以便进行进行后续处理;
    3.B和C和A的通信机制完全一致,区别仅仅在于共享内存指向的路径不同,所以是用的一段代码不同配置项

    结果:
    11台机器部署完全一致的程序,但是只有一台机器上观察共享内存处理逻辑是混乱滴,并且在线下死活是不能复现滴,
    原因:
    仔细观察了B,C的共享内存分别指向路径:path_B,path_c,没错,灰长正常,但是再定睛看他们的inode节点,如下:
    31866881 –> 1E64001
    32260097 —> 1EC4001
    发现了什么:  天杀的低16位完全相同4001,只有高位不同,回忆下,返回的整数IPC键由proj_id的低序8位,st_dev成员的低序8位,st_info的低序16位组合而成, proj_id(相同代码,所以指定的id相同),设备号相同的情况下,inode的低16位又相同,于是B,C同时写到了一块共享内存中,疯掉了,这是 1/65536的概率,真实的中奖了。
    6 解决方法的思考
    那么这种陷阱有没有办法避免呢?在了解了以上的原理后,相信聪明的读者已经想到了解决方法.
    1.最直接的方法:改project_id,但是这样就需要升级程序,又要重新的回归,测试,劳民伤财
    2.自己写一个代替ftok的,保证不冲突的,缺点也同1
    3.在共享内存中加一个标识,B,C只认属于自己的标识,缺点同上
    4.最后来个最简单的吧,诸如共享内存之类的方式,部署后借助系统命令查看,发现不对,立即重启撒
    通过ipcs查看
    $ ipcs -m
    —— Shared Memory Segments ——–
    key        shmid      owner      perms      bytes      nattch     status
    0x6c03806a 32769      work      666        33554016   1

    nattch字段就表示,连接在关联的共享内存段的进程数。通过这个来判断下,是否符合预期,像刚刚描述的血案,很容易通过实际建立的共享内存数量和natch字段这个观察出异常.

    7 其他tips

    1.取得ipc信息:
    ipcs [-m|-q|-s]
    -m     输出有关共享内存(shared memory)的信息
    -q      输出有关信息队列(message queue)的信息
    -s      输出有关“遮断器”(semaphore)的信息
    # ipcs -m
    IPC status from <running system> as of 2007年04月10日 星期二 18时32分18秒 CST
    T         ID      KEY        MODE        OWNER    GROUP
    Shared Memory:
    m          0   0x50000d43 –rw-r–r–     root     root
    m        501   0x1e90c97c –rw-r—–   oracle      dba
    #ipcs |grep oracle|awk   ‘{print $2}
    501

    2.删除ipc(清除共享内存信息)
    ipcrm -m|-q|-s shm_id
    %ipcrm -m 501
    for i in `ipcs |grep oracle|awk   ‘{print $2}’`
    do
    ipcrm -m $i
    ipcrm -s $i
    done

    ps -ef|egrep “ora_|asm_”|grep -v grep |grep -v crs|awk ‘{print $2}’ |xargs kill -9
    helgrind死锁,或者因为线程问题导致valgrind崩溃的情况。
    还有很多其他的经验,在大家的使用过程中将会继续发现的,我们也会持续更新这个列表,让大家有所参考。
    8 结束语
           在Linux环境中进行IPC测试是一件很有挑战性的事情,因为很多问题往往不容易设计case进行覆盖,往往只能通原理层面分析和经验积累来发现隐患;从这个角度而言,笔者给我们提供了一些经验, 帮助我们更快更好地发现问题;而另一方面,由于IPC也是程序中的易错点,所以我们QA需要对这方面使用得更加熟练、了解得更加透彻,才能更好地发现隐藏在代码和实现细节中的问题。欢迎同学们就文章中的内容与我进一步交流,谢谢!

    http://qa.baidu.com/blog/?p=48

    展开全文
  • 千分

    2015-06-02 10:25:58
    千分号(‰),就是指千分之几的意思,用法和百分号(%)相似。“‰”也可以表示一个数是另一个数的千分之几的数,叫做千分数,千分数也叫做千分率、千分比。例如:1‰=1/1000。...

    千分号(‰),就是指千分之几的意思,用法和百分号(%)相似。“‰”也可以表示一个数是另一个数的千分之几的数,叫做千分数,千分数也叫做千分率、千分比。例如:1‰=1/1000。

    展开全文
  • <div><p>Fatal Exception: java.lang.NoClassDefFoundError Failed resolution of: Lxxxx/xx/x/PersonalFragmentN; Raw Text com.xunmeng.router.AppRouteTable.handle (AppRouteTable....chenenyu/Router</p></div>
  • 用Excel导了两天数据,各种问题,折磨客户也折磨了自己,以前没发现的问题一下子都暴露出来了 特意收集两篇Excel跟CSV读取相关的两篇文章 asp.net读取excel文件,将excel文件先上传,在读取,最后删除。...

     

    用Excel导了两天数据,各种问题,折磨客户也折磨了自己,以前没发现的问题一下子都暴露出来了

    特意收集两篇Excel跟CSV读取相关的两篇文章奋斗

     

    asp.net读取excel文件,将excel文件先上传,在读取,最后删除。

    但有一个问题,那就是excel文件夹需要有读写的权限,IIS需要为asp.net用户开通权限的。

    而且excel文件本身存在安全隐患,那就是它可以运行vba程序。所以从安全角度考虑,上传excel是个不好的方法。

    今天介绍另一种方法,读取CVS文件。

    Step1.拖一个fileupload和button控件。

    Step2.双击button,在button事件中写下列代码。

    protected void btnUpload_Click(object sender, EventArgs e)

        {

            if (FileUploadCVS.HasFile)

            {

                if (System.IO.Path.GetExtension(FileUploadCVS.FileName) == ".csv")

                {

                    DataTable dt = GetdataFromCVS(FileUploadCVS);

                 }

              }

          }

    Step3. 写读取CVS文件的函数。

    public static DataTable GetdataFromCVS(FileUpload fileload)

            {

                DataTable dt = newDataTable();

                StreamReader sr = newStreamReader(fileload.PostedFile .InputStream);

                string strTitle = sr.ReadLine();

                string[] strColumTitle = strTitle.Split(',');   //CVS 文件默认以逗号隔开

                for (int i = 0; i < strColumTitle.Length; i++)

                {

                    dt.Columns.Add(strColumTitle[i]);

                }

                while (!sr.EndOfStream)

                {

                    string strTest = sr.ReadLine();

                    string[] strTestAttribute = strTest.Split(',');

                    DataRow dr = dt.NewRow();

                    for (int i = 0; i < strColumTitle.Length; i++)

                    {

                        dr[strColumTitle[i]] = strTestAttribute[i];

                    }

                    dt.Rows.Add(dr);

                }

                return dt;

            }

    记得加上System.IO 命名空间。StreamReader 是在这个namespace下的。很多跟输入输出相关的累都在这个命名空间下


    经常用到csv文件,一直用odbc进行读取,但是在unicode编码的时候读取不正确,有时候就算是ANSI编码,如一列数据混编,读取也不正确。不清楚是不是个人电脑的问题。只好自己写个来实现简单的读取,解析含","及"""号CSV文件。

    更新1:使用中发现有些软件生存csv文件时,所有数据默认带有"",以前代码处理带引号空字段数据不正确。

        代码如下,默认用UTF8编码,一次性读取整个CSV文件,若谁试用了此段代码,有问题请反馈给我,谢谢。

    复制代码
            /// <summary>
            /// 读取csv文件到DataTable
            /// </summary>
            /// <param name="filepath"></param>
            /// <returns></returns>
            static private DataTable ReadCsv(string filepath)
            {
                DataTable dt = new DataTable("NewTable");
                DataRow row;
    
                string[] lines = File.ReadAllLines(filepath, Encoding.UTF8);
                string[] head = lines[0].Split(',');
                int cnt = head.Length;
                for (int i = 0; i < cnt; i++)
                {
                    dt.Columns.Add(head[i]);
                }
                for (int i = 0; i < lines.Length; i++)
                {
                    lines[i].Trim();
                    if ((string.IsNullOrWhiteSpace(lines[i])))
                    {
                        continue;
                    }
                    try
                    {
                        row = dt.NewRow();
                        row.ItemArray = GetRow(lines[i], cnt);
                        dt.Rows.Add(row);
                    }
                    catch { }
                }
                return dt;
            }
            /// <summary>
            /// 解析字符串 获取 该行的数据 已经处理,及"号
            /// </summary>
            /// <param name="line">该行的内容</param>
            /// <param name="cnt">总的条目数</param>
            /// <returns></returns>
            static private string[] GetRow(string line, int cnt)
            {
                //line = line.Replace("\"\"", "\""); //若空数据加引号替换不正确
                string[] strs = line.Split(',');
                if (strs.Length == cnt)
                {
                    return RemoveQuotes(strs);
                }
                List<string> list = new List<string>();
                int n = 0, begin = 0;
                bool flag = false;
    
                for (int i = 0; i < strs.Length; i++)
                {
    
                    //没有引号 或者 中间有引号 直接添加
                    if (strs[i].IndexOf("\"") == -1
                        || (flag == false && strs[i][0] != '\"'))
                    {
                        list.Add(strs[i]);
                        continue;
                    }
                    //其实有引号,但该段没有,号,直接添加
                    n = 0;
                    foreach (char ch in strs[i])
                    {
                        if (ch == '\"')
                        {
                            n++;
                        }
                    }
                    if (n % 2 == 0)
                    {
                        list.Add(strs[i]);
                        continue;
                    }
                    //该段有引号 有 ,号,下一段增加后添加
                    flag = true;
                    begin = i;
                    i++;
                    for (i = begin + 1; i < strs.Length; i++)
                    {
                        foreach (char ch in strs[i])
                        {
                            if (ch == '\"')
                            {
                                n++;
                            }
                        }
                        if (strs[i][strs[i].Length - 1] == '\"' && n % 2 == 0)
                        {
                            StringBuilder sb = new StringBuilder();
                            for (; begin <= i; begin++)
                            {
                                sb.Append(strs[begin]);
                                if (begin != i)
                                {
                                    sb.Append(",");
                                }
                            }
                            list.Add(sb.ToString());
                            break;
                        }
                    }
                }
                return RemoveQuotes(list.ToArray());
            }
            /// <summary>
            /// 将解析的数据 去除多余的引号
            /// </summary>
            /// <param name="strs"></param>
            /// <returns></returns>
            static string[] RemoveQuotes(string[] strs)
            {
                for (int i = 0; i < strs.Length; i++)
                {
                    //若该项数据为空 但csv文件中加上双引号
                    if (strs[i] == "\"\"")
                    {
                        strs[i] = "";
                        continue;
                    }
                    //若该项数据头和尾加上引号
                    if (strs[i].Length > 2 && strs[i][0] == '\"' && strs[i][strs[i].Length - 1] == '\"')
                    {
                        strs[i] = strs[i].Substring(1, strs[i].Length - 2);
                    }
                    //若该项数据中间有引号
                    strs[i] = strs[i].Replace("\"\"", "\"");
                }
                return strs;
            }

    转载于:https://www.cnblogs.com/ganting/p/5049896.html

    展开全文
  • 中国工程院原副院长、邬贺铨院士在启动仪式上表示,中国的IPv6用户在世界仅排第50位,甚至落后于印度、越南,国内只有千分之三用户可以用IPv6。据了解,IPv6是Internet Protocol Version6的缩写,其中Internet ...

    国家发改委“面向‘互联网+’的广电IPv6云资源交换中心”项目14日在广州启动。中国工程院原副院长、邬贺铨院士在启动仪式上表示,中国的IPv6用户在世界仅排第50位,甚至落后于印度、越南,国内只有千分之三用户可以用IPv6。据了解,IPv6是Internet Protocol Version6的缩写,其中Internet Protocol译为“互联网协议”。IPv6是IETF(互联网工程任务组)设计的用于替代现行版本IP协议(IPv4)的下一代IP协议。IPv4最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展。

    “IPv4地址没了,谁能顶得住呢?互联网地址需求继续增加,自2015年起IPv4地址全面枯竭,在中国一个地址一年租用要50-100元,影响发展。”在今天的启动会议上,中国工程院原副院长、邬贺铨院士用一连串数字形象地介绍IPv6发展新趋势,“IPv6性能优于IPv4,有每个用户一个地址、最短路径、无时延等特点,到今年9月,全球IPv6流量已占全网总流量15%,美国IPv6用户占全网用户比例46%。”

    据了解,“面向互联网+的广电IPv6云资源交换中心”系2016年“互联网+”重大工程专项项目,由广东省广电网络股份有限公司联合中国科学院、国家新闻出版广电总局广播科学研究院等单位向国家发展改革委申报,目前已获国家发展改革委批复。

    广东省广电网络股份有限公司副总工程师徐江山介绍,该项目将构建IPv6云资源池、地址转换云,完成网络改造升级,确立家庭智能网关终端战略,未来将以内容带流量,以运营促过度,发展IPv6发展的新模式、新业态。去年已在佛山进行了IPv6试点,从云、管、端、营全体系打通了广电IPv6运营链条。今年6月有线无线融合网江门试点完成了IPv6的部署。未来,项目的实施将形成广电行业IPv6演进的标准规范,使广播电视网络从应用、平台、网络、终端具备向下一代互联网进行迁移的条件,破解广电互联网转型的困局,占领下一代互联网发展的制高点。

    “国际上IPv6的采用正在起飞,中国不能错过这一机会,必须赶上。”邬贺铨院士认为,发展IPv6是网络强国战略的重要内容,因此建议国家明确向IPv6过渡时间表,建设国家级IPv6用户流量监测平台,定期发布真实、权威的IPv6检测报告,以及改变当前互联网在国际出口不开放的IPv6策略等。

    本文转自d1net(转载)

    展开全文
  • 很多时候在使用word编辑财务类的文档的时候,都需要在文档中添加很多的数字,这时候就需要在文档中添加千分符,如何添加呢?word数字千分符设置教程打开软件,然后点击“开始”菜单中的“替换”命令,然后进入替换...
  • 千分号怎么打?

    2020-06-05 21:17:25
    千分号(‰),是指千分之几的意思,也可以叫做千分数、千分率或者千分比,那么在使用WPS文字时,千分号怎么打或者怎么写呢? 将电脑的输入切换为拼音输入法(搜狗拼音、百度拼音或者QQ拼音都可以),直接在输入...
  • 文|迈克尔·刘易斯 由于地球自转放缓的原因,科学家们将再度...上个月看了一本非常精彩的金融小说《高频交易员》,里面对时间的价值标准按纳秒级(十亿分之一秒)计算的,千分之十三秒就能让高频交易员完成一次交易...
  • [Android]如何做一个崩溃率少于千分之三噶应用app(1)-module工程架构 [Android]如何做一个崩溃率少于千分之三噶应用app(2)-完全退出App [Android]如何做一个崩溃率少于千分之三噶应用app(3)-极速编译 ...
  • 迟到本身对于现在的我们来说,无关痛痒,才千分之一嘛,可是,它无形中对我们将来的影响是非常要命,同时也明白了,任何事不能仅仅看它的表面,而是应该看它的深层含义,“润物细无声”的侵害才是最可怕的。...
  • 1:千分号处理 Highcharts.setOptions({ lang: { decimalPoint: ',', thousandsSep: ' ' } }); var chart = new Highcharts.Chart({ chart: { renderTo: 'container' }, xAxis: { categories: ['Jan'...
  • WordPress 在官博发文,庆祝它在流量排名前一万网站中的市场占有率达到了三分之一。据 W3Techs 的数据,WordPress 在前一万网站的市场份额从一年前的 29.9% ...
  • 大概快到了千分之2的这个数量级,这是非常非常恐怖的。因此我们花了一段时间,集中的fix了一把OOM的相关问题,一顿操作,直接让主版本的崩溃率来到了「万分之一」,OOM率来到了十万分之一这个数量级。 干掉OOM,我们...
  • xxxxxxxx产线与xxxxxxxx产线使用工具烧录 MultiDownload_V2.1烧录 出现三个概率异常现象 开机后不断报camera错误, 开机后红外不能使用 开机后拍照模糊 以上均需要恢复出厂设置才能恢复正常的功能,重新开机关面...
  • // 正则 数字超过1000 千分符展示 thousandBitSeparator(n) { let re = /\d{1,3}(?=(\d{3})+$)/g; let n1 = n.toString().replace(/^(\d+)((\.\d+)?)$/,function(s,s1,s2){return s1.replace(re, '$&,') + s2...
  • Word里千分号怎么打?

    2017-05-02 13:23:45
    千分号就是指千分之几的意思,用法和百分号(%)相似。也可以表示一个数是另一个数的千分之几的数,叫做千分数,千分数也叫做千分率、千分比。在Word中编辑数学公式时,有时会用到千分号,那么如何在Word里打千分号...
  • 以下是我这个系列的相关...[Android]如何做一个崩溃率少于千分之三噶应用app--章节列表 我建立了一个关于Android架构学习的群,里面可以进一步进行组件化学习和架构思想的的交流。 群号是316556016,也可以扫码...
  • [Android]如何做一个崩溃率少于千分之三噶应用app--章节列表 我建立了一个关于Android架构学习的群,里面可以进一步进行组件化学习的交流。 群号是316556016,也可以扫码进群。我在这里期待你们的加入...
  • [Android]如何做一个崩溃率少于千分之三噶应用app--章节列表 这个系列的有关架构的概念,适合有大概三年以上Android经验的同学理解。如果你大概一年半以上经验,入门进阶了,我近段时间会开展...
  • [Android]如何做一个崩溃率少于千分之三噶应用app--章节列表 我们最开始开发需要了解的除了Activity,估计就是AndroidMainfest了。 但是当你使用组件化运用到你的工程的时候,你真的了解你的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,917
精华内容 766
关键字:

千分之千