首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

《Effective-Ruby》读书笔记

这是因为每个迭代后,reduce 丢弃上次迭代的累加器保留了块的返回值作为的累加器 def sum (enum) enum.reduce(0) do |accumulator, element...::new 一个块,当需要默认值时这个块就会被调用,友好地返回一个新创建的数组: irb> h = Hash.new{[]} irb> h[:weekdays] = h[:weekdays] h.keys ---> [:weekdays, :holidays] # 你可能发现上面这样的技巧存在着重要的不足:每当访问不存在的键时,块不仅会在哈希中创建实体,同时还会创建一个的数组...接着,任何未在第一阶段标记过的对象会被视为垃圾被清楚,之后将内存释放回 Ruby 或操作系统。 遍历整个对象图标记可访问对象的开销太大。Ruby 2.1 通过的分代式垃圾收集器对性能进行了优化。...每当 Ruby创建一个对象时,它可能尝试触发一次懒惰清除阶段,去释放一些空间。为了更好的理解这一点,我们需要看看垃圾收集器如何管理存储对象的内存。

4K60

对SHA-256感到好奇?这个项目教你如何可视化哈希函数的工作原理

# simple ruby sha256.rb abc # hash binary or hex data by using `0b` or `0x` prefixes ruby sha256.rb...合并多个 bit 时通过多次 XOR 运算进行,同时获得多个 bit 的“平衡表示”(balanced representation)。 加法 (add.rb) ?...函数 将上述运算组合起来,就可以创建函数。 前四个函数使用希腊符号 Sigma 命名(小写σ和大写Σ)。 σ0 (sigma0.rb) ?...对于消息调度中的每个词,我们都使用 “状态寄存器” 中的当前值来计算两个的临时词(设为 T_1 和 T_2)。 ? Temporary Word 1 (t1.rb) ?...计算了两个临时词之后,将状态寄存器中的值移至下一个位置,更新寄存器: 状态寄存器中的第一个值变为 T_1 + T_2,同时状态寄存器中的第五个值已添加了 T_1。

1.2K20

5.3 分布式 Git - 维护项目

-b 选项: $ git checkout -b sc/ruby_client master 现在你已经准备好将别人贡献的工作加入到这个特性分支,考虑是否将其合并到长期分支中去了。...现在你可以删除这个特性分支,丢弃不想拉入的提交。 Rerere 如果你进行大量的合并或变基,或维护一个长期的特性分支,Git 提供的一个叫做“rerere”的功能会有一些帮助。...为发布打标签 当你决定进行一次发布时,你可能想要留下一个标签,这样之后的任何一个提交点都可以重新创建该发布。 你 Git 基础 中已经了解了创建标签的过程。...git hash-object 来直接将 key 导入到 Git 的数据库中,git hash-object 命令会向 Git 中写入一个包含其内容的 blob 对象,并向你返回该 blob 对象的...既然 Git 中已经包含你的 key 的内容了,你就可以通过指定由 hash-object 命令给出的 SHA-1 值来创建一个直接指向它的标签: $ git tag -a maintainer-pgp-pub

56820

一文读懂以太坊存储数据核心数据结构:MPT

从上图中可以看出: 最底层,和哈希列表一样,我们把数据分成小的数据块,有相应地哈希和它对应; 往上走,并不是直接去运算根哈希,而是把相邻的两个哈希合并成一个字符串,然后运算这个字符串的哈希,这样每两个哈希就结婚生子...如果最底层的哈希总数是单数,那到最后必然出现一个单身哈希,这种情况就直接对它进行哈希运算,所以也能得到它的子哈希再往上推,依然是一样的方式,可以得到数目更少的一级哈希; 最终必然形成一棵倒挂的树,到了树根的这个位置...下载后,合并文件之前先对比小文件的Hash是否一样,如果一样就认为是可靠的,如果不一样,就判定文件被损坏,从新的来源重新下载。...文件合并之后,计算小数据块的 Hash 最终计算根 Hash,也成为 Merkle Root,然后对比根 Hash 是否一致。...根据第三个规则,添加一个全0的补在后面,那么就是20.根据第三个规则内容压缩合并,那么结果就是[0x20 0x62 0x6f 0x62] 官方有一个详细的结构的示例: 怎么样,看了这篇文章,对MPT和树状结构有基本的了解了吗

3K72

GitLab 任意文件读取漏洞 (CVE-2016-9086) 和任意用户 token 泄露漏洞

2.服务器根据Project.json文件创建一个的项目,并将对应的项目文件拷贝到服务器上对应的位置。...这样,读取VERSION文件的时候服务器就会根据软链接读取到/etc/passwd的第一行内容赋值给version。...访问之前搭建好的GitLab服务器,创建一个的项目,填写完项目名称后Import project from一栏中选择GitLab export,上传我们修改后的导入包,然后就可以看到/etc/passwd...任意用户authentication_token泄露漏洞 复现步骤为: 1.注册一个普通用户,创建一个的项目 2.项目的member选项中,添加管理员到项目中。 ?...为了重现这种情况,我们本地新建一个的项目去通过authentication_token和GitLab api来修改项目文件。

