安装SQL Server2008时报错:已安装 SQL Server 2005 Express 工具。

安装SQL Server 2008时,提示错误:

Sql2005SsmsExpressFacet 检查是否安装了 SQL Server 2005 Express 工具。 失败,已安装 SQL Server 2005 Express 工具。若要继续,请删除 SQL Server 2005 Express 工具。

sql server 2005 management和sql server 2008 management不是兼容吗?为什么会有这样的提示?

答案是SQL Server 2005 Express 工具不是sql server 2005 management,不用卸载sql server 2005 management,用一个小技巧就行:修改注册表!

打开注册表编辑器,找到HKEYLocalMachine/Software/Microsoft/Microsoft SQL Server/90/Tools/ShellSEM。

网上有的讲把这个文件夹删了,我怕删了sql server 2005 management不能用了,重命名一下,把ShellSEM改成ShellSEM1试试,结果继续安装sql server 2008 management的时候显示安装成功!打开也没问题。

只是因为前面修改了注册表,导致sql server 2005 management启动不了,双击打开界面闪一下就没有了。

接着再打开注册表把ShellSEM1改回ShellSEM,就可以打开sql server 2005 management,OK。搞定sql server 2008 management、 sql server 2005 management同时安装的问题!

数据库的版本为661,无法打开。此服务器支持662版及更低版本。不支持降级路径。

很多人会问:服务器版本比数据库版本还高,按说是可以向下兼容的,为什么会报错呢?

是这样的,662是SQL Server 2008 SP2以后的数据库版本号,SP2之前的SQL Server 2008
的数据库版本是655,而661是SQL Server 2008 R2的数据库版本号,本身SQL Server 2008 R2的版本要比SQL Server 2008 要高,按常理661版的数据库文件是不能附加到支持655版本号的SQL Server 2008里的。至于出现这个蛋疼的提示是因为微软在SQL Server 2008 SP2里加入了15k分区数的功能,而发布SP2之前就已经发布了SQL Server 2008 R2了,由于SQL Server 2008 R2 RTM并不支持15k分区的功能,如果按常规SQL Server 2008还保持655的版本号的话就可能会出现附加15k分区的数据文件到SQL Server
2008 R2 RTM中,这肯定是不能附加的,所以微软为了解决这个难题,就打破常规,SQL Server 2008 SP2里将数据库的版本号改为662,这样,由SQL Server 2008 R2 RTM的数据库版本号比SQL Server 2008 SP2的低,所以自然就不能附加了,避免了麻烦,不过为了一15k分区的功能改变了版本号带来的副作用就像楼主这种情况了。
这是问题的根本缘由。也就是说,661的数据库版本比662高。

解决办法:

第一种:

升级到 SQL Server 2008 R2。注意,下载的时候看清是R2。

第二种:

将数据库附加到SQL Server 2008 R2版的数据库实例里,生成SQL Server 2008版的脚本文件,使用脚本文件部署到SQL Server 2008里。

Zend Framework启用Dojo报错:Uncaught exception ‘Zend_Loader_PluginLoader_Exception’ with message ‘Plugin by name ‘Dojo’

在Zend Framework中开启Dojo时,报如下错误:
[php]
Fatal error: Uncaught exception ‘Zend_Loader_PluginLoader_Exception’ with message ‘Plugin by name ‘Dojo’ in E:\mydev\source\ZendFramework-1.12.3-minimal\library\Zend\Controller\Plugin\Broker.php on line 336
Zend_Loader_PluginLoader_Exception: Plugin by name ‘Dojo’ was not found in the registry; used paths: Zend_View_Helper_: Zend/View/Helper/;./views\helpers/ in E:\mydev\source\ZendFramework-1.12.3-minimal\library\Zend\Loader\PluginLoader.php on line 412
[/php]
经过多次尝试,终于找到原因。在Bootstrap中,本来是这样写的:
[php]
$view->addHelperPath(‘Zend/Dojo/View/Helper/’, ‘Zend_Dojo_View_Helper’);
Zend_Dojo::enableView($view);
// $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(‘ViewRenderer’);
// $viewRenderer->setView($view);
[/php]
错误就出在上面注释的两行代码,将其注释掉即可解决。

ffmpeg转换时报错:flv does not support that sample及ffmpeg参数详解

ffmpeg.exe是一款视频转换工具,该工具有如下几大特点:

1、音频转换(ffmpeg -i my_audio.wav my_audio.mp3-i)

2、视频转换(ffmpeg -i my_video.mpeg -s 500×500 my_video.flv-i)

3、从视频中截取图片

4、从视频中采集音频

5、创建截屏视频

6、用图片制作视频

