Glyme's Notes

just Google it


  • 首页

  • 分类

  • 归档

  • 标签

Unix Network Programming 2

发表于 2017-05-16   |   分类于 technology   |  
卷二对Unix各种进程间通信(IPC)方法做了介绍。 IPC方法主要有(这里只列出POSIX IPC): 管道&FIFO(有名管道) 消息队列 锁与条件变量 信号量 共享内存 其中POSIX消息队列实际运用很少,就不在这里讲解了。 IPC的持续性将IPC的持续性分为3种: 随进程,如管道、非共享内存区互斥锁和条件变量 随内核,如有名信号量、共享内存 随文件 管道&FIFO管道适合进程进行少量数据的传递。 使用pipe函数创建管道,然后使用fork复制进程,子进程/父进程关闭读/写管道,最后使用write/read进行数据读写。 FIFO是有名管道,可用于无亲缘关系的进程之间进行通信。 如果write大小小雨PIPE_BUF,则write操作具有原子性。 锁和条件变量锁用来控制临界区访问,而条件变量用于等待条件。 条件变量在获取锁后,使用pthread_cond_wait会释放锁并等待条件满足时被唤醒。 为了防止虚假唤醒,条件变量被唤醒时需要监测条件是否满足123while (!is_condition_satisfied) { pthread_cond_wait(&cond, &mutex);} 线程取消带来的死锁问题pthread_cond_wait是线程取消点(cancellation point)。在阻塞在pt ...
阅读全文 »

Unix Network Programming 1

发表于 2017-05-15   |   分类于 technology   |  
卷一主要以TCP echo服务为例,对UNIX网络socket编程做了讲解。 基本TCP socket编程使用socket, connect, bind, listen, accpet, fork, exec, close等基本函数搭建一个并发服务器。 然后讨论了多种异常情况,包括: accept返回前终止 服务器进程终止服务器会向客户TCP发送FIN,客户在socket会读取到EOF 服务器崩溃这时服务器不会发送FIN,客户TCP会不断尝试重传直到超时。可以使用SO_KEEPALIVE和超时机制探测服务器状态 服务器崩溃后重启客户TCP向服务器发送数据时,服务器由于不存在这个TCP连接,会向客户发送RST IO复用讲解了select和poll函数实现IO复用 套接字选项重点选项: SO_REUSEADDR所有服务器套接字都应该使用这个选项,用以部分解决TIME_WAIT的问题 SO_LINGER用以决定close后缓冲区中残留数据的处理方式。l-onoff设为非0,且l_linger为0时,close将导致缓冲区中的数据被扔到并向对端发送RST,也可以避免TIME_WAIT SO_KEEPALIVETCP保活机制 基本UDP socket编程UDP编程与TCP编程类似,但是由于UDP没有状态,不需要建立连接。 对UDP而言,可以直接使用recvfrom和se ...
阅读全文 »

基于粒子滤波器的目标跟踪器

