2006年12月26日

    移动MMS有2种封装格式:application/vnd.wap.multipart.mixed和application/vnd.wap.multipart.related,前者将MMS中的各类多媒体信息混合在一起,而后者则根据SMIL格式定义以幻灯片的形式进行多媒体内容播放。绝大多数彩信应用会采用multipart.related封装彩信。如果你使用移动提供的MM7API,那么,在发送彩信中含有SMIL文件时候,你可能遭遇虽然发送成功,但是在很多手机上都显示错误的现象。在这种情况下,多半是由于SMIL文件格式不对以及ContentID的设置问题。

    对于ContentID,当MMS封装格式为multipart.mixed时,只需要该参数即可,如果MMS封装格式为multipart.related,则需要设置ContentID和ContentLocation。两者内容保持一致。设置ContentID和ContentLocation只需要调用mm7api的setContentID和setcontentLocation方法即可

    实际应用中,发现有一些问题:网上绝大多数能够找到的代码都会举例如下:

mmc.setContentId("100.jpg");

mmc.setContentLocation("100.jpg");

    根据试验,这样写代码是会导致在某些手机无法显示接收到的MMS的情形。原因在这里:

    Within SMIL part the reference to the media object parts shall use either Content-ID or Content-Location mechanism [RFC2557] and the corresponding WSP part headers in media object parts contain the corresponding definitions.
    In case of Content-ID, the URI:s shall be without < and > (compare to [RFC2557], <IMG
SRC="cid:950120.aaCC@XIson.com">). To resolve a CID reference, "cid:" part shall be removed from the string, and the remaining string enclosed within < > marks. After this it can be compared to the value obtained from Content-ID header.
As the CID reference is only used within a single message, there shall be no need to create globally unique values for the content-ids, and there shall be no requirement for a legal address definition for the CID.
    The Content-Location reference in the SMIL part shall be represented as relative URI, e.g., <img src=”myimage.jpg”>). The corresponding definition in media object parts shall be:
Content-Location: myimage.jpg
   

    从上面的描述得知,SMIL文件中对媒体元素的引用可以是Content-ID或者Content-Location,在使用Content-ID的情况下,SMIL文件中的引用和Content-ID的Header信息的描述方式应该如下所示:
SMIL文件的描述:<img src=” cid:950120.aaCC@XIson.com”>
Content-ID头信息:Content-ID: <950120.aaCC@XIson.com>
而如果使用Content-Location的话,则描述方式如下:
SMIL文件的描述:<img src=”myimage.jpg”>
Content-Location头信息:Content-Location: myimage.jpg

    根据对mmc.setContentId("100.jpg")进行抓包的结果,可以看到截取部分如下:

Content-Type:application/smil
Content-Transfer-Encoding:8bit
Content-ID:100.jpg

有什么问题吗?——答案在这里:缺少尖括号<>,在相当多的手机上这一点是会被忽视的,因此彩信得以正常显示,但是对于部分手机如NEC的某些型号,它的MMS协议栈是精确匹配的。因此会导致无法根据ContentID来定位多媒体资源的情况,从而无法播放彩信。

    所以,兼容性良好的做法是:

mmc.setContentId("<100.jpg>");

mmc.setContentLocation("100.jpg");

    需要说明的是,当没有设置ContentLocation的时候,很多手机也可以正常显示彩信,而某些手机如索爱系列可能就无法正常播放。

2006年11月22日

ajax开发中,有时会遇到返回的数据包含js的情况。很多场合下,这些js的定义在主页初次加载的时候就已经包含进来,因此,在返回的DOM数据中如果包含相应的js函数调用,那么不会有任何问题。

然而,在另外一些场合中,希望在返回的DOM数据包含的js,其也定义了很多js函数并且执行对这些函数的调用,如:

<script>

function foo(){}

</script>

<a href="#" onclick="foo()">foo</a>

以上全部均为ajax返回的数据,在这种情况下,浏览器会报foo()未定义的错误。

解决方法:

根据犀牛书,这样定义函数即可:

<script>

foo=function(){}

</script>

2006年10月11日

以前写的那篇blog不是一个好的解决办法,而且当时自己也是只知其然不知其所以然。

实际上,只要在DIV中加入:WORD-WRAP: break-word;那么该DIV中的文字就可以自动换行了,FF下则无需这样。此外,如果在table中,默认的文字也是自动换行的。

有时候,需要保持文字原有的格式,这个时候需要用到pre,然而,用pre默认是不能自动换行的。比如,如果希望实现以下效果:

 

12345中文

       12334中文

                12334中文12334中文12334中文12334中文12334中文12334中文12334中文12334中文12334中文

 

以上文字如果希望显示在一个宽度小于第三行的区域内,且第一和第二行的行首空格和行尾的回车都以原来格式显现,可以组合使用pre和div。

给pre加上如下属性:

white-space: pre-wrap;  /* css-3 */white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */white-space: -pre-wrap;      /* Opera 4-6 */white-space: -o-pre-wrap;    /* Opera 7 */word-wrap: break-word;   /* Internet Explorer 5.5+ */

此时如果不加div,则pre在ie6下是无法保证以上第三行文字的自动换行的,因此需要在pre的外边嵌套一个具有

