易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
值得一用的5.3RC4

值得一用的5.3RC4

原文来自:http://www.mikespook.com/index.php/archives/352

不过,我感兴趣的也就两个:

1、延迟绑定

2、匿名函数

原文如下:

6月19日发布的PHP 5.3 RC4 同之前的RC版本并无很大出入,仅仅是修复bug和稳定性的改进。

新的一些特性,大家都讨论过了。不过我觉得还是有必要再罗嗦一下。

关于命名空间

namespaces 多少人期待了多少年,时间长到我以为 php 不会有命名空间了。突然有消息说 5.3 含有 namespaces,并且使用很有争议的“\”作为分隔符号。

其实,没有命名空间,大家都想出了各种各样的替代方法。比如经典的“_”对应子目录之类的。在大家屡试不爽的时候,突然在一个小版本号升级中引入了 namespaces,实在让人摸不着头脑。不过看一下从 php4 -> php5 的升级周期,或许真正的 namespaces 只有在 php6 的时候才能稳定和成熟。php 5.3 的namespaces 或许只是 perview 而已。

这些大家应该都是知道的,不多说了。总之 namespaces 很好用,又总之,真正用到 namespaces 的那天还很遥远。

关于推迟静态绑定

叫这个名字,不一定准确,我只是隐约记得 Late Static Bindings 是这个叫法吧。这个东西能带来一个好处,就是代码的动态性更强,越晚的绑定,越低的耦合。我遇到过这种情况,在项目中有一个类要重写其中的一些方法,但是 由于过早的绑定机制,导致不重写其中的大部分代码就不可能完成类似的任务。最后的结果是出现了种种丑陋的,难以维护的代码编写方式来实现这个本不复杂的问 题。

例如在php网站上提供的这个代码中:

class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
self::who();
}
}

class B extends A {
public static function who() {
echo __CLASS__;
}
}

B::test();

在之前的php版本中,为了让 B::test() 输出 B 这个结果,唯一的方法是在 B 类中重写 test 方法(这个时候粘贴-复制-修改是好办法)。如果这样的方法有很多,那么工作量还是很大的,特别是在维护的时候……至少我是经常会忘记有哪些类似的代码需 要修改。
有了 Last Static Bindings:

class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); // Here comes Late Static Bindings
}
}

class B extends A {
public static function who() {
echo __CLASS__;
}
}

B::test();

如我所愿,现在的输出是 B 了,使用 static 关键字,让 who 方法的调用延迟到最后才绑定到真正的调用上。这样,就可以让代码变得简介并且容易理解。

关于匿名函数

匿名函数,也就是 Anonymous functions 其实并不是个完全陌生的家伙。create_function 这个函数已经给无数的程序员带来了甜蜜的感觉。只是 create_function 使用起来一点也不友好,同时字符串化的功能代码混乱难读。尤其是需要编写大段的匿名函数时,用 create_function 绝对是噩梦。现在真正意义上的匿名函数的出现,会给 php 带来什么影响呢?我觉得至少,在一些时髦的框架中会很快引入并应用这种特性,用这个语法糖去更简洁的实现一些功能。比如插件,再比如 DI……

$helloWorld = function ($name) {
return "Hello world! Hello {$name}";
};

很像 javascript?也许吧!

在不断的升级中 php 引入了很多新的功能,也提供了各种不同的体验。同时越来越庞大,学习也越来越困难。它,还能保持它的本色吗?


关于命名空间,我实在是不能忍受,反斜杠本来就是转义的,现在变成命名空间了。。。
可是有什么办法呢? .被用掉了,::也被用掉了
唉。。。
匿名函数的使用往往多用于插件中,避免与原来的函数(命名)产生冲突,这是最好的方法了。
延迟绑定,可以让PHP对于一些模式的使用变得更加优雅?或许这么说比较好吧


一段有意思的JS代码

一段有意思的JS代码

