Ruby on Rails这种“约定大于配置”的理念值得深入学习与思考。
Ruby on Rails这种“约定大于配置”的理念值得深入学习与思考。
最近用上了vs2010..呵呵
昨天要团队做一个网站..
发现本来的Add Project Source Control.. 菜单项 已经变成了连接到 TFS源代码管理器了..
无奈没有TFS2010 服务器..试了几次无法连接到VSS2005..
google 了一下.. 才找到 原来vs2010 也可以连接到vss2005 的..呵呵
原文:
To configure VSS2005 with VS2010 we can change the settings in Tools-> Options-> Source Control-> Select the Vss Source Safe option.
Then try to open the solution or project directly see that will help.
Cheers 🙂
..
然后建议安装一个vss2005更新:VSS integration with Dev10
VSS用法指南
The usage of VSS (Visual Source Safe 2005)
1. 首先,当然是得安装好Visual Source Safe 2005
你可以在Visual Studio 2005的安装光盘中找到VSS目录,相关的安装文件就在那个目录下,如果你的光盘上没有,你可以发送一封邮件给我:stillful@foxmail.com, 我可以发送一份给您。
安装好VSS后程序菜单中应该已经有相应的快捷方式了:
2. 配置”Microsoft Visual SourceSafe Administration“(VSS管理器VSSA)
1). 启动VSS管理器 (因汉化包的效果并不理想,偶建议大家还是使用英文版)
2). File – > New database… (文件->新建数据库)
若您的盘符仍是FAT32文件系统,会出现警告信息:
建议,使用以下方法快速转换您的盘符到NTFS格式,否则VSS权限设置功能会受限。
* 如何快速将硬盘从FAT32转换为NTFS (Windows XP下)
i. 开始->”运行” – cmd
ii. 打开窗口以后,在光标的提示符下输入“covert X:/FS:NTFS”,然后回车。
注意在“covert”的后面有一个空格,这里的X就是您刚才指定Location所在的盘符。
iii. 接着系统会要求你输入X盘的卷标,然后回车。
卷标在“我的电脑”中点X盘,然后看它的属性可以找到。
这样就可简单地转换分区格式为NTFS了。这个方法只用于FAT32转为NTFS,不能将NTFS转为FAT32.
iv.该方法仅在windowsXp下测试成功,其他操作系统未用测试。
v. 转换的方法有很多,可以考虑使用http://news.softhouse.com.cn/news/show/10468.html上提供的更多方法。
继续:
3. 给自己项目的VSS起个名字,可以用类似:”VSS-My Project Source Code”这样的名字
4. 使用以下默认选项:
5. 完成了数据库的设置:
6. 完成后OK即可:
7. 来看一看新建数据库后VSS管理器(VSSA)里已经默认建立的用户名列表:
显然,默认情况下VSSA会创建三个用户帐号:
Admin,Guest,当前登录的用户名
8. 进入服务器配置
9. 确定后就会有服务新增:
10. 直接允许(如果你也装过360安全卫士的话)
现在可以修改Admin的密码了,空密码在客户端连接时易造成很大困惑,建议一定要改!
11. 双击Admin帐号或
12. 修改完成后
13. 最后,设置My Project的权限:共享和Web共享都开放全部权限(安全考虑可以清除Everyone权限,添加Administrators权限)
========到本步骤,服务器端已经设置完毕,现在可以转入客户端的VSS来配置了。=========
14. 在Lan的计算机上(客户端) 同样安装好VSS
15. 转入 “Microsoft Visual SourceSafe” (VSS)
打开已存在的数据库:
16. 连接到服务器的数据库
18. 新建连接后可以打开了!
19. 指定VSS目录所对应的本地的“工作目录”
20.本地的工作路径(截图时采用同一机器作的实验,所以能够看得到My Project(勿怪!)
21. 启动Visual Studio 2005 部署你的项目到VSS
在客户端启动VS2005,将项目框架部署到VSS中去:
1). 工具->选项
2). 插件设置
3). 将解决方案添加到源代码管理中:
4). 用帐号登陆:
5). 新建的VSS项目名称:归属到$/根目录下:
访问是否新建目录:
22. 现在的视图有变化了:
23. 对所有的团队开发成员约定以下几点:
1. 必须下载最新版本后现进行修改;
2. 修改需要签出(Check out)
3. 当完成修改后及时签入(Check in)
4. 不要一性长久签出多个文件(会造成团队其他成员长时等待)
5. 建议由项目管理人员首先将项目框架部署好,其他团队成员可以使用VS“获取”来得到最新版本数据
24. 图示1)位置为获取最新版本,2)为签出(修改前必须这样做)
其他几张截图:
当签出以进行编辑时的提示框(选项中可以关闭之)
被Default.aspx被签出到本地后的标志是前面打上了红勾!
当被签出后,其他人员在VSS中看到该文件的状态:
1. 一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完.
但在php中,默认的该页最久执行时间为 30 秒.就是说超过30秒,该脚本就停止执行.
这就导致出现 无法打开网页的情况.这时我们可以修改 max_execution_time
在php.ini里查找
max_execution_time
默认是30秒.改为
max_execution_time = 0
0表示没有限制
2. 修改 post_max_size 设定 POST 数据所允许的最大大小。此设定也影响到文件上传。
php默认的post_max_size 为2M.如果 POST 数据尺寸大于 post_max_size $_POST 和 $_FILES superglobals 便会为空.
查找 post_max_size .改为
post_max_size = 150M
3. 很多人都会改了第二步.但上传文件时最大仍然为 8M.
为什么呢.我们还要改一个参数upload_max_filesize 表示所上传的文件的最大大小。
查找upload_max_filesize,默认为8M改为
upload_max_filesize = 100M
另外要说明的是,post_max_size 大于 upload_max_filesize 为佳.
<html>
<head>
<style>
@-webkit-keyframes twinkling{ /*透明度由0到1*/
0%{
opacity:0; /*透明度为0*/
}
100%{
opacity:1; /*透明度为1*/
}
}.twinkling{
-webkit-animation: twinkling 1s infinite ease-in-out;
}.yellow{
background:yellow;
}
</style>
</head>
<body>
<div class=”twinkling yellow”>Go!!!</div>
</body>
</html>
注:动画名称为twinkling 时间为1s 动画次数为无限次 动画效果ease-in-out
简单吧!其实用css3做动画效果,比用flash,javascript要方便简单多了!希望浏览器赶快都支持css3 Animation .目前webkit内核的浏览器都支持(safrai,chrome)
摘自:html5专栏
一、新建EXCEL表
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
app.CreateDispatch(“EXCEL.Application”);
app.SetVisible(false); //设置表可见性
app.SetDisplayFullScreen(false); //设置不全屏显示
app.SetDisplayAlerts(false); //屏蔽警告
二、打开EXCEL表
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path); //获取当前目录
CString strPath = path;
strPath += “\\计算结果”;
books.AttachDispatch(app.GetWorkbooks(),true);
book.AttachDispatch(books.Add(_variant_t(strPath)));
三、获取工作表
sheets = book.GetWorksheets();
sheet = sheets.GetItem(COleVariant((short)1));
四、新建工作表
sheets = book.GetWorksheets();
sheets.Add(vtMissing,vtMissing,_variant_t((long)5[u1] ),vtMissing);
五、选择工作表某个区域
1、range = sheet.GetRange(COleVariant(“A1”),COleVariant(“A1”));
2、range.AttachDispatch(sheet.GetRange(_variant_t(“K39”),_variant_t(“K39”)),TRUE);
六、合并单元格
range = sheet.GetRange(COleVariant(“A1”),COleVariant(“A1”)); //先选择区域
range.Merge(_variant_t((long)0)); //再合并
七、设置单元格内容
1、单个单元格赋值
range = sheet.GetRange(COleVariant(“A1”),COleVariant(“A1”)); //先选择区域
range.SetValue2(COleVariant(“××”)); //再赋值
2、批量赋值
CString sCell; //定义字符串变量
for(int i=0; i<360; i++)
{
sCell.Format(“A%d”,i+2); //选择单元格
range = sheet.GetRange(COleVariant(sCell[u2] ),COleVariant(sCell[u3] ));
range.SetValue2(COleVariant((short)(1.5*i))); //再赋值
}
八、设定单元格字体,对齐方式,颜色,粗体,斜体,背景色,列宽,行高
Font ft; //定义字体变量
Interior it; //定义背景色变量
range = sheet.GetRange(COleVariant(“A1”),COleVariant(“A1”)); //先选择区域
range.SetHorizontalAlignment(_variant_t((long)-4131)); //水平居中对齐
range.SetVerticalAlignment(_variant_t((long)-4108)); //竖直居中对齐
range.SetColumnWidth(COleVariant(“20”)); //列宽
range.SetRowHeight(COleVariant(“25”)); //行高
ft.AttachDispatch(range.GetFont()); //匹配
ft.SetBold(_variant_t((long)0)); //设置粗体,0-不加粗;1-加粗
ft.SetItalic(_variant_t((long)0)); //设置斜体,0-不斜;1-斜
ft.SetSize(_variant_t((long)11)); //字大小
ft.SetColorIndex(_variant_t((long)5)); //字颜色
it.AttachDispatch(range.GetInterior());
it.SetColorIndex(_variant_t((long)8)); //背景色
说明:
对齐方式:(水平)居中:-4108 靠左:-4131 靠右:-4152
(竖直)居中:-4108 靠上:-4160 靠下:-4107
线颜色值:1-黑;2-白;3-红;5蓝;6黄;7-粉红;8-浅蓝;9-灰;10-绿;
九、获取单元格数据
COleVariant rValue,gValue; //定义COleVariant变量
CString quzhi; //定义字符串变量
range = sheet.GetRange(COleVariant(“A1”),COleVariant(“A1”));
rValue=COleVariant(range.GetValue(gValue)); //取得单元格数据
rValue.ChangeType(VT_BSTR); //数据转换格式
quzhi=rValue.bstrVal; //将单元格数据赋在字符串变量中
十、绘单元格边框
Range rg ; //定义变量
1、绘横线
CString strCell1strCell2,strCell3;
for (i=5;i<21;i++)
{
strCell1.Format(“I%d”,i*2);
strCell2.Format(“K%d”,i*2);
rg.AttachDispatch(sheet.GetRange(COleVariant(strCell1),
COleVariant(strCell2)),true);
rg.BorderAround(_variant_t((long)1),_variant_t((long)2),
_variant_t((long)1),vtMissing);
//线型 // 线宽 //颜色
}
2、绘竖线
for(i=0;i<20;i++)
{
strCell1.Format(“%c12”,(char)(‘I’+i));
strCell2.Format(“%c40″,(char)(‘I’+i));
rg.AttachDispatch(sheet.GetRange(COleVariant(strCell1)
,COleVariant(strCell2)),true);
rg.BorderAround(_variant_t((long)1),_variant_t((long)2),
_variant_t((long)3),vtMissing);
}
3、绘外框
strCell3=(CString)CHAR(i+74)+”40”;
rg.AttachDispatch(sheet.GetRange(COleVariant(“I10”),
COleVariant(strCell3)),TRUE);
rg.BorderAround(_variant_t((long)1),_variant_t((long)3),
_variant_t((long)5),vtMissing);
十一、保存结果
book.SaveAs(COleVariant(strPath),covOptional,
covOptional,covOptional,
covOptional,covOptional, (long)0,covOptional,covOptional,covOptional,
covOptional,covOptional);
十二、关闭表及释放变量
app.Quit();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
今天用VC开发的时候,新建两个类后,发现没有要类视图那里显示,在文件那里也没看到,于是就想自己手动把这两个类加到工程中去,没想到一点添加文件就发生内存读写错误。开始以为是软件出错了,重启软件后,还是一样,接着发现连从VC 的“文件”-》的“打开”也没办法打开文件了,一样报内存读写错误。郁闷了半天,觉得可能是中毒了吧,开始找软件杀毒,弄来弄去还是出现同样的错误。
于是在网上找资料,找了很久终于让我找到了,原来是VC6.0和Visio两个软件(也可能是office 2010)有冲突,真是汗啊,都是微软的东西,居然有冲突,把Visio卸载掉,问题完全解决。 我实在是想不明白,自家的软件在自家的平台上运行,然后自己人还打起来了,只能说是无语了。
—以上摘自http://www.diybl.com/course/3_program/vc/vc_js/2008331/107733.html
解决方法:
第一步:下载“FileTool”,该文件是个压缩包,压缩包里是一个vc6.0写的工程文件,是微软提供的,看来微软是知道会出现问题的。
第二步:解压缩后用vc6.0编译该工程,生成一个dll文件。
第三步:将dll文件拷贝到vc安装目录下(安装目录下有个vc98文件夹,放到该文件夹里就行)。然后运行任意一个vc6.0工程项目,通过Tools(工具)->Customize(订制)->Add-ins And Macro Files(附加项和宏文件)点击“浏览”将刚才复制vc98文件夹里的DLL添加进去。这是就多了一个工具栏如图,“A”表示“添加”、“O”表示“打开”。以后就可以通过点击“A”把文件添加到工程了。
—以上摘自 http://blog.sina.com.cn/s/blog_4900be890100l3hi.html
【参考资料 感谢作者】
1、必须先安装Excel;
2、在工程中导入Excel API:
ClassWizar->Add Class->选择excel.exe->选中全部->确定
自动添加excel.h、excel.cpp到工程
3、Ole初始化:
在InitInstance()函数,添加:AfxOleInit();
4、创建Excel模板文件:
新建一个空的xls文件,改名为tpl.xls,放到运行目录下。
API新建Excel文件时会以tpl.xls为模板。
5、读取Excel文件:
bool CMainFrame::LoadExcelFile(const char* pszExcelFile)
{
if (!pszExcelFile)
{
return false;
}
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CString sValue = “”;
_Application objApp;
Workbooks objBooks;
_Workbook objBook;
Worksheets objSheets;
_Worksheet objSheet;
Range objRange;
VARIANT vRet;
// 打开Excel文件
objApp.CreateDispatch(“Excel.Application”);
objBooks = objApp.GetWorkbooks();
objBook = objBooks.Open(pszExcelFile, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional);
objSheets = objBook.GetWorksheets();
objSheet = objSheets.GetItem(COleVariant((short)1));
objRange = objSheet.GetUsedRange();
// 取行列数
vRet = objRange.GetValue(VOptional);
COleSafeArray oleSA(vRet);
long lNumRows;
long lNumCols;
oleSA.GetUBound(1, &lNumRows);
oleSA.GetUBound(2, &lNumCols);
if (lNumRows <= 1)
{
AfxMessageBox(“没有数据!”);
return true;
}
long index[2];
VARIANT vValue;
// 读取数据
for(int i=1; i<=lNumRows; ++i)
{
for(int j=1; j<=lNumCols; ++j)
{
sValue = “”;
index[0] = i;
index[1] = j;
oleSA.GetElement(index, &vValue);
switch(vValue.vt)
{
case VT_R8:
{
// 数字
sValue.Format(“%1.1f”,vValue.dblVal);
break;
}
case VT_BSTR:
{
// 文字
sValue=(CString)vValue.bstrVal;
break;
}
case VT_DATE:
{
// 日期
COleDateTime odt = COleDateTime(vValue.date);
sValue = odt.Format(“%Y-%m-%d %H:%M:%S”);
}
default:
{
break;
}
}
sValue.TrimLeft();
sValue.TrimRight();
}
}
// 关闭文件
objRange.Clear();
objBook.Close(COleVariant((short)FALSE),VOptional,VOptional);
objBooks.Close();
objApp.Quit();
return true;
}
6、新建、写入Excel文件:
bool CMainFrame::SaveExcel()
{
// 取模板文件
char szMainPath[MAX_PATH];
if (!GetModuleFileName(NULL, szMainPath, sizeof(szMainPath)))
{
return false;
}
char *pDest = strrchr(szMainPath, ‘\\’);
if (!pDest)
{
return false;
}
pDest[0] = ‘\0’;
if (szMainPath[strlen(szMainPath) – 1] != ‘\\’)
{
strcat(szMainPath, “\\tpl.xls“);
}
else
{
strcat(szMainPath, “tpl.xls”);
}
szMainPath[sizeof(szMainPath) – 1] = ‘\0’;
// 取新文件名
CFileDialog mFileDlg(FALSE, NULL,NULL,
OFN_ALLOWMULTISELECT,
_T(“Excel Files (*.xls)|*.xls|Excel2007 Files (*.xlsx)|*.xlsx|All Files (*.*)|*.*||”),
AfxGetMainWnd());
CString strPathName;
if (mFileDlg.DoModal ()==IDOK)
{
POSITION mPos = mFileDlg.GetStartPosition();
strPathName = mFileDlg.GetNextPathName(mPos);
}
else
{
return false;
}
strPathName.MakeLower();
if (strPathName.Find(“.xls”) == -1 && strPathName.Find(“.xlsx”))
{
strPathName += “.xls”;
}
// 打开新文件
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CString sValue=””;
_Application objApp;
_Workbook objBook;
Workbooks objBooks;
Worksheets objSheets;
_Worksheet objSheet;
Range objRange;
objApp.SetAlertBeforeOverwriting(FALSE);
objApp.SetDisplayAlerts(FALSE);
objApp.CreateDispatch(“Excel.Application”);
objBooks = objApp.GetWorkbooks();
objBook = objBooks.Open(szMainPath, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional);
objSheets = objBook.GetWorksheets();
objSheet = objSheets.GetItem(COleVariant((short)1));
objRange.AttachDispatch(objSheet.GetCells(),true);
// 写数据
for (int i=1; i<10; ++i)
{
for (int j=1; j<10; ++j)
{
CString strItem;
strItem.Format(“数据 %d – %d”, i, j);
COleVariant vItem(strItem);
vItem.ChangeType(VT_BSTR);
objRange.SetItem(COleVariant((long)(i)),COleVariant((long)(j)),vItem);
}
}
// 保存文件
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
objBook.SaveAs(COleVariant(strPathName.GetBuffer(0)),covOptional,covOptional,covOptional,
covOptional,covOptional,(long)0,covOptional,covOptional,covOptional,covOptional,covOptional);
strPathName.ReleaseBuffer();
objRange.ReleaseDispatch();
// 关闭文件
objRange.Clear();
objBook.Close(COleVariant((short)FALSE),VOptional,VOptional);
objBooks.Close();
objApp.Quit();
return true;
}
直接说解决办法,原理就是利用label控件。在点击label时,相当于触发上传控件的“浏览”按钮,且不会发生“拒绝访问”错误。
只有两步:
1、用CSS隐藏input控件,注意不能用display:none的方法,否则控件的功能也失效了。代码如下:
#upload_file{
position:absolute;
top:-9999px;
opacity:0;
filter:alpha(opacity:0);
}
2、为input控件添加label,属性for的值即为上传控件的ID,代码如下:
<label for=”upload_file”>上传新图标</label>
剩下的就是利用CSS美化这个label了。
参考NPAPI。
网景插件应用程序编程接口(NPAPI, Netscape Plugin Application Programming Interface)是Netscape Navigator、Mozilla Suite、Mozilla SeaMonkey、Mozilla Firefox、Apple Safari和Google Chrome等Gecko引擎浏览器所使用的类似ActiveX的插件接口。
NPAPI编程学习参考:http://geeklu.com/2010/10/getting-started-with-npapi-plugin/
其实,只要浏览器赋予网站的权限足够大,那么利用Javasript可对计算机实现非常多的控制。
比如,执行命令行命令(如关机命令、打开某个程序)、操作文件系统(如操作文件、操作目录)等。
这个过程有两个要解决的关键问题:
第一,如何让浏览器赋予特定网站足够的权限。
第二,Javascript代码如何编写。
下面分别介绍。
第一,让浏览器赋予我们的网站足够的权限。IE浏览器“工具”–Internet选项–安全,将站点添加至可信站点。对可信站点进行“自定义级别”,启用“对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本”。至此完成。
第二,JavaScript代码如何编写。提供下面两个函数供参考。
/*
* 说明:运行脚本命令或脚本文件
* 示例:shell_run(“shutdown -r -t 30”);
shell_run(“c:\\shutdown.bat”);
*/
function shell_run(shell_path) {
try {
var objShell = new ActiveXObject(“wscript.shell”);
objShell.Run(shell_path);
objShell = null;
}
catch (e) {
////////////////////////
}
}
/* * 创建文件并写入内容 */ function CreateFile() {
var fso, tf;
fso = new ActiveXObject("Scripting.FileSystemObject");
tf = fso.CreateTextFile("c:\\testfile.txt", true);
//
写一行,并且带有新行字符。tf.WriteLine("Testing 1, 2, 3.") ;
//
向文件写三个新行字符。
tf.WriteBlankLines(3) ;
//
写一行。tf.Write ("This is a test.");
tf.Close();
}
1、每天,形形色色的人,忙忙碌碌,究竟是为了什么?
2、人的思想、境界、层次,决定了人的成就。
3、不要把自己的职业想象的太神圣,其实都是为了活计而混口饭吃。
4、劳动者靠双手,资本家靠劳动者的双手。
5、遵循本心。
6、三思,而后,言、行。
7、停顿下来,仰望苍穹,思考人生。
今天,在完善一个原来项目的过程中,实现了两个想法:一个是表格单元格宽度的强制固定,另一个是网页对屏幕分辨率的自适应。下面分别介绍一下。
曾经碰到一个非常头疼的问题:一个table拆分为两个后,如何让两个table中的各个列精确对齐,看起来如同一个表。
这个问题,初想起来是蛮简单的:只要给两个table都添加相同的一堆<col>不就行了?
但实际操作起来却发现存在这样的问题:表格会根据单元格中填充内容的多少自动调整表格。
后来,我尝试着将table的各列的宽度直接作为行内style进行定义,结果也一样,表格仍然自动调整。
这里不再详述问题的解决过程。将几点重要经验分享给大家:
1、单元格的溢出处理
[css]
table{
width:1000px;
table-layout:fixed;
}
td{
overflow:hidden;
text-overflow:ellipsis;
}
[/css]
2、根据框模型,仔细分析宽度组成。这里重点观察:width是否如你所想的,包含了border、padding等。
小技巧:很多浏览器自带调试工具,用调试工具进行查看能发现意想不到的问题!
此项目要求在不同分辨率的屏幕上具有较为严格的一致性。这里给出解决思路供大家参考。
1、头部HEAD
[html]
这些文件中只包含各分辨率下不同的部分,相同部分放在style.css中。
命名方式参考:style_pack_1920_1080.css, style_pack_1024_768.css。
3、利用js进行css文件引入控制
给出jquery代码:
[javascript]
function ajust_to_screen(){
var width = parseInt( $(‘body’).css(‘width’) );
var css_pack_file;
switch( width ){
case 1024:
css_pack_file = ‘style_pack_1024_768.css’;
break;
case 1920:
css_pack_file = ‘style_pack_1920_1080.css’;
break;
default:
css_pack_file = ‘style_pack_1920_1080.css’;
break;
}
$(‘style_pack’).attr( ‘href’, css_pack_file );
}
[/javascript]