技术文章

redis系列之------简单的动态字符串(SDS)

眉间皱痕 提交于 2021-02-17 11:38:43
前言 Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。 个人感觉 SDS 类似于Java的 ArrayList, 大家可以拿两者对比一些,谁的效率更加高一点。 SDS定义 1 struct sdshdr { 2 3 // 记录 buf 数组中已使用字节的数量 4 // 等于 SDS 所保存字符串的长度 5 int len; 6 7 // 记录 buf 数组中未使用字节的数量 8 int free ; 9 10 // 字节数组,用于保存字符串 11 char buf[]; 12 13 }; 这里注意一下。C语言的char是 占一个字节的。 不像Java的char占两个字节。也就是只有八位,-127 - 128。 SDS相比于C字符串的优势 1. 常数复杂度获取字符串长度 这个比较好理解,因为SDS里面有一个字段为len,可以直接获取长度 2. 减少修改字符串时带来的内存重分配次数 因为传统的c字符串,不会自动扩容。而且其内存大小就等于字符串长度+1,因此,每修改一次字符串,都要重新分配一次内存,非常的耗费时间 SDS 会自动扩容,并且会进行空间预分配。比如现在有一个 Hello

Java中的常量池(字符串常量池、class常量池和运行时常量池)

半腔热情 提交于 2021-02-17 11:35:16
转载。 https://blog.csdn.net/zm13007310400/article/details/77534349 简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去CSDN、博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将我自认为对的理解写下来与大家共同探讨: 在Java的内存分配中,总共3种常量池: 1.字符串常量池(String Constant Pool): 1.1:字符串常量池在Java内存区域的哪个位置? 在JDK6.0及之前版本, 字符串常量池是放在Perm Gen区(也就是方法区)中; 在JDK7.0版本, 字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了。 1.2:字符串常量池是什么? 在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个Hash表,默认值大小长度是1009;这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。字符串常量由一个一个字符组成,放在了StringTable上。 在JDK6.0中,StringTable的长度是固定的,长度就是1009,因此如果放入String Pool中的String非常多,就会造成hash冲突,导致链表过长,当调用String

quanTIseq:肿瘤浸润免疫细胞定量分析

↘锁芯ラ 提交于 2021-02-17 11:25:33
欢迎关注”生信修炼手册”! quanTIseq基于反卷积算法,利用bulk samples的RNA_seq数据,可以对肿瘤样本中不同种类免疫细胞的组成进行预测,支持以下10种类型的免疫细胞 B cells Classically activated macrophages(M1) Alternatively activated macrophage(M2) Monocytes Neutrophils Natural Killer(NK) cells Non-regulatory CD4+ T cells CD8+ T cells Regulatory CD4+ T(Treg) cells Dendritic cells 该软件设计成pipeline的形式,直接输入样本对应的测序原始数据,进行预处理,定量,免疫细胞组分预测,数据分析流程示意如下 分成以下3个模块 预处理,使用Trimmomatic处理原始测序数据,去除adapter和低质量碱基 基因表达定量,使用kallisto软件进行定量,定量的方式为TPM 细胞组分预测,该软件的核心,利用反卷积算法预测样本中不同细胞的比例 该软件的用法非常简便,需要输入一个配置文件,在配置文件中指定了样本对应的序列文件的位置,内容示意如下 \t 分隔的三列文件,第一列为样本名称,第二列和第三列分别对应R1端和R2端的序列文件。配置文件写好之后

数据调试~~TCP转串口、串口转TCP调试

偶尔善良 提交于 2021-02-17 11:24:55
1 Android socket开发了一个socket客户端,当输入服务器ip以及端口,建立连接之后,Android可以发送数据到电脑接收服务器端。 2 5 如果电脑端没有socket服务器怎么办?方法如下: 6 7 1 、虚拟串口,建立一对虚拟串口COM2 COM3 8 9 2 、打开两个串口助手,分别选择COM2 COM3,打开串口 10 11 3 、打开一个TCP转串口,监听TCP端口之后,选择发送至串口 12 这样Android通过Tcp过来的数据就可以在串口助手中查看,进行调试了 13 【反过来之后,也可以串口至网络进行调试】 来源: oschina 链接: https://my.oschina.net/u/4323904/blog/3937776

利用 Python 批量修改文件名

北城余情 提交于 2021-02-17 10:59:41
开发的第一步,首先得熟悉脚本中使用的模块函数,废话不多说,开干! 1 函数介绍 1.1 os 模块 (1)os.lisdir() >>> import os >>> print(os.listdir()) ['.env', 'rename.py', '.rename.py.swp'] 此函数的作用即列出指定目录下的所有文件与目录的名,并以列表形式展现。 (2)os.path.splitext() >>> import os >>> print(os.path.splitext('rename.py')) ('rename', '.py') 在函数中指定一个文件名,用于分割文件名与后缀,结果存储于元组中 (3)os.path.join() >>> import os >>> print(os.path.join('/etc','nginx','nginx.conf')) /etc/nginx/nginx.conf 将函数中的目录、文件组合成一个路径 (4)os.rename() >>> import os >>> os.rename('src','dest') # src 为原文件名,dest 为目标文件名 将目录或文件重命名 1.2 argparse 模块 ​ Python 中内置模块,用于解析给出的函数参数,生成有用信息。 # argparse 模块示例源码 [root

我泪流满面,比尔盖茨也老了

本小妞迷上赌 提交于 2021-02-17 10:58:52
今天看奥运新闻,看到比尔盖茨去观看"美华裔乒球女选手惊艳奥运"的新闻,看到盖茨的近照,突然泪流满面了,满是沧桑和老态。 虽然作为java世界的一员,对只知道赚钱的微软一顿鄙视,但是用着微软的诸多免费软件,如live writer这么优秀的博文编写器,突然觉得java的世界没有windows也失色不少。盖茨是无私的,他把他的资产都捐给了世界;盖茨是和善的,他是一个极客,而且平易近人;盖茨是伟大的, 现在看博文的人基本上都用的windows操作系统。 人都有老去的一天,无论你多么伟大,无论你多么富有,无论你多么强壮,也许,盖茨先生最想的就是用他的财富换取在年轻一次的机会,所以年轻是一笔没有人能换的回来的财富啊,兄弟们,珍惜自己的健康和青春,快乐的生活吧。哪怕码代码的兄弟也要多出去开心一下,去泡泡中意的妹子丫。去踩踩单车,吹吹风,去快意一下人生,呵呵.... 没有乔布斯一样暴躁的脾气,也没有乔布斯因为疾病而病态的挑剔,但愿盖茨先生身体健康,继续享受这个生活的每一天。愿您健康长寿。 来源: oschina 链接: https://my.oschina.net/u/137092/blog/69889

创业的路上 最难的是不放弃

送分小仙女□ 提交于 2021-02-17 10:58:35
我是一个技术创业者,也是一个独立创业者,没有优秀的行业背景,没有优秀的学历,从技术做到管理,到现在已经有8个年头。是的,我看透了这个行业的浮躁,凭着一颗为您做真正需要的软件之心出来创业了^_^。 从2015.4到现在差不多10个月,经历了从“ 不知道做什么好 ”,到“ 先做这个吧(好歹也是个真正的小需求) ”,再到“ 都搞到这地步了,先推出去市场看看吧 ”,然后上线迭代了好几个版本,到现在的“ 这个阶段已经不是我一个人可以搞掂了,找投资吧 ”,这大概就是我这10个月来的真实写照。 不得不说,在中国做一个独立开发者不是那么一件容易的事情(甚至可以说很困难),由于熟悉android,我是先做android端app,应用上线就是其中一个卡你的地方(因为你是个人开发者),特别是那些大公司的应用市场,如果你跟我有相似经历一定会懂得“ 豌豆荚 ”的确是比较友好。这里还要感谢“ 友盟umeng ”,是真正为开发者考虑的,提供的东西省了不少开发时间。上线已经如此就更别说上线后做推广,如果你想利用大公司的资源来做,那也是各种卡。 曾经看过一篇文章对我触动很深,引用一下: 当你创业的时候,你会发现:最先相信你的是陌生人,最先鼓励你的是合伙人,最先看不起你的是身边的人,最先不相信你的是亲人,打击你最狠的是你最亲密的人,当你有一天功成名就请客吃饭的时候,你会发现除了最先相信你助你成功的陌生人不在

hibernate 3.6.4 BUG Fix

ⅰ亾dé卋堺 提交于 2021-02-17 10:58:10
http://sourceforge.net/projects/hibernate/files/hibernate3/3.6.4.Final hibernate 3.6.4 BUG Fix http://opensource.atlassian.com/projects/hibernate/secure/ReleaseNote.jspa?projectId=10031&version=11220 来源: oschina 链接: https://my.oschina.net/u/94915/blog/16361

如何写出无法维护的代码

帅比萌擦擦* 提交于 2021-02-17 10:57:54
对,你没看错,本文就是教你怎么写无法维护的代码。 一、程序命名 容易输入的变量名 。 比如:Fred,asdf 单字母的变量名 。比如:a,b,c, x,y,z(如果不够用,可以考虑a1,a2,a3,a4,….) 有创意地拼写错误 。比如:SetPintleOpening, SetPintalClosing。这样可以让人很难搜索代码。 抽象 。比如:ProcessData, DoIt, GetData… 抽象到就跟什么都没说一样。 缩写 。比如:WTF,RTFSC …… (使用拼音缩写也同样给力,比如:BT,TMD,TJJTDS) 随机大写字母 。比如:gEtnuMbER.. 重用命名 。在内嵌的语句块中使用相同的变量名有奇效。 使用重音字母 。比如:int ínt(第二个 ínt不是int) 使用下划线 。比如:_, __, ___。 使用不同的语言 。比如混用英语,德语,或是中文拼音。 使用字符命名 。比如:slash, asterix, comma… 使用无关的单词 。比如:god, superman, iloveu…. 混淆l和1 。字母l和数字1有时候是看不出来的。 二、伪装欺诈 把注释和代码交织在一起。 for(j=0; j < array_len; j + = 8) { total += array[j+0 ]; total += array[j+1 ]; total

实现Vue的双向绑定

久未见 提交于 2021-02-17 10:57:36
一、概述 之前有讲到过 vue实现整体的整体流程 ,讲到过数据的响应式,是通过Object.defineProperity来实现的,当时只是举了一个小小的例子,那么再真正的vue框架里是如何实现数据的双向绑定呢?是如何将vm.data中的属性通过“v-model”和“{{}}”绑定到页面上的呢?下面我们先抛弃vue中DOM渲染的机制,自己来动手实现一双向绑定的demo。 二、实现步骤 1、html部分 根据Vue的语法,定义html需要绑定的DOM,如下代码 2、js部分 由于直接操作DOM是非常损耗性能的,所以这里我们使用DocumentFragment(以下简称为文档片段),由于createDocumentFragment是在内存中创建的一个虚拟节点对象,所以往文档片段里添加DOM节点是不太消耗性能的;此处我们将app下面的节点都劫持到文档片段中,在文档片段中对DOM进行一些操作,然后将文档片段总体重新插入app容器里面去,而且此处插入到app中的节点都是属于文档片段的子孙节点。代码如下: 1 // 劫持DOM节点到DocumentFragment中 2 function nodeToFragment(node) { 3 var flag = document.createDocumentFragment(); 4 while (node.firstChild) { 5