这段JS代码很有意思,可以在页面上写字。。。
原文来自knowsky,不过不建议看原文,原文广告太多。
原文地址为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>写字</title>
<style type="text/css">
* {
-moz-user-select:none;
border:0px;
}
#tips {
width:850px;
padding-top:8px;
padding-bottom:8px;
background:#999999;
color:#FFFFFF;
text-align:center;
margin:auto;
font-size:14px;
}
</style>
<script type="text/javascript">
var Is_Mouse_Down = false
var Is_First=1
function Create(evt){
evt=evt?evt:window.event
if(Is_Mouse_Down){
if(evt.ctrlKey){
Clean(evt)
}
else {
Write(evt)
}
}
}
function Write(evt){
evt=evt?evt:window.event
var Obj_Nian=document.createElement("DIV")
Obj_Nian.style.position="absolute"
Obj_Nian.style.left=evt.clientX-10+"px"
Obj_Nian.style.top=evt.clientY-10+"px"
switch(Is_First){
case 1:Obj_Nian.innerHTML=".";break;
case 2:Obj_Nian.innerHTML=".";break;
case 3:Obj_Nian.innerHTML=".";break;
case 4:Obj_Nian.innerHTML=".";break;
case 5:Obj_Nian.innerHTML=".";break;
case 6:Obj_Nian.innerHTML=".";break;
default:Obj_Nian.innerHTML="Error";break;
}
Is_First+=1
if(Is_First==7){
Is_First=1
}
Color_Nian="RGB("+Math.floor(Math.random()*100)+"%,"+Math.floor(Math.random()*100)+"%,"+Math.floor(Math.random()*100)+"%)"
Obj_Nian.style.color=Color_Nian
document.body.appendChild(Obj_Nian)
}
function Clean(evt){
evt=evt?evt:window.event
evt.srcObj=evt.srcElement?evt.srcElement:evt.target
if(evt.srcObj.tagName=="DIV" && (evt.srcObj.innerHTML=="." || evt.srcObj.innerHTML=="." || evt.srcObj.innerHTML=="." || evt.srcObj.innerHTML=="." || evt.srcObj.innerHTML=="." || evt.srcObj.innerHTML==".")){
evt.srcObj.innerHTML=""
}
}
document.onmousedown=function(){Is_Mouse_Down=true}
document.onmousemove=Create
document.onmouseup=function(){Is_Mouse_Down=false}
</script>
</head>
<body onselectstart="javascript:return false">
<div id="tips">提示:按住鼠标左键不放,在页面中拖动即可写字 ; 同时按住ctrl和鼠标左键不放,在页面中拖动即可把字擦去</div>
</body>
</html>

discuz数据表优化

这是来自imysql.cn的文章,作者是叶金荣,第一部分内容是3年前的了。可略作参考,估计7.0的数据库应该已经部分解决这个问题,第二部分是最新的。或许也能帮助你解决一些问题。

对于我来说是不用的啦。。我的论坛才几十个人。根本不需要用到这些功能。哇哈哈哈。
不过,我记得,如果是自己的服务器架设的论坛,DZ可以通过打开APC来进行缓存加速(好象是6.X版本中的功能。7.X没有研究过是不是还存在)

不说废话,看叶金荣先生的文章:


第一部分:

一. 前言
近日由于需要,对discuz论坛(简称dz)进行优化,当然了,只是涉及到数据库的优化.
先说一下服务器及dz的数据量,2 * Intel(R) Xeon(TM) CPU 2.40GHz, 4GB mem, SCISC硬盘.
MySQL 版本为 4.0.23. 数据表情况:
cdb_attachments 2万
cdb_members 10万
cdb_posts 68万
cdb_threads 7万
二. 缓存优化
在 my.cnf 中添加/修改以下选项:

