mysql的BASE64编码和解码实现

刚好需要,找到了这个东西。mysql有MD5,AES,DES等加密函数,不过恰恰却没有BASE64编码解码函数。找到了原文:http://forums.mysql.com/read.php?10,404800,404800#msg-404800
http://wi-fizzle.com/downloads/base64.sql
下面的代码来自Gist https://gist.github.com/1724446

当然了,除非特殊需要,不推荐这么使用。如果技术够的话,可以写成UDF。
汉字等还需要注意编码

几组极易混淆概念的理解(2)进程(process)和线程(thread).

      进程和线程这对概念的理解也是很难的,至今网络上可查的资料对其的理解出入都挺大,在不同的操作系统中,如linux和windows中,其概念和实现都是有出入的。因此,我在这里结合我自己的理解谈下这两个概念,讲的都是一般性的概念,并且主要是基以WINDOWS的。
     一般将进程定义为一个正在运行的程序的实例。我们在任务管理器重所看到的每一项,就可以理解为一个进程,每个进程都有一个地址空间,这个地址空间里有可执行文件的代码和数据,以及线程堆栈等。一个程序至少有一个进程。进程可以创建子进程,创建的子进程可以和父进程一起工作,也可以独立运行。
     而线程是隶属于进程的,也就是说,线程是不能单独存在的,线程存在于进程中。每个进程至少有一个主线程,进程里的线程就负责执行进程里的代码,这也叫做进程的“惰性”。线程所使用的资源是它所属的进程的资源。线程也有自己的资源,主要组成部分就是一些必要的计数器和线程栈,占用的资源很少。我们可以理解为进程就是个容器,而线程才是真正干活的。线程可以在内核空间实现,也可以在用户空间实现。
     这里特别提一下linux,在linux中,每一个进程都必须有一个父进程(如果没有父进程,则把PID=1的根进程作为其父进程)。进程退出了,就成了僵尸进程,等待父进程的退出信号,如果父进程没有给他发信号,得给他找一个父进程,或者等待内核自动销毁。Linux内核只提供了轻量进程的支持,限制了更高效的线程模型的实现,但Linux着重优化了进程的调度开销,使得linux进程切换开销较小。所以linux系统没有真正意义上的线程机制。linux中,Linux线程是通过进程来实现,进程和线程是同一个层次的。(我这里提到的是基于linux 2.6 内核的,在最新的LINUX中,对线程的实现做了优化,但是还是基于进程的。有些linux实现了新的线程机制,但主流还是和我描述的一样)
   进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这也是进程和线程的重要区别。
     比如,windows中的explorer就是资源管理器进程,我们每打开一个窗口,这个进程就会创建一个线程。有上面的描述,我们可以知道,进程有独立的地址空间,多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
     在第一节中,我提到过,“并发!=多线程“,是的。如Unix操作系统和Windows操作系统支持多用户、多进程的并发执行,而Java这样的语言支持应用程序进程内部的多个执行线程的并发执行。我们知道,php在语法上是没有多线程这个概念的,那java/NET的多线程是怎么实现的。实际上,java只是通过native方法调用操作系统API来创建多线程而已。另外,我们经常说某个网站并发是多少多少,nginx是高并发服务器了。。这里的并发和我前面的并发概念是不同的。要想做到高并发,除了多线程等的实现,还需要各种好的IO机制,不然线程再多也没用,资源利用跟不上来。高并发又跟同步、异步等IO复用机制有了牵连。
      下面列举一下进程和线程中的一些概念。
进程:创建,销毁,创建子进程(fork),优先级。
线程:创建,挂起,恢复,销毁,切换,协作,睡眠,唤醒,等待,同步,锁,优先级。
      从上面的描述,基本可以理清进程和线程的关系了。最后总结下:
1.linux没有内核上的多线程实现,但是不能说linux没有多线程。WINDOWS有内核的多线程实现。
2.进程开销大,线程开销小,但是linux的进程和线程开销差异不明显。
3.并行的实现离不开多线程。
     再留个悬念,多线程的实现和运行还会涉及到同步异步,原子性等概念。这些概念是相互交叉的,这里先不做深入。

