昨天导师分配了一个科研的课题给我了.
即将要进入读博阶段.
玩电脑N年,给了我一个经验,凡事都是需要积累的,没有积累,很难成功.
想来做科研也是一样.
如果不用比别人更多的时间去看文章去搞实验,靠小聪明,是不可能有成的,即便是有成,也不是自己的实力使然,估计也是因为导师太牛的原因.
读博不仅仅是为了出成果,是为了让自己能独当一面,所以导师虽然牛,但这两年得完成自己的积累才是重点.
我的人生虽然不如其他大人物的多姿多彩,但我希望我的人生不平凡.
想得到什么,就得付出一些东西.
电脑方面的研究,要停下来一段时间了,以后一段时间只做重复劳动,不再做开发了,然后就等着美元过来.
上次的文章中的计划也要开始实现了.
女朋友家里太过经济太过现实,我不太想在这方面再伤神了了,反正就顺其自然,不再强求,一切随缘.一切还是凭实力说话,现在说再多解析再多也是枉然.
本日记理清未来思路,勉励自己,勇往直前.
莫羡三春桃与李,应看桂花向秋荣.
日记:10月即将来了,人生即将要进入另一阶段,化龙还是继续做条蛰伏的小虫就看这次了
September 27th, 2011 by 黎 浩江 No comments »16美刀/天纪念日,再修正一下短期的人生目标
September 27th, 2011 by 黎 浩江 7 comments »今天第一次突破16美刀,纪念一下,因为16美刀相当于100RMB了.
学了N年的PHP,HTML,CSS,JAVASCRIPT,写过的代码没10万行都有5万行了.
今天才真正觉得学这些东西有小小用.
今天在地铁听到两很猥锁的中年男性聊天,一男说:”唉,生意不好做啊,微利啊,快餐店那里一个月才2~3万利润,一年才二三十万;茶庄那里一天只要例行送单出去就有几十万了;不如将快餐店出租还好!”
我在旁边听到,只能闭目养神,心里就想:”晕死,原来开快餐店也能月入2~3万,看到原定的100美元1天的目标实在是太低了,至少不能像这两个大叔那样吧”.
希望尽快实现100美刀一天,然后向300美刀进军,这样高消耗脑细胞的工作,如果不能比快餐店还要高收入,做来还有什么意义呢?
另:有个朋友发email问我如何赚的:回这个朋友:
努力吧,如果你可以坚持连续5个月下来的编程(不包括我大学期间花了三年来学基础[自学]),将一个代码从初始成形到修改到300个版本以上,还要忍受住连续5个月被女朋友BS说这样做是浪费时间的话.
你一定会收入超过我几十倍,至少我认识一个朋友,他”日”入是7000RMB的,就被女朋友BS了至少三年,应该说在那三年里,我也认为这R是游手好闲的,没想到时至今日,我非常羡慕距,那R的已经有公司了.
人生,还是需要努力的,有一天你坐着收美元,是因为前些天,你睡着都在写代码.
有时,真后悔喜欢上这些东西,如果我喜欢的是经济学,天天炒炒股,那人生多幸福啊;又或者,我喜欢上写小说,天天YY就可以赚几下万,那该多好啊,我有个女同学,听说她写小说可以用敲烂几块键盘换来几万元/月的.
唉,怎么就走上了这条天天死脑细胞的路呢.
drupal hack core:node_load , 性能再度提升
September 18th, 2011 by 黎 浩江 9 comments »我的采集站不会有除了我以外的别的用户,bluehost的垃圾性能也不可能支持多用户像论坛那样聊天
所以为了节约性能,
若你的站点的文章只由一个用户发表,则大可放心去用下面的hack,
node_load:凡是要读取node的时候都会用到,即便是views
Node.module,node_load在单用户的时候是非常浪费性能的,因为node_load的时候会inner join user,就是说一个node_load至少要两次inner join,
我的bluehost在load一篇文章时要用500ms,用了下面的hack后是250ms,性能加快了一半
function node_load($param = array(), $revision = NULL, $reset = NULL) {
static $nodes = array();
if ($reset) {
$nodes = array();
}
$cachable = ($revision == NULL);
$arguments = array();
if (is_numeric($param)) {
if ($cachable) {
// Is the node statically cached?
if (isset($nodes[$param])) {
return is_object($nodes[$param]) ? drupal_clone($nodes[$param]) : $nodes[$param];
}
}
$cond = 'n.nid = %d';
$arguments[] = $param;
}
elseif (is_array($param)) {
// Turn the conditions into a query.
foreach ($param as $key => $value) {
$cond[] = 'n.'. db_escape_table($key) ." = '%s'";
$arguments[] = $value;
}
$cond = implode(' AND ', $cond);
}
else {
return FALSE;
}
// Retrieve a field list based on the site's schema.
$fields = drupal_schema_fields_sql('node', 'n');
$fields = array_merge($fields, drupal_schema_fields_sql('node_revisions', 'r'));
//hack
//$fields = array_merge($fields, array('u.name', 'u.picture', 'u.data'));
// Remove fields not needed in the query: n.vid and r.nid are redundant,
// n.title is unnecessary because the node title comes from the
// node_revisions table. We'll keep r.vid, r.title, and n.nid.
$fields = array_diff($fields, array('n.vid', 'n.title', 'r.nid'));
$fields = implode(', ', $fields);
// Rename timestamp field for clarity.
$fields = str_replace('r.timestamp', 'r.timestamp AS revision_timestamp', $fields);
// Change name of revision uid so it doesn't conflict with n.uid.
$fields = str_replace('r.uid', 'r.uid AS revision_uid', $fields);
// Retrieve the node.
// No db_rewrite_sql is applied so as to get complete indexing for search.
/*
//hack
if ($revision) {
array_unshift($arguments, $revision);
$node = db_fetch_object(db_query('SELECT '. $fields .' FROM {node} n INNER JOIN {users} u ON u.uid = n.uid INNER JOIN {node_revisions} r ON r.nid = n.nid AND r.vid = %d WHERE '. $cond, $arguments));
}
else {
$node = db_fetch_object(db_query('SELECT '. $fields .' FROM {node} n INNER JOIN {users} u ON u.uid = n.uid INNER JOIN {node_revisions} r ON r.vid = n.vid WHERE '. $cond, $arguments));
}
*/
if ($revision) {
array_unshift($arguments, $revision);
$node = db_fetch_object(db_query('SELECT '. $fields .' FROM {node} n INNER JOIN {node_revisions} r ON r.nid = n.nid AND r.vid = %d WHERE '. $cond, $arguments));
}
else {
$node = db_fetch_object(db_query('SELECT '. $fields .' FROM {node} n INNER JOIN {node_revisions} r ON r.vid = n.vid WHERE '. $cond, $arguments));
}
if ($node && $node->nid) {
// Call the node specific callback (if any) and piggy-back the
// results to the node or overwrite some values.
if ($extra = node_invoke($node, 'load')) {
foreach ($extra as $key => $value) {
$node->$key = $value;
}
}
if ($extra = node_invoke_nodeapi($node, 'load')) {
foreach ($extra as $key => $value) {
$node->$key = $value;
}
}
if ($cachable) {
$nodes[$node->nid] = is_object($node) ? drupal_clone($node) : $node;
}
}
return $node;
}
by:http://www.trackself.com
drupal hack core:drupal_lookup_path hack了后性能会提高很多
September 17th, 2011 by 黎 浩江 2 comments »(先别说mysql有缓存什么的,我一开始也以为缓存什么的,我只知道做了这个hack后,站点MYSQL查询真快了0.5s,不是页面快了0.5s)
如果站点启用了path模块或者pathauto模块,并且站点不是多国语言,只有单种语言的话(我指的是你没在drupal中增加语言),我认为都应该使用这个hack,因为drupal设计是为了能多国语言的,但默认的时候是单语言的.
在使用垃圾主机的时候,访问量大于1000IP/day的时候,这个hack为了节省了很多性能
启用了devel模块后,你会发现”drupal_lookup_path”这样的查询会有上百个
并且,并不是所有的drupal_lookup_path的查询都在一个数量级上的,如果只有少量的几个不在一个数量级可以认为是缓存,但如果有一半呢?
includes/path.inc
下面是被我hack过的drupal_lookup_path,将language相关的删除
在改动之前,先为url_alias表增加src,dst的索引
改动后,我的bluehost环境下,快了0.5s一个页面.
function drupal_lookup_path($action, $path = '', $path_language = '') {
global $language;
// $map is an array with language keys, holding arrays of Drupal paths to alias relations
static $map = array(), $no_src = array(), $count;
$path_language = $path_language ? $path_language : $language->language;
// Use $count to avoid looking up paths in subsequent calls if there simply are no aliases
if (!isset($count)) {
$count = db_result(db_query('SELECT COUNT(pid) FROM {url_alias}'));
}
if ($action == 'wipe') {
$map = array();
$no_src = array();
$count = NULL;
}
elseif ($count > 0 && $path != '') {
if ($action == 'alias') {
if (isset($map[$path_language][$path])) {
return $map[$path_language][$path];
}
// Get the most fitting result falling back with alias without language
/*
//hack
$alias = db_result(db_query("SELECT dst FROM {url_alias} WHERE src = '%s' AND language IN('%s', '') ORDER BY language DESC, pid DESC", $path, $path_language));
*/
$alias = db_result(db_query("SELECT dst FROM {url_alias} WHERE src = '%s'", $path));
$map[$path_language][$path] = $alias;
return $alias;
}
// Check $no_src for this $path in case we've already determined that there
// isn't a path that has this alias
elseif ($action == 'source' && !isset($no_src[$path_language][$path])) {
// Look for the value $path within the cached $map
$src = FALSE;
if (!isset($map[$path_language]) || !($src = array_search($path, $map[$path_language]))) {
// Get the most fitting result falling back with alias without language
/*
//hack
if ($src = db_result(db_query("SELECT src FROM {url_alias} WHERE dst = '%s' AND language IN('%s', '') ORDER BY language DESC, pid DESC", $path, $path_language))) {
*/
if ($src = db_result(db_query("SELECT src FROM {url_alias} WHERE dst = '%s'", $path))) {
$map[$path_language][$src] = $path;
}
else {
// We can't record anything into $map because we do not have a valid
// index and there is no need because we have not learned anything
// about any Drupal path. Thus cache to $no_src.
$no_src[$path_language][$path] = TRUE;
}
}
return $src;
}
}
return FALSE;
}
其实我早就想这么改了,但觉得hack core很不好,又想到,这查询其实也没什么呀
直到有一天我分析mysql_slow_query的时候才发现,不hack不行了,这样的语句在站点忙的时候居然占用了3S,而且很多条.
改动后,虽然在繁忙的时候也会占用1S,但多多少少减少了不是?
而且据我分析:drupal每个页面至少会有30~150个这样查询,每个查询节约1ms,都能节约100ms了,而且事实上不止1ms
你们可以做一下select SQL_NO_CACHE 进行同时上100条的查询.会发现差别实在太大了.
by:http://www.trackself.com
bluehost:不能打开drupal的comment模块
September 17th, 2011 by 黎 浩江 No comments »我的某个drupal站点流量:3000IP一天的站点,垃圾评论大约是300条一天,用的模块是spam
结果发现网站性能比较差
因为关闭了comment模块和与此相关的模块.
得出结论:在bluehost站点上,最好还是完全静态化的好,有评论也是浪费表情的,总有一天会因为评论搞死站点.