2.5K70

Redis集群搭建

首先创建redis-cluster文件夹,该文件夹下分别创建7001、7002、7003、7004、7005、7006文件夹,用来存放我的Redis配置文件,如下: ?...接下来我们就可以进行集群的创建了,首先将redis/src目录下的redis-trib.rb文件拷贝到redis-cluster目录下,然后redis-cluster目录下执行如下命令: ....注意创建过程的日志,每个redis都获得了一个编号,同时日志也说明了哪些实例做主机,哪些实例做从机,每个从机的主机是谁,每个主机所分配到的hash槽范围等等。...添加主节点 首先我们准备一个端口为7007的主节点启动,准备方式和前面步骤一样,启动成功后,通过如下命令添加主节点: ..../redis-trib.rb reshard 127.0.0.1:7001 后面的地址为任意一个节点地址,分配的过程中,我们一共要输入如下几个参数: 1.一共要划分多少个hash槽出来?

96211

PHP如何使用Redis

存储key中的列表里指定范围的元素, // 第一个参数是列表名 // 第二个参数是起始位下标, // 第三个是结束位下标(包含结束位元素)。...// $redis->hset('hash表', key, value); // 如果hash表不存在,创建一个该hash表,如果不存在该key则设置成功,返回true, // 如果存在,则替换掉原来的值...如果表中不存在该key,则自动添加该key,设置值为自增幅度 $redis->hincrbyfloat('hashtest', '2', 1.5); // hash表中key自增 获取...// 第一个参数是set集合名 // 第二个参数是往该集合插入值,即:往value中插入值 $redis->sadd('settest', 'a'); // 1 $redis->sadd('settest...// 执行zadd时,如果不存在,则创建一个的有序集合; // 如果ztest存在但不是有序集类型时,返回一个错误。

93431

实现自己的Vue Router -- Vue Router原理解析

获取对应的组件 6. render组件 Vue-Router的路由模式有两种:hash和history,这两种模式的监听方法不一样 监听url改变事件 hash模式的值可以通过location.hash...Vue插件 使用Vue-Router之前我们都会调用下Vue.use,那Vue.use方法究竟是干嘛的呢?...我们要实现路由插件功能的关键是使用vue.mixinAPI,这个API可以将一些变量和方法全局混入Vue的实例,下面我们混入一个测试数据,渲染到跟路由上: pluginA.install = function...1. warn: 抛出警告 2. extend:类似于Object.assign,一层拷贝,Object.assign有兼容问题,这个方法是一个for...in循环 3. mergeOptions:合并选项...$options.router; // 监听current, defineReactive(obj, key, val)不传第三个参数,第三个参数默认是obj[key]

60941

自己实现一个Vue Router -- Vue Router原理解析

获取对应的组件 6. render组件 Vue-Router的路由模式有两种:hash和history,这两种模式的监听方法不一样 监听url改变事件 hash模式的值可以通过location.hash...Vue插件 使用Vue-Router之前我们都会调用下Vue.use,那Vue.use方法究竟是干嘛的呢?...vue) { console.log(vue); } 我们要实现路由插件功能的关键是使用vue.mixinAPI,这个API可以将一些变量和方法全局混入Vue的实例,下面我们混入一个测试数据,渲染到跟路由上...1. warn: 抛出警告 2. extend:类似于Object.assign,一层拷贝,Object.assign有兼容问题,这个方法是一个for...in循环 3. mergeOptions:合并选项...$options.router; // 监听current, defineReactive(obj, key, val)不传第三个参数,第三个参数默认是obj[key]

27640

redis应用场景

Redis还为集合提供了求交集、集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个的集合中。...实现方式: set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否集合内的原因。...使用场景: 交集,集,差集:(Set) //book表存储book名称 set book:1:name ”The Ruby Programming Language” set book:2:...name ”Ruby on rail” set book:3:name ”Programming Erlang” //tag表使用集合来存储数据,因为集合擅长求交集、集 sadd...”Ruby on rail” set book:3:name ”Programming Erlang”//tag表使用集合来存储数据,因为集合擅长求交集、集sadd tag:ruby 1sadd

74710

Redis特性和应用场景

批量获取 mget key1 key2 key3 //没有设置则返回空 incr 对key的值做增加操作,返回的值 +1 incrby 对可以的value加指定的值, key如果不存在会设置key...它和java的HashMap完全类似 方法 说明 特性 hset 设置一个hash 的field为指定值,如果key不存在则先创建 hset tab ke1 val1 hget 获取某个hash的某个field...Zset类型 它是set的一个升级版本,set的基础上增加了顺序,这一属性添加修改元素时可以指定,每次指定后,zset会自动按的值调整顺序。...无论是第一次同步建立的连接还是连接断开后的重新连接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集的写命令缓存起来。...”Ruby on rail” set book:3:name     ”Programming Erlang” //tag表使用集合来存储数据,因为集合擅长求交集、集 sadd tag:ruby 1

1.3K70
领券