7、从webcam中截取视频

该工具运行在windows下dos系统,通过输入命令执行,支持avi,FLV,asf,mpeg,mp3等等格式,使用方法如下:开始菜单–运行–cmd—然后再运行ffmpeg软件,非常实用。

今天使用ffmpeg.exe转换视频时,出现一个问题,怎么也转换不成功,通过错误信息,看到提示是“flv does not support that sample rate, choose from (44100, 22050, 11025).Could not write header for output file #0 (incorrect codec parameters ?)”和“Sample rate must be 11025, 22050 or 44100
Error while opening codec for output stream #0.1 – maybe incorrect parameters such as bit_rate, rate, width or height”

我之前的写法是:

ffmpeg -i input.avi  output.flv

我于是查了下相关资料,再通过多次测试,发现是语句上的写法出了点问题。

最后写成这样就没有问题了:

ffmpeg -i input.avi -ar 22050 output.flv

不过,这样的输出flv文件质量比较低,后来发现,如果加多一个参数-sameq的话,输出的视频质量会大大提高。

写法如下:

ffmpeg -i input.avi -sameq -ar 22050 output.flv

 

扩充知识

转换FLV格式的ffmpeg.exe 参数说明

ffmpeg.exe -i F:\input.mp3 -ab 56 -ar 22050 -b 500 -r 15 -s 320×240 f:\output.flv

ffmpeg -i F:\01.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320×240 f:\test.flv

使用-ss参数 作用(time_off set the start time offset),可以从指定时间点开始转换任务。如:

转换文件格式的同时抓缩微图:

ffmpeg -i “test.avi” -y -f image2 -ss 8 -t 0.001 -s 350×240 ‘test.jpg’

对已有flv抓图:

ffmpeg -i “test.flv” -y -f image2 -ss 8 -t 0.001 -s 350×240 ‘test.jpg’

-ss后跟的时间单位为秒

Ffmpeg转换命令

ffmpeg -y -i test.mpeg -bitexact -vcodec h263 -b 128 -r 15 -s 176×144 -acodec aac -ac 2 -ar 22500
-ab 24 -f 3gp test.3gp

或者

ffmpeg -y -i test.mpeg -ac 1 -acodec amr_nb -ar 8000 -s 176×144 -b 128 -r 15 test.3gp

ffmpeg参数设定解说

-bitexact 使用标准比特率

-vcodec xvid 使用xvid压缩

-s 320×240 指定分辨率

-r 29.97 桢速率(可以改,确认非标准桢率会导致音画不同步,所以只能设定为15或者29.97)

◆画面部分,选其一

-b <比特率> 指定压缩比特率,似乎ffmpeg是自动VBR的,指定了就大概是平均比特率,比如768,1500这样的就是原来默认项目中有的

-qscale <数值> 以<数值>质量为基础的VBR,取值0.01-255,约小质量越好

-qmin <数值> 设定最小质量,与-qmax(设定最大质量)共用,比如-qmin 10 -qmax 31

-sameq 使用和源同样的质量

◆声音部分

-acodec aac 设定声音编码

-ac <数值> 设定声道数,1就是单声道,2就是立体声,转换单声道的TVrip可以用1(节省一半容量),高品质的DVDrip就可以用2

-ar <采样率> 设定声音采样率,PSP只认24000

-ab <比特率> 设定声音比特率,前面-ac设为立体声时要以一半比特率来设置,比如192kbps的就设成96,转换均默认比特率都较小,要听到较高品质声音的话建议设到160kbps(80)以上

-vol <百分比> 设定音量,某些DVDrip的AC3轨音量极小,转换时可以用这个提高音量,比如200就是原来的2倍

这样,要得到一个高画质音质低容量的MP4的话,首先画面最好不要用固定比特率,而用VBR参数让程序自己去判断,而音质参数可以在原来的基础上提升一点,听起来要舒服很多,也不会太大,看情况调整。

例子:ffmpeg -y -i “1.avi” -title “Test” -vcodec xvid -s 368×208 -r 29.97 -b 1500 -acodec aac -ac 2 -ar 24000 -ab 128 -vol 200 -f psp -muxvb 768 “1.***”

解释:以上命令可以在Dos命令行中输入,也可以创建到批处理文件中运行。不过,前提是:要在ffmpeg所在的目录中执行(转换君所在目录下面的cores子目录)。

参数

-y(覆盖输出文件,即如果1.***文件已经存在的话,不经提示就覆盖掉了)

-i “1.avi”(输入文件是和ffmpeg在同一目录下的1.avi文件,可以自己加路径,改名字)

-title “Test”(在PSP中显示的影片的标题)

-vcodec xvid(使用XVID编码压缩视频,不能改的)