#取消文件系统的外部锁
skip-locking
#不进行域名反解析,注意由此带来的权限/授权问题
skip-name-resolve
#索引缓存,根据内存大小而定,如果是独立的db服务器,可以设置高达80%的内存总量
key_buffer = 512M
#连接排队列表总数
back_log = 200
max_allowed_packet = 2M
#打开表缓存总数,可以避免频繁的打开数据表产生的开销
table_cache = 512
#每个线程排序所需的缓冲
sort_buffer_size = 4M
#每个线程读取索引所需的缓冲
read_buffer_size = 4M
#MyISAM表发生变化时重新排序所需的缓冲
myisam_sort_buffer_size = 64M
#缓存可重用的线程数
thread_cache = 128
#查询结果缓存
query_cache_size = 128M
#设置超时时间,能避免长连接
set-variable = wait_timeout=60
#最大并发线程数,cpu数量*2
thread_concurrency = 4
#记录慢查询,然后对慢查询一一优化
log-slow-queries = slow.log
long_query_time = 1
#关闭不需要的表类型,如果你需要,就不要加上这个
skip-bdb

以上参数根据各自服务器的配置差异进行调整,仅作为参考.
三. 索引优化
上面提到了,已经开启了慢查询,那么接下来就要对慢查询进行逐个优化了.
1. 搜索优化
搜索的查询SQL大致如下:

SELECT t.* FROM cdb_posts p, cdb_threads t WHERE
t.fid IN ('37', '45', '4', '6', '17', '41', '28', '32', '31', '1', '42')
AND p.tid=t.tid AND p.author LIKE 'JoansWin'
GROUP BY t.tid ORDER BY lastpost DESC LIMIT 0, 80;

用 EXPLAIN 分析的结果如下:

mysql>EXPLAIN  SELECT t.* FROM cdb_posts p, cdb_threads t WHERE
t.fid IN ('37', '45', '4', '6', '17', '41', '28', '32', '31', '1', '42')
AND p.tid=t.tid AND p.author LIKE 'JoansWin'
GROUP BY t.tid ORDER BY lastpost DESC LIMIT 0, 80;
+-----------+------------+----------+--------------+-------------+-----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
+-----------+------------+----------+--------------+-------------+-----------+-------------+
| 1 | SIMPLE | t | range | PRIMARY,fid | fid | 2 | NULL | 66160 | Using where;
Using temporary; Using filesort |
| 1 | SIMPLE | p | ref | tid | tid | 3 | Forum.t.tid | 10 | Using where
| +----+-------------+-------+-------+---------------+------+---------+-------------+-------+
---------

