<?xml version="1.0" encoding="UTF-8"?><!-- generator="WordPress/2.8.3" -->
<rss version="0.92">
<channel>
	<title>Terrysco&#039;s Blog</title>
	<link>http://www.terrysco.com</link>
	<description>仅关注于互联网行业， Linux平台开发。</description>
	<lastBuildDate>Sat, 13 Feb 2010 10:23:04 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	
	<item>
		<title>archlinux上搭建android开发环境</title>
		<description><![CDATA[其实在archlinux上搭建Android的开发环境更加简单，我们甚至不需要去官方网站下载SDK，因为aur的源里面都有了。首先安装eclipse开发环境（虽然netbeans现在也有android开发包，但配置起来很麻烦）。
sudo pacman -S eclipse jdk
然后使用aur安装eclipse-android（ADT）以及android的sdk。
yaourt -S eclipse-android android-sdk
完成后，我们就可以打开eclipse来创建android项目了，但在这之前，我们先做一些简单的配置，window菜单的“Android SDK and AVD manager”选项打开后，选择update all，安装SDK platform android 2.1（最新版）。
这里需要注意下，arch默认为我们安装的SDK文件属主不是自己，该目录下没有可写的权限，所以在安装的时候可能会失败，我们事先要把SDK目录chown成自己就没问题了。如果发现没有安装成功，仔细查看下日志，我第一次安装的时候就是因为目录不可写的问题。
完成后在eclipse的首选项里面配置下android的SDK路径，arch默认安装在/opt/android-sdk目录下，我们手动指定即可。
所有配置都已完成，我们现在可以参考android官方文档开始创建项目了。

]]></description>
		<link>http://www.terrysco.com/node/archlinux-android-environment.html</link>
			</item>
	<item>
		<title>SDLMAME的家用机模式</title>
		<description><![CDATA[今天看到一个新的neogeo的bios，点击这里可以下载。运行sdlmame的时候可以指定一个bios，比如
sdlmame -bios uni-bios_2_0 kof98
启动后即可设置是否采用家用机模式，如果还想设置下次进入这个bios的界面时候ABC三键一起按（是游戏中的ABC，不是键盘）。另外游戏中可以同时按下1P的开始键和投币键，即可调出来一个作弊菜单。
如果你同时按下ABC时键盘冲突，可以参考我的另外一篇文章：
XMAME热键设置
最后，如果嫌每次都输入-bios选项麻烦，可以手动加一个alias，编辑.bashrc文件，加入一行：
alias sdlmame=&#8217;sdlmame -bios uni-bios_2_0&#8242;
source .bashrc
以后只要运行sdlmame kof98就可以了。
enjoy mame games!
]]></description>
		<link>http://www.terrysco.com/node/sdlmame-cheat.html</link>
			</item>
	<item>
		<title>firefox3.5关联amule</title>
		<description><![CDATA[自从firefox3.5和amule不能通过常规办法关联后，就一直借助opera做下载的跳转，今天看到一个老外用的办法，试了下可行，分享给各位。
$ gconftool-2 -t string -s /desktop/gnome/url-handlers/ed2k/command &#8220;/usr/bin/ed2k %s&#8221;
$ gconftool-2 -t bool -s /desktop/gnome/url-handlers/ed2k/needs_terminal false
$ gconftool-2 -t bool -s /desktop/gnome/url-handlers/ed2k/enabled true
]]></description>
		<link>http://www.terrysco.com/node/firefox3-amule.html</link>
			</item>
	<item>
		<title>豆瓣电台上线了</title>
		<description><![CDATA[今天Gmail收到一封豆瓣的邮件，邮件标题为&#8221;豆瓣送你一部私人音乐电台&#8221;，自己本身对豆瓣的产品从技术到体验还是比较中意的，尤其之前看过豆瓣的开发架构演变过程，更是觉得不错。
互联网很多产品都在改变我们的生活，正如邮件中所说：我们后台的机器人会不断模仿和学习你的个人口味，算出你真正想听的歌曲。
确实，现实生活中，大部分用户电脑上面的音乐文件都是自己喜欢的，听的时间一长的确比较腻味，新的音乐流行的音乐又不一定对自己的口味。或者选择QQ音乐等推荐，但这种推荐往往并不是自己真正喜欢的东西。如果通过一种方式或者算法程序提供给你自己喜欢的音乐，或者客观根据你的音乐喜好给你推荐你没听过但”应该“会喜欢的音乐，那多好，豆瓣电台正是如此。
试用了一下，通过三种方式”喜欢，删除，跳过“来判别你的音乐喜好，通过你的类似微软语音识别软件的”调教“之后，想听的音乐相似度越来越高。另外，还可以自定义自己喜好的歌手，我想这个会更加精确选择你喜好的音乐。
总之很有创意，因为有了喜好分析算法，不单单是一个在线流媒体播放器，不错的产品，应该可以删除您电脑中庞大的mp3或者更大格式的文件了。
]]></description>
		<link>http://www.terrysco.com/node/douban-fm.html</link>
			</item>
	<item>
		<title>关于drupal架构的思考</title>
		<description><![CDATA[自从drupalchina推荐我的blog后，很多drupal的开发者和我讨论drupal的性能，drupal的缺陷，大有感触。
很多人都说drupal站点不适合扩展，或者简单的做到数据库和代码分离后就茫然了。最近参考了很多软件和web架构的书，反过来对drupal这个系统做了一些关于架构扩展的思考。
以自己现有水平来看，drupal的瓶颈似乎在PHP代码执行层面。网上说使用APC加速可以大大加强drupal的性能，自己还没有手动进行测试，所以没有发言权。但目前在自己使用过程中，还是看到drupal一些小尴尬。
drupal的缓存系统比较简单，只是对匿名用户（因为匿名用户访问页面变更比较少）进行页面缓存，并且是以数据库的形式进行缓存。直接序列化页面到cache_page表中，这种性能可想而知，如果对百万级的访问量来说，db将会是个噩梦。
drupal用apache的rewrite模块实现了简洁链接，伪静态页面是提高了SEO效果，但是针对生成静态页面来说，还是比较困难的。另外，drupal的代码可以更加精简，否则为了强大的扩展性损失大幅性能也是不可取的。
有人说代码和架构扩展没有关系（忘记哪位大牛说的），其实我不是很赞同这句话，代码和数据库刚开始的设计决定或者制约了很多后面需要扩展的条件，比如水平划分数据库表的时候，最好是选取primary key，但是这个字段最好不是auto_increment的（道理很容易想到），再比如数据库抽象层的代码如果做memcache缓存，好修改吗？
很多时候，代码级别制约扩展性的很大一个因素就是联合查询，因为在做垂直划分数据库的时候，分离的都是一些关联性不大，并且不会牵扯到联合查询的库表，但drupal很多地方都使用的inner join（几乎每个模块都能看到）。当用户并发数越来越大，服务器最大的压力来源于数据库，这时，有些朋友就说了”负载均衡“啊。
没有那么简单，首先我们考虑基于重定向的负载均衡，多做几个后端服务器，使用RR或者简单随即抽取机制来轮流使用服务器，drupal和其他站点不同的一点小小特性就是唯一入口index.php，也就是说在这个文件我们可以写入一些代码，实现重定向的负载均衡，这点是比较合适的。或者您为了避免不是真正的压力平衡，可以使用DNS负载均衡，这样下来，稍微大点的数据量我们勉强顶得住了。
从水平划分的方面来看，首先最大的表应该是drupal的node表，nid字段是primary key,并且auto_increment的，这就很难进行分表存储。另外就算使用了一些别的算法，分N个表出来存储node，问题是如果使那些众多的node相关操作代码使用不会出问题？
另外一种做法就是使用ngnix的反向代理功能，很多java的开发者叫分布式。就算后端服务器性能差异，我们还是可以通过配置文件来决定权重，能者多得的方式，让每个机器发挥到极限。还可以考虑的方式就是使用apache加载我们定义的lua脚本，匹配select和insert，update，delete等字符串，用来区分属于何种sql查询，进一步实现读写分离。不过在机器之间的数据同步也是个麻烦的事情，我没有在运维方面有多少经验，最多就是使用过rsync。
分析种种情景，使用drupal的用户不要担心，只要我们想的到，可扩展的办法还是很多的。性能决定在你自己手里。
]]></description>
		<link>http://www.terrysco.com/node/drupal-extension.html</link>
			</item>
	<item>
		<title>定制wordpress的文章发布</title>
		<description><![CDATA[wordpress在发布文章的时候，已经集成了很多特性，比如tinyMCE这个可视化编辑器，文章标签（tags），别名（alias），以及分类（taxonomy）。但对于一个基于wordpress的项目，我们仍然需要对其高度定制，wordpress为我们提供了add_meta_box，来优雅的解决这个问题。
用起来比较简单，就6个参数，其中第三个参数为callback。我们可以在这个callback中设置一些输出信息，或者一个表单，最常用的还是后者。比如我们设置一个textarea的文本区域，用来保存一些用户输入的信息，这样用户发布这个post或者page的时候，这个信息就会保存到postmeta表里。其次，我们可以使用get_post_meta来获取这个数据。说到这里，有必要简单提下wordpress的表结构。
不像drupal那么复杂，wordpress主要的内容信息其实就两个表，一个post表，一个postmeta表，前者存放用户发布的基本内容，比如一篇blog，后者存放这个内容的一些附加信息，比如我们刚才定制的那个textarea。
最后，这里说下我碰到的一个问题以及自己的解决办法。在使用add_meta_box的时候，我们只是给post这个表单加入了一些输入控件，如果要处理文件的上传，或者使用curl等库来处理更高级的http操作，就出现问题了。因为form这个表单本身在wordpress中就定义好了，我们知道如果上传文件，form表单必须设置enctype = &#8220;multipart/form-data&#8221;属性，但默认的是没有的。google大叔告诉我很多人直接修改了wordpress的core，但我觉得这不是一个好的处理方式，我的解决办法是加入一段javascript来动态修改。
window.onload = function() {
	var form = document.getElementById(&#8221;post&#8221;);
	form.enctype = &#8220;multipart/form-data&#8221;;
};
这段javascript可以替换为更好的jquery代码，因为jquery等很多javascript类库已经集成到wordpress里面。目前能想到的就是这种方式，或许我还不够了解wordpress的机制？
]]></description>
		<link>http://www.terrysco.com/node/wordpress-meta-box.html</link>
			</item>
	<item>
		<title>初涉wordpress开发</title>
		<description><![CDATA[近期涉及到wordpress-MU版本的开发工作，因为用户对其插件buddypress比较感兴趣。看了两天的文档，感慨wordpress文档的匮乏。。。
除了少的可怜的官方文档，基于codex系统，很多页面都没有书写外，自己down了一份plugin development的pdf，看完这个pdf才有点插件开发的感觉。写了4-5个小插件，熟悉了下wordpress的hook（wp中称作action和filter）。感觉还是不如drupal的模块优雅和灵活，但定制一个系统还是比较简单的，最大的痛苦就是wordpress的api函数太多，而很多都没有文档，不知道该如何选择，看了很多sample，用的还都不一样，版本之间留有差异性，不像drupal，5.x和6.x之间分别保持统一。
目前看来，一个buddypress新建一个用户，数据库中会多出8个表，这个恐怖的事实在网上已经有商业插件解决，不知道这个项目到底是怎么回事？
另外，视频方面采用了vimeo，开发和调试阶段颇为麻烦，因为国内的防火墙墙掉了很多应用，vimeo也不例外，使用vpn虽然解决了这个问题，但文档和wordpress一样少的可怜。
经过5天的google和编码，还算有点收获，过几天不忙了整理点文档共享给wordpress的插件开发者们。感慨：好的开源项目，如果文档不完善，依然是一件痛苦的事情。
]]></description>
		<link>http://www.terrysco.com/node/wordpress-starting.html</link>
			</item>
	<item>
		<title>给drupal批量导入外部数据</title>
		<description><![CDATA[很多时候，我们想给自己的drupal站点批量导入节点数据，其中包括很多方法，例如csv格式文件的导入，通过别的站点抓取到得信息，整合别的系统时，相互数据的迁移都要用到这些内容。我们建立一个简单的模型，只考虑节点基本数据，不考虑其他因素（比如节点图片，节点术语分类等等），将模型简单化有助于我们解决问题。
以拿抓取页面为例，我们使用正则表达式过滤出需要的信息后，将其存放在一个一维关联数组中，其中键对应数据库中的节点字段，比如title，body，name。。。然后我们手动调用node_submit方法，将一维数组传进去，这个方法会对我们的数组做一些存表之前的工作，我们直接可以在api.drupal.org查看这个方法的代码。
&#60;?php
function node_submit($node) {
  global $user;

  // Convert the node to an object, if necessary.
  $node = (object)$node;

  // Auto-generate the teaser, but only if it hasn't been set (e.g. by a
  // module-provided 'teaser' form item).
  if (!isset($node-&#62;teaser)) {
    $node-&#62;teaser = isset($node-&#62;body) ? node_teaser($node-&#62;body, isset($node-&#62;format) ? [...]]]></description>
		<link>http://www.terrysco.com/node/drupal-colletion-info.html</link>
			</item>
	<item>
		<title>Mysql的一些问题总结</title>
		<description><![CDATA[最近时间比较多，决定花些时间深入研究下mysql，尤其是性能和高负载站点的优化问题。不可避免的再次察漏补缺下基础知识，还是发现一些以前忽略的小细节，正可谓温故知新。

使用alter语句修改表的时候，change和modify都可以修改表的定义，不同的是change后面需要写两次列名，但可以修改列名，而modify则不行。
insert语句一个很好的特性：可以一次插入多条记录。格式为：insert into table (field 1, &#8230; , fieldn) values (value1, &#8230; , valuen), (value1, &#8230; , valuen); 这个特性在插入大量记录时，节省很多网络开销，大大提高效率。
其实查询Mysql安装后自带的帮助文档是很方便的，在提示符中键入 ? contents，根据结果依次使用问号操作符做进一步查询，即可获得详细信息。
Blob和text类型会引起一些性能问题，尤其是删除了大量记录的时候。应该使用optimize table功能进行碎片整理。
MyISAM引擎建议使用固定长度的数据列代替可变长度的数据列，而innodb引擎建议使用varchar类型，因为char平均占用空间多于varchar。
可以使用合成索引来提高大文本字段的查询性能，在表的设计中多一个字段，用来存储大文本的md5值，精确匹配大文本查询的时候可以利用该文本的md5值进行查询，以减少I/O，提高查询效率。

]]></description>
		<link>http://www.terrysco.com/node/mysql-tips.html</link>
			</item>
	<item>
		<title>使用 PHP 和 Apache Solr 实现企业搜索</title>
		<description><![CDATA[来源：http://www.ibm.com/developerworks/cn/opensource/os-php-apachesolr/index.html
通过本文了解如何将企业级搜索引擎 —— Apache Software Foundation 的 Solr —— 与 PHP 应用程序结合使用。
在 “用 PHP 构建自定义搜索引擎” 中，我结合使用 PHP 与开源 Sphinx 搜索引擎创建了文本密集型数据库查询的快速备选方法，例如 MySQL 中的 LIKE 和 MATCH（要获得与 Sphinx 相关的信息，请参阅 参考资料）。
Sphinx 非常易于安装和维护，并且功能十分强大。而且，Sphinx 的最新版本现在提供了一个本机 MySQL 引擎，不需要运行独立的 Sphinx 守护进程。V0.9.8（撰写本文时的最新版本）还添加了地理距离（geodistance）查询，用于查找在给定位置的某个距离范围内的记录；并添加了名为多查询（multi-query）的功能，它是在单一网络连接中绑定多个查询和结果集的优化功能功能。

Sphinx 一直以来不断改进，并且是购物站点、博客和许多其他应用程序的理想选择。根据 Sphinx 站点的数据，一个应用程序现在将索引 700 百万个文档，或者索引大约 1.2 百万兆字节数据。因此，我毫不犹豫地向您推荐 Sphinx。
但是，当应用程序或站点变得越来越流行、使用量逐步增加时，Sphinx 可能无法提供相应的几项功能。尤其是，Sphinx 仍然不能够自动复制或分发其索引，使其守护进程成为单点故障（作为解决方法，几台计算机可以索引同一个数据库，并且可以将这些系统聚合在一起）。 Sphinx 不突出显示搜索结果（如 Google 在显示缓存页面时所做的操作），不保留或缓存最近搜索到的结果，并且不支持正则表达式 (regex) 或与日期相关的操作。
如果要寻找那些功能或者准备采用企业级解决方案，请考虑 Apache Software Foundation 的 Solr 项目。基于 [...]]]></description>
		<link>http://www.terrysco.com/node/solr-entry.html</link>
			</item>
</channel>
</rss>
