利用Kafka发送/消费消息-Java示例 利用Kafka发送/消费消息-Java示例当使用命令行工具把基本的组件运行起来后,再使用Java client就很简单,这里是入门的第一个Java客户端程序,有很多需要深入理解的地方。依赖配置 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.11</
Kafka安装(windows) Kafka 简介是一个分布式消息队列,高吞吐量,使用Scala实现。安装1.安装JDK2.下载zookeeper和kafka,解压到某个目录下面,比如我的是 D:\dev3.修改zookeeper的配置文件,位于D:\dev\zookeeper-3.4.8\conf,把zoo_sample.cfg重命名为zoo.cfg,修改里面的存储目录dataDir和端口号。 # the directory wh
DispatcherServlet 源码阅读(1) 有时间还是应该多看看源码。DispatcherServlet 是一个实实在在的 Servlet,所以 Spring MVC 引入后不会改变 Servlet 容器的行为,仍然是解析 web.xml 部署文件,只需要在里面配置这个 Servlet 即可。 比如下面配置 dispatcher Servlet 处理所有的请求,也体现了 DispatcherServlet 是前端控制器(Front Cont
matplotlib中画图显示中文,但保存为图片后中文乱码 matplotlib中画图显示中文,但保存为图片后中文乱码这两天赶毕设论文的测试,使用matplotlib画图,首先解决图片预览的中文显示,很简单:import numpy as npimport matplotlib.pyplot as pltimport matplotlib# 设置显示中文matplotlib.rcParams['font.sans-serif'] = ['SemiH
一个奇怪BUG的记录(未根本解决) 一个奇怪BUG的记录(未根本解决).md基本逻辑:将文件夹下面的所有文件路径名,提取到一个configfile文件中,然后按行读取处理。代码: 问题:对于bash数据集没有问题,但是对于redis数据集(文件比bash少)出现segmentfault,使用gdb定位到是内存释放时候的错误(损坏了内存管理结构?)。 使用valgrind没有错误。 后来想到是否和权限有关?但是检查了打开文件时候的
POX设置packet-in的miss_send_len POX设置packet-in的miss_send_len在of_01.py中可以看到交换机和Controller建立连接时的信息流交互,互问hello,然后得到Switch的feature信息,而后Controller可以发送ofp_switch_cofig消息配置交换机,这个消息很简单,就是我们需要的 miss_send_len。POX中处理来自交换机的ofp_switch_features消息的
在POX中操作数据包 在POX中操作数据包标签(空格分隔): 博客 SDN想在SDN控制器中做点事情,必须要能够解析上来的packet,在POX中利用pox.lib.packet中的组件很方便,重点是熟悉各个协议的字段。POX文档 POX Wiki 相对比较完善,值得好好看看。各个协议类继承了packet_base, 里面的find 方法很实用,在解析packet的时候, find(‘protocol’)就会解析得到对应
得到文件某行的偏移量(get byte offset of a line) 得到文件某行的偏移量(get byte offset of a line)场景:通过对文件的一趟处理,把每行的offset得到。现有的文件系统不能直接定位到某一行,如果你知道行号,也只能一行行的读下去,找到你想要的line。但是当文件很大的时候,就需要一定的预处理,保存行的offset,后续的处理可以根据offset直接定位到具体的line,无疑这会提高速度。所以需要实现:line到byte off
生成1000万行7位数字文件(编程珠玑) 生成1000万行7位数字文件(编程珠玑)今天看《编程珠玑》排序的问题,输入是一个千行文件,每行是7位数字,并且无重复。搜索了下,没有现成的数据集,所以简单用python生成了下,虽然简单! 思路:顺序生成,然后shuffle。#!/usr/bin/pythonf = open("numbers.txt", "w");for i in range(0, 9999999): s = str(
利用pipe实现兄弟进程之间的通信 利用pipe实现兄弟进程之间的通信进程A创建2个子进程B,C。然后B C执行的程序利用pipe来通信:ls的输出通过管道到达另一个进程用wc统计单词数,字节数,行数。execve系统调用用于执行指定的程序,其他的exec系列函数都是基于它。APUE-188 int execve(const char *filename, char *const argv[],char *const envp[
Bootstrap 字体图标,下拉列表组件的使用 Bootstrap 字体图标,下拉列表组件的使用Glyphicons 字体图标通过代码可以看到图标类的使用方法,图标类不能和其它组件直接联合使用,图标类只能应用在不包含任何文本内容或子元素的元素上。所以一般在Button的text前面搞一个span标签,用来渲染图标。aria-label:有的图标可以没有文本,此时可以在代码中通过aria-label这个属性来表明图标的含义,比如这里的“左对齐”
jQuery改变label/input的值,改变class,改变img的src jQuery改变label/input的值,改变class,改变img的src jQuery改变label的值:$('#aID').text("New Value");jQuery改变input的值:$('#aID').val("New Value");jQuery改变class属性:$('#aID').attr('class', "newClass");//设置class$('#aID')
RocketMQ 刷盘实现 RocketMQ 刷盘实现标签(空格分隔): RocketMQBroker 在收到Producer发送过来的消息后,会存入CommitLog对应的内存映射区中,见CommitLog类的putMessage方法。该方法执行OK后,会判断存储配置中刷盘模式:同步or异步?继而进行对应的操作。 ServiceThread –> FlushCommitLogService –> GroupCommit
RocketMQ 源码分析 RocketMQ 源码分析RocketMQ 的设计思想来自于Kafka,在具体设计时体现了自己的选择和需求,具体差别可以看RocketMQ与Kafka对比(18项差异)。接下来记录下自己阅读源码的一些探索。RocketMQ的整体架构如下,可以看到各个组件充当的角色,Name Server 负责维护一些全局的路由信息:当前有哪些broker,每个Topic在哪个broker上等; Broker具体处
The constructor ClassPathXmlApplicationContext(String) refers to the missing type The constructor ClassPathXmlApplicationContext(String) refers to the missing type首次学习Spring Framework,通过Maven加入如下依赖: <dependency> <groupId>junit</groupId> <artifactId>junit</
SIFT,SURF,ORB,FAST,BRISK 特征提取算法比较 SIFT,SURF,ORB,FAST 特征提取算法比较图像处理的基础就是要进行特征点的提取,feature(interest points) detect 的方法也在不断的进步,边检测,角点检测,直线检测,圆检测,SIFT特征点检测,同时描述符也在发展,为了匹配的高效,逐渐从高维特征向量到二进制向量…下面做一个简单的罗列,并调用opencv API看看效果! 承接上一篇文章。Feature Det
OpenCV4Android 选择图片并提取特征点 OpenCV4Android 选择图片并提取特征点这一部分,主要是关于UI设计。v0.4自定义Button style从Gallery中选择图片运行效果: 代码 GitHub参考: 50 Awesome & useful Android custom button style pick image from gallery
OpenCV4Android 提取特征点描述符(Feature Descriptor) OpenCV4Android 提取特征点描述符(Feature Descriptor)在得到keypoints之后(参考前面),通过使用相应的FeatureDescriptor就可计算得到关键点处的描述子。Native Code:JNIEXPORT void JNICALL Java_com_example_test_NativeUtil_computeDescripors( JNI
OpenCV4Android 特征点提取演示 OpenCV4Android 特征点提取演示前面通过两天的时间,也只是熟悉了基本的环境搭建,明确了基本的部件流程,接下来需要熟悉API,进行实际的应用编程。本篇尝试获取图片的SIFT特征点,并学习相应的API及图像处理基本知识。目标: - 定义Native method 接口 - Bitmap 和 opencv Mat 之间的转换 - 通过org.opencv.core.Mat.getN
OpenCV for Android 使用(Linux) OpenCV for Android 使用(Linux)根据OpenCV4Android的文档一步步往下走。导入这些项目后,出现如下的构建问题: * Build of configuration Default for project OpenCV Tutorial 2 - Mixed Processing * /ndk-build.cmd Cannot run program “
appcompat_v7\res\values-v21\themes_base.xml:191: error: Error: No resource found that matches the gi appcompat_v7\res\values-v21\themes_base.xml:191: error: Error: No resource found that matches the given name: attr ‘android:XXX’创建Android项目时,ADT会自动的创建一个名为appcompat_v7的 Support Library 项目,然后你会看到values21
SIFT,SURF,ORB,FAST 特征提取算法比较 SIFT,SURF,ORB,FAST 特征提取算法比较主要的特征检测方法有以下几种,在一般的图像处理库中(如opencv, VLFeat, Boofcv等)都会实现。FAST ,Machine Learning for High-speed Corner Detection, 2006SIFT,Distinctive Image Features from Scale-Invariant Key
Tomcat部署项目时出错java.lang.IllegalStateException: ContainerBase.addChild: start:org.apache.catalina.Life Tomcat部署项目时出错java.lang.IllegalStateException: ContainerBase.addChild: start:org.apache.catalina.LifecycleException: Failed to start component[StandardEngine[Catalina].StandardHost[localhost].StandardCo
Maven实战(1) Maven实战(1)本文的目的: 了解Maven构建工具的基本思想 maven的基本命令 maven-shade-plugin的作用 如何在Eclipse中使用 安装maven,新建helloworld作为示例;注意groupId,artifactId代表的含义;clean, compile, test, package, install 命令。这样运行mvn pack
《Unix编程艺术》读书笔记(1) 《Unix编程艺术》读书笔记(1)这两天开始阅读该书,下面是自己的体会,以及原文的摘录,虽然有些东西还无法完全吃透。写优雅的代码来提高软件系统的透明性:(P134) Elegance is a combination of power and simplicity. Elegant code does much with little. Elegant code is not only corr
程序间协作方式-shell out 程序间协作方式-shell outshell out这个名词虽然没怎么听说,但是说不定在默默的使用,说白了就是通过一个程序通过命令的形式调用另一个程序,即system(2)系统调用。其中存在的交互(或者称为协议)很简单,一个执行完了,接着另一个再执行,不会有通信过程,最多有调用程序向被调用程序传递参数。 这种模式的变形,就是C库函数popen()和pclose(),我们可以把popen这种机制看做
Linux setuid 实践 Linux setuid 实践之前接触过setuid,但是没有深入思考,今天读《Unix编程艺术》,觉得瞬间为这种设计所折服,所以总结一下。一般在设计系统时,为了安全,总是试图使用最小权限模型,除非迫不得已需要特权来访问系统,否则不该信任用户代码。Unix中访问控制是基于用户和组的,所以setuid/setgid正是为了给当前进程设置用户/组ID,从而赋予相应的权限。 Under Unix, p
python-igraph 小试牛刀 1.首先明确igraph能做什么,为何使用。2.安装。3.测试。Installing collected packages: python-igraphRunning setup.py install for python-igraphSuccessf
Linux下优雅的让程序后台运行 Linux下优雅的让程序后台运行 假设在终端上启动运行了一个程序,跑了几天,如果不小心把terminal关了,那么程序就会终止,这是SIGHUP信号的原因,即使通过bg置为后台运行同样会如此,应该让程序成为一个daemon,步骤如下:1.Ctrl+z 暂停程序的运行,可以看到程序的作业号,假设为1;2.bg %1 置为后台运行;3. disown -h %1 使其不受
Java操作密钥库入门 Java操作密钥库入门1.用Java keytool这个密钥和证书管理工具,创建一个密钥并存入.keystore文件中,如下图,默认会存在一个别名为"mykey"的条目,也可以自己创建。2.创建KeyStore实例,从.keystore文件中加密密钥库,而后通过别名来获取对应的条目,一定要制定正确的密码。public class KeyStoreTest { public s
OpenCV入门 - 调整图片尺寸 OpenCV入门 - 调整图片尺寸(image resize) 通过Mat::size()方法得到关于图像大小的Size实例,通过resize方法调整图像大小。代码如下:#include #include #include //#include // resize()#include using namespace cv;using namespace st
OpenCV入门 - 关键点描述子匹配Flann-based OpenCV入门 - 关键点描述子匹配Flann-based 和前面利用暴力法找距离最近的descriptor,Flann-based matcher使用快速近似最近邻搜索算法,在匹配前可以利用图片训练该matcher,从而加快检测速度(TODO). What is it Flann? FLANN is a library for performing fast appro
OpenCV入门 - 关键点描述子匹配Brute-force OpenCV入门 - 关键点描述子匹配Brute-force对图片提取特征向量之后进行keypoint descriptors matching,从而可以判断特定图像与训练集中图片的匹配程度,BFMatcher暴力匹配类继承自抽象类DescriptorMatcher,"Brute-force descriptor matcher. For each descriptor in the
OpenCV入门 - 提取SIFT特征向量 OpenCV入门 - 提取SIFT特征向量 为了确保旋转不变性,会以关键点为中心,以关键点的方向建立坐标轴,不是单独考察单一的这个关键点,而是需要一个邻域。邻域中每个小格的方向代表该像素的梯度方向,长度是梯度模大小,在每个4X4的小块上计算8个方向的梯度方向直方图,统计每个方向的累加值,形成一个种子点。David G.Lowe建议对每个关键点使用4X4=16个种子点进行描
OpenCV入门 - 提取SIFT关键点 OpenCV入门 - 提取SIFT关键点 在基于内容的图像检索中,图像的局部不变特征是相对全局特征来说的,局部特征可以有力的描述图像的特征,具有重要的意义,而在很多基于灰度的局部特征提取算法中SIFT具有最好的效果,具体原理要看Lowe的论文,下面利用opencv感受以下效果。#include #include #include //using namespace c
OpenCV入门 - Ubuntu 12.04 安装OpenCV OpenCV入门 - Ubuntu 12.04 安装OpenCV本来打算在Ubuntu 12.04上安装opencv 3.0的,结果发生了下面(2)中的错误,不知如何解决,所以最后还是老老实实安装opencv 2.4.(1)编译时出现错误:In file included from /home/vonzhou/Downloads/opencv-3.0.0-rc1/modules
倒排索引的简单实现 倒排索引的简单实现 倒排索引是搜索引擎中常用的算法,主要用来实现full text searching,建立关键词和所在文档的映射关系,很多强大的功能都建立在此基础之上,关于Inverted Index的详尽描述可以看Wikipedia。下面按照自己的想法实现之,只是为了体会这个数据结构的运作。 todo:如果要搜完整的出现一句话如“what is it”可以分别
分析一个Java Class文件 Java源码文件TestClass.java:package jvm.chapter6;//P166public class TestClass { private int m; public int inc(){ return m+1; }}展示这个Class文件的16进制内容:从头开始分析=>ca fe ba be :magic number
Runtime类理解 Runtime类理解虽然我们知道在编写java程序时,只有线程的概念,依托于JVM这个进程,但是API提供了Runtime这个类,(Every Java application has a single instance of class Runtime that allows the application to interface with the environment in w
KMP算法理解 KMP算法理解字符串匹配算法之KMP算法一直以来都很难理解,虽然知道要减少不必要的匹配,但是仍然不懂里面的思想,即使看着代码。后来看到(2)中博客中的解释才清晰了许多,不至于在什么DFA,前缀表,部分匹配表等概念中迷失自己。主要的指导思想在于当发生不匹配的时候如何更有效的利用现在已经匹配的字符串的信息来加速移动过程,部分匹配表的存在正是挖掘一个字符串中前缀和后缀中最长公共串,比
重定位绝对引用(absolute reference relocation) 重定位决定引用(absolute reference relocation) 还是承接前面的程序,在swap.c中 “int *bufp0 = &buf[0];”bufp0被初始化为一个全局的数组地址,所以需要重定位,详细信息如图和, r.offset=0xc, r.symbol=buf, r.type=R_386_32 ,重定位条目告诉编译器,这是一个32位的绝对引用,必须重定位才能指
重定位PC相对引用(PC-relative reference relocation) 重定位PC相对引用(PC-relative reference relocation) 示例代码(main.c, swap.c )见之前的一篇文章,分析目标文件。可以看到main中调用swap的call指令位于section offset 0x1d处,操作码是e8,操作数是32bit的引用0xfffffffc,即-4(little endian存储的),下一行显示的是swa
反汇编一个简单的C程序 反汇编一个简单的C程序看了下网易云课堂的《Linux内核分析》,第一节要求有一个简单C程序得到汇编代码,然后分析。只要明确每个汇编指令代表的含义,就可以容易的走下去,关键是要体会里面的思想。int g(int x){ return x+3;}int f(int x){ return g(x);}int main(){ return f(8
Data Structure Alignment 2 Data Structure Alignment 2在前面的一篇文章中,似乎明白了结构体对齐的基本规则,但是有些地方还是含糊不清。比如看下面的这个程序。根据前面的规则很容易算出,sizeof(A)=16, sizeof(B)=24.但是在GCC下运行的结果却不是这样,所以一时有点不知问题所起,内存对齐都是编译器做的工作所以各个平台下面的实现没有得到统一规范,虽然可以#pragma
探寻ELF文件内容,理清符号所在section 受《CSAPP》P453启发,想实际的看看ELF文件的内容,所以做了简单的尝试,希望不虚此行。采用的程序demo是:swap.cextern int buf[];int *bufp0 = &buf[0];int *bufp1;void swap(){ int temp; bufp1 = &buf[1]; temp = *bufp0;
源码阅读tinyhttpd tinyhttpd 是一个用C语言实现的简单的HTTP服务器程序,500行代码,值得阅读。看完这个代码之后有几点需要进一步的思考:1.get_line()函数要处理跨平台的换行('' or '\r')MSG_PEEK 标志可以窥探缓冲区中的数据,从而决定是否读取;2.stat ,st.st_mode & S_IFMT) == S_IFDIR 判断对应的路径是否是目录;3.
2015阿里暑期实习招聘在线笔记题 2015阿里暑期实习招聘在线笔记题 昨天感受了下阿里的在线笔试,感觉不简单,特别是概率和推理题,这里把部分题整理下,目的把不会的搞懂,把相关的知识点真正掌握。选择题是40分钟,20个题随机的,附加题和报的岗位有关。
Ubuntu 下安装Sublime Text 2 Ubuntu 下安装Sublime Text 2 不管在Linux还是Windows系统下 Sublime都是一款很优秀的编辑器。这里记录下安装过程。1. 到官网下载 Sublime Text 2.0.2.tar.bz2 ;2. 解压后,拷贝到自己的软件目录中: tar -xjvf Sublime\ Text\ 2.0.2.tar.bz2sudo mv Sub
Linux下面Eclipse出现中文乱码 Linux下面Eclipse出现中文乱码之前在Windows下面的代码移到Ubuntu系统后出现中文乱码,因为默认不支持Windows下面的GBK字符集,需要自己加入到配置文件中。1. 在 /var/lib/locales/supported.d/local文件后面添加:zh_CN.GBK GBKzh_CN.GB2312 GB2312 2. 重新配置locals包
最大流问题(Ford-Fulkerson算法) 最大流量问题 对于最大流量问题的详细分析和理论参见算法导论,Ford-Fulkerson算法,伪代码如下:SetFtotal = 0Repeat until there is no path from s to t: Run DFS from s to find a flow path to t Letcp be the minimum
Java集合中二分查找算法实现 Java集合中二分查找算法实现Arrays.binarySearch实现了对有序数组特定区间的二分查找,虽然我们觉得很简答,但是阅读源码的确能看到实现这些库的优秀技巧,总是在追求完美和高效。值得学习的地方有:(1)边界检查;(2)求中位数的时候使用位移操作,而不是 x/2;(3)如果查找的元素不在数组中,通过返回值昭示了应该插入的位置,而不是直接返回-1;
Linux使用du和df命令结果不一致 Linux下面通常用du和df命令看磁盘空间的使用情况,基本语法如下:df - report file system disk space usagedf [OPTION]... [FILE]...-h, --human-readable print sizes in human readable format (e.g., 1K 234M 2G)du -
安装Virtualbox Guest Additions(解决Virtualbox中Ubuntu分辨率过小) 问题:Virtualbox中Ubuntu分辨率过小,操作极其不方面。解决:需要安装Virtualbox Guest Additions。步骤如下:1.下载Virtualbox Guest Additions,从这里下载 ;2. 为主机增加一个虚拟光驱 ;3. 进入系统后,点击“设备”-> “安装增加功能”,就可以从刚才增加的光驱中进行挂载安装(如
C语言不支持引用传递和函数重载 C语言不支持引用传递和函数重载(1)ANSI C不支持引用(pass by reference),通过对指针的传值可以到达需求,C++才支持引用。(2)C语言不支持函数重载。测试如下:
通过Edit Distance问题理解动态规划算法 动态规划算法理解 动态规划(Dynamic Programming)是通过组合子问题的解来解决问题。所以对于一个问题是否能够用DP,就要看是否具有相同的子问题结构,而且计算有重叠。导致直接用递归来解决的话就带来巨大开销,甚至栈溢出,动态规划就是一种改进暴力递归的策略,有自顶向下和自底向上2个角度来看问题。Top-Down的话就是为了避免递归过程中的重复计算,会记录下中间步骤可以
多维数组作为函数参数的形式 多维数组作为函数参数的形式 今天在看CSAPP的时候,直接敲入了书中的代码片段(P582),没有多加思考,却出现了段错误coredump,然后再纠结:被调用函数是否可以访问到主函数中的数据,函数中的自动变量存在栈中?最后才知道是函数声明的问题。所以通过这篇文章理清了数组作为参数时如何实践,同时不要忽略编译器给我们的警告。问题: $vi 2.c $ gcc
Linux pipe 源码分析 Linux pipe 源码分析 管道pipe作为Unix中历史最悠久的IPC机制,存在各个版本的Unix中,主要用于父子进程之间的通信(使用fork,从而子进程会获得父进程的打开文件表),pipe()系统调用底层的实现就相当于一个特殊的文件系统,每次调用的时候创建一个inode关联着两个file,一个用于读,一个用于写,从而实现数据的单向流动。用户层API:
Linux select 机制深入分析 Linux select 机制深入分析 作为IO复用的实现方式,select是提高了抽象和batch处理的级别,不是传统方式那样阻塞在真正IO读写的系统调用上,而是阻塞在select系统调用上,等待我们关注的描述符就绪。当然现在更好的方式是epoll,比如Java中的NIO底层就是用的epoll。这篇文章只是为了搞懂select机制的原理,不看源码就不能说懂这些IO复用手
创建并使用静态库(ar 命令) 创建并使用静态库(ar 命令) archive命令的功能是:创建或修改归档文件或者从归档文件中析取信息。可以简单的理解为一个打包工具,将成员文件按照一定的规则构建到.a文件中,通常这种类型的归档文件用来将常用的例程组织为一个静态库,方便应用程序的链接。重要参数:d - 从archive中删除模块,若指定v选项的话还会在删除的过程中打印信息;r - 以替换的方式
Ubuntu下安装MySQL 5.6.23 Ubuntu下安装MySQL 5.6.231.下载对应Linux-generic的源码包,解压,将解压后的文件夹重命名为mysql,移动到/usr/local目录下;tar –xzf mysql-5.6.23-linux-glibc2.5-x86_64.tar.gzmv mysql-5.6.23-linux-glibc2.5-x86_64 mysql sudo mv mysql
在Linux下查看系统版本号信息命令总结 vonzhou@de16-C6100:~$ lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 12.04.4 LTSRelease: 12.04Codename: precisevonzhou@de16-C6100:~$ u
文件操作命令 1.ls列出文件信息:文件类型:d 目录(directory)l 符号链接(link)s 套接字文件(socket)b 块设备文件(block device file)c 字符设备文件(character)p 命名管道文件(named pipe ,FIFO)- 普通文件创建文件命令:touch filename改变文件权限:chmod [who
单例模式(Singleton Pattern) 单例模式确保一个类只会有一个实例,而且会提供一个全局访问点,特别用于资源敏感的对象。在实现的时候要考虑多线程环境,就需要同步。在Singleton4实现中用双重检查加锁,减少同步粒度,从而只会在第一次(不超过两次)请求该实例的时候才会进行同步,在这里,之所以要Double Check的原因是:假设线程P1,P2都执行到了pointA处,此时P1获得对象锁,进入了同步块,然后发现此时unique
Linux内存管理 - PAGE_OFFSET理解 Linux内存管理 - PAGE_OFFSET理解 PAGE_OFFSET 代表的是内核空间和用户空间对虚拟地址空间的划分,对不同的体系结构不同。比如在32位系统中3G-4G 属于内核使用的内存空间,所以 PAGE_OFFSET = 0xC0000000。在X86-64架构下是ffff880000000000。可以看到内核程序可以可以访问从PAGE_OFFSET 之
[LeetCode] Triangle 解题记录 题目描述:Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.For example, given the following triangle[ [2],
[LeetCode]Valid Sudoku解题记录 这道题考查对二维数组的处理,哈希表。1.最自然的方法就是分别看每个数是否符合三个规则,所以就需要相应的数据结构来记录这些信息,判定是否存在,显然最先想到用哈希表。2.学会把问题抽象成一个个的子问题。3.在索引的构建上下工夫。4.底层数组如何对应的细节没有那么重要,重要的是构成了问题的全集。代码:附图:一趟遍历时根据i,j,对应到具体的grid,这里的构造模式有多种(??
对openvSwitch中不同类型端口的理解 同一主机上的OVS中可以创建多个网桥(即多个datapath实例),每个bridge可以通过patch ports互联,而netdev ports是OVS对底层物理端口的抽象封装,internal 类型的端口比较不好理解,可以看做每个OVS交换机有个可以用来处理数据报的本地端口,可以为这个网络设备配置 IP 地址(比如在把eth0加入某个bridge的时候,它的IP地址就失效了,可以把IP地址
APUE 线程 - 程序清单 APUE 线程 - 程序清单程序清单11-1 打印线程ID程序清单11-2 获得线程退出状态程序清单11-3 pthread_exit 的参数不正确使用程序清单11-4 线程清理处理程序程序清单11-5 使用互斥量保护数据结构程序清单11-6 使用两个互斥量程序清单11-7 简化的加,解锁程
APUE信号-程序汇总 APUE信号-程序汇总 最近重看APUE,发现对于很多程序的要领还是没有完全理解,所以梳理下便于查看,而且有很多值得思考的问题。程序清单10- 1 捕获 SIGUSR1 和 SIGUSR2的简单程序#include "util.h"static void sig_usr(int);int main(void){ if(signal(SIGUSR1,
Implementing Software Timers - Don Libes 在看APUE习题10.5的时候提示了这篇文章,讲的很清晰,设计也很巧妙,所以把原文放在这里,值得自己去实现。Title: Implementing Software TimersBy: Don LibesOriginally appeared in the Nov. 1990 "C User's Journal" and is also reprinted as C
错误: ISO C++ 不允许在类内初始化非常量静态成员 错误: ISO C++ 不允许在类内初始化非常量静态成员 今天开始学C++ primer,在牵扯到Sales_item.h头文件时,出现了一些问题(和C++11新特性相关),当前的编译器版本是gcc/g++ 4.6.3,所以需要升级。可以利用PPA升级到4.8.1,如下:sudo add-apt-repository ppa:ubuntu-toolchain-r/t
execl error: Permission denied 错误解决 execl error: Permission denied 错误解决 在调用execl函数执行一个文件的话要确保:全路径名是正确的,第二个参数必须对应为第一个参数的文件名;最后一个参数是 (char *)NULL ;可以直接把第一个参数放在命令行运行来检验。否则会出现 Permission denied 错误。值得注意的是,即使执行的是一个解释器文件,也需要其有可执行权限。(
进行命令处理的典型程序框架 进行命令处理的典型程序框架 今天翻看APUE中非局部goto的时候,看到了这个处理命令行的代码框架,所以就想简单的实现一个功能进行调试,花了大概2个小时,才完全看的过去,记录下,虽然看起来还是不够层次清晰。里面牵扯到的知识点注意有:业务要学会分层;枚举值和对应字符串的转换;字符串的解析(分词)。#include "util.h"void do_line(ch
把枚举转化为相应的字符串 把枚举转化为相应的字符串 今天无意间就需要这样的一个功能,从枚举值得到对应的字符串表示,一个容易想到的方法就是再造个字符串数组,和ENUM对应起来,显然这个方法没有可扩展性;第二种方法在stackoverflow上看到的就是巧妙的利用 宏 来生成对应的字符串数组,感觉非常巧妙,易于扩展。下面是这两种方法的代码。#include#includeenum
源码安装 openssl 源码安装 openssl 因为sha1计算的需要,要求有openssl/sha.h头文件,所以要安装 openssl 和 libssl-dev 否则会报错: fatal error: openssl/sha.h: No such file or directory。由于这台机器不能直接上网,就需要下载源码进行安装。不装 libssl-dev 的话,程序仍然找不到相应的头文件
守护进程重读配置文件示例 守护进程重读配置文件示例 重读APUE,对守护进程有了更加深刻的理解,特别是相应的编程规则和应用场景。对于为什么要fork两次,日志设施的用法,信号的处理方法都有了更加清晰的认识。通常的应用场景是,守护进程在收到一个SIGHUP信号的时候重新读取配置文件,而不需要停止。下面是运行APUE书中这个实例的过程。 首先主要代码为(reread.c):#incl
Netty3 源码分析 - NIO server接受连接请求过程分析 Netty3 源码分析 - NIO server接受连接请求过程分析 当服务器端的server Channel绑定某个端口之后,就可以处理来自客户端的连接请求,而且在构建 NioServerSocketChannelFactory 的时候已经生成了对应的 BossPool 和 WorkerPool,前者管理的 NioServerBoss 就是专门用来接受客户端连接的Sele
Java 数组反射(Array Reflection) 1. 在不确定某个参数或对象是否是数组的时候,就可以使用发射机制,把该对象的Class对象传给Array.isArray(Class) 方法进行判断。通过Class对象的 getComponentType() 方法可以进一步知道数组组件的具体类型,数组如果是多维的话可以递归调用Array.isArray;2.Array.getLength(class)可以得到数组的大小;3.可以运行时利用
Netty3 源码分析 - NIO server绑定过程分析 Netty3 源码分析 - NIO server绑定过程分析 一个框架封装的越好,越利于我们快速的coding,但是却掩盖了很多的细节和原理,但是源码能够揭示一切。服务器端代码在指定好ChannelFactory,设定好选项,而后Bootstrap.bind操作就会开启server,接受对端的连接。所以有必要对这后面的过程分析清楚,下图是关键流程。先是构建一个默认的Pipe
OpenvSwitch中端口的抽象层次结构 OpenvSwitch中对端口的抽象层次结构 struct vport抽象的是OVS中datapath层的每个端口,通过它将ovs中的各种数据结构与Port关联起来,而结构体netdev_vport 就是vport和底层真实网络设备结构net_device 的入口,关键数据结构如下:struct vport { struct rcu_he
Collections.synchronizedList 工厂方法 Collections.synchronizedList 工厂方法通常的Map,Set,List实现都不是线程安全的,通过这些工厂方法可以得到相应的同步容器,相当于增强了访问控制,把一个链表对象传递过来后,我们都通过返回的这个链表对象来进行各种操作(都是同步方法),而不再操纵底层的那个链表。此外,在Vector和同步封装器类中是用内置锁来来支持客户端加锁,所以我们可以进行扩展。在对
Netty3 源码分析 - ChannelUpstreamHandler Netty3 源码分析 - ChannelUpstreamHandlerChannelUpstreamHandler处理上行的通道事件,并且在流水线中传送事件。这个接口最常用的场景是拦截IO工作现场产生的事件,传输消息或者执行相关的业务逻辑。在大部分情况下,我们是使用SimpleChannelUpstreamHandler 来实现一个具体的upstream ha
Netty3 源码分析 - ChannelFuture Netty3 源码分析 - ChannelFutureChannelFuture抽象的是Channel中异步IO操作的结果。在Netty中,所有的IO操作是异步的,意味着任何IO调用会立刻返回,而不是等到操作真正的执行完成。相反,会返回一个ChannelFuture 对象,在IO完成之后通过其得到结果状态。ChannelFuture 要么完成要么未完成,当IO操作开始执行会创建一个新的
Netty3 源码分析 - 套接字绑定实现原理 前面关注的地方都是Netty采用的流水线处理方式的组织方式,ChannelHandler如何管理,通道状态,通道事件等这些上层的架构设计,那么Netty中如何实现诸如套接字绑定,连接,关闭等这些底层的操作呢?不能只顾着套用API写程序,却对细节不求甚解。这里大致追踪下OIO模式下Channel中套接字绑定的实现,(NIO以后分析)其实逻辑都是一样的,只是在线程模型的地方时不同的。大致过程如下(
Netty3 源码分析 - ChannelPipeline ChannelPipeline的作用就是组织一系列的ChannelHandlers 为某一个Channel服务,处理各种事件。实现了拦截过滤器模式的高级形式(an advanced form of the Intercepting Filter pattern),进而有效控制如何处理一个事件以及ChannelHandlers之间如何交互。类型结构图为:流水线的创建:对于
Netty3 源码分析 - ClientBootstrap Bootstrap是通道初始化辅助类 提供了初始化通道或子通道所需要的数据结构,那么ClientBootstrap就是客户端的,而且会执行连接操作。配置通道,就是把相应的键值对选项传递给底层: ClientBootstrap b = ...; // Options for a new channel b.setOption("remoteAddress", new Inet
Netty3 源码分析 - OioClientSocketChannelFactory 是一个ClientSocketChannelFactory 的实现,基于SocketChannel的阻塞方式的客户端通道。使用的是传统的阻塞IO API,特点是能得到好的吞吐量和低延迟,当需要服务的连接数少的时候。(联系NIO和OIO的区别) 在OioClientSocketChannelFactory中只有一种线程类型,worker threads。每个连接的通道有一个专用的
Netty3 源码分析 - ChannelStateEvent Netty3 源码分析 - ChannelStateEventChannelStateEvent是ChannelEvent的子接口,可以代表改变的通知或者是请求,取决于它是上行还是下行事件。UpstreamChannelStateEvent是默认的上行通道状态事件实现类。结合ChannelState中的表很容易看懂源码。DownstreamChannelStateEve
Netty3 源码分析 - ChannelState Netty3 源码分析 - ChannelState枚举类ChannelState代表的是这个Channel的状态集,状态的解读和ChannelStateEvent中的value值以及事件的方向息息相关,下面这个表可以从宏观上把握。DirectionStateValueMeaningUpst
Netty3 源码分析 - ChannelEvent Netty3 源码分析 - ChannelEvent ChannelEvent是和这个Channel相关的IO事件和请求,会由各个ChannelHandler来处理。 事件分为上行和下行两种。当服务器从客户端收到一个消息,那么与之相关的就是一个上行事件(upstream event),流水线中的UpstreamChannelHandler会处理它;如果服务要回应这个
Netty3 源码分析 - ChannelHandlerContext Netty3 源码分析 - ChannelHandlerContextChannelHandlerContext存在的意义是可以让其管理的Handler与Pipeline或其他handlers进行交互,ChannelHandler的理解在前面说过。发送事件:可以调用 sendUpstream(ChannelEvent) 或sendDownstream(Channel
Netty3 源码分析 - ChannelHandler Netty3 源码分析 - ChannelHandler每个通道关联一个Pipeline,在流水线中拦截处理各种事件的对象就是ChannelHandler,它处理ChannelEvent而后进行传递。接口ChannelHandler没有提供任何方法,有两个子接口分别用来规范处理上行和下行的通道事件。ChannelHandler是随ChannelHandl
Netty3 源码分析 - AbstractChannel Netty3 源码分析 - AbstractChannelAbstractChannel 是Channel的部分实现,维护了一个通道相关的资源,如channel id, pipeline等;而且实现了对该套接字的IO操作,以及设置interestOps;这里还没有牵扯到底层的细节,只是这个框架的结构。(Channels中的具体实现有待分析)源码能说明一切:/