WORD-WRAP: break-word;属性的div。

2006年09月07日

addEvent: function(elm, evType, fn){
  if (elm.addEventListener){
   elm.addEventListener(evType, fn, false);
   return true;
  } else if (elm.attachEvent) {
   var r = elm.attachEvent(‘on’ + evType, fn);
   return r;
  } else {
   elm['on' + evType] = fn;
  }
 },
removeEvent:function( elm, evType, fn ) {
  if ( elm.detachEvent ) {
    elm.detachEvent( ‘on’+evType, fn );
  } else
    elm.removeEventListener( evType, fn, false );
}, 

常常遇到在DIV文字过多而需要自动换行的问题,通常的解决之道为:

在IE下利用:word-break:break-all 属性

这时文字到达行尾时会自动换行显示。然而这种方式在Firefox下却是将超过行尾的部分截取掉了,这样如果用户希望在一个DIV内多行显示文字,就会遇到无法显示完全的问题。通常的解决之道是利用javascript动态在文字串内插入<br>或者<wbr>,然而这种方法过于繁琐。

今天偶然看到一个网页,只利用如下简短的CSS就达到效果:

.aftercell {
	margin: 0px;
	padding: 17px 7px 7px 7px;
	border-right: 1px solid #FFFFFF;
	height: 485px;
	min-width: 186px;
	max-width: 286px;
	width: 186px;
	overflow: auto;
}
在IE和FF下均工作良好。
2006年09月05日

两个rails都用到了mongrel_cluster

ln -s /etc/mongrel_cluster/app1.yml /var/www/app1/config/mongrel_cluster

ln -s /etc/mongrel_cluster/app2.yml /var/www/app2/config/mongrel_cluster

这样/etc/init.d/mongrel_cluster start 就可以把2个应用的mongrel都启动

增加一个VirtualHost:

<VirtualHost *:80>
  ServerName www.app2.com
  DocumentRoot /var/www/app2/public
  ErrorLog /var/log/apache2/app2_error_log
  CustomLog /var/log/apache2/app2_access_log combined

…#Rewrite和mod_proxy_balancer的配置跟前一个相同

</VirtualHost>

 

2006年09月01日

Redhat AS4上需要安装RMagick,安装RMagick需要首先安装Imagemagick,而Imagemagick在安装之前还需要有freetype,libjpeg,libpng,libtiff等附加库,在之前ubuntu机器上测试时,这些附加库本身都没有,因此通过sudo apt-get install build-essencials来将它们逐渐安装,而Redhat AS4机器本身已经以rpm形势安装好了相应附加库,因此按理说,Imagemagick在make install之后必然是OK的。

然而事实上并非如此,当对imagemagick make install之后gem install rmagick,随后

ruby -rrubygems -e "require ‘RMagick’; puts Magick::Long_version;"
测试出RMagick安装正常,本以为网站就该运作正常,但实际上所上传的图片并没有被处理。经过仔细跟踪,才知道是imagemagick并没有和此前系统里已经存在的libjpeg,libpng等库连接上。由于对configure不熟悉,因此不得已再次去分别下载libjpeg,libpng,libtiff的源程序,在分别make install成功之后,重新编译imagemagick,这时它才可以跟rmagick真正的协同工作。

 

网上看到一篇文章,作者在ubuntu下安装rails完毕之后,会遇到MySQL Error: Lost connection to MySQL server during query: SET NAMES ‘utf8′,解决之道是:sudo apt-get install libmysql-ruby1.8

用Ruby/MySQL代替MySQL/Ruby。

我在Redhat AS 4 下也遇到了该问题,而且遍历互联网,所有类似情况基本上发生在debian或者由debian衍生出来的ubuntu上。由于Redhat下无法利用apt-get来install libmysql-ruby1.8,因此我不得不去网上搜索该安装包,搜寻半天居然发现没有,所有与之相关的文档均是跟debian或者ubuntu有关的,这就很郁闷了。

后来好歹搜到一篇文章,来到http://www.tmtm.org/en/ruby/mysql/README_en.html
下载ruby-mysql-0.2.6.tar.gz并安装,这样前述的连接错误才得以解决。

 

 

2006年08月29日

一直没有配好actionmailer,从log看邮件已经成功发出,但就是没有收到,所有网上能搜到的资源都对过了,没发现跟他们有什么不同,所以这事就没管,一搁好多月。

今天偶然想到,以前用mongrel时,每次mongrel_rails start均异常退出,说是enviroment.rb里的actionmailer有问题,当时图省事就直接把相关的actionmailer语句删除。该异常错误在webrick下是没有的,因此在一开始还怀疑是否actionmailer和mongrel兼容性问题,今天仔细一看出错记录,原来是actionmailer的位置放错了:

Rails::Initializer.run do |config|

end

此前actionmailer是放在以上循环体内,拿出来放在后面就好了。有时候事情解决就是这样简单。

2006年08月24日

Rails的cache只对get请求有效,因此对于AJAX来说就无法产生cache,因为prototype默认的ajax请求是post。可以用以下手段将ajax请求改为get:

1  在rails中 form_remote_tag :method => ‘get’

2 在js中 new Ajax.Request(ajaxUrl, {method:’get’, onLoading:function(request){..},onSuccess:function(request){…}});