Archive for the ‘TODO’ Category
MySQL支持很多字符串类型,以及它们的许多变化类型。这些数据类型在 4.1和5.0版本变化都比较大。可以说变得更复杂了。早在4.1版本中,每个字符串列都有自己的字符集和对于那些字符集的排序规则,或者叫做 collation(校对)。 VARCHAR 和CHAR 有两个主要的字符串类型就是VARCHAR和CHAR。它们都存储了字符 值。不幸的是,很难准确解释这些值怎样存储在硬盘和内存中,因为这些都是有存储引擎实现的。我们假设你使用的是MyISAM和/或者InnoDB.如果不 是,你最好查阅你使用存储引擎的相关文档。 让我们先看看VARCHAR和CHAR是怎样存储在硬盘上的。要注意的是 存储引擎可能存储的CHAR或者VARCHAR在存入内存和硬盘上有所不同的,以及当服务器从存储引擎获得了这个值的时候,会把这个值转为另一个存储引擎 的格式。下面就是两种类型的比较 VARCHAR: VARCHAR存储了变长的字符串以及它是最常见的字符串数据类型。它占 用的空间要少于定长的类型,因为它根据所需来决定需要的空间大小。特例就是MyISAM参数设为ROW_FORMAT=FIXED.这个参数使表的每一行 使用固定大小的空间以及浪费大量的空间。 varchar使用了1或者2额外的字节记录值的长度:如果长度大约为 255字节的话,大概使用1个字节,如果更多的话,那么就是2个字节。假如是latin1字符节,一个varchar(10)将会占用11字节的存储空 间。一个varchar(1000)使用上限为1002字节。因为需要2字节存储长度信息。 VARCHAR会对性能有所帮助,因为它节约了空间。然而,因为行是变 长,当你更新它们的时候,它们就会增长。这样会导致需要额外的一些工作。如果一行增长以及并不在原来的地址了。这些行为依赖于存储引擎。举个例 子,MyISAM可能把行分为碎片。以及InnoDB可能切开页,把行填充到它的内部。其他的存储引擎可能在适当的地方不会更新数据。 当最大列长度比平均长度要大的时候就值得使用VARCHAR.当很少更新 字段的时候,存储碎片就不是一个问题。以及当你使用复杂的字符集如UTF-8时,每个字符都使用变量的字节数存储。 在5.0以及最新的版本,当你存储和获取值的时候,MySQL会保留尾部 的空格。在4.1和更早的版本,MySQL去掉尾部空格。 CHAR CHAR是定长的:MySQL总是分配指定的内存空间去存储字符。当存储 了一个CHAR值,MySQL去掉尾部空格。值附加了空格是比较的需要。 如果你存储的字符串是非常短的,用CHAR是非常有用的。举个例子,存储 密码的MD5值使用CHAR是个好的选择。因为这个MD5一直是定长的。如果数据经常修改的话CHAR要优于VARCHAR。因为定长的行并不会有存储残 片。对于非常短的列,CHAR要比VARCHAR高效。一个CHAR(1)用来存储Y和N值。这只会使用1个字节,但是一个VARCHAR(1)会使用两 个字节。有个字节用来保存它的长度信息。 这个行为让人有点困惑,因此我们举一个例子。首先,我们创建一个有单独 CHAR(10)列的表以及存储一些数值。 mysql> CREATE TABLE char_test( char_col CHAR(10)); mysql> INSERT INTO char_test(char_col) VALUES -> (‘string1′), (‘ string2′), (‘string3 ‘); 当我们获取这个值的时候,尾部空格被去掉了。 mysql> SELECT CONCAT(“‘”, [...]
越来越多的开发者与设计者希望将自己的产品开源,以便其他人可以在他们的代码基础上做更多事,开源社区也因此充满生机。在我们所能想到的应用领域, 都有开 源软件存在(象 WordPress,Drupal 这些开源CMS)。然而很多人对开源许可并不了解,本文介绍开源领域常用的几种许可协议以及它们之间的区别。 什么是许可协议? 什么是许可,当你为你的产品签发许可,你是在出让自己的权利,不过,你仍然拥有版权和专利(如果申请了的话),许可的目的是,向使用你产品的人提供一定的权限。 不管产品是免费向公众分发,还是出售,制定一份许可协议非常有用,否则,对于前者,你相当于放弃了自己所有的权利,任何人都没有义务表明你的原始作者身份,对于后者,你将不得不花费比开发更多的精力用来逐个处理用户的授权问题。 而开源许可协议使这些事情变得简单,开发者很容易向一个项目贡献自己的代码,它还可以保护你原始作者的身份,使你至少获得认可,开源许可协议还可以阻止其它人将某个产品据为己有。以下是开源界的 5 大许可协议。 GNU GPL GNU General Public Licence (GPL) 有可能是开源界最常用的许可模式。GPL 保证了所有开发者的权利,同时为使用者提供了足够的复制,分发,修改的权利: 可自由复制 你可以将软件复制到你的电脑,你客户的电脑,或者任何地方。复制份数没有任何限制。 可自由分发 在你的网站提供下载,拷贝到U盘送人,或者将源代码打印出来从窗户扔出去(环保起见,请别这样做)。 可以用来盈利 你可以在分发软件的时候收费,但你必须在收费前向你的客户提供该软件的 GNU GPL 许可协议,以便让他们知道,他们可以从别的渠道免费得到这份软件,以及你收费的理由。 可自由修改 如果你想添加或删除某个功能,没问题,如果你想在别的项目中使用部分代码,也没问题,唯一的要求是,使用了这段代码的项目也必须使用 GPL 协议。 需要注意的是,分发的时候,需要明确提供源代码和二进制文件,另外,用于某些程序的某些协议有一些问题和限制,你可以看一下 @PierreJoye 写的 Practical Guide to GPL Compliance 一文。使用 GPL 协议,你必须在源代码代码中包含相应信息,以及协议本身。 GNU LGPL GNU 还有另外一种协议,叫做 LGPL (Lesser General Public Licence),它对产品所保留的权利比 GPL 少,总的来说,LGPL [...]
profiling 基础 http://www.xaprb.com/blog/2006/10/12/how-to-profile-a-query-in-mysql/ http://www.xaprb.com/blog/2006/10/15/a-case-study-in-profiling-queries-in-mysql/ http://www.xaprb.com/blog/2006/10/17/mysql-profiling-case-study-part-2/ profiling 进阶 http://www.mysqlperformanceblog.com/2009/01/19/profiling-mysql-stored-routines/ http://www.mysqlperformanceblog.com/2008/05/18/wanted-better-memory-profiling-for-mysql/ maatkit–perldoc mk-query-profiler profiling高级 http://dev.mysql.com/tech-resources/articles/pro-mysql-ch6.html http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html profiling 骨灰级 http://www.scribd.com/doc/2669413/DTrace-and-MySQL-Presentation http://forge.mysql.com/wiki/Using_DTrace_with_MySQL http://wikis.sun.com/display/BluePrints/Optimizing+MySQL+Database+Application+Performance+with+Solaris+Dynamic+Tracing via:http://www.muduo.net/index.php?uid-8974-action-viewspace-itemid-330618
1)设置 set profiling = 1 ; 2)执行一些SQL语句 3) 显示执行的语句及序号 show profiles; 4)显示某SQL执行情况 show profile [ ALL | BLOCK IO, CONTEXT SWITCHES, CPU, IPC, MEMORY, PAGE FAULTS, SOURCE, SWAPS] [for query n] ; 3315-bbs>show profile all for query 1\G; *************************** 1. row *************************** Status: starting Duration: 0.000032 CPU_user: 0.000000 CPU_system: 0.000000 Context_voluntary: 0 Context_involuntary: 0 Block_ops_in: 0 Block_ops_out: 0 Messages_sent: [...]
1、什么是XMPP ? XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测。它在促进服务器之间的准即时 操作。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。
SOCKS代理是目前功能最为全面,使用最为稳定的代理服务器,目前用SSH搭建SOCKS代理服务器上网,访问网络没有任何限制。下面重讲一下如何使用 SOCKS代理服务器。 用SSH搭建SOCKS代理上网,建议使用Firefox浏览器,因为Firefox支持SOCKS代理 远程域名解析,而IE只能通过类似SocksCap这样的第三方软件实现,不是很方便。 配置Firefox浏览器 在Firefox设置SOCKS远程域名解析,主要是为了防止DNS污染,具体设置方法是,在Firefox地址栏中,输入 about:config ,按确认,修改里面的一项数值,改成 network.proxy.socks_remote_dns=true 就可以了。 然后,打开FireFox浏览器,选择菜单栏的“工具/选项…”。选择“高级/网络”,点设置,就出现下面的界面,就可以进行代理服务器的设置了, 选中“手动配置代理”,然后在SOCKS主机上,填写代理服务器的地址127.0.0.1,端口1080,SOCKS类型选择“SOCKS V5”,这时Firefox就配置结束。 设置SSH 配置好了Firefox,就该配置SSH了,安全外壳协议(Secure Shell Protocol / SSH)是一种在不安全网络上提供安全远程登录及其它安全网络服务的协议。常用的SSH工具有开源软件PuTTY,支持SSH远程登录的主机可以实现 socks5代理服务器的功能,不过在PuTTY中没有配置文件,需要手动设置才能实现,且无法保存,而PuTTY完整版自带的pLink可以实现命令行 方式调用PuTTY实现SSH的加密通道。 具体的方法是,去PuTTY官方网站下载pLink这个文件>>点击这里下载,pLink 的调用参数是:plink -C -v -N -pw 密码 -D 本地端口 远程用户@IP或域名:远程希望打开的端口。 新建 一个文件,写入以下内容,另存为pLink.bat批处理文件,并放在Putty的安装目录内。 plink -N Username@sshServer -pw Password -D 127.0.0.1:1080 请将 Username sshServer Password三处改为用户自己登陆SSH服务器的用户名、服务器地址和密码。这个SSH帐号可以通过多种方法获得,例如用户购买了某些国外主机空间或 VPS就会有SSH帐号,或者在淘宝网也有SSH帐号出售,通常SSH帐号的价格大约是每年几十元人民币左右,当然,也有提供免费的SSH帐号>>点击这里了解 执行这个批处理文件,保持其窗口开启,一旦关闭窗口代理便失效。然后打开已经配置好127.0.0.1:1080的Socks5代理的 Firefox浏览器,就可以使用SOCKS代理服务器上网了。 其他设置技巧 为了方便代理服务器的快 速切换,建议安装一个名为QuickProxy的FireFox代理服务器扩展,可以实现一键切换代理功能,QuickProxy安装后在状态栏有一个按 钮,点击后可以启用、关闭Firefox浏览器的默认代理设置,可以快速在代理和非代理之间切换,很方便。界面如下图所示。 设置完成了之后,你就可以自由自在地在开放的互联网上傲游了。基于SSH的SOCKS代理稳定、快速、功能全面,是值得推荐的代理方法,使用过程中流量 需要自己把控,其浏览体验要远远高于其他代理软件。 via:http://blog.tianya.cn/blogger/post_show.asp?idWriter=0&Key=0&BlogID=245589&PostID=21554490
路线图是要在问题中有目标版本的设置等,如下: What is shown on the roadmap? * Releases that are not marked as released. * Releases that have a description or at least one visible issue. * Issues that have a “Target Version” set. * Issues that are matching the current project and that the logged in user has access to. 问题设置了目标版本,访问权限为默认,$g_roadmap_view_threshold = VIEWER; [...]
群组功能发帖时候增加编辑器,其实并不是很复杂,只不过我们要理解,为什么要这样修改代码。 *可能有些听不懂,不过不会影响修改,多学点东西总是好的吧? 首先,我们解析一下blog的编辑器。 看模板文件夹下cp_blog.htm里面的这段代码: 复制内容到剪贴板 代码: <textarea class=”userData” name=”message” id=”uchome-ttHtmlEditor” style=”height:100%;width:100%;display:none;border:0px”>$blog[message]</textarea> <iframe src=”editor.php?charset=$_SC[charset]&allowhtml=$allowhtml” name=”uchome-ifrHtmlEditor” id=”uchome-ifrHtmlEditor” scrolling=”no” border=”0″ frameborder=”0″ style=”width:100%;border: 1px solid #C5C5C5;” height=”400″></iframe> 第一步呢,我们先要读懂这两行代码: 这就是编辑器的比较核心的部分,用一个隐藏的textarea来提交信息,用js提取框架iframe里面的编辑内容,而iframe里面的部分是编辑器页面。 display:none 表示用css隐藏了textarea,看不到但是提交信息是可以发出去的。 我们会发现,textarea的iduchome-ttHtmlEditor和iframe里面的name和id都很像,对,这两个能合并在一起就是用这个挂钩的,当然,还要借助于js实现。 第二步,再看提交的时候,触发了什么,请看这两段代码,还是那个文件。 复制内容到剪贴板 代码: <input type=”button” id=”blogbutton” name=”blogbutton” value=”提交发布” onclick=”validate(this);” style=”display: none;” /> 复制内容到剪贴板 代码: <input type=”button” id=”issuance” onclick=”document.getElementById(’blogbutton’).click();” value=”保存发布” class=”submit” /> 如果刚才认真听课的同学都发现了,“display: none”又一次使用到了隐藏。 但是提交的时候更有趣: 下面的按钮触发的是上面按钮的动作,怎么做到的呢? 复制内容到剪贴板 代码: [...]
// 300) { text = text + “\r\n\n本文来自CSDN博客,转载请标明出处:” + location.href; clipboardData.setData(“text”, text); } }, 100); } } // ]]> // Thread 是threading模块中最重要的类之一,可以使用它来创建线程。有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法;另一种是 创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入。下面分别举例说明。先来看看通过继承 threading.Thread类来创建线程的例子: threading.Thread #coding=gbk import threading, time, random count = 0 class Counter(threading.Thread): def __init__(self, lock, threadName): ””’@summary: 初始化对象。 @param lock: 琐对象。 @param threadName: 线程名称。 ”’ super(Counter, self).__init__(name = threadName) #注意:一定要显式的调用父类的初始 化函数。 self.lock = lock def run(self): ””’@summary: 重写父类run方法,在线程启动后执行该方法内的代码。 ”’ global count self.lock.acquire() for i in xrange(10000): count = count + 1 self.lock.release() lock = threading.Lock() [...]
// 300) { text = text + “\r\n\n本文来自CSDN博客,转载请标明出处:” + location.href; clipboardData.setData(“text”, text); } }, 100); } } // ]]> // 1.join()方法的使用 join方法,如果一个线程或者一个函数在执行过程中要调用另外一个线程,并且待到其完成以后才能接着执行,那么在调用这个线程时可以使用被调用线程的join方法 例子: import threading, time class MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): time.sleep(5) print self.id t = MyThread(1) def func(): t.start() #t.join() print t.isAlive() print func() 输出结果 True(线程运行) none 然后等待5秒以后输出1 [...]

