- 博客(156)
- 资源 (8)
- 收藏
- 关注
原创 ONE 一个 隐私保护声明
ONE 一个是由eriolchan为Windows Store平台开发的Window 8 应用。1. 我们不会收集你的任何个人信息。2. 用户使用我们的服务,应遵守国家有关法律法规和规章制度。
2013-06-19 16:10:44 3113
转载 Building Web Services the REST Way
Roger L. CostelloI will first provide a brief introduction to REST and then describe how to build Web services in the REST style.What is REST?REST is a term coined by Roy Fielding in his Ph.
2012-09-15 20:44:06 594
原创 敏捷软件开发——测试
Test-Driven Development 测试驱动开发如果我们遵守了以下的规则进行开发,那么这就是测试驱动开发:在编写任何产品代码之前先写一个会运行失败的单元测试。编写一个单元测试,使其刚好能够运行失败或者编译失败。编写的产品代码应该刚好能够使失败的单元测试运行通过。如果按照这种开发方式进行开发,那么我们将处于一个非常短的开发周期中。这样做的好处是,首先程序中的每一个单独
2012-08-08 22:31:16 718
原创 敏捷软件开发——计划
Initial Exploration 初始探索在项目的初期,开发人员和业务人员将关于新的系统的构建进行交流以确定所有重要的feature。事实上,并不需要在一开始就确定所有的feature,因为随着项目的进行,业务人员会发现更多的feature。当一个feature被确定后,它将会被分解为一个或多个user story。在这个阶段,我们并不试图去捕获所有的细节。我们只是简单地希望user s
2012-07-28 21:50:36 592
原创 敏捷软件开发——极限编程概述
极限编程实践包括以下几个方面:Whole Team 完整团队极限编程希望客户、经历和开发人员能够密切的工作在一起,这样每个人都可以知道别人所遇到的问题,并能够通过合作来解决这些问题。强调开发人员与客户之间的紧密合作,这样就能够及时的得到客户的需求反馈来对变化作出反应。User Stories 用户故事用户故事是对于用户需求的一种助记的方法。它可以被用来对某个需求的实
2012-07-26 22:06:03 574
原创 敏捷软件开发——敏捷实践
最近在学习敏捷软件开发,看的书是"Agile Principles, Patterns, and Practices in C#",这里摘录一部分书中的精华与大家分享。Manifesto for Agile Software DevelopmentWe are uncovering better ways of developing software by doing it and
2012-07-15 17:11:31 453
原创 fedora下ssh的配置
1) 安装openssh-serveryum install openssh-server 2) 查看是否已成功安装openssh-serverrpm -qa | grep openssh-server3) 修改ssh服务的配置文件 配置ssh服务的运行参数是通过修改配置文件/etc/ssh/ssh_config实现的。 #Por...
2011-12-21 11:24:33 202
原创 Python中的None
None是一个特殊的常量。None和False不同。None不是0。None不是空字符串。None和任何其他的数据类型比较永远返回False。None有自己的数据类型NoneType。你可以将None复制给任何变量,但是你不能创建其他NoneType对象。 >>> type(None)<class 'NoneType'&g...
2011-12-21 11:17:38 567
原创 Linux下用C实现线程池
什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。 下面是Linux系统下用C语言创建的一个线程池。线程池会维护一个任务链表(每个CThread_worker结构就是一个任务)。...
2011-12-11 21:52:35 133
原创 Java类加载器
Java虚拟机中可以安装多个类加载器,系统默认主要有三个类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader。当然也可以自定义类加载器,自定义的加载器必须继承ClassLoader。 类加载器也是Java类,因为其它Java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这个就是BootStrap。...
2011-10-21 18:57:02 214
原创 stop() 和 suspend() 方法为何不推荐使用
反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,当在一个线程对象上调用stop()方法时,这个线程对象所运行的线程就会立即停止,假如一个线程正在执行:synchronized void { x = 3; y = 4;} 由于方法是同步的,多个线程访问时总能保证x,y被同时赋值,而如果一个线程正在执行到x = 3;时,被调用了 stop()方法,即使在同步块中,它也干脆地s...
2011-10-21 15:39:08 290
原创 strcpy, memcpy, memmove, memset的实现
strcpy() 字符串拷贝 char *strcpy(char *strDest, const char *strSrc){ assert((strDest!=NULL) && (strSrc !=NULL)); char *address = strDest; while( (*strDest++ = * strS...
2011-10-15 17:12:09 126
原创 最长公共子序列
题目 如果字符串1中的所有字符都按顺序的出现在字符串2中,那么称字符串1是字符串2的子串。现在给定两个字符串,求它们的最长公共子串。 例如:对于字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,长度为4。 思路 考虑字符串X = {x1, x2, ... xm} 和 Y = {y1, y2, ... yn},记 Z = {...
2011-10-09 18:15:28 160
原创 弗洛伊德算法
Floyd-Warshall算法,简称Floyd算法,用于求解任意两点间的最短距离,时间复杂度为O(n^3)。 使用条件&范围通常可以在任何图中使用,包括有向图、带负权边的图。 Floyd-Warshall 算法用来找出每对点之间的最短距离。它需要用邻接矩阵来储存边,这个算法通过考虑最佳子路径来得到最佳路径。 算法思想 // dist(i,j...
2011-10-07 20:38:33 195
使用阻塞缓冲区的生产者消费者
Repository 重点在于Repertory类的实现,该类提供阻塞的addProduct和getProduct,来达到生产者与消费者之间的协调。 public class Repertory { private int product = 0; public synchronized void addProduct() { if(this.product &...
2011-10-07 19:59:28 138
原创 生产者消费者问题
生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的问题,它的描述是有一块生产者和消费者共享的有界缓冲区,生产者往缓冲区放入产品,消费者从缓冲区取走产品,这个过程可以无休止的执行,不能因缓冲区满生产者放不进产品而终止,也不能因缓冲区空消费者无产品可取而终止。解决生产者消费者问题的方法有两种,一种是采用某种机制保持生产者和消费者之间的同步,一种是在生产者和消费者之间建立一...
2011-10-07 19:47:28 1114
最大栈和最大队列
最大栈 具有栈的功能,并且提供O(1)的时间复杂度来获取最大值max。 思路:使用一个辅助栈assist来维护最大值,最大值为assist的栈顶元素。当入栈的值大于最大值时,将该值压入assist栈,相当于更新了最大值。当有元素出栈时,检查该元素是否为最大值,如果是,则assist出栈,即更新了最大值。 import java.util.Stack;publi...
2011-10-04 20:50:44 218
原创 TCP状态转换
TCP建立连接协议(三次握手)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。客户必须再次回应服务段一个ACK报文,这是报文段3。 TCP连接终止协议(四次...
2011-10-03 14:49:44 110
原创 楼层扔鸡蛋问题
有限层数和蛋数,求即使最坏情况下需要的最少判断次数两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。 这是典型的动态规划问题。假设f[n]表示从n层楼找到摔鸡蛋不碎安全位置的最少判断次数。假设第一个鸡蛋第一次从第i层扔下,如果碎了,就剩一个鸡蛋,为确定...
2011-10-03 13:44:02 150
原创 iptables原理
iptables基础 规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行...
2011-10-03 13:34:02 116
原创 select, poll和epoll
对select、poll、epoll了解得不多,下面是从《构建高性能Web站点》摘录下来的介绍,等以后真正接触到select、poll和epoll方面的开发再详细写一下使用上的区别。 selectselect最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核...
2011-10-02 20:14:24 124
原创 cache写策略
Write Through (完全写入) CPU向cache写入数据时,同时向memory也写一份,使cache和memory的数据保持一致。优点是简单,缺点是每次都要访问memory,速度比较慢。 Write Back (回写) CPU更新cache时,只是把更新的cache区标记一下,并不同步更新memory。只是在cache区要被新进入的数据取代时,才更新 m...
2011-10-02 19:07:25 540
原创 coredump简介
通常情况下core dump包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等。可以理解为把程序工作的当前状态存储成一个文件。许多程序和操作系统出错时会自动生成一个core文件。 core dump又叫核心转储,当程序运行过程中发生异常,程序异常退出时,由操作系统把程序当前的内存状况存储在一个core文件中。 如何使用core文件? gdb -c cor...
2011-10-02 16:51:56 145
原创 实模式与保护模式
1. x86实模式介绍x86体系的处理器刚开始时只有20根地址线,寻址寄存器是16位。我们知道16位的寄存器可以访问64K的地址空间,如果程序要想访问大于64K的内存,就需要把内存分段,每段64K,用段地址+偏移量的方式来访问,这样使20根地址线全用上,最大的寻址空间就可以到1M字节,这在当时已经是非常大的内存空间了。 2. 实模式的问题与保护模式的出现事实上,实模式将整个...
2011-10-02 16:30:30 104
判断两个链表是否相交
题目 : 给出两个链表的头指针,比如h1,h2,判断这两个链表是否相交。 扩展:(1) 如果链表可能有环呢? (2) 如何求出两个相交链表的相交的第一个节点。 如果链表没有环 假设两个链表没有环,如果它们相交,那么它们的最后一个元素必定相同。 public boolean isConNLoop(ListNode h1, ListNode h2) ...
2011-10-02 15:44:10 102
原创 Java中从方法中返回多个值
有些时候,我们需要从一个方法中返回多个值。那么在Java中该怎么实现呢?在Java中,你无法控制参数传递的方式,Java中所有的参数传递都是按值传递: 简单类型,将参数的值传递给函数; 对象类型,将参数的地址传递给函数。 正因为传递对象类型参数时,你传递的是对象的地址,或者叫引用(reference),这时函数就可以改变该地址上的那个对象。所以,如果你要修改某个...
2011-09-28 21:42:04 375
原创 求和为n的连续正整数序列
题目:输入一个正数n,输出所有和为n连续正整数序列。 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。 解法1 因为整数序列是有序的,可以设立两个游标begin和end,通过判区间[begin,end]的和是否为N来得到这个序列。如果区间和大于n,begin往前移动,如果小于n,end往前移动...
2011-09-27 18:49:10 383
原创 析构函数与virtual
作为通常的原则,如果一个类定义了虚函数,那么它的析构函数就应当是virtual的。因为定义了虚函数则隐含着:这个类会被继承,并且会通过基类的指针指向子类对象,从而得到多态性。这个类可能会被继承,并且会通过基类的指针指向子类对象”,因此基类的析构函数是否为虚将决定子类的对象是否被析构。 #include <iostream.h>struct A{ ...
2011-09-26 14:57:16 153
原创 dup和dup2函数
dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。这两个函数的原形如下: #include <unistd.h>int dup( int oldfd );int dup2( int oldfd, int targetfd ); dup()函数 利用函数d...
2011-09-26 14:23:35 420
原创 boost智能指针weak_ptr
循环引用 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象。一个简单的例子如下: #include <string>#include <iostream>#include <boost/shared_ptr.hpp>#include <boost/weak_ptr.hpp>...
2011-09-26 12:49:20 123
原创 boost智能指针shared_ptr
最近项目中使用boost库的智能指针,感觉智能指针还是蛮强大的,在此贴出自己学习过程中编写的测试代码,以供其他想了解boost智能指针的朋友参考,有讲得不正确之处欢迎指出讨论。当然,使用boost智能指针首先要编译boost库,具体方法可以网上查询,在此不再赘述。 智能指针能够使C++的开发简单化,主要是它能够自动管理内存的释放,而且能够做更多的事情,即使用智能指针,则可以再代码中n...
2011-09-26 12:37:15 161
原创 智能指针的原理和实现
当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享。 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。...
2011-09-26 12:22:33 184
原创 并查集
1. 概述并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。2. 基本操作并查集是一种非常简单的数据结构,它主要涉及两个基本操作,分别为:合并两个不相交集合。判断两个元素是否属于同一个集合。 (1) 合并两个不相交集合(Union(x,y))...
2011-09-25 22:07:14 165
原创 死锁和饥饿的异同
在多道程序系统中,同时有多个进程并发运行,共享系统资源,从而提高了系统资源利用率,提高了系统的处理能力。但是,若对资源的管理、分配和使用不当,则会产生死锁或是饥饿。 所谓死锁是指在多道程序系统中,一组进程中的每一个进程都无限期等待被该组进程中的另一个进程所占有且永远不会释放的资源。饥饿是指系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应带来明显影响...
2011-09-24 18:28:52 2419
原创 回调函数(callback)和仿函数(functor)
回调函数(callback)与仿函数(functor)很多时候从用途上来看很相似,以致于我们经常将它们相提并论。例如: inline bool compare(int a, int b){ return a > b;} struct comparer { bool operator()(int a, int b) const { return...
2011-09-23 15:09:47 382
原创 映射二分堆
引入 平常,我们用堆最常见的就是随机地加入元素,随机地取最大值或最小值。这些基本的操作C++中的priority_queue和set都能很好的完成,而且C++中还有一个make_heap,效率较前面2个会更高。而且前面提到的STL都是采用红黑树实现的,很具有稳定性。 上面的堆虽然使用简单,但功能上还是有些局限。比如前面提到的堆都只能实现删除最值并没有办法删除指定的值。而且一般...
2011-09-18 20:57:52 218
原创 memcpy, memccpy和memmove
memcpy 声明:void *memcpy(void *dest, const void *src, size_t n)返回值:返回指向dest的指针。作用:memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束。 memccpy ...
2011-09-18 14:59:51 199
原创 CPU页式内存管理
页式内存管理 CPU的页式内存管理单元,负责把一个线性地址,最终翻译为一个物理地址。从管理和效率的角度出发,线性地址被分为以固定长度为单位的组,称为页(page),例如一个32位的机器,线性地址最大可为4G,可以用4KB为一个页来划分,这页,整个线性地址就被划分为一个totall_page[2^20]的大数组,共有2的20个次方个页。这个大数组我们称之为页目录。目录中的每一个目录项,就是一...
2011-09-17 20:25:39 375
原创 CPU段式内存管理
逻辑地址如何转换为线性地址 一个逻辑地址由两部份组成,段标识符: 段内偏移量。段标识符是由一个16位长的字段组成,称为段选择符。其中前13位是一个索引号。后面3位包含一些硬件细节,最后两位涉及权限检查。如图: 索引号就是“段描述符(segment descriptor)”。段描述符描述了一个段。这样,很多个段描述符,就组了一个数组,叫“段描述符表”...
2011-09-17 14:45:07 183
原创 SYN flood
SYN Flood介绍 SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。要明白这种攻击的基本原理,还是要从TCP连接建立的过程开始说起: 大家都知道,TCP与UDP不同,它是基于连接的,也就是说:为了在服务端...
2011-09-16 21:16:15 226
org.apache.batik包
2010-04-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人