只用到了 t.fid 和 p.tid,而 p.author 则没有索引可用,总共需要扫描
66160*10 = 661600 次索引,够夸张吧 :(
再分析 cdb_threads 和 cdb_posts 的索引情况:

mysql>show index from cdb_posts; 
+-----------+------------+----------+--------------+-------------+-----------+----------
---+----------+--------+------+--+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part |
Packed | Null | Index_type | Comment | +-----------+------------+----------+--------------+----
---------+-----------+-------------+----------+--------+------+--+
| cdb_posts | 0 | PRIMARY | 1 | pid | A | 680114 | NULL | NULL |
| BTREE | |
| cdb_posts | 1 | fid | 1 | fid | A | 10 | NULL | NULL |
| BTREE | |
| cdb_posts | 1 | tid | 1 | tid | A | 68011 | NULL | NULL |
| BTREE | |
| cdb_posts | 1 | tid | 2 | dateline | A | 680114 | NULL | NULL |
| BTREE | |
| cdb_posts | 1 | dateline | 1 | dateline | A | 680114 | NULL | NULL |
| BTREE | |
+-----------+------------+----------+--------------+-------------+-----------+---

以及

mysql>show index from cdb_threads; 
+-----------+------------+----------+--------------+-------------+-----------+-------------+
----------+--------+------+-----+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part |
Packed | Null | Index_type | Comment | +-----------+------------+----------+--------------+-----
--------+-----------+-------------+----------+--------+------+-----+
| cdb_threads | 0 | PRIMARY | 1 | tid | A | 68480 | NULL | NULL |
| BTREE | |
| cdb_threads | 1 | lastpost | 1 | topped | A | 4 | NULL | NULL |
| BTREE | |
| cdb_threads | 1 | lastpost | 2 | lastpost | A | 68480 | NULL | NULL |
| BTREE | |
| cdb_threads | 1 | lastpost | 3 | fid | A | 68480 | NULL | NULL |
| BTREE | |
| cdb_threads | 1 | replies | 1 | replies | A | 233 | NULL | NULL |
| BTREE | |
| cdb_threads | 1 | dateline | 1 | dateline | A | 68480 | NULL | NULL |
| BTREE | |
| cdb_threads | 1 | fid | 1 | fid | A | 10 | NULL | NULL |
| BTREE | |
| cdb_threads | 1 | enablehot | 1 | enablehot | A | 2 | NULL | NULL |
| BTREE | | +-------------+------------+-----------+--------------+-------------+------

看到索引 fid 和 enablehot 基数太小,看来该索引完全没必要,不过,对于fid基数较大的情况,则可能需要保留>该索引.
所做修改如下:

ALTER TABLE `cdb_threads` DROP INDEX `enablehot`, DROP INDEX `fid`, ADD INDEX (`fid`, `lastpost`);
ALTER TABLE `cdb_posts` DROP INDEX `fid`, ADD INDEX (`author`(10));
OPTIMIZE TABLE `cdb_posts`;
OPTIMIZE TABLE `cdb_threads`;

在这里, p.author 字段我设定的部分索引长度是 10, 是我经过分析后得出来的结果,不同的系统,这里的长度也不同,最好自己先取一下平均值,然后再适当调整.
现在,再来执行一次上面的慢查询,发现时间已经从 6s 变成 0.19s,提高了 30 倍.
这次先到这里,下次继续 ^_^


第二部分:

很早以前写过一个文章,是关于discuz论坛的优化:MySQL优化 之 Discuz论坛优化。 写的时候是2006年,没想到过了这么久,discuz论坛的问题还是困扰着很多网友,其实从各论坛里看到的问题总结出来,很关键的一点都是因为没有将数 据表引擎转成InnoDB导致的,discuz在并发稍微高一点的环境下就表现的非常糟糕,产生大量的锁等待,这时候如果把数据表引擎改成InnoDB的 话,我相信会好很多。这次就写个扫盲贴吧。

1. 启用innodb引擎,并配置相关参数

#skip-innodb
innodb_additional_mem_pool_size = 16M #一般16M也够了,可以适当调整下
innodb_buffer_pool_size = 6G #如果是专用db的话,一般是内存总量的80%
innodb_data_file_path = ibdata1:1024M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 20
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 16M
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 50
innodb_lock_wait_timeout = 120
innodb_file_per_table

2. 修改表引擎为innodb

mysql> alter table cdb_access engine = innodb;

其他表类似上面,把表名换一下即可...
将表存储引擎改成innodb后,不仅可以避免大量的锁等待,还可以提升查询的效率,因为innodb会把data和index都放在buffer pool中,效率更高。


膘叔认为:如果有自己的服务器,可以考虑做几件事情
1、如果有APC功能打开APC
2、如果没有APC,可以考虑把缓存目录指定为内存看看
3、GZIP关闭,少用rewrite等
4、在大负载的情况下,又只有一台服务器,考虑改程序,延迟插入或者其他的。。。(不太现实,哈哈)

关于mysql 1366的错误。

关于mysql 1366的错误。

在查mysql 1366的错误原因时,发现一些有趣的回答。地址为:http://zhidao.baidu.com/question/59029575.html

不过,还是有人给出了比较好的解决方法:

MySQL 1366错误大致描述如下

1. SQL Error: 1366: Incorrect string value: "\xE8\xAF\xA6\xE7\xBB\x86…" for column "address" at row 1

解决办法:检查数据库此字段的字符集与整理字符集是否与SQL语句传递数据的字符集相同;不相同则会引发MySQL1366错误。

修改MySQL该字段的字符集与整理规则即可。假设数据表为phplamp, SQL语句的字符集为utf8,出错的字段为address:
MySQL 1366 错误解决办法

1. #检查数据表所有字段的状态
2. ->show full columns from phplamp;
3. #发现address字段的Collation项非utf8,修改它!
4. ->alter table phplamp change name name varchar(100) character set utf8 collate utf8_unicode_ci not null default '';

修改完字段的字符集后可以再使用show full columns from table_name命令检查一下,以确保万无一失。假如您的SQL字符集为GBK或是GB2312或是其它的话,只需要将数据表字段的字符集更改为其相应的编码即可。

再送上一个MySQL的命令:
修改数据表的字符集与整理

1. ->show full columns from table_name;
征求意见:关于phped的虚拟空格

征求意见:关于phped的虚拟空格

phped是一款PHP IDE,用下来感觉还不错
但是有一个功能是我最受不了的
就是虚拟空格。。。

鼠标点到哪里,就可以直接在哪里进行输入。
对于页面的控制不太好。不知道哪里可以关掉

顺便,再请各位看到本文推荐一款IDE
1、项目管理方便点
2、没有虚拟空格
3、在项目中可以指定单个文件编码
4、对于类或者函数的提示速度要快,要完善
5、对于单例化的class或者工厂模式的CLASS要能够进行提示

这么多,应该是每个用IDE的人都想解决的问题吧?
不知道有没有哪个IDE能够提供。。。

常用JS代码

常用JS代码

两个常用的JS代码

/**
*
* UTF-8 data encode / decode
* http://www.webtoolkit.info/
*
**/

var Utf8 = {

// public method for url encoding
encode : function (string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";

for (var n = 0; n < string.length; n++) {

var c = string.charCodeAt(n);

if (c < 128) {
utftext += String.fromCharCode(c);
}
else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}

}

return utftext;
},

// public method for url decoding
decode : function (utftext) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;

while ( i < utftext.length ) {

c = utftext.charCodeAt(i);

if (c < 128) {
string += String.fromCharCode(c);
i++;
}
else if((c > 191) && (c < 224)) {
c2 = utftext.charCodeAt(i+1);
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
}
else {
c2 = utftext.charCodeAt(i+1);
c3 = utftext.charCodeAt(i+2);
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}

}

return string;
}

}
/**
*
* Base64 encode / decode
* http://www.webtoolkit.info/
*
**/