发表于 2016-12-15   |  
毕设准备做一些目标跟踪检测相关的事情,要点是使用概率计算方法实现,因此打算先研究研究常见的跟踪检测算法,然后看看哪些算法适合概率计算方法。 跟踪方法的分类跟踪方法一般分为两类,分别是:top-down,bottom-up。 top-down,这种方法根据模型生成目标在当前帧的位置的假设,然后通过当前帧图像去验证这种假设。粒子滤波就属于这类方法。 bottom-up,这种方法把当前帧进行分割,然后尝试搜索物体的位置。Mean-shift算法就属于这类方法。 粒子滤波器粒子滤波器是一种SIS(Sequencial Importance Sampling)方法。具体作用就是在Markov Chain上进行推导和预测,plusikid大神的这篇漫谈 HMM:Kalman/Particle Filtering对Particle Filter进行了详细的讲解和推导。 我这里用通俗的话来讲一讲粒子滤波器是干嘛用的。就拿漫谈 HMM:Forward-Backward Algorithm中的火星车来举例。 首先第一步,火星车的位置(隐藏状态)为$S_0=(x,y)$,粒子滤波器根据初始状态生成一大堆的particles(每一个权重是状态和权重组成的二元组),$$S\_samples=(s_0^{(0)},s_0^{(1)}…s_0^{(n)}), w=(w_0^{(0)},w_0^{(1)}…w_0 ...
阅读全文 »

XPOSED初探——Android去广告

发表于 2016-11-12   |  
最近学习了一下XPOSED框架,入门参照了这系列博文 [Android 开发] Xposed 插件开发。 总结起来,XPOSED框架首先搭建好环境,包括引用xposedjar包,创立入口点xposed_init文件。 我所要去除的广告是应用的首屏广告。很多应用不会直接进入主界面,而是先显示一个过渡界面,这个过渡界面一般被称为SplashActivity。这是因为有的应用在第一次启动时,需要加载的资源比较多,如果不使用过渡界面,在加载资源的这段时间手机会黑屏,用户体验较差,使用过渡界面就可以解决这个问题。过渡界面一般用来显示应用Logo和提示加载资源的进度,但是很多应用机wu智chi的滥用这个技术,把过渡界面用来展示广告,而且还要显示好几秒,远远大于实际加载资源所需要的时间。 使用XPOSED这个神器可以去除这种首屏广告。XPOSED不同于普通的Android应用,它只是一个框架,不提供具体的应用,而开发者则可以使用它提供的API编写模块实现具体的功能。XPOSED的功能十分强大,它可以Hook任意的Java函数,提供类似AOP的功能。 具体的编写方法这里就略过,只讲思路。要跳过广告,就是跳过广告的Activity直接进入真正内容的Activity,使用XPOSED Hook住广告Activity的onStart方法,在onStart之前进行切入,启动主Activity并finish ...
阅读全文 »

Android玩机——解决流氓软件的耗电问题

发表于 2016-11-04   |   分类于 life   |  
自从从iPhone换回Android以后,每天都在和流氓软件作斗争。源自于iPhone的使用习惯,我喜欢下一大堆软件,使用之后也懒得打开多任务管理杀进程,而是直接按Home键返回桌面。 这样,我的手机电量是飞流直下三千尺。终于在一天外出时,某地图软件在我关屏后依然疯狂耗电,硬是半个小时之内把我的电量从60%耗到30%。这下我终于忍无可忍下定决心要狠制这些流氓。 以下是今天学习的总结。 耗电原因: 应用长时间运行。某些流氓明明都没它啥事了,它还一个劲的在后台运行。 相互唤醒。流氓软件自己运行也就算了,它还要唤醒一大堆的家族流氓一起来搞事。 滥用唤醒锁、Alarm。Android在系统空闲时会让CPU进入睡眠状态,睡眠状态耗电量极小。而滥用唤醒锁将会导致CPU无法进入睡眠,因此电就掉的很快。Alarm也是Android提供的一种机制,定期唤醒设备做一些操作,但总有一些操蛋的应用一分钟要申请好几十个Alarm。 大杀器列表: 绿色守护,老牌软件,配合Android 6.0的休眠体验很棒。能够在保留应用缓存的情况下(下次可以直接恢复到应用之前的状态),阻止应用做一些耗电的任务,比如网络操作等等,因此微信QQ这些通讯类的软件最好不要绿色化。使用也十分简单,把流氓扔进绿色化列表就可以了。解决长时间运行和部分唤醒 阻止运行。一大神器,返回键退出应用后杀死应用,6.0也可以退出后休眠 ...
阅读全文 »

记录C++的一个调试过程

发表于 2016-10-07   |   分类于 technology   |  
记录C++的一个调试过程Pass-By-Value使用scala编写的斗鱼弹幕监控系统运行良好,但是java的内存消耗比较大,我的小破VPS有点承受不住。于是打算使用c++重写,但在过程中却遇到了一个bug,我调试一天的时间才解决。虽然这个bug非常的愚蠢,但是不常使用c++的人可能比较容易犯而且很难找到问题出在哪,特此记录。 我使用了一个unordered_map<int, byte_buffer>保存房间的缓冲(key为socket file descriptor),缓冲byte_buffer是我仿照java的ByteBuffer写的一个类,具有flip,compact等功能。 在使用epoll循环处理消息的过程中,首先根据socket file descriptor获取对应的缓冲,然后使用recv将数据读取到缓冲中,循环处理收到的消息直到当前缓冲中的数据不够,最后使用compact方法清除已处理的数据并为下一次接收数据做准备。 整个程序流程和我用scala写的一样,但是总是会出现错误。根据斗鱼的协议,每条消息的前4个byte应该是消息长度,但是我处理时消息长度有时候明显不对,比如为负数或一个超大的数。 通过分析,艰苦的分析后发现,错误只会在接收到ranklist消息后发生,ranklist消息发送长度比较长,大于mss会分段。通过gdb调试,我发现发生错误时,by ...
阅读全文 »

基于统计模型纠正Anki_GRE词典的分词错误

发表于 2016-09-24   |   分类于 science   |  
在Anki软件中,使用的极品GRE卡牌组中的单词解释不知道怎么回事,单词经常被莫名其妙的断开。 比如limp and flabby被写成了li mp and flabb y,读起来很不爽。于是想通过程序自动纠正这种错误。 方案1一开始想到了一个很naive的方法:首先建立一个词典,然后每次读入一个词(空格分开)判断一下该词是否存在于词典中,如果不存在,判断该词与下一个词的组合是否在词典中,如果在,就把这两个词组合在一起并保存。 比如flabb不存在于词典,而flabby存在于词典,这样就能把这个错误纠正。 但是也有很多情况,即使一个单词被错误的分成了两个部分,但这两个部分依然是正确的单词。比如li和mp都存在于词典中,这样的方法就不能纠正这样的错误。 这是因为这个方案实在是too naive了,完全没有利用到上下文的关系。 方案2使用google的API,google会提供搜索建议,比如搜索li mp and flabb y,google会返回提示你是否要查询的是limp and flabby。 google搜索虽然功能很强大,但是由于众所周知的原因,最后没有采用。 方案3参考了数学之美和Beautiful Data中的分词方法,实际上就是比较$P(a_1,a_2,…,a_n)$与$P(b_1,b_2,…,b_n)$,其中$a_i,b_i$为两种分词方法第$i$个单词。 使用2阶模 ...
阅读全文 »

让Chrome打印适应Kindle大小的PDF

发表于 2016-09-24   |   分类于 technology   |  
最近发现一本深度学习的好书 Neural Networks and Deep Learning,想保存下载在Kindle上面阅读。 但是书中包含大量由MathJAX渲染的公式,无论是直接保存html或是另存为word,在Kindle上的阅读体验都比较糟糕。只有pdf格式才能完美的显示公式,于是想到使用chrome将网页保存为pdf格式。 首先使用开发者工具删掉网页中多余的元素,只保留书本内容,然后使用chrome的打印pdf功能将网页保存为pdf格式。 但chrome只能打印A4,A3等几种大小的pdf,这些大小在kindle上阅读体验也不好。 最适合kindle pw1的大小是 85mmx114mm。通过在CSS样式表里添加代码控制chrome打印pdf的大小,123@media print{ @page { size:85mm 114mm; margin-left: 2mm; margin-right: 2mm }} 然后打印、保存、上传到Kindle上,效果就很棒啦。
阅读全文 »

Scala练手——斗鱼弹幕监控

发表于 2016-09-19   |   分类于 technology   |  
Scala练手——斗鱼弹幕监控Why最近在学习hadoop, spark, kafka, zookeeper等大数据处理框架,也就顺带学习了一下scala这门编程语言,以阅读spark的源代码(spark核心使用scala编写)。没想到scala越学越上瘾,越来越喜欢函数式编程了。 在这里以斗鱼弹幕监控为课题,使用scala编写了一个斗鱼弹幕获取、分析的小程序练练手,在这里记录一下遇到的问题以及解决方案。 斗鱼API斗鱼API使用时,需要与斗鱼服务器建立TCP长连接,使用心跳包维护连接,每一个连接对应一个斗鱼房间。当有消息时,斗鱼服务器会通过连接将消息推送过来。消息为Key-Value的格式,使用斗鱼自定义的序列化方法进行序列化,在客户端需要自行反序列化。 需要注意的是,斗鱼服务器限制连接个数,连接超出一定个数(我测试的是150)时,连接会被重置(RST)。 程序实现程序需要实现以下功能: 获取斗鱼房间列表,为每一个房间创建TCP长连接 监听每一个TCP连接,有消息时接收消息并打印 通过心跳包维护TCP连接 BiMap程序需要保存建立的长连接的信息,包括Socket和房间ID(room_id)的对应关系。由于Socket与房间ID一一对应,需要从Socket查房间ID,也需要从房间ID反查Socket,因此需要一个双向Map结构(BiMap)。 这里使用了两个Concurren ...
阅读全文 »

关于网络编程中 MTU、TCP、UDP 优化配置的一些总结

发表于 2016-09-13   |   分类于 technology   |  
首先要看 TCP/IP 协议,涉及到四层:链路层,网络层,传输层,应用层。   其中以太网(Ethernet)的数据帧在链路层   IP 包在网络层   TCP 或 UDP 包在传输层   TCP 或 UDP 中的数据(Data) 在应用层   它们的关系是 数据帧{IP 包{TCP 或 UDP 包{Data}}}   ———————————————————————————在应用程序中我们用到的 Data 的长度最大是多少,直接取决于底层的限制。   我们从下到上分析一下:   1. 在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的 18 是数据帧的头和尾,也就是说数据帧的内容最大为 1500(不包括帧头和帧尾),即 MTU(Maximum Transmission Unit)为 1500;  2. 在网络层,因为 IP 包的首部要占用 20 字节,所以这的 MTU 为 1500-20=1480; 3. 在传输层,对于 UDP 包的首部要占用 8 字节,所以这的 MTU 为 1480-8=1472;   所以,在应用层,你的 Data 最大长度为 1472。 (当我们的 UDP 包中的数据多于 MTU(1472) 时,发送方的 IP 层需要分片 fragmentation 进行传输,而在接收方 IP 层则需要进行数据报重 ...
阅读全文 »
123
Glyme

Glyme

记录我的学习、生活点滴

21 日志
3 分类
17 标签
© 2017 Glyme
由 Hexo 强力驱动
主题 - NexT.Pisces