九个例程认识Rust中的引用

2015 年 5 月 26 日

为方便理解,先简述一下Rust中的所有权概念:

一个变量同一时刻只能有一个拥有者。

完整的概念参看Rust Book: https://doc.rust-lang.org/stable/book/ownership.html。

例一

通过引用把变量借给方法,方法结束后,会自动把变量的拥有权归还给主逻辑。

例二

例一之堆版本。

例三

引用没有归还之前,原变量不可使用。否则报错。

例四

例三正确版。
给c一个作用域,超出作用域时c会自动归还b。

例五

例四基础上另一个多次借出的错误示范。

例六

函数是可以返回引用的。

例七

但是返回的引用必须是传入的结构体里的东西。这样可以保证只要传入的变量活着,返回的变量也会一直有效。
因为如果在函数内部声明一个变量,返回它的引用的话,出了这个函数那个变量也被回收了。
像下面这样是不行的。

例八

但是如果传入的变量有两个,编译器就不知道把返回的指针的生命周期和其中哪个绑定了。
于是报错,等我们解决。

例九

例八正确版。
使用“命名生命周期”解决例八的问题,告诉编译器绑定第一个变量。
这里第一次出现了“’a”这个东西,一下就出现了三次。
它就是“命名生命周期”。

出现的这三次可以这样理解:
第一次:声明’a,我这个函数接下来会用到;
第二次:给’a赋值,’a等于第一个参数的生命周期;
第三次:把’a的值赋给返回,返回的引用的声明周期等于’a。
这样就把返回的引用生命周期和第一个传入的参数绑在一起了。

‘a也可以是’b,’c,’d,a-z都可以用的。

改成下面这样就可以运行了。

请这样理解’a:它和var一样也是函数的一个参数,同样是由调用者赋值的。
在这里例子里面,在函数被调用的那一刻(标记A)’a就被foo赋值了。

Tags

DASH标准阅读笔记(一)

2015 年 5 月 6 日

功能上和HLS相比的强处

1、支持inband事件流;
2、切片可以用模块描述,避免轮询索引;

功能上和HLS相比的弱处

1、没有冗余线路的支持;

3个无感切流的实践

1、关键帧;
2、时间上不相互重叠的切片;
3、切片拼装起来后和原始流数据一致(注意时间戳);

关于MPD

1、MPD是XML;
2、MPD支持GZIP压缩;
3、加密和完整性内容保护都不是DASH标准的一部分,但是可以通过XML的W3C标准中相关内容来实现;

数据分层概览

1、Period -> Adaptation Sets -> Representations -> Sub-Representations-> Segments -> Sub-Segments;
2、Adaptation Set、Representation、Segment都可以指定码率、sar等视频相关的属性,按照级别一级一级覆盖,低级优先;

Period

是数据分层中最高的一层,内含一段时间的内容;

先发Period

先发Period是Period的一种,用于表示流的一些信息,类似头信息。
同时满足以下条件的Period就是“先发Period”。
1、直播;
2、不是MPD里的第一片;
3、不包含@start属性;
4、前一片没有@Duration属性;

Adaptation Set

1、是Period的下一级;
2、是Representation的上一级;
3、包含多个可以无感切换的Representation;
4、可以声明下面所有Repersentation的码率总范围;
5、可以声明关键帧是否是对齐的;

Media Content Compontent

1、是Adaptation Set的下一级;
2、如果一个Adaptation Set中只包含一个Media Content Compontent,可以不单独出现这个元素,直接在Adaptation Set的属性中声明;
3、可以指定par、lang、contentType、role、viewpoint等属性;

Representation

1、是Adaptation Set的下一级;
2、是Segment的上一级;
3、时长与Period相同;
4、可以是自启动的,也可以通过指定@dependencyId属性靠依赖启动;
5、直播时的时钟补偿操作在这一层做;
6、Segmentlist属性只能指定一个;
7、要声明自己的@qualituRanking;

Sub-Representations

1、用于音频、字幕、低码率视频;
2、提供同内容的低质量流,比如说只包含声音或者文字的;
3、是包含在Repersentation之中的,而不是与之平级;
4、如果指定了@level,就必须指定@bandwidth;

Subsets

1、是Period的下一级;
2、负责聚集多个Adaptation Set;
3、不可以用一个Subsets聚集所有的Adaptation Sets;
4、主要作用就是聚集Adaptation Sets;

Segments