-s 368×208(输出的分辨率为368×208,注意片源一定要是16:9的不然会变形)

-r 29.97(帧数,一般就用这个吧)

-b 1500(视频数据流量,用-b xxxx的指令则使用固定码率,数字随便改,1500以上没效果;还可以用动态码率如:-qscale 4和-qscale 6,4的质量比6高)

-acodec aac(音频编码用AAC)

-ac 2(声道数1或2)

-ar 24000(声音的采样频率,好像PSP只能支持24000Hz)

-ab 128(音频数据流量,一般选择32、64、96、128)

-vol 200(200%的音量,自己改)

-f psp(输出psp专用格式)

-muxvb 768(好像是给PSP机器识别的码率,一般选择384、512和768,我改成1500,PSP就说文件损坏了)

“1.***”(输出文件名,也可以加路径改文件名)

机器强劲的话,可以多开几个批处理文件,让它们并行处理。

E:\ffmpeg.exe -i I:\1.wmv -b 360 -r 25 -s 320×240 -hq -deinterlace -ab 56 -ar 22050 -ac 1 D:\2.flv

PHP利用Ffmpeg进行视频转码(视频格式转换)

Google下载一个Ffmpeg
得到文件

下载好之后首先就是配置一下环境变量

我下载的放在了D盘跟目录

D:\oracle\product\10.2.0\client_1\bin;D:\oracle\product\10.2.0\db_1\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\Java\jdk1.7.0\bin;C:\Program Files\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files\Common Files\Thunder Network\KanKan\Codecs;D:\Program Files\TortoiseSVN\bin;C:\Program Files\Microsoft SQL Server\90\Tools\binn\;D:\ffmpeg

配的有点多,最后那个就是我的ffmpeg

配置好之后就先在Dos中测试下

打开Dos界面 输入 ffmpeg

如果成功的话会显示好多的命令

如果失败则显示 你输入的不是内部命令之类的。

如果失败就看看自己的环境变量是否配置OK

OK之后先在Dos下测试是否能成功转换

首先在一个目录放入一个视频

我在D盘跟目录放入了Demo.avi 视频,我将要转换为Flv

输入命令:ffmpeg -i D:/Demo.avi D:/Demo..flv

-i 后面紧跟的是要转换的文件地址 在后是你要把文件转换到哪里以及相对应的文件名和格式

输入命令之后回车,看看相对应的目录是否出现了你需要的转换后的文件。

如果失败检查命令是否错误。

PHP中执行转换的命令
[php]
//转换为Flv
function makeFlv($video_file,$flv_file)
{
//判断给定的文件是否正常
if(!is_file($video_file)){
return false;
}

global $flv_msg;
$flv_cmd=”ffmpeg -i “.$video_file.” “.$flv_file;
exec($flv_cmd,$flv_msg);
}

//创建flv视频的图片
function makeFlvPic($flv_file,$flv_pic_file)
{
global $flv_msg;

$flv_pic_cmd=”ffmpeg -i “.$flv_file.
” -y -f image2 “.
” -ss 1 “.
” -t 0.001 “.
” -s 350×240 “.$flv_pic_file;

exec($flv_pic_cmd,$flv_msg);
}
[/php]

PHP上传文件推荐命名规则

通常上传文件时,都会对文件进行重命名,如果命名规则不够合理,很可能出现文件命名出现冲突的问题。

我总结了两种重命名的方法:

1、md5加密

计算上传文件md5,以这个md5作为文件名称。这种方式出现重名,并且重名的文件是不一样的的几率由md5出现碰撞的几率决定。

使用md5重新命名的方法,有一个好处,就是上传同样的文件,服务器只会保存一份,不会浪费空间。这个方法的缺点也是比较明显的,就是md5名称看起来不是很友好,而且md5如果出现碰撞,就会导致数据丢失。现在md5的碰撞也逐渐被找到。有兴趣的童靴可以自行研究下。

2、以日期方式重命名

我个人比较喜欢这种方法,但是如果精确到秒的话,名称重复的可能性就非常高了,所以通常要精确到微秒。形如下面的格式:
[php]
2012 09 20 17 21 55 927386 . jpg
年 月 日 时 分 秒 微秒 后缀
[/php]
因为每个目录下的文件数量是有限制的,所以还要细分目录进行存储,我常用年月日来分目录,就是每天上传的文件保存到一个目录。把上面的格式稍微改一下,改成下面的格式:
[php]
2012/09/20/ 17 21 55 927386 . jpg
年/月/日/ 时 分 秒 微秒 后缀
[/php]
在正式保存文件时要循环检验要保存的地址是否已经存在文件了,如果文件已经存在,就要重新命名,直到文件不存在为止。