var Base64 = {

// private property
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

// public method for encoding
encode : function (input) {
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;

input = Base64._utf8_encode(input);

while (i < input.length) {

chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);

enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;

if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}

output = output +
this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

}

return output;
},

// public method for decoding
decode : function (input) {
var output = "";
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;

input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

while (i < input.length) {

enc1 = this._keyStr.indexOf(input.charAt(i++));
enc2 = this._keyStr.indexOf(input.charAt(i++));
enc3 = this._keyStr.indexOf(input.charAt(i++));
enc4 = this._keyStr.indexOf(input.charAt(i++));

chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;

output = output + String.fromCharCode(chr1);

if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}

}

output = Base64._utf8_decode(output);

return output;

},

// private method for UTF-8 encoding
_utf8_encode : function (string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";

for (var n = 0; n < string.length; n++) {

var c = string.charCodeAt(n);

if (c < 128) {
utftext += String.fromCharCode(c);
}
else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}

}

return utftext;
},

// private method for UTF-8 decoding
_utf8_decode : function (utftext) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;

while ( i < utftext.length ) {

c = utftext.charCodeAt(i);

if (c < 128) {
string += String.fromCharCode(c);
i++;
}
else if((c > 191) && (c < 224)) {
c2 = utftext.charCodeAt(i+1);
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
}
else {
c2 = utftext.charCodeAt(i+1);
c3 = utftext.charCodeAt(i+2);
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}

}

return string;
}

}

这两个应该是比较常用的了。不管是在AJAX中还是在其他中,都应该是很有用的

一周岁了

今天是一个特殊的日子
去年的今天,是我妻子的受难日,在这一天的凌晨两点,她去了医院,10点左右的时候被推进了产房,11点50多分的时候,我们家的小东西出生了。
一年以来,全家被他折腾来折腾去的。
今天是他的生日,也算是对一年来的回顾吧。[阳历生日,阴历生日已经过了]
把一年来的照片各取一张回顾回顾。呵呵

[查看更多图片请点击图片下方的链接,小图片均是从原日志中提取出来的]

6-21 出生第一天的照片

链接地址

6-24 回家的第一天