1、可以指定这个片的“可见时间”,也就是不会404的时间;
2、三种指定Segment Url的方法:
a> 1个SegmentList;
b> 1个SegmentTemplate;
c> 1个SegmentBase加多个BaseUrl;
3、1个representation只包含1个Segment时才用到SegmentBase;
4、1个representation包含多个Segment时用SegmentList或者SegmentTemplate;
5、多个Segment时必须指定@Duration属性或者SegmentTimeline元素其中之一,但不能都指定;
6、SegmentURL支持指定HTTP Range;
7、可以通过SegmentList.href关联远端SegmentList;
8、SegmentTemplate模版使用示例: %05d。printf的格式都支持,还可以关联representation中的@Id和@bandwidth等属性;
9、多个Segment时,以下4项可以帮助定位:
a> URL+HTTP Range;
b> representation中的序号;
c> 开始时间;
d> 时长;
10、模版中$time变量是指之前所有片的@Duration之和;
11、SegmentUrl尝试解析顺序如下:
a> SegmentTemplate + Number;
b> SegmentTemplate + Time;
c> SegmentList;
d> SingleSegment;
12、Segment的“可见时间”可以等于:
a> representation的结束时间;
b> MPD的“可见时间” —— Period.@miniumUpdate属性;

Tags

redis的slave复制过程小窥备忘

2015 年 5 月 1 日

redis.c

1、让我们从redis.c开始,先是一个全局的struct redisServer server;

2、然后main()里面initServerConfig();

3、再然后int serverCron()里面run_with_period(1000) replicationCron()。这就转到了replication.c里面;

replication.c

4、replicationCron()位于replication.c之中。首先执行slaveofCommand()里面做了一堆校验之类的,然后转到replicationSetMaster();

5、replicationSetMaster()里面继续一堆校验,这里第一次把server.repl_state设成了REDIS_REPL_CONNECT。

至此,初始化算是完成了。等待下一次replicationCron()的触发;

6、connectWithMaster()开始连接master,并在此函数内注册了回调的syncWithMaster()方法;

7、syncWithMaster()之中完成身份验证之类,转到slaveTryPartialResynchronization()开始尝试同步数据;

8、slaveTryPartialResynchronization()之中分辨要不要全量复制,如果不是则转到replicationResurrectCachedMaster();

9、replicationResurrectCachedMaster()之中注册回调readQueryFromClient()用以读取同步数据,实际是命令;

networking.c

10、readQueryFromClient()在networking.c之中。一堆校验后调用processInputBuffer()读取数据;

11、processInputBuffer()之中是一个while死循环,循环到buf被读空。每一次循环依靠processCommand()来执行命令,也就是写入数据;

回到redis.c

12、processCommand()在redis.c之中。如果是批量的命令,其依靠queueMultiCommand()来把命令丢到Queue里去慢慢消化。
如果是单条则通过call()来执行;

13、call()的原型是void call(redisClient *c, int flags),依然在redis.c之中。
其中核心的一条是c->cmd->proc(c);

redis.h

14、看一下位于redis.h中的redisClient的定义。

得知c->cmd的定义是redisCommand,还看到了可爱的int argc和robj **argv变量。
感觉接近目标了。

15、redisCommand同样位于redis.h;

搞定

16、所以,我们只需要在redis.c的1933行call()方法内处加上:

就可以看到每一句redis执行的命令了。

17、如果想要解析出全部命令参数,可以照抄aof.c中的catAppendOnlyGenericCommand()。
这样——

18、五一节第一天的任务完成。oy~

Tags

mplayer播放pcm

2015 年 3 月 26 日

Tags

Mac下魔兽世界和风暴英雄适应1920×1200分辨率

2015 年 3 月 8 日

Mac下大部分非标准分辨率都可以这样搞定。

魔兽世界:
defaults write com.blizzard.worldofwarcraft DesktopModeIsDefault 1

风暴英雄:
defaults write com.blizzard.heroesofthestorm DesktopModeIsDefault 1

命令行里执行一下,再进游戏就能看到不变形的的1920×1200分辨率了。

梦醒时分

2015 年 2 月 28 日

胸中愁涟涟,秀手轻抚怜;
惊醒原是梦,今宵又无眠。

流光飞舞

2015 年 2 月 27 日

词曲:黄沾

迎浮生千重变
跟有情人 做快乐事
别问是劫是缘

这,谁做得到??

WordPress去掉google font的引用

2015 年 2 月 26 日

目前所有插件都不靠谱,手动来吧。

我的主题没有用到google font,如果主题使用了google font还要记得把主题里的引用也要去掉。

不信抬头看,苍天饶过谁 —— 《狼图腾》观后感