几组极易混淆概念的理解(1)--并发和并行

     最近正想整理下这个专题,想了下,主要有以下几组概念,我们时不时会听到,但只要一细想就会觉得困惑,觉得没那么简单。这几组概念有:
1.并发和并行
2.线程与进程
3.缓冲与缓存
4.同步与异步
5.阻塞与非阻塞
6.原子性与事务性
     这几组概念,不仅概念间容易混淆,而且一组概念和另一组概念之间又存在交叉,极容易搞混。
------------------------------------------------------------------------
    下面,就我所了解的知识,分门别类的谈一下这几个概念间的关系,如有不当之处,还望指出和补充。
1.并发( concurrency)和并行( Parallelism)
   狭义的并发和并行属于操作系统里的概念。并发和并行是两个即有相同处,又有区别的概念,相同的地方在于他们都是指同时处理多个任务。不同的地方在于并发是逻辑上的,并行是物理上真真实实的。
    我们都清楚,在单个CPU的情况下,对于到达CPU执行单元的作业(作业就是待执行的进程和线程),都是需要排队的,因为我只有一个窗口,你要吃饭,就必须到我这个窗口来,也就是说CPU资源是有限的。假如说这个时候,某个作业一直占着CPU资源不放,那么其他作业就得不到执行,也就是被阻塞,被挂起了。这就需要一种机制,保证每个作业都有机会被执行到,这种机制就叫做处理器的调度机制,其中又分为抢占式和非抢占式的调度。细分后又有先来先服务(老老实实排队,谁先到就服务谁),最短作业优先(哪个好搞定就先服务谁),优先级调度,时间片调度等。并发就是通过时间片轮转的方式实现的,一个作业执行一段时间后被中断,换另外一个上去,大家都有机会被执行到。
       时间片轮转,就涉及到一个进程切换的问题,频繁的切换必然带来性能开销。我们看到的一个程序一直在持续运行,但实际上并不是这样的,从CPU级别的粒度上讲,其实是多个程序间在快速的切换,只是这个切换的速度很快(想一下,CPU的主频现在都有2GHZ了),我们感觉不到而已。在早期的操作系统中,不支持多任务,一个任务在执行,其它任务就必须等待。
       废话说了这么多,就是要说明,并发就是多个进程或线程在同时执行,但实际上,他们并不是真正的在同一个时间点上一起跑的,而是我跑一段时间后,接下来你跑,我再跑,看起来我们都在跑,这就是并发。
     而并行,则是实实在在的多个进程同时跑在高速公路上,齐头并进。看下面的图,上面的是并发,下面的是并行。
bf.jpg
    通过我前面的描述,可以知道,并发是由CPU调度算法实现的,只需要一个CPU即可实现并发。而并行则要在多核或者多处理器情况下才能做到,单CPU是无法实现并行的,因为任一个时刻点上只有一个程序在处理器上运行。并行计算,这就是当今大型计算机所要实现的难题,如何让几千个CPU进行协作。并发和并行都需要处理器和OS的支持。
       提到并发,就难免会提到多线程,并发!=多线程,多线程只是一种并发的实现模型。这里暂且留作后话。根据我们前面的描述,可以知道,时间片切换是有开销的,因此多线程不一定就能发挥出更佳的效率,特别是在单处理器的情况下。故,多线程也是不能盲目迷信的。

转:迅雷、快车下载地址加密算法

转自:http://www.yexiwei.com/post/219/
留下备用
1、迅雷专用链接编码

在原地址前面加”AA”,后面加”ZZ”(不包括引号),地址变为

AAhttp://www.yexiwei.com/10k.jpgZZ

此地址base64编码为

QUFodHRwOi8vd3d3LnlleGl3ZWkvMTBrLmpwZ1pa

迅雷专链即在上地址前加thunder://,即

thunder://QUFodHRwOi8vd3d3LnlleGl3ZWkvMTBrLmpwZ1pa

2、快车专用链接编码

在原地址前后都加上”[FLASHGET]“(不包括引号),地址变为

[FLASHGET]http://www.yexiwei.com/10k.jpg[FLASHGET]

此地址base64编码为

W0ZMQVNIR0VUXWh0dHA6Ly93d3cueWV4aXdlaS5jb20vMTBrLmpwZ1tGTEFTSEdFVF0=