链接地址

7月的某一天


链接地址1 ,链接地址2


本来还有游泳视频,这是42天的时候,回医院复检时候拍的,但网上的空间只能存7天,所以链接失效了。文章地址为:http://www.neatstudio.com/show-180-1.shtml,点击也看不到了(只是汇总一下)

穿上衣服的一些照片,拍照片时,大约身高63cm,体重为7kg

链接地址为:http://www.neatstudio.com/show-225-1.shtml

下面这张表情已经被我当成QQ表情,原来你是搞挨踢的呀。



9月20日左右,新买推车。首次坐车照


链接地址为:http://www.neatstudio.com/show-272-1.shtml

小家伙这时候开始学抬头了。头很大。抬不动啊。。感觉象拼命挣扎

链接地址为:http://www.neatstudio.com/show-282-1.shtml

小和尚(理了个光头)


链接地址为:http://www.neatstudio.com/show-292-1.shtml

10月23日,小和尚在阳台晒太阳


链接地址为:http://www.neatstudio.com/show-319-1.shtml

庆祝百日,拍了一些照片

链接地址为:http://www.neatstudio.com/show-325-1.shtml

就在这段时间小家伙生病了,http://www.neatstudio.com/show-343-1.shtml,还算是比较严重的。挂水好多次,还好坚强的挺过来了。也几乎没有哭。。

1月21日,有意识无意识的发出一些双音节:papa,记录了一下:http://www.neatstudio.com/show-480-1.shtml

新年快乐:


链接地址为:http://www.neatstudio.com/show-487-1.shtml

洗澡被偷拍


链接地址为:http://www.neatstudio.com/show-488-1.shtml

8个月的时候,学会坐了(7坐8爬,直到今天都没有学会爬。唉。。。)


链接地址为:http://www.neatstudio.com/show-535-1.shtml

5月,带他去公园逛了逛
5月2日~3日


5月9日


5月29日




儿童节,第一个节日,可惜我在上课。。
6月6日


6月13日


更多请查看:http://picasaweb.google.com/xiaoyy2008/
今天,生日,陪着吃饭(现在时间为中午,还没有拍任何照片)

龙芯获MIPS专利授权 将支持Android

据cnbeta报道:龙芯获MIPS专利授权 将支持Android
6月16日消息,中国自主研发的CPU龙芯近日获得了MIPS授权。MIPS Technologies周一称,中国科学院计算技术研究所(简称计算所)已经获得MIPS32与MIPS64架构的授权,技术将用于开发龙芯CPU。 龙芯之痛,卡在专利关口

知名IT杂志《PC World》撰文称:“龙芯的支持者希望终有一天这款产品能渗透外国市场,但现在使用该芯片的设备在中国也寥寥无几,龙芯的MIPS核心使得它与英特尔AMD的X86结构PC不兼容。”龙芯使用MIPS架构,既是无奈,更是被迫。

在中国自力更生研发CPU的过程中,曾使用用“MIPS-like”的词汇来形容龙芯(修改版本的MIPS),此举招致MIPS Technologies的不满,因而一直未获授权。这几年来,计算所不断与MIPS Technologies谈判,希望获得技术授权,但一直未果。无奈之下,计算所只好退而求其次,与意法半导体合作,因为它拥有MIPS授权。以龙芯为核 心的CPU也在意法半导体的网页有所介绍,其名字为更商业化的“Loongson”。龙芯难产,卡在专利一关。

龙芯将支持Android 年底推新款低价CPU

中国科学院计算技术研究所“龙芯1号”研制组组长胡伟武说,尽管这几年龙芯推出了新品,但一直不准在上面贴上‘MIPS-compatible’标签。现 在问题终于解决了。他还表示,研究所正在对一些芯片做兼容性测试。获得MIPS授权是一个大进步,它意味着龙芯可以支持Google的Android平 台。胡伟武表示:“无论是否推出装有龙芯CPU与Android的设备,计算所都将与寻找一些商业伙伴,努力将芯片植入它们的产品中。”