2015 年 2 月 25 日

  旧时代在慢慢死去,新时代里没有自己的位置。
  曾经无敌的技能慢慢变得一文不值不说,还拦别人前进的道。
  
  你们说,在这样的大环境下。作为一个个体,能怎么办呢?
  
  站在这个时刻的我们,怎样做才是最好?
  挣扎?反抗?屈服?接受?忍耐?
  
  陈阵作为一个有退路没顾忌的家伙,他当然可以养小狼。
  当然他可以抱住所爱,享受那轻轻一吻。
  
  甚至他可以在多年后写一本讲述这段故事的书。
  坐收版税的同时,收获人们的钦佩和道德的认可。
  来自新时代的人儿,无法他做什么,都透着那么轻松写意。
  
  可是心中真有“图腾”的毕利格老人怎么办?他无法突破自己去囚困心中的神。
  可是另外倾慕噶斯迈的藏族小伙子怎么办?他无法允许自己觊觎人别的妻子。
  
  甚至,那美丽而可怜的女人怎么办?那个带着孩子的活在现实里的女人,她怎么办?
  
  对于他们而言。
  心中那些曾经让自己强大的信念,一瞬间全变成绳索。
  依然还是那样强大,捆得自己动弹不得。
  想尝试挣扎一下,立马勒出血印子。
  
  怎么办?
  
  影片安排老人慢慢死去,年轻人光荣战死。
  虽然勾得我眼泪直流,但这大概已经是比较好的结局了。
  
  不然呢?拿枪上山,续集来一部《智取威虎山》?
  
  在文明更迭的最后,别说利益形势,就连道德标准也无法自善其身的。
  不及时战死,就要变成被镇压,被剿灭,被大快人心。连眼泪都骗不到了。
  
  怎么办?
  
  我真想不出答案。
  
  
  只是。
  那新时代来的人儿啊,地方是你的,神是你的,女人。。。你也拿走吧。
  但求你有没有可能慢一会儿,温柔一点,学习一点点技巧。
  没有前戏真的会痛。
  
  你是不是知道,天道好轮回。
  

时光是把杀猪刀,但爱直接割喉 —— 《消失的爱人》观后感

  代入感好强的片子,让我窒息。
  缓过来之后,有个疑问。
  
  Amy为什么不和富翁Neil在一起,最后隐身希腊。
  非要迈出最关键那一步,把自己陷入最后那样无可自拔的结局呢?
  如此坚决的她,到底在追求什么?
  
  她和Nick之间确实有经济问题,但Neil一起不就没这方面问题了么。
  为了她反复提及的安全感?这问题Neil一样可以解决,去希腊开始新的生活啊。
  控制欲?Neil被她操纵了那么多年还不够满足?
  被爱被重视的感觉?Neil给的还不够?
  
  Neil一口气给了她那么多那么多,他说:“只要你要,只要我有。”
  她居然用那么干脆残忍的一刀回答:“这些都不是我想要的!”
  
  说得那么大声。
  
  这个女人到底在追寻什么呢?
  如果此片是在隐喻婚姻的意义,那我们在婚姻关系中追寻的是什么呢?
  
  我想了好久。
  
  ……
  
  “归属感”?
  
  所谓归属感,就是这两个问题的明确答案:
  我属于谁?
  谁属于我?
  
  Neil属于Amy,但Amy不认为自己属于他。
  Amy也许觉得自己属于Nick,但她又感觉不到Nick属于她。
  
  如果女主是在追求这个玩意,那她必将获得苦痛的一生。
  她能力越强,越有力的挣扎,就会给自己越深重的伤痕。
  
  现代社会中,我们把自己的每一面都拿出来交换我们所需。
  把专业献给老板,换取工资。
  把激情献给女人,换取满足。
  
  但是若要说某一个具体的人,而不是他身上的某一个角色或者社会属性,一个完全的人。
  她完全地属于我。
  或者我完全属于她。
  
  这种可能性有没有呢?
  
  我觉得答案不乐观。
  
  电影《成为简·奥斯汀》中奥斯汀为什么和勒弗罗伊分手?他们都已经在私奔的路上了啊。
  因为奥斯汀发现勒弗罗伊有一大笔她不知道的债务。
  所以即使是私奔这么极端的行为,也不能说明她爱上的,不是她爱人的某一个或几个面。
  不能说明是一个“完全的人”爱上了另一个“完全的人”。
  
  一般意义下,私奔即意味着彼此是生命的最重要,重到大于其它一切的总和。
  但即是这样的关系,和相互归属的关系依然相去有日。
  勒弗罗伊的债务意味她要放弃“自由写作”的那部分自己。
  
  “我做不到,我又不属于你。”
  对吧?
  
  可谁能让自己完全地属于另一个人呢?
  如果没人可以做到,那谁又能得到一个这样的人呢?
  
  对于追寻不存在的东西的下场结局,庄子比开箱刀还利——
  
  “殆已。”