快车专链即在上地址前加flashget://,注意后面还要加上”&符号”,符号怎么得出不清楚,在最后面加的是我的个人信息,至今未有人报告转换错误,即

Flashget://W0ZMQVNIR0VUXWh0dHA6Ly93d3cueWV4aXdlaS5jb20vMTBrLmpwZ1tGTEFTSEdFVF0=&yexiwei

转:Nginx源码剖析之内存池,与内存管理(3)

全文总结

    来自淘宝数据共享平台blog内的一篇文章对上述Nginx源码剖析之内存池,与内存管理总结得很好,特此引用之,作为对上文全文的一个总结:

    Nginx的内存池实现得很精巧,代码也很简洁。总的来说,所有的内存池基本都一个宗旨:申请大块内存,避免“细水长流”。
3.1、创建一个内存池
    nginx内存池主要有下面两个结构来维护,他们分别维护了内存池的头部和数据部。此处数据部就是供用户分配小块内存的地方。


    //该结构用来维护内存池的数据块,供用户分配之用。  
    typedef struct {  
        u_char *last; //当前内存分配结束位置,即下一段可分配内存的起始位置  
        u_char *end; //内存池结束位置  
        ngx_pool_t *next; //链接到下一个内存池  
        ngx_uint_t failed; //统计该内存池不能满足分配请求的次数  
    } ngx_pool_data_t;  
    //该结构维护整个内存池的头部信息。  
    struct ngx_pool_s {  
        ngx_pool_data_t d; //数据块  
        size_t max;  //数据块的大小,即小块内存的最大值  
        ngx_pool_t *current;    //保存当前内存池  
        ngx_chain_t *chain; //可以挂一个chain结构  
        ngx_pool_large_t *large;    //分配大块内存用,即超过max的内存请求  
        ngx_pool_cleanup_t *cleanup;    //挂载一些内存池释放的时候,同时释放的资源。 
        ngx_log_t *log;  
    }; 
有了上面的两个结构,就可以创建一个内存池了,nginx用来创建一个内存池的接口是:

    ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log)(位于src/core/ngx_palloc.c中);

调用这个函数就可以创建一个大小为size的内存池了。

   

阅读剩余部分...

转:Nginx源码剖析之内存池,与内存管理(2)

Nginx源码剖析之内存管理


2、内存池操作


2.1、创建内存池


ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
    ngx_pool_t  *p;
    
    p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
    //ngx_memalign()函数执行内存分配,该函数的实现在src/os/unix/ngx_alloc.c文件中(假定NGX_HAVE_POSIX_MEMALIGN被定义):
    
    if (p == NULL) {
        return NULL;
    }
    
    p->d.last = (u_char *) p + sizeof(ngx_pool_t);
    p->d.end = (u_char *) p + size;
    p->d.next = NULL;
    p->d.failed = 0;
    
    size = size - sizeof(ngx_pool_t);
    p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
    //最大不超过4095B,别忘了上面NGX_MAX_ALLOC_FROM_POOL的定义
    
    p->current = p;
    p->chain = NULL;
    p->large = NULL;
    p->cleanup = NULL;
    p->log = log;
    
    return p;
}
例如,调用ngx_create_pool(1024, 0x80d1c4c)后,创建的内存池物理结构如下图:

3.jpg3.jpg

紧接着,咱们就来分析下上面代码中所提到的:ngx_memalign()函数。

阅读剩余部分...

转:Nginx源码剖析之内存池,与内存管理(1)

作者:July、dreamice、阿波、yixiao。
出处:http://blog.csdn.net/v_JULY_v/

引言    


    Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用。  


    其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx,以及诸多暂不曾得知的玩意儿。

    读者可以到此处下载Nginx最新版本的源码:http://nginx.org/en/download.html。同时,本文本不想给源码太多注释,因为这不像讲解算法,算法讲解的越通俗易懂越好,而源码剖析则不同,缘由在于不同的读者对同一份源码有着不同的理解,或深或浅,所以,更多的是靠读者自己去思考与领悟。

    ok,本文之中有任何疏漏或不正之处,恳请批评指正。谢谢。


Nginx源码剖析之内存池