MIPS Technologies公司亚太区的副总Mark Pittman说:“在我们看来,授权将缩短龙芯进入市场化的时间。”因为计算所再也不用通过意法半导体来设计芯片了。

据计算所介绍,龙芯将同时进入高端与低端产品线,设计完全其于第一款高端芯片——4核心龙芯3代,它也是第一款多核龙芯。今年晚些时候,计算所还将推出低端的龙芯,即1GHz的Godson 2g。

附:
MIPS Technologies是一家设计制造高性能、高档次及嵌入式32位和64位处理器的厂商,在RISC处理器方面占有重要地位。1984年,MIPS计算机公司成立。1992年,SGI收购了MIPS计算机公司。


有人说,龙芯买授权花了N多钱,还有人对龙芯购买授权很不理解,为此,龙芯论坛超版九门提督这样说:

要说明白龙芯为什么拿MIPS授权要回答一下几个问题:
1、龙芯为什么要选择MIPS指令集而不是x86指令集?
2、龙芯为什么是现在才取得授权而不是8年前?
3、现在MIPS授权对龙芯发展有什么帮助?


一、现在回答第一个问题,龙芯为什么要选择MIPS指令集而不是x86指令集?
大家应该都知道,计算所准备研制龙芯是2000年左右的事,2001年5月正式开始研制,第一个要解决的问题就是选择什么架构什么指令集,当然龙芯选择了RISC架构,而不是CISC架构。架构的事我们不谈(如果将来有人由于架构的关系说龙芯是冒牌货,没有技术含量,忽悠纳税人的钱,就如现在的情况,那我们再谈,当然架构也是广义指令集)。
确定了架构开始确定使用何种指令集,两条路:一、自己开发指令集;二、采用已有指令集。
要自己开发出指令集并不难,我国早期的计算机采用的就是自己开发的指令集,如果大家想知道相关的情况,可在百度输入“夏培肃”来了解,比如107计算机、银河系列计算机,在局部取得了成功,但是它们是用在专有领域,不存在和别人竞争通用市场的问题。外国科技企业再牛也不敢找中国人民解放军的麻烦不是么?
难就难在指令集要为整个业界所接受,成为标准之一并推向世界。
打个比方,我开发了一个名叫“小强”的指令集,研发了基于“小强”的CPU,然后呢?然后你要卖CPU啊!可是你这个CPU,市面上没有配套的操作系统,更别说应用软件!你怎么办?你要开发基于“小强”的编译器、BIOS、操作系统、应用软件……。你要把这些东西都推广出去,让别人去接受,让别人把自己现有的东西都迁移到“小强”上来——这是一个何其浩大的工程——用屁股想都知道不可能。你会发现你家除了一窝“小强”什么也没有!!!
以上说了七八轱辘的话,我想我们大家应该有个共识:龙芯不能独创一个全新的指令集。如果还有朋友不同意这个观点,那么以下的文字对你来说都是废话,你可以不用看了。
龙芯要选择已有的指令集,现在指令集有很多,但可供龙芯选的稍微思考一下就只剩X86和MIPS了,当然还有ARM,但ARM得授权方式虽然好,却使龙芯失去了独立的研发经历,没有任何安全可言。
要选择X86么?我们知道计算所对龙芯的定位是通用CPU,通用CPU的老大是INTEL,龙芯只要研发出来,不论性能如何,从性质上说,就是INTEL的竞争对手,何况背后还有中国政府的支持。如果我是INTEL我会很高兴计算所选择了X86指令集,我会提供给计算所不高不低的技术支持,要他研究一个不好不坏的CPU,等他壮大一点,我就掐死一点,造个舆论,骂下计算所,多要点授权费,然后再多给点授权,让龙芯的市场再大一点,然后如此这般再来一边,最后计算所痛苦的发现,原来替INTEL做嫁衣裳。
最后李国杰和胡伟武被骂成汉奸,买办,卖国贼,白痴,最终被钉在历史的耻辱柱上。
亲爱的你还会选择X86架构么?
最后只剩MIPS了。MIPS的最大竞争对手是谁呢?自然是X86啊,换句话说几乎就是INTEL啊。从这个程度上说龙芯和MIPS的大目标是一致的。
尤其重要的是,MIPS经过几十年发展,是一种优秀的精简指令集,但是MIPS被SGI抛弃后就江河日下,上个世纪90年代的辉煌已经过去,现在几乎沦落到靠卖个指令集的授权吃饭,今天上了下ARM和MIPS的网站,两者气象完全不同,MIPS卖了个授权给计算所,就毫不犹豫的把新闻放在公司首页,如此可见一般。
通过提供MIPS指令集授权来获取授权费,这是MIPS现在比较现实的商业模式,承认与否也是这样。
到现在为止,大家应该明白,选择MIPS指令集是龙芯最理想也最现实的选择。
好了,第一个问题,回答完了。
二、龙芯为什么是现在才取得授权而不是8年前?
计算所的一帮学究刚开始设计龙芯的时候,估计也没有仔细考虑将来产业化的情况,毕竟当时连什么时候能设计出来都没谱。但是关于指令集的问题,是经过仔细考虑的,在设计时采用MIPS指令集,几乎所有指令都是过了保护期的,可以自由使用,虽然落后,但那是千锤百炼,经过市场检验的东西。其它没有开放的指令,通过用其他相似指令代替和与ST的合作来解决。
网上传说计算所花了500万美元获得了mips的正式授权,此价格我还没有确认,但肯定是不菲的,500万美元合3500万人民币左右,这可不是一笔小钱!大家想想八年前MIPS心气多高啊,当时的要价绝对要比500万美元高多了,计算所哪出得起啊。龙芯刚刚开发的时候,是计算所自己的1000万人民币创新基金拿出来搞的,可没有什么国家的科研经费(你要说计算所属于国家,这钱也是国家的,哪我没话可说)。这点钱,当时的MIPS绝对看不上眼,而且MIPS当时认为中国人开发通用CPU有一种中国男足拿世界杯的感觉。
八年以后,龙芯虽然没有多好,但他有了自己的产品线,有了明确的发展规划,有了初步的产业化成果,有了国家的国民的大力支持。
所以,为了MIPS和龙芯的发展,龙芯拿到了授权。