通过试验可以发现,date函数并不支持“微秒”的输出,总是输出“00000”。下面给出一个支持微秒的时间输出函数。
[php]
/*
* 功能:支持微秒的时间输出函数
* 参数:$format 时间格式
* 返回:无
*/
private function udate($format = ‘u’, $utimestamp = null) {
if (is_null($utimestamp))
$utimestamp = microtime(true);

$timestamp = floor($utimestamp);
$milliseconds = round(($utimestamp – $timestamp) * 1000000);

return date(preg_replace(‘`(?< !\\\\)u`', $milliseconds, $format), $timestamp); } [/php]

Zend Framework中Zend_Form浅析

Zend_Form组件的使用容易出现VC(View,Controller)的强耦合,这实在是个大问题,下面举例说明应该怎样合理使用Zend_Form:

假设我们要实现一个用户登陆的表单,其代码大致情况如下:

控制器:
[php]
$form = new Zend_Form;

$form->setMethod(‘post’);

$username = new Zend_Form_Element_Text(‘username’);
$username->setLabel(‘Username’)->setRequired(true)->addValidator(‘NotEmpty’);

$password = new Zend_Form_Element_Password(‘password’);
$password->setLabel(‘Password’)->setRequired(true)->addValidator(‘NotEmpty’);

$submit = new Zend_Form_Element_Submit(‘submit’);

$form->addElements(array($username, $password, $submit));

$form->clearDecorators();

$form->addDecorator(‘FormElements’)
->addDecorator(‘HtmlTag’, array(‘tag’ => ‘ul’))
->addDecorator(‘Form’);

$form->setElementDecorators(array(
array(‘ViewHelper’),
array(‘Errors’),
array(‘Description’),
array(‘Label’, array(‘separator’=>’ ‘)),
array(‘HtmlTag’, array(‘tag’ => ‘li’, ‘class’=>’element-group’)),
));

$submit->setDecorators(array(
array(‘ViewHelper’),
array(‘Description’),
array(‘HtmlTag’, array(‘tag’ => ‘li’, ‘class’=>’submit-group’)),
));

if ($this->_request->isPost()) {
if ($form->isValid($this->_request->getPost())) {
// success …
} else {
$form->populate($this->_request->getPost());
}
}

$this->view->form = $form;
[/php]
视图:
[php]
echo $this->form;
[/php]
这是Zend_Form最一般的用法,从这个典型的例子中我们能很容易的发现表单的渲染是在控制器中完成的,从理论上来说,类似Label,Decorator(如上红色部分)这样的代码本质上属于视图的范畴,不应该出现在控制器中,而且,视图需求向来是复杂多变的,很难在控制器里处理。幸运的是,Zend_Form有一个Zend_Form_Decorator_ViewScript方案,可以比较完美的解决这些问题:

修改后的代码如下:

控制器:
[php]
$form = new Zend_Form;

$form->setMethod(‘post’);

$username = new Zend_Form_Element_Text(‘username’);
$username->setRequired(true)->addValidator(‘NotEmpty’);

$password = new Zend_Form_Element_Password(‘password’);
$password->setRequired(true)->addValidator(‘NotEmpty’);

$submit = new Zend_Form_Element_Submit(‘submit’);

$form->addElements(array($username, $password, $submit));

if ($this->_request->isPost()) {
if ($form->isValid($this->_request->getPost())) {
// success …
} else {
$form->populate($this->_request->getPost());
}
}

$this->view->form = $form;
[/php]
视图:
[php]
echo $this->form->setDecorators(array(
array(‘ViewScript’, array(‘viewScript’ => ‘/path/to/viewscript.phtml’))
))->render();
[/php]

viewscript.phtml:
[html]



[/html]
可以看到,通过使用ViewScript,在不影响现有功能的情况下,我们将表现逻辑相关代码完整的剥离了出来,当然,这里还有一些细节可以改进,比如说控制器中的Form代码可以集中写在一个Form类中,还有表单的生成可以结合使用Zend_View_Helper_Form*相关助手等等。
分享到:

PHP利用CURL模拟登陆并获取数据

[php]
< ?php $cookie_file    =    tempnam('./temp','cookie'); $login_url        =    'http://renrenstudy.com/login.php';  // 此处设置登录表单提交指向的action $post_fields    =    'username=test&password=123';   // 表单项 $ch = curl_init($login_url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); curl_exec($ch); curl_close($ch); $url='http://renrenstudy.com/account.php';    // 欲获取的页面地址 $ch = curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); $contents = curl_exec($ch); echo $contents; curl_close($ch); ?>
[/php]