1、内存池结构


    内存相关的操作主要在文件 os/unix/ngx_alloc.{h,c} 和 core/ngx_palloc.{h,c} 中实现,ok,咱们先来看内存管理中几个主要的数据结构:
typedef struct {    //内存池的数据结构模块
    u_char               *last;    //当前内存分配结束位置,即下一段可分配内存的起始位置
    u_char               *end;     //内存池的结束位置
    ngx_pool_t           *next;    //链接到下一个内存池,内存池的很多块内存就是通过该指针连成链表的
    ngx_uint_t            failed;  //记录内存分配不能满足需求的失败次数
} ngx_pool_data_t;   //结构用来维护内存池的数据块,供用户分配之用。

struct ngx_pool_s {  //内存池的管理分配模块
    ngx_pool_data_t       d;         //内存池的数据块(上面已有描述),设为d
    size_t                max;       //数据块大小,小块内存的最大值
    ngx_pool_t           *current;   //指向当前或本内存池
    ngx_chain_t          *chain;     //该指针挂接一个ngx_chain_t结构
    ngx_pool_large_t     *large;     //指向大块内存分配,nginx中,大块内存分配直接采用标准系统接口malloc
    ngx_pool_cleanup_t   *cleanup;   //析构函数,挂载内存释放时需要清理资源的一些必要操作
    ngx_log_t            *log;       //内存分配相关的日志记录
};

再来看看大块数据分配的结构体:
struct ngx_pool_large_s {
    ngx_pool_large_t     *next;
    void                 *alloc;
};

#define NGX_MAX_ALLOC_FROM_POOL (ngx_pagesize - 1)  //在x86体系结构下,该值一般为4096B,即4K

上述这些数据结构的逻辑结构图如下:

阅读剩余部分...

转:2011年10月百度,阿里巴巴,迅雷搜狗最新面试七十题(1)


   当即早已进入10月份,十一过后,招聘,笔试,面试,求职渐趋火热。而在这一系列过程背后浮出的各大IT公司的笔试/面试题则蕴含着诸多思想与设计,细细把玩,思考一番亦能有不少收获。

    上个月,本博客着重整理,此次重点整理百度,阿里巴巴,迅雷和搜索等公司最新的面试题。同上篇一样,答案望诸君共同讨论之,个人亦在慢慢思考解答。多谢。

    本人正在一步一步整理本文中50多道题的答案,希望诸君各位与我一起做这些题。已经做出来的题目我会把答案即时更新到文章中。诸君,一起努力吧。谢谢。July、2011.10.14更新。


第一辑:


1.十月百度:一个数组保存了N个结构,每个结构保存了一个坐标,结构间的坐标都不相同,请问如何找到指定坐标的结构(除了遍历整个数组,是否有更好的办法)?(要么预先排序,二分查找。要么哈希。hash的话,坐标(x,y)你可以当做一个2位数,写一个哈希函数,把(x,y)直接转成“(x,y)”作为key,默认用string比较。或如Edward Lee所说,将坐标(x, y)作为 Hash 中的 key。例如(m, n),通过 (m,n) 和 (n, m) 两次查找看是否在 HashMap 中。也可以在保存时就规定 (x, y) , x < y ,在插入之前做个判断。)

2.百度最新面试题:现在有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来。(编程珠玑上有此类似的一题,如果有足够的内存的话可以用位图法,即开一个1亿位的bitset,内存为100m/8== 12.5m, 然后如果一个数有出现,对应的bitset上标记为1,最后统计bitset上为0的即可。)

3.Alibaba笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法
String extractSummary(String description,String[] key words)
目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限编程语言)20分。(扫描过程始终保持一个[left,right]的range,初始化确保[left,right]的range里包含所有关键字则停止。然后每次迭代:
1,试图右移动left,停止条件为再移动将导致无法包含所有关键字。
2,比较当前range's length和best length,更新最优值。
3,右移right,停止条件为使任意一个关键字的计数+1。
4,重复迭代。
编程之美有最短摘要生成的问题,与此问题类似,读者可作参考。)

阅读剩余部分...

    Page :
  1. 1
  2. 2
  3. 3
  4. 4
  5. ...
  6. 11