三、现在MIPS授权对龙芯发展有什么帮助?
龙芯发展了8年多,大部分指令集是MIPS的,受专利保护的指令集自己做了扩展,但是还是对MIPS指令集的软件在龙芯上的使用有很多冲突,现在好了,基于MIPS的软件都可以使用了。龙芯有了具有自主知识产权的架构,又能使用MIPS所有的指令集,现阶段来说,是最好的结果。好多朋友以为,我们采用MIPS指令集就是采用了MIPS提供的核,这根本就两回事。这种情况,一般出现在ARM的合作伙伴上。
在国外销售不会有版权冲突,不会再仰仗ST这个第三方,以后ST就是纯粹的代工企业。将来和ST谈起来,筹码更多了。
还有 很多很多。。。。
就像当年没有钱拿授权现在可以一样。我希望龙芯将来强大了,直接买下MIPS公司。这才是终极解决方案——这也是我内心的深切愿望。

本文最初在yhustc的博客上看到,全部内容来自于网上

引:

1、妓者? http://yhustc.com/Blog/175.html

2、龙芯获MIPS专利授权 将支持Android http://www.cnbeta.com/articles/86691.htm

3、关于龙芯拿MIPS授权的再一点理解 http://www.lemote.com/bbs/viewthread.php?tid=23886&extra=page%3D1

随想

随想

一大早打开QQ,看了几篇QQ新闻。很惭愧

http://news.qq.com/a/20090617/000314.htm 双胞胎姐妹爬行上学犹如长征(组图)

http://news.qq.com/a/20070803/000284.htm 无肛少女髋骨碾碎植钢针 戴尿布坚持求学(图)

同样也看到:

http://news.qq.com/a/20090617/000374.htm 青年猥亵抗战英雄赵一曼雕塑 网友称忍无可忍

再对比自己。惭愧啊。人就怕一个对比,我也一样。一对比才发现自己素质有多差。看看吧,改变一下自己