一 : IncrediBuild工具使用及设置(转)
虽然现在计算机的运算速度不断提高, 但大型软件的编译速度仍然是个漫长的过程,我所在的项目, 软件大小约为200K行, 在VC6下的编译时间为3分钟(P4 1.8G, 512M), 在交叉编译时更慢, 提高编译速度将能够直接提高前期调测的效率. 本文将介绍提高编译速度的有效方法之一 - 分布式编译.
分布式编译的原理很简单, 就是将编译的整个工作量通过分布计算的方法分配到多个计算机上执行, 这样可以获得极大的效率提升. 由于分布式计算的技术相对成熟, 现在可以见到的分布式编译软件也较多. 一般来说, 一个分布式编译软件不是一个编译器, 而是附着在某个编译器上的分布计算管理软件, 使得对于特定的编译器可以实现分布式编译.
常见的分布式编译器通常是对应于特定的C/C++编译器, 如Gcc, Visual C++, 因为这些编译器使用相当广泛且开放度高. 因而实现分布式编译的意义更大. 下面分别以Visual C++和Gcc为例说明两个典型的分布式编译软件:
1)IncrediBuild
这是一个对应Visual C++ 的分布式编译软件, 通过Visual C++强大的IDE扩展功能, 它有着非常友好的界面, 可以将整个分布式编译过程直观的展现给用户, 并且它通过一个"虚拟机"的技术, 使能编译的参与者可以与编译发起者有着不同的系统配置(Windows操作系统版本, 库文件等), 甚至无需在参与者机器上安装Visual C++.
IncrediBuild需要一个特定的计算机做仲裁者, 其他的所有计算机作为客户, 有了仲裁者的好处是, 可以有它来统一安排所有客户端所发起的编译请求, 一旦某个客户发起编译请求, 则仲裁者会根据其他客户的CPU空闲情况而安排分布式编译, 当多个客户同时发起编译请求时, 仲裁者会自动平衡分布计算负担,使得编译参与者不会占用过多的CPU.
在我们的项目中, 使用IncrediBuild的结果如下:
未使用: 3分钟
5客户: 40秒
10客户: 25秒
可见IncrediBuild对编译性能的巨大提升, 并且在取得如此性能提升的同时, 仲裁者和编译参与者的CPU占用率很低. 保持相当高的可用性, 这是很难得的.
IncridiBuild的缺点是目前仅支持Visual C++ 6编译器和.Net编译器, 也仅适用于Windows平台. 适用范围相对较窄.
2)DistCC
这是一个GNU的分布式C++编译器, 适用于一切Gcc兼容的C++编译器, DistCC也具有很好的跨平台特性, 支持Linux, XFree86, CygWin等平台. 使用范围相当广泛.
DistCC和IncrediBuild的差别在与DistCC不使用仲裁者, 直接由客户端对其他客户端发起编译请求. 所以每个客户端都需要知道其他客户端的位置, 并且当多个客户发起编译请求时不易做平衡处理.
下面说一下怎样利用increbuild实现分布式编译
1.make文件夹里面的Gsm2.mak修改make工具的编译项为IncredBuild增加运行参数
#@echo tools/make.exe -fmake/comp.mak -r -R COMPONENT=$* ... $(strip $(COMPLOGDIR))/$*.log
@if /I %OS% EQU WINDOWS_NT /
(if /I $(BM_NEW) EQU TRUE /
(XGConsole /command="tools/make.exe -fmake/comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))/$*.log 2>&1" /NOLOGO /profile="tools/XGConsole.xml") /
else /
(XGConsole /command="tools/make.exe -fmake/comp.mak -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))/$*.log 2>&1" /NOLOGO /profile="tools/XGConsole.xml") /
) /
else /
(if /I $(BM_NEW) EQU TRUE /
(tools/make.exe -fmake/comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))/$*.log) /
else /
(tools/make.exe -fmake/comp.mak -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))/$*.log) /
)
@type $(strip $(COMPLOGDIR))/$*.log >> $(LOG)
@perl ./tools/chk_lib_err_warn.pl $(strip $(COMPLOGDIR))/$*.log
2.tools工具夹里面加入 XGConsole.xml
内容为
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Profile FormatVersion="1">
<Tools>
<Tool Filename="perl" AllowRemote="true" />
<Tool Filename="make" AllowIntercept="true" />
<Tool Filename="tcc" AllowRemote="true" />
<Tool Filename="tcpp" AllowRemote="true" />
<Tool Filename="armcc" AllowRemote="true" />
<Tool Filename="armcpp" AllowRemote="true" />
<Tool Filename="strcmpex" AllowRemote="true" />
<Tool Filename="warp" AllowRemote="true" />
<Tool Filename="armar" AllowRemote="false" />
<Tool Filename="formelf" AllowRemote="false" />
</Tools>
</Profile>
3.tools工具夹里面的make2.pl修改以下几行
if (($action eq "update") || ($action eq "remake") || ($action eq "new") || ($action eq "bm_new") ||
扩展:incredibuild破解工具 / incredibuild设置 / incredibuild使用
{
if ($ENV{"NUMBER_OF_PROCESSORS"} > 1)
{
if ($fullOpts eq "")
{
$fullOpts = "CMD_ARGU=-j$ENV{/"NUMBER_OF_PROCESSORS/"}";
}
else
{
$fullOpts .= ",-j$ENV{/"NUMBER_OF_PROCESSORS/"}";
}
}
}
改为
if (($action eq "update") || ($action eq "remake") || ($action eq "new") || ($action eq "bm_new") ||
($action eq "c,r") || ($action eq "c,u"))
{
if ($ENV{"NUMBER_OF_PROCESSORS"} >= 1)
{
if ($fullOpts eq "")
{
$fullOpts = "CMD_ARGU=-j$ENV{/"NUMBER_OF_PROCESSORS/"}"."0";
}
else
{
$fullOpts .= ",-j$ENV{/"NUMBER_OF_PROCESSORS/"}"."0";
}
}
}
$ENV{"NUMBER_OF_PROCESSORS"} = 10; //修改为你想要的进程数
4.把tools里面的make.exe换成多任务的文件
联合编译的功能引入分为下面几个要素:
1. 使能或禁止联合编译功能;
2. 检查XGC是否存在;
3. 定义可用的进程数;
4. 中间编译文件;
5. 编译命令;
1.1. 使能或禁止联合编译的参数设定
对于MTK平台,可以通过命令行方式参数“-disable_ib”,“-no_ib”或“-bm”。(www.61k.com]我们可以通过查看脚本make2.pl确认。
}elsif ($ARGV[0] =~ /-disable_ib/i)
{
$disable_ib = 1;
}elsif ($ARGV[0] =~ /-no_ib/i)
{
$disable_ib = 1;
} elsif ($ARGV[0] =~ /-bm/i)
{
$disable_ib = 1;
}
确认联合编译环境
接着系统开始检查联合编译器以及系统是否支持联合编译,请看下面脚本的检查。首先,脚本执行命令“$exec_xgc_result = `XGConsole /NOLOGO /SILENT /NOWAIT tools//XGC_Test.xml 2>&1`;”,确认是否存在联合编译器。
my $no_of_proc=1;
my $exec_xgc_result=999;
# $exec_xgc_result = system("XGConsole /NOLOGO /SILENT tools//XGC_Test.xml /n");
$exec_xgc_result = `XGConsole /NOLOGO /SILENT /NOWAIT tools//XGC_Test.xml 2>&1`;
if ("$exec_xgc_result" ne "")
{
$exec_xgc_result=99;
# print "XGConsole not found";
} else
{
if (("$ENV{/"TERM/"}" eq "") && ("$ENV{/"USERDOMAIN/"}" eq "DOMAIN_MTK"))
{
$disable_ib = 1;
print " WARNING: XGConsole is supported but it's NOT in telnet mode. TERM is not defined! /n";
}
if ($disable_ib==0)
{
$exec_xgc_result=0;
# print "XGConsole found";
} else
{
$exec_xgc_result=99;
}
}
其中,XGC_Test.xml是比较简单的。然后,通过环境变量确认OS是否支持联合编译。
扩展:incredibuild破解工具 / incredibuild设置 / incredibuild使用
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<BuildSet>
<Environments>
</Environments>
</BuildSet>
下面的脚本是用来确认对VC++的联合编译特性的支持的。
my $exec_buildconsole=999;
#$exec_buildconsole = system("BuildConsole /n");
$exec_buildconsole = `BuildConsole 2>&1`;
if ($exec_buildconsole =~ /IncrediBuild/)
{
if ( "$ENV{/"TERM/"}" eq "" )
{
$disable_ib = 1;
print " WARNING: BuildConsole is supported but it's NOT in telnet mode. TERM is not defined! /n";
}
if ($disable_ib==0)
{
$exec_buildconsole=0;
#print "/nBuildConsole found";
} else
{
$exec_buildconsole=99;
}
} else
{
$exec_buildconsole=99;
#print "/nBuildConsole not found";
}
if ( $exec_buildconsole==0 ) # support BuildConsole
{
system "perl tools//RunMsdev.pl";
$msdev = 'BuildConsole msdev';
} else # not support BuildConsole
{
$msdev = 'msdev';
}
1.3. 定义进程数
根据CPU个数设定编译可创建的进程数,一般双核CPU的进程数设为4各基本均衡了。
if (($action eq "update") || ($action eq "remake") || ($action eq "new") || ($action eq "bm_new") ||
($action eq "c,r") || ($action eq "c,u") || ($action eq "scan"))
{
if ($ENV{"NUMBER_OF_PROCESSORS"} > 1)
{
if ( $exec_xgc_result==0 )
{
$no_of_proc = $ENV{"NUMBER_OF_PROCESSORS"}*2;
if ($fullOpts eq "")
{
$fullOpts = "CMD_ARGU=-j$no_of_proc";
} else
{
$fullOpts .= ",-j$no_of_proc";
}
} else
{
if ($fullOpts eq "")
{
$fullOpts = "CMD_ARGU=-j$ENV{/"NUMBER_OF_PROCESSORS/"}";
} else
{
$fullOpts .= ",-j$ENV{/"NUMBER_OF_PROCESSORS/"}";
}
}
MTK还提供了通过“-o|-op|opt”来设定进程数。
if ($fullOpts ne "") {
# Fix build errors when "parallel jobs processing" fuction enabled by argument "-o|-op|-opt" in command line
my @temp = @mOpts;
@mOpts = ();
foreach (@temp)
{
if ($_ =~ /^/s*(-j|--jobs)/)
{
$fullOpts .= ",$_";
}
else
{
push(@mOpts,$_);
}
}
# End
$fullOpts =~ s/"///"/g;
$fullOpts = "/"$fullOpts/"";
$fullOpts =~ s/,/ /g;
$makeCmd .= " " . join(" ", @mOpts) . " $fullOpts ";
}
1.4. 中间编译文件
中间编译文件intermed.mak包括了需要编译各个模块的依赖关系和编译方法。
1.5. 编译命令
(if /I $(BM_NEW) EQU TRUE /
(XGConsole /command="tools/make.exe -fmake/intermed.mak -k -r -R $(strip $(CMD_ARGU)) " /NOLOGO /profile="tools/XGConsole.xml" ) /
else /
(XGConsole /command="tools/make.exe -fmake/intermed.mak -r -R $(strip $(CMD_ARGU)) " /NOLOGO /profile="tools/XGConsole.xml" ) /
) /
其中,XGConsole.xml规定了各种编译工具的是否支持远程工作和是否允许分段处理的特性。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Profile FormatVersion="1">
<Tools>
<Tool Filename="perl" AllowRemote="true" />
<Tool Filename="make" AllowIntercept="true" />
<Tool Filename="tcc" AllowRemote="true" />
<Tool Filename="tcpp" AllowRemote="true" />
<Tool Filename="armasm" AllowRemote="true" />
扩展:incredibuild破解工具 / incredibuild设置 / incredibuild使用
<Tool Filename="armcc" AllowRemote="true" />
<Tool Filename="armcpp" AllowRemote="true" />
<Tool Filename="strcmpex" AllowRemote="true" />
<Tool Filename="warp" AllowRemote="true" />
<Tool Filename="armar" AllowRemote="false" />
<Tool Filename="fromelf" AllowRemote="false" />
</Tools>
</Profile>
按照Xoreax IncrediBuild的说明我们可以在用GNUMAKE等语言的编译器使用联合编译。
IncrediBuild 试用时间推迟的算法
EXTERN_C void GetIncrediBuildLicKey(DATE date, LPTSTR lpszKey, UINT cchMax)
{
BYTE * pByte = (BYTE *)&date;
BYTE * T1 = (BYTE *) (pByte);
BYTE * T2 = (BYTE *) (pByte + 2);
DWORD dwM1 = (DWORD) *pByte;
dwM1 *= (DWORD) *(pByte + 1);
dwM1 *= (DWORD) *(pByte + 2);
dwM1 *= (DWORD) *(pByte + 3);
WORD wM2 = (WORD) *(pByte + 4);
wM2 *= (WORD) *(pByte + 5);
WORD wM3 = (WORD) *(pByte + 6);
wM3 *= (WORD) *(pByte + 7);
TCHAR szOut[MAX_PATH] = { 0 };
wsprintf(szOut, _T("{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}"),
dwM1,
wM2,
wM3,
*T1, *(T1+1),
*T2, *(T2+1), *(T2+2), *(T2+3), *(T2+4), *(T2+5)
);
lstrcpyn(lpszKey, szOut, cchMax);
}
以上代码调用方法:
void CCrackibDlg::OnButton1()
{
COleDateTime destTime = COleDateTime::GetCurrentTime();
COleDateTime dateTime(destTime.GetYear(), destTime.GetMonth()+1, destTime.GetDay()-1, 23, 59, 59);
DATE Date = (DATE)dateTime;
TCHAR szOut[MAX_PATH] = { 0 };
GetIncrediBuildLicKey((DATE)Date, szOut, MAX_PATH);
SetDlgItemText(IDC_EDIT1, szOut);
}
-------------------------------------------------------------------------------
这些天对IncrediBuild进一步研究了其软件安全保护措施,发现3.40版本与前几个版本很相似,只是对于试用版有效期限保护的密文更换了在注册表中的位置。下面我详细解释我这两天的研究过程,希望对大家有帮助。
1.打开注册表监督程序,查看已安装IncrediBuild的“关于”对话框,发现它会去取注册表的键值:
HKEY_CLASSES_ROOT/Interface/{48C6296A-4F4C-4238-A9E1-60E9A544A863}
"Field"
HKEY_CLASSES_ROOT/Interface/{48C6296A-4F4C-4238-A9E1-60E9A544A863}/NumMethods
"4"
HKEY_CLASSES_ROOT/Interface/{48C6296A-4F4C-4238-A9E1-60E9A544A863}/ProxyStubClsid32
"{M1-M2-M3-T1-T2}"
2.当我把ProxyStubClsid32的键值修改为“0”,查看IncrediBuild的“关于”对话框,提示我过期时间为1899-12-30;
3.删除HKEY_CLASSES_ROOT/Interface/{48C6296A-4F4C-4238-A9E1-60E9A544A863}整个项目,查看IncrediBuild的“关于”对话框,提示我证书无效;
4.卸载IncrediBuild后,并将电脑时间设置到2100年,再安装软件,安装完成后,提示我过期时间为2100年某年某月,但软件仍为过期不能使用。
5.通过上面的实验可以肯定的是在试用版授权模式下,试用期确定为30天,当前时间与过期时间相差大于30天,都认为过期。可过期时间的密文的位置已经让我们发现,我们可以在不改变授权模式的情况下,总取更新过期时间也能达到延长软件使用的效果。
看过网上一些文章说,其证书是RSA签出的证书,要么修改软件中的公钥去更换加密密钥,这样影响颇大。幸好,网上有高手给出了3.31的过期时间密文的加密算法,那让我们来冲浪一下吧。破解方案确定为重置试用期时间。
编码,测试,单调却有那么点诱惑的成就感:
整个破解程序的流程为:
1.调用GetLocalTime获取当前时间;
2.做计算当前日期后若干天数的算法:
unsigned char month_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
days = curday + offset;
for(months = curmonth -1; ; months++)
{
years = curyear + months/12;
if(curyear%4)
month_days[1] = 28;
else
month_days[1] = 29;
if(days <= month_days[months%12])
break;
days -= month_days[months%12];
}
curyear = years;
curmonth = months%12 + 1;
扩展:incredibuild破解工具 / incredibuild设置 / incredibuild使用
IncrediBuild破解+3.51版本下载:http://download.csdn.net/source/3331797
IncrediBuild联合编译的使用
分类:incredibuild3_302009-06-15 17:32 1612人阅读评论(0)收藏举报
联合编译的意义在于充分利用网格中的闲置电脑资源提高我们的编译效率。它主要由Agents和Coordinator Server组成。Agents主要作为工作机,分配出来的计算工作在这些电脑上完成。Coordinator Server负责分配工作,协调网络中的各个电脑的性能均衡。
联合编译的功能引入分为下面几个要素:
1. 使能或禁止联合编译功能;
2. 检查XGC是否存在;
3. 定义可用的进程数;
4. 中间编译文件;
5. 编译命令;
1.1. 使能或禁止联合编译的参数设定
对于MTK平台,可以通过命令行方式参数“-disable_ib”,“-no_ib”或“-bm”。我们可以通过查看脚本make2.pl确认。
} elsif ($ARGV[0] =~ /-disable_ib/i) {
$disable_ib = 1;
} elsif ($ARGV[0] =~ /-no_ib/i) {
$disable_ib = 1;
} elsif ($ARGV[0] =~ /-bm/i) {
$disable_ib = 1;
}
1.2. 确认联合编译环境
接着系统开始检查联合编译器以及系统是否支持联合编译,请看下面脚本的检查。首先,脚本执行命令“$exec_xgc_result = `XGConsole /NOLOGO /SILENT /NOWAIT tools//XGC_Test.xml 2>&1`;”,确认是否存在联合编译器。
my $no_of_proc=1;
my $exec_xgc_result=999;
# $exec_xgc_result = system("XGConsole /NOLOGO /SILENT tools//XGC_Test.xml /n");
$exec_xgc_result = `XGConsole /NOLOGO /SILENT /NOWAIT tools//XGC_Test.xml 2>&1`;
if ("$exec_xgc_result" ne "")
{
$exec_xgc_result=99;
# print "XGConsole not found";
} else
{
if (("$ENV{/"TERM/"}" eq "") && ("$ENV{/"USERDOMAIN/"}" eq "DOMAIN_MTK"))
{
$disable_ib = 1;
print " WARNING: XGConsole is supported but it's NOT in telnet mode. TERM is not defined! /n";
}
if ($disable_ib==0)
{
$exec_xgc_result=0;
# print "XGConsole found";
} else
{
$exec_xgc_result=99;
}
}
其中,XGC_Test.xml是比较简单的。然后,通过环境变量确认OS是否支持联合编译。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<BuildSet>
<Environments>
</Environments>
</BuildSet>
下面的脚本是用来确认对VC++的联合编译特性的支持的。
my $exec_buildconsole=999;
#$exec_buildconsole = system("BuildConsole /n");
$exec_buildconsole = `BuildConsole 2>&1`;
if ($exec_buildconsole =~ /IncrediBuild/)
{
if ( "$ENV{/"TERM/"}" eq "" )
{
$disable_ib = 1;
print " WARNING: BuildConsole is supported but it's NOT in telnet mode. TERM is not defined! /n";
}
if ($disable_ib==0)
{
$exec_buildconsole=0;
#print "/nBuildConsole found";
} else
{
$exec_buildconsole=99;
}
} else
{
$exec_buildconsole=99;
#print "/nBuildConsole not found";
}
if ( $exec_buildconsole==0 ) # support BuildConsole
{
system "perl tools//RunMsdev.pl";
$msdev = 'BuildConsole msdev';
} else # not support BuildConsole
{
$msdev = 'msdev';
}
1.3. 定义进程数
根据CPU个数设定编译可创建的进程数,一般双核CPU的进程数设为4各基本均衡了。
if (($action eq "update") || ($action eq "remake") || ($action eq "new") || ($action eq "bm_new") ||
($action eq "c,r") || ($action eq "c,u") || ($action eq "scan")) {
扩展:incredibuild破解工具 / incredibuild设置 / incredibuild使用
if ($ENV{"NUMBER_OF_PROCESSORS"} > 1) {
if ( $exec_xgc_result==0 )
{
$no_of_proc = $ENV{"NUMBER_OF_PROCESSORS"}*2;
if ($fullOpts eq "") {
$fullOpts = "CMD_ARGU=-j$no_of_proc";
} else {
$fullOpts .= ",-j$no_of_proc";
}
} else {
if ($fullOpts eq "") {
$fullOpts = "CMD_ARGU=-j$ENV{/"NUMBER_OF_PROCESSORS/"}";
} else {
$fullOpts .= ",-j$ENV{/"NUMBER_OF_PROCESSORS/"}";
}
}
}
}
MTK还提供了通过“-o|-op|opt”来设定进程数。
if ($fullOpts ne "") {
# Fix build errors when "parallel jobs processing" fuction enabled by argument "-o|-op|-opt" in command line
my @temp = @mOpts;
@mOpts = ();
foreach (@temp)
{
if ($_ =~ /^/s*(-j|--jobs)/)
{
$fullOpts .= ",$_";
}
else
{
push(@mOpts,$_);
}
}
# End
$fullOpts =~ s/"///"/g;
$fullOpts = "/"$fullOpts/"";
$fullOpts =~ s/,/ /g;
$makeCmd .= " " . join(" ", @mOpts) . " $fullOpts ";
}
1.4. 中间编译文件
中间编译文件intermed.mak包括了需要编译各个模块的依赖关系和编译方法。
1.5. 编译命令
(if /I $(BM_NEW) EQU TRUE /
(XGConsole /command="tools/make.exe -fmake/intermed.mak -k -r -R $(strip $(CMD_ARGU)) " /NOLOGO /profile="tools/XGConsole.xml" ) /
else /
(XGConsole /command="tools/make.exe -fmake/intermed.mak -r -R $(strip $(CMD_ARGU)) " /NOLOGO /profile="tools/XGConsole.xml" ) /
) /
其中,XGConsole.xml规定了各种编译工具的是否支持远程工作和是否允许分段处理的特性。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Profile FormatVersion="1">
<Tools>
<Tool Filename="perl" AllowRemote="true" />
<Tool Filename="make" AllowIntercept="true" />
<Tool Filename="tcc" AllowRemote="true" />
<Tool Filename="tcpp" AllowRemote="true" />
<Tool Filename="armasm" AllowRemote="true" />
<Tool Filename="armcc" AllowRemote="true" />
<Tool Filename="armcpp" AllowRemote="true" />
<Tool Filename="strcmpex" AllowRemote="true" />
<Tool Filename="warp" AllowRemote="true" />
<Tool Filename="armar" AllowRemote="false" />
<Tool Filename="fromelf" AllowRemote="false" />
</Tools>
</Profile>
按照Xoreax IncrediBuild的说明我们可以在用GNUMAKE等语言的编译器使用联合编译。
Xoreax IncrediBuild
Xoreax IncrediBuild是分布式编译(多线程处理)技术,我们也称之为联合编译.如果局域网内存在多台电脑安装了这个,在编译C/C++时,它会使用空闲的CPU一起编译,大大缩短了编译的时间,对于大工程来说,是一件非常爽的事情.
IncrediBuild分为服务端(Coordinator)和客户端(Agent).简单的理解是服务端是协调任务的分配,客户端把分到手的任务编译后再返还回去.注意的是,服务端只负责分配工作,之后者最客户端之间P2P的操作,如果二个客户端建立好链接后,此时再与服务端断开也不会影响他们之间的编译了.
1) 服务端(Coordinator)的安装:
运行IncrediBuild安装程序,选择Install IncrediBuild,并点Next下一步.同意那什么License Agreement继续下一步.来到安装组件选择(Component Selection).这里做为服务端我们要钩先上IncrediBuild Coordinator.这里是一个复选框,一般来说服务端也可以参与编译工作,如果不想让服务端参与编译工作的话,就把上面的IncrediBuild Agent前的钩点掉就可以
继续下一步,选择安装路径,和使用的一些端口号.参与编译的CPU数(这个只有钩选了Agent后才会有)等,这些使用默认的就可以了.之后安装完成.IncrediBuild的服务端就安装好了.
2) 客户端(Agent)的安装:
在其它的电脑上,运行IncrediBuild的安装程序,运行到安装组件选择(Component Selection),只钩选IncrediBuild Agnet并下一步
选择安装路径,并下一步.在这要填入服务端的IP地址和端口号.
填好之后下一步,它会与服务器进行验证一下.然后设置一下编译通讯的端口之类的.这与网内安装的其它的一至就行了,一般情况都使用默认.然后选择参与编译的CPU数.最后安装就行了.
扩展:incredibuild破解工具 / incredibuild设置 / incredibuild使用
到这步,基本上服务器与客户端都安装完成.在Coordinator Monitor中可以看到各成员的状态.
打开VS你将会发现菜单栏上多出了一项IncrediBuild的选项.这就是那个所谓的联合编译了.
找个工程试一下就知道了.
附上IncrediBuild的安装文件及试用期时间复位工具
扩展:incredibuild破解工具 / incredibuild设置 / incredibuild使用
二 : 自助式微软BI工具PowerPivot使用介绍!
上篇《自助式微软BI工具PowerPivot简介!》已对PowerPivot插件作了简单介绍,本文将进一步介绍PowerPivot插件的基本情况,以便各位童鞋初步掌握此工具的条件,本文以SQL Server 2008 R2 PowerPivot为例进行介绍,PowerPivot 支持最大为 2GB 的文件,最多允许在内存中处理 4GB 的数据。[www.61k.com)PowerPivot 还包括数据分析表达式 (DAX)。DAX 是一种新的公式语言,它对于 Excel 的数据操作功能进行了扩展,从而可以实现更高级和更复杂的分组、计算和分析。DAX 公式的语法非常类似于 Excel 公式的语法,都使用函数、运算符和值的组合。
Excel 与 PowerPivot 工作簿之间的差异
在 PowerPivot 窗口和 Excel 窗口中处理数据的方式不同。下面是我们要特别指出的一些其他重要区别: • PowerPivot 数据可以在具有以下文件类型的工作簿中保存:Excel 工作簿 (*.xlsx)、启用 Excel 宏的工作簿 (*.xlsm) 和 Excel 二进制工作簿 (*.xlsb)。在具有其他格式的工作簿中不支持 PowerPivot 数据。
• PowerPivot 窗口不支持 Visual Basic for Applications (VBA)。您可以在 PowerPivot 工作簿的 Excel 窗口中使用 VBA。
• 在 Excel 数据透视表中,可以通过右键单击列标题然后选择“组”来将数据分组。此功能通常用于按日期将数据分组。在基于 PowerPivot 数据的数据透视表中,可以使用计算列来实现类似功能。有关详细信息,请参阅 Grouping Dates(分组日期)。
将数据发布到 SharePoint
创建一个 PowerPivot 工作簿之后,可以按通常共享文件的各种方式与他人共享它。不过,通过将文件发布到安装了 PowerPivot for SharePoint 和 Excel Services 的 SharePoint 服务器或场中,可以获得许多好处。在 SharePoint 服务器上,这些服务一起用来处理该工作簿:PowerPivot for SharePoint 组件处理数据,Excel Services 在浏览器窗口中呈现它,而其他用户在该窗口中可继续分析数据。
SharePoint 上的 PowerPivot 服务增加了对您发布到 SharePoint 中的 PowerPivot 工作簿的协作和文档管理支持。PowerPivot for SharePoint 提供一种新的文档库类型,借助于该文档库,可以在 PowerPivot 工作簿中呈现报表的丰富预览,能够根据发布的 PowerPivot 工作簿中的数据创建 Reporting Services 报表,而且能够计划自动刷新外部数据源中的 PowerPivot 数据。
下表指定了 PowerPivot 组件中定义的各种对象的最大大小和最大数量。
最大容量规范
对象 | 规范/限制 |
---|---|
对象名称长度 | 100 个字符 |
名称中的无效字符 | ., ; ' ` : / \ * | ?" & % $ ! + = () [] {} < > |
每个 PowerPivot 数据库的表数 | (2^31) - 1 = 2,147,483,647 |
每个表的列数和计算列数 | (2^31) - 1 = 2,147,483,647 |
表中的计算度量值数 | (2^31) - 1 = 2,147,483,647 |
用于保存工作簿的 PowerPivot 内存大小 | 4GB = 4,294,967,296 字节 |
每个工作簿的并发请求数 | 6 |
本地多维数据集连接数 | 5 |
列中的非重复值数目 | 1,999,999,997 |
表中的行数 | 1,999,999,997 |
字符串长度 | 536,870,912 字节 (512 MB),相当于 268,435,456 个 Unicode 字符(2 亿 5 千 6 百万个字符) |
注意 |
---|
此字符串限制不适用于以下函数,这些函数中的字符串不能超过 2,097,152 个 Unicode 字符: |
CONCATENATE 和嵌入连接运算符
DATEVALUE
EXACT
FIND
FORMAT
LEFT
LEN
LOWER
MID
REPLACE
REPT,限制适用于输入参数和结果
RIGHT
SEARCH
SUBSTITUTE,限制适用于输入参数和结果
TIMEVALUE
TRIM
UPPER
安装PowerPivot的软硬件要求如下:
硬件和软件要求
用于创建 PowerPivot 工作簿的计算机必须满足针对 Office 2010 的最低硬件和软件要求。
硬件要求
组件 | 最低要求 |
---|---|
处理器 | 500 MHz 32 位或 64 位处理器 |
RAM | 2 到 4 GB RAM。外接程序使用大约 25 MB 的 RAM。在第一个数据透视表添加到工作表时,将使用另外 33 MB。PowerPivot 工作簿需要额外的 RAM。所需的 RAM 量视您创建的工作簿而异。 PowerPivot 最多支持 2GB 大小的文件。使用 PowerPivot 的 64 位版本,您可以在内存中处理最多 4GB 的数据;而使用 32 位版本的数据, 您可以在内存中处理最多 2GB 的数据。 |
磁盘空间 | 程序文件需要 100 MB 磁盘空间。存储数据文件需要附加磁盘空间。尽管文件包含压缩数据,但是如果创建许多包含超大量数据的工作簿,您可能需要大量的磁盘空间。没有办法事先知道您的磁盘空间要求将是多少。在创建和保存文件时,请确保监视磁盘空间使用情况,以确保有足够的空间。 |
软件要求
PowerPivot for Excel 可安装在具有 32 位或 64 位 Excel 2010 的计算机上。如果您安装了 32 位版的 Excel,则必须安装 32 位版的 PowerPivot for Excel。同样,如果您安装了 64 位版的 Excel,则必须安装 64 位版的 PowerPivot for Excel。
最低要求 | |
---|---|
操作系统 | Windows XP SP3(仅限 32 位)、Windows Vista SP2、Windows 7、Windows Server 2003 R2 with MSXML 6.0(仅限 32 位)、Windows Server 2008 SP2 或 Windows Server 2008(仅限 64 位)。 如果使用的是 Windows Vista 或 Windows Server 2008,还必须安装 http://support.microsoft.com/default.aspx/kb/971644 上提供的平台更新。 |
Windows 功能 | Microsoft .NET Framework 3.5 SP1(在安装 Office 之前安装) |
Excel 版本要求 | 安装 PowerPivot for Excel 需要 Excel 2010(32 位或 64 位)。 |
Office 功能 | 必须随 Excel 2010 一起安装 Office 共享功能。 还必须安装 Microsoft Excel 中的 .NET 可编程支持。 |
注意 |
---|
在工作簿中创建和使用 PowerPivot 数据时,需要 Excel 2010 和 PowerPivot for Excel 外接程序。Excel 2007 可用于打开 PowerPivot 工作簿以及更改样式和格式(例如,应用其他颜色或字体),但不能使用 Excel 2007 与基于 PowerPivot 数据的数据透视表或数据透视图进行交互或更改基础数据。 |
建议
SQL Server PowerPivot for Excel 可以与 Excel 2010 的 32 位或 64 位版本一起使用。但是,64 位版本的 Excel 和 PowerPivot for Excel 所支持的数据远远多于 32 位版本。特别是,如果您要导入超过一百万行或列的数据,则必须使用 64 位版本。否则,如果数据集不是特别大,使用 32 位版本可获得可接受的性能。请注意,如果您打算对 Excel 使用数据挖掘外接程序,则必须使用 32 位版本的 Excel。
组件 | 建议 |
---|---|
平台和操作系统 | Windows 7(64 位)或带有 SP1 的 Windows Vista(64 位)Business Edition 或 Ultimate Edition。 |
Excel 版本要求 | Excel 2010(64 位) |
PowerPivot 工作簿中支持的数据源
可以从下表所列出的数据源中导入数据。PowerPivot for Excel 不安装对每种数据源列出的访问接口。某些访问接口可能已随其他应用程序安装在您的计算机上;否则您需要下载并安装这些访问接口。
还可以链接到 Excel 中的表以及从对剪贴板使用 HTML 格式的应用程序(如 Excel 和 Word)复制并粘贴数据。有关详细信息,请参阅通过使用 Excel 链接表添加数据和将数据复制并粘贴到 PowerPivot。
源 | 版本 | 文件类型 | 访问接口 1 |
Access 数据库 | Microsoft Access 2003、2007 和 2010。 | .accdb 或 .mdb | ACE 14 OLE DB 访问接口 |
SQL Server 关系数据库 | Microsoft SQL Server2005、2008、2008 R2;Microsoft SQL Azure 数据库 2 | (不适用) | OLE DB Provider for SQL Server SQL Server Native Client OLE DB 访问接口 SQL Server Native 10.0 Client OLE DB 访问接口 用于 SQL 客户端的 .NET Framework 数据访问接口 |
SQL Server Parallel Data Warehouse (PDW) 3 | 2008 R2 | (不适用) | OLE DB provider for SQL Server PDW |
Oracle 关系数据库 | Oracle 9i、10g、11g。 | (不适用) | Oracle OLE DB 访问接口 用于 Oracle 客户端的 .NET Framework 数据访问接口 用于 SQL Server 的 .NET Framework 数据访问接口 MSDAORA OLE DB 访问接口 4 OraOLEDB MSDASQL |
Teradata 关系数据库 | Teradata V2R6、V12 | (不适用) | TDOLEDB OLE DB 访问接口 Teradata 的 .NET 数据访问接口 |
Informix 关系数据库 | (不适用) | Informix OLE DB 访问接口 | |
IBM DB2 关系数据库 | 8.1 | (不适用) | DB2OLEDB |
Sybase 关系数据库 | (不适用) | Sybase OLE DB 访问接口 | |
其他关系数据库 | (不适用) | (不适用) | OLE DB 访问接口或 ODBC 驱动程序 |
文本文件 | (不适用) | .txt、.tab、.csv | 用于 Microsoft Access 的 ACE 14 OLE DB 访问接口 |
Microsoft Excel 文件 | Excel 97-2003、2007、2010 | .xlsx、xlsm、.xlsb、.xltx、.xltm | ACE 14 OLE DB 访问接口 |
PowerPivot 工作簿 | Microsoft SQL Server 2008 R2 Analysis Services | xlsx、xlsm、.xlsb、.xltx、.xltm | ASOLEDB 10.5 (只能与发布到已安装 PowerPivot for SharePoint 的 SharePoint 场的 PowerPivot 工作簿一起使用) |
Analysis Services 多维数据集 | Microsoft SQL Server 2005、2008、2008 R2 Analysis Services | (不适用) | ASOLEDB 10 |
数据馈送 (用于从 Reporting Services 报表、Atom 服务文档和单个数据馈送导入数据) | Atom 1.0 格式 公开为 ADO.Net Data Services Framework 服务的任何数据库,如 Microsoft SQL Server 2005、2008、2008、2008 R2 Reporting Services 报表 | 服务文档的可定义一个或多个馈送的 .atomsvc Atom Web 馈送文档的 .atom | Microsoft Data Feed Provider for PowerPivot 用于 PowerPivot 的 .NET Framework 数据馈送数据访问接口 |
Office 数据库连接文件 | .odc |
1 还可以使用用于 ODBC 的 OLE DB 访问接口。
2 有关 SQL Azure 的详细信息,请参阅网站SQL Azure。
3 有关 SQL Server PDW 的详细信息,请参阅网站SQL Server 2008 R2 Parallel Data Warehouse(SQL Server 2008 R2 并行数据仓库)。
4 在某些情况下,使用 MSDAORA OLE DB 访问接口可能会导致连接错误,特别是对于 Oracle 的较新版本时。如果您遇到任何错误,我们建议您使用为 Oracle 列出的其他访问接口之一。
不支持的源
目前不支持以下数据源:
无法导入已发布的服务器文档,例如,已发布到 SharePoint 的 Access 数据库。
选择数据源的提示
从关系数据库导入表可以省去一些操作步骤,因为在导入过程中将使用外键关系在 PowerPivot 窗口中的工作表之间创建关系。
导入多个表,然后删除不需要的表,这样也可以省去一些操作步骤。如果一次导入一个表,则仍可能需要手动创建表之间的关系。
不同数据源中包含类似数据的列是在 PowerPivot 窗口中创建关系的基础。在使用异类数据源时,应选择包含这样的列的表:这些列可以映射到其他数据源中包含相同或类似数据的表。
若要支持针对发布到 SharePoint 的工作簿的数据刷新,请选择工作站和服务器可平等访问的数据源。在发布工作簿后,可以设置数据刷新计划以自动更新工作簿中的信息。使用网络服务器上可用的数据源可以实现数据刷新。有关详细信息,请参阅创建用于 SharePoint 的 PowerPivot 工作簿。
OLE DB 访问接口有时可为大型数据提供更快的性能。在为同一数据源选择不同访问接口时,应首先尝试 OLE DB 访问接口。
PowerPivot 工作簿中支持的数据类型
在 PowerPivot 中支持使用以下数据类型。当您在公式中导入数据或者使用某一值时,即使原始数据源包含不同的数据类型,该数据也转换为以下数据类型之一。从公式得出的值也使用这些数据类型。
通常,实施这些数据类型以便在计算列中实现精确的计算,并且相同的限制将应用于 PowerPivot 中的其余数据以便保持一致性。
用于数字、货币、日期和时间的格式应遵循在打开该工作簿的计算机上指定的区域设置的格式。您可以使用工作表中的格式设置选项控制显示值的方式。
PowerPivot 用户界面中的数据类型 | DAX 中的数据类型 | 说明 |
整数 | 一个 64 位(八字节)整数值 1, 2 | 没有小数位的数字。整数可以是正数或负数,但必须是介于 -9,223,372,036,854,775,808 (-2^63) 和 9,223,372,036,854,775,807 (2^63-1) 之间的整数。 |
小数 | 一个 64 位(八字节)实数 1, 2 | 实数是可具有小数位的数字。实数涵盖很广范围的值: 从 -1.79E +308 到 -2.23E -308 的负值 零 从 2.23E -308 到 1.79E + 308 的正值 但是,有效位数限制为 17 个小数位。 |
TRUE/FALSE | 布尔值 | True 或 False 值。 |
文本 | 字符串 | 一个 Unicode 字符数据字符串。可以是字符串,或以文本格式表示的数字或日期。 最大字符串长度为 268,435,456 个 Unicode 字符(2 亿 5 千 6 百万个字符)或 536,870,912 字节。 |
日期 | 日期/时间 | 采用接受的日期-时间表示形式的日期和时间。 有效值是 1900 年 3 月 1 日后的所有日期。 |
货币 | 货币 | 货币数据类型允许值介于 -922,337,203,685,477.5808 到 922,337,203,685,477.5807 之间,并且具有四个小数位的固定精度。 |
不适用 | 空白 | 空白是 DAX 中的一种数据类型,表示并替代 SQL 中的 Null。您可以通过使用 BLANK 函数创建空白,或者通过使用逻辑函数 ISBLANK 测试是否存在空白。 |
1 DAX 公式不支持比表中所列的类型还小的数据类型。
2 如果您尝试导入具有非常大数值的数据,则导入可能会失败,并且具有以下错误消息:
内存中数据库错误:“<表名>”表的“<列名>”列包含值 "1.7976931348623157e+308",这是不支持的。操作已取消。
此错误是因为 PowerPivot 使用该值来表示 Null 导致的。下表中的值是上述 Null 值的同义词:
值 |
9223372036854775807 |
-9223372036854775808 |
1.7976931348623158e+308 |
2.2250738585072014e-308 |
您应该从数据中删除该值并且尝试再次导入。
表数据类型
此外,DAX 使用“表”数据类型。DAX 在许多函数中都使用此数据类型,如在聚合和时间智能计算中。某些函数要求对表的引用;其他函数返回可用作对其他函数的输入的表。在要求表作为输入的某些函数中,您可以指定计算结果为表的表达式;对于某些函数,要求对基表的引用。有关特定函数的要求的信息,请参阅针对 PowerPivot 的 DAX 函数参考。
DAX 公式中的隐式和显式数据类型转换
每个 DAX 函数都对用作输入和输出的数据类型具有特定的要求。例如,某些函数要求将整数用于某些参数,将日期用于其他参数;其他一些函数则要求文本或表。
如果列中您指定为参数的数据与函数所要求的数据类型不兼容,则在许多情况下 DAX 都会返回错误。但是,只要可能,DAX 都会尝试隐式将数据转换为所需的数据类型。例如:
您可以将日期作为字符串键入,并且 DAX 将分析该字符串并尝试将其转换为 Windows 日期和时间格式之一。
您可以将 TRUE + 1 并且获取结果 2,因为 TRUE 隐式转换为数字 1 并且将执行运算 1+1。
如果您将两列中的值相加,并且一个值表示为文本 ("12"),另一个值表示为数字 (12),则 DAX 会隐式将字符串转换为数字,然后执行加法以得到数值结果。下面的表达式返回 44: = "22" + 22
如果您尝试连接两个数字,则 PowerPivot 外接程序会将它们显示为字符串,然后执行连接。 下面的表达式返回 "1234": = 12 & 34
下表总结了在公式中执行的隐式数据类型转换。通常,PowerPivot 在行为上类似于 Microsoft Excel,在指定操作要求时将尽可能执行隐式转换。
隐式数据转换表
执行的转换类型由运算符确定,运算符在执行请求的运算前转换它要求的值。这些表列出了运算符,并且在与相交行中的数据类型搭配时指示对列中的每种数据类型执行的转换。
注意 |
---|
这些表中不包含文本数据类型。在数字表示为文本格式时,在某些情况下,PowerPivot 将尝试确定数字类型并且将其表示为数字。 |
加 (+)
运算符 (+) | INTEGER | CURRENCY | REAL | Date/time |
INTEGER | INTEGER | CURRENCY | REAL | 日期/时间 |
CURRENCY | CURRENCY | CURRENCY | REAL | 日期/时间 |
REAL | REAL | REAL | REAL | 日期/时间 |
日期/时间 | 日期/时间 | 日期/时间 | 日期/时间 | Date/time |
例如,如果某一实数在加法运算中与货币数据结合使用,则两个值都转换为 REAL,并且结果返回为 REAL。
减 (-)
在下表中,行标题是被减数(左侧),列标题是减数(右侧)。
运算符 (-) | INTEGER | CURRENCY | REAL | 日期/时间 |
INTEGER | INTEGER | CURRENCY | REAL | REAL |
CURRENCY | CURRENCY | CURRENCY | REAL | REAL |
REAL | REAL | REAL | REAL | REAL |
日期/时间 | 日期/时间 | 日期/时间 | 日期/时间 | 日期/时间 |
例如,如果某一日期用于采用任何其他数据类型的减法运算中,则两个值都转换为日期,并且返回值也是日期。
注意 |
---|
PowerPivot 还支持一元运算符 -(负号),但此运算符不能更改操作数的数据类型。 |
乘 (*)
运算符 (*) | INTEGER | CURRENCY | REAL | 日期/时间 |
INTEGER | INTEGER | CURRENCY | REAL | INTEGER |
CURRENCY | CURRENCY | REAL | CURRENCY | CURRENCY |
REAL | REAL | CURRENCY | REAL | REAL |
例如,如果在乘法运算中某一整数与实数结合使用,则两个数字都将转换为实数,并且返回值也是 REAL。
除 (/)
在下表中,行标题是分子,列标题是分母。
运算符 (/) (行/列) | INTEGER | CURRENCY | REAL | 日期/时间 |
INTEGER | REAL | CURRENCY | REAL | REAL |
CURRENCY | CURRENCY | REAL | CURRENCY | REAL |
REAL | REAL | REAL | REAL | REAL |
日期/时间 | REAL | REAL | REAL | REAL |
例如,如果某一整数在除法运算中与某一货币值一起使用,则两个值都转换为实数,并且结果也是实数。
比较运算符
在比较表达式中,布尔值被视作大于字符串值,字符串值被视作大于数值或者日期/时间值,数值和日期/时间值被视作具有相同排名。对布尔值或字符串值不执行隐式转换;BLANK 或空白值根据其他比较值的数据类型转换为 0/""/false。
下面的 DAX 表达式说明此行为:
=IF(FALSE()>"true","Expression is true", "Expression is false")返回"Expression is true"
=IF("12">12,"Expression is true", "Expression is false")返回"Expression is true"
=IF("12"=12,"Expression is true", "Expression is false")返回"Expression is false"
如下表所述,为数字或日期/时间类型执行隐式转换:
比较运算符 | INTEGER | CURRENCY | REAL | 日期/时间 |
INTEGER | INTEGER | CURRENCY | REAL | REAL |
CURRENCY | CURRENCY | CURRENCY | REAL | REAL |
REAL | REAL | REAL | REAL | REAL |
日期/时间 | REAL | REAL | REAL | 日期/时间 |
空白、空字符串和零值的处理
DAX 处理零值、Null 和空字符串的方式不同于 Microsoft Excel 和 SQL Server。本节描述这些差异,并描述如何处理这些数据类型。
务必要记住的是,在 PowerPivot 中,空白值、空单元格或缺失值全都由同一新的值类型表示,即 BLANK。在运算(例如加法或连接)中处理空白的方式取决于各个函数。您也可以通过使用 BLANK 函数生成空白,或者通过使用 ISBLANK 函数测试是否有空白。在 PowerPivot 工作簿内并不支持数据库 Null,并且在 DAX 公式中引用包含 Null 值的列时,Null 将隐式转换为空白。
定义空白、Null 和空字符串
下表汇总了 DAX 和 Microsoft Excel 之间在处理空白的方式上的差异。
表达式 | DAX | Excel |
BLANK + BLANK | BLANK | 0(零) |
BLANK +5 | 5 | 5 |
BLANK * 5 | BLANK | 0(零) |
5/BLANK | 无穷 | 错误 |
0/BLANK | NaN | 错误 |
BLANK/BLANK | BLANK | 错误 |
FALSE OR BLANK | FALSE | FALSE |
FALSE AND BLANK | FALSE | FALSE |
TRUE OR BLANK | TRUE | TRUE |
TRUE AND BLANK | FALSE | TRUE |
BLANK OR BLANK | BLANK | 错误 |
BLANK AND BLANK | BLANK | 错误 |
有关特定函数或运算符如何处理空白的详细信息,请参阅针对 PowerPivot 的 DAX 函数参考一节中关于各 DAX 函数的单独主题。
三 : Storyboard介绍及使用
参考文章
Storyboards Tutorial in iOS 7: Part 1
Storyboards Tutorial in iOS 7: Part 2
背景知识
Storyboard 在iOS5时引入,它能节约你创建UI的时间,先看一张storyboard的图:
storyboard样图
看到它,你就像看到了一张设计图,一切已胸有成竹!
storyboard与常规nib(nib文件后来改名叫xib文件,小伙伴不用纠结它是啥)文件相比,有很多优势:
与散落的nib相比,storyboard能给你一种全局感。
storyboard可以描述各种场景之间的过渡,这种过渡被称作"segue",你通过简单的ctrl-dragging就能搞定,减少代码量。
storyboard支持table view的prototype cell,这意味着你可以在storyboard中编辑cell,减少代码量。
当然,世界上没有完美的东西,由于Interface Builder还不够强大,所以,有些nib能做到的,storyboard还(www.61k.com]不能。而且,你需要一个更大的显示器~
storyboard 把 view controller叫做:“scene”.
启动storyboard的系统预设
在工程plist中
plist
storyboard操作
(iOS有所谓的三大container view controller,分别是Tab Bar Controller,Navigation Controller,Split View Controller )
注意:在缩放的时候无法拖拽控件到画板。
1.更改初始化视图控制器
选择初始化view controller,选中相应view controller ->Attributes inspector
,勾选Is Initial View Controller
,如图
initial view controller
直接拖拽初始化箭头到相应视图控制器
如果更改了初始化的view controller,会发现初始化箭头发生移动,如图:
初始化箭头移动
2.添加Navigation Controller
选中要添加Navigation Controller的视图控制器,在Xcode menubar选择Editor\Embed In\Navigation Controller
从Object Library拖拽
在storyboard的画板上,会虚拟出一个Navigation Controller的scene,它当然不是一个真的UINavigationBar对象,而是虚拟一个,方便我们操作和理解。
当我们点击与Navigation Controller连接的视图控制器,点击Attributes inspector
,会发现Simulated Metrics
,如图:
Simulated Metrics
Inferred
是storyboard的缺省设置,这意味着该视图控制器在Navigation Controller中时,会展示一个navigation bar (当然,在其他container view controller中,会展示相对的bar,比如,在一个tab bar controller中会展示一个tab bar).Simulated Metrics
并不能用于runtime.
3.创建relationship segue
如图所示:
tab bar controller
Ctrl-drag
,从tab bar controller 连到navigation controller,松手,弹出 popup menu,如图:
popup menu
选择Relationship Segue – view controllers
,结果如图:
Relationship Segue – view controllers
4.命名tabbar controller和navigation controller中的bar item
并非在tabbar controller 里,而是在与其相连、对应的controller里,如图:
修改tabbar controller展示出来的tab item
同理,修改navigation bar,也是在对应的controller里,而不是虚拟的navigation controller,如图:
修改navigation bar
5.自定义UI类
就像你不用storyboard一样,创建一个类,当然,就不要勾选xib选项了,从storyboard的object library中拖拽出它的父类UI,在此UI的Indentity inspector中,将这个类与UI绑定,如图:
自定义UI类
6.在storyboard中找到相应的视图控制器
举例,找到tab bar controller第一个tab————一个带有导航栏的视图控制器,
UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController; UINavigationController *navigationController = [tabBarController viewControllers][0]; PlayersViewController *playersViewController = [navigationController viewControllers][0];
7.Prototype cells
我们用static cells,一般是这样的:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } // Configure the cell... return cell;}
用Prototype cells是这样的:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PlayerCell"]; // Configure the cell... return cell;}
我们选中控制器的tableview空间,第一个就是cell的选择,如图:
table view cell
默认是prototype cell.
有没有想过把prototype cell 用在不同的table view 中?我这样想过,了解了一下,发现目前storyboard还不支持,如果想曲线救国,实现起来挺复杂的,参见Reusable UITableView's prototype cell。
8.Static Cell
如果用static cell,我们就不用为tableview创建data source,因为它就是个静态的cell,不需重用,所以,你可以把该cell上的UI控件拖拽到对应的controller(Prototype cell是不行的),如图:
static cell
拖拽static cell上的控件到对应的controller
9.添加bar button item 到导航栏
拖拽一个bar button item 到拥有导航栏的控制器上,而不是那个虚拟的navigation controller.
10.segue
我们在前面说过container view controller 有一种relationship segue,它表示一个container view controller上所拥有的view controller,另外,就是用于view controller之间过渡的segue,它可以由button,cell,gesture等等来触发。
它的优势在于,节省很多代码量,很直观,你不用再写什么方法,或者像xib那样连接诸如IBAcation之类的东西。
操作segue
例如:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if ([segue.identifier isEqualToString:@"AddPlayer"]) { UINavigationController *navigationController = segue.destinationViewController; PlayerDetailsViewController *playerDetailsViewController = [navigationController viewControllers][0]; playerDetailsViewController.delegate = self; }}
注意:记得给segue添加Identifier
四 : 充电电钻使用技巧及产品介绍
充电电钻使用技巧及产品介绍
充电电钻什么牌子好
博大充电式手电钻
博大公司自1998年开始组建之时,到现在为止已经发展成为集科研、制造、销售为一体的中国最具竞争力的专业的电动工具生产供应服务商之一。目前博大公司产品已经涵盖充电式手电钻、冲击钻、电圆锯、电刨、角磨机、平板砂光机、雕刻机等多种产品。
博世充电式手电钻
大家都知道博世是德国最大的工业企业之一,它主要从事汽车技术、工业技术和消费品及建筑技术的产业等。于1886年创办公司时,就
将公司定位为“精密机械及电气工程的工厂”。博世以其创新尖端的产品及系统解决方案而闻名于世。
日立充电式手电钻
日立公司于20世纪60年代来到中国,现在成为早期进入中国市场的少数外资企业之一。很多年来,日立致力于积极开拓中国市场,并且
注重引进大量先进的技术和产品。在政府的支持下,日立在中国各地的投资事业都获得了了长足的发展。您可以放心选购。
百得品牌创立时间:
百得公司成立于1950年,两位好友GiuseppeBallanti先生和FerdinandoTura先生抓住迅速发展的市场提供的机会,在供热领域开辟了自己
的天地
锐奇品牌创立时间:
上海锐奇工具股份有限公司,电动扳手十大品牌,电锤电钻十大品牌,上海市着名商标,上海名牌,上市公司,全球领先的高等级专业
电动工具运营商,高新技术企业,国内最具竞争力的专业电动工具制造商之一
麦太保品牌创立时间:
麦太保电动工具以安全、优质、高效而满誉世界,目前麦太保的已经产品输往150多个国家和地区,始终得到世界各地消费者的好评和欢
迎,其全球性的成功源于近九十年的精益求精及对高品质的不懈追求。
金鼎品牌创立时间:
江苏金鼎电动工具集团有限公司专注于电动工具的研发、制造、销售,并致力于提供安全可靠、耐久易用的电动工具产品及专业化的服
务,帮助全球客户和合作伙伴取得成功。
充电电钻使用技巧及产品介绍
充电电钻使用技巧
使用电钻时的个人防护
面部朝上作业时,要戴上防护面罩。在生铁铸件上钻孔要戴好防护眼镜,以保护眼睛。
钻头夹持器应妥善安装。
作业时钻头处在灼热状态,应注意灼伤肌肤。
钻Φ12mm以上的手持电钻钻孔时应使用有侧柄手枪钻。
站在梯子上工作或高处作业应做好高处坠落措施,梯子应有地面人员扶持。
作业前应注意事项
确认现场所接电源与电钻铭牌是否相符。是否接有漏电保护器。
钻头与夹持器应适配,并妥善安装。
确认电钻上开关接通锁扣状态,否则插头插入电源插座时电钻将出其不意地立刻转动,从而可能招致人员伤害危险。
若作业场所在远离电源的地点,需延伸线缆时,应使用容量足够,安装合格的延伸线缆。延伸线缆如通过人行过道应高架或做好防止线
缆被碾压损坏的措施。
电钻的正确操作方法
在金属材料上钻孔应首先用在被钻位置处冲打上洋冲眼。
在钻较大孔眼时,预先用小钻头钻穿,然后再使用大钻头钻孔。
如需长时间在金属上进行钻孔时可采取一定的冷却措施,以保持钻头的锋利。
钻孔时产生的钻屑严禁用手直接清理,应用专用工具清屑。
维护和检查
检查钻头
使用迟钝或弯曲的钻头,将使电动机过负荷面工况失常,并降低作业效率,因此,若发现这类情况,应立刻处理更换。
电钻器身紧固螺钉检查
使用前检查电钻机身安装螺钉紧固情况,若发现螺钉松了,应立即重新扭紧,否则会导致电钻故障。
检查碳刷
电动机上的碳刷是一种消耗品,其磨耗度一旦超出极限,电动机将发生故障,因此,磨耗了的碳刷应立即更换,此外碳刷必须常保持干
净状态。
保护接地线检查
保护接地线是保护人身安全的重要措施,因此Ⅰ类器具(金属外壳)应经常检查其外壳应有良好的接地
五 : 火麻油介绍及使用
一、火麻油简介
二、火麻油成分及益处
三、火麻油的保健功能
四、火麻油的美容功效
一、火麻油简介:
火麻仁,又叫大麻仁或麻仁,为桑科植物大麻的干燥成熟果实。(www.61k.com)其味甘、性平,入脾、胃,能润燥滑肠,滋养补虚。火麻仁含有丰富的蛋白质、不饱和脂肪酸,还有卵磷脂、亚麻酸、维生素及钙、铁矿物等人体必需的微量元素。食之有润肠胃、滋阴补虚、助消化、明目保肝、祛病益寿之功效,且对老人便秘、高血压和高胆固醇等疾病有特殊的疗效,而且火麻是唯一能够溶于水的油料。
《火麻油》的传统习惯,并称之为“长寿麻”、“长寿油”。
榆社北寨十分利于火麻的生长,田禾火麻在生长过程中无须使用杀虫剂和除草剂,是名副其实的绿色食品原料。 国内外多家科研机构经过深入研究,认为火麻仁为植物中最集中、最完整、最平衡的必需氨基酸和必需脂肪酸的来源,是一种不可多得的食品于油料。
二、火麻油成分及益处:
采用低温冷榨的物理工艺制取的田禾火麻油,不但较好的保留了原料的天然活性营养成分,经检测火麻油还具有无胆固醇、人体必需脂肪酸含量高,特别是具有ω-6族亚油酸与ω-3族α-亚麻酸2.4 : 1的天然比值,符合国际卫生组织推荐的小于等于4 :1最佳比值的特点,是最具营养平衡性的油脂且可溶于水。火麻油营养清香,长期食用田禾火麻油有效补充人体必需营养素α-亚麻酸、润燥滑肠、有益心、脑及血管的健康延年益寿 还具有降低血脂血压血糖等功效。
火麻仁又叫大麻仁或麻仁,为桑科植物大麻的干燥成熟果实。其味甘、性平,入脾、胃,能润燥滑肠,滋养补虚。火麻仁含有丰富的蛋白质、不饱和脂肪酸,还有卵磷脂、亚麻酸、维生素及钙、铁矿物等人体必需的微量元素。食之有润肠胃、滋阴补虚、助消化、明目保肝、祛病益寿之功效,且对老人便秘、高血压和高胆固醇等疾病有特殊的疗效。火麻是唯一能够溶解于水的油料,是巴马百岁老人长期食用得以健康长寿的原因之一,当地群众称之为“长寿麻”或“长寿油”。
巴马寿星几乎顿顿要吃火麻青菜汤,根据研究发现巴马人食用的火麻油的不饱和脂肪酸达93%,是一切常见食物油中不饱和脂肪酸含量的最高者。火麻仁在中药中有润肠通便之功,可防老年人便秘, 火麻仁还含有丰富的植酸武汉医科大学营养卫生教研室认为,常摄入大量植酸食物的地区冠心病发病率低。经实验证明, 巴马长寿老人长期食用火麻油。在百岁老人肠中的双歧杆菌与年轻人甚至婴儿的含量相同。现代科学研究证实, 火麻仁油具有延缓动脉硬化、预防心脑血管疾病、防癌的功效,是值得推荐的长寿油料。
火麻茶油将菜炒,素食为主锌锰高;地下河水元素多,空气清新人不老;晚婚晚育勤劳动,常享桃李野葡萄;知足常乐心清净……”,在广西巴马流传着以上民谣。如果说特殊的自然环境、奇特的地理状况是巴马人长寿的外在因素,那么,生长在这里的各种植物食品就是致人长寿的内在因素。
所略乡坡帮村老人黄家英,今年已经106岁了,老人鹤发童颜,四代同堂,耳不聋,眼不花,如今依然擅刺绣、懂草药,乐于助人,是屯里人人爱戴的“老祖宗”。猫豆、红薯叶、苦脉菜、火麻汤、玉米粥——这就是黄家英一天的食谱。巴马长寿研究所所长陈进超说:“这些食品不仅没有投放添加剂,也没有用任何化学药剂,都是天然的绿色食品。”
据调查,巴马寿星们的主要食物都是当地土生土长的自然生态作物。主要粮食有珍珠黄玉米、粳米、糯米、小米、红薯、山芋、黄豆、猫豆、木薯等。蔬菜以青菜、南瓜、南瓜苗、红薯叶、苦麻菜、野藤菜、雷公根、儿粮菜、鲜米菜等为主;同时还有竹笋、香菇、木耳、剑花等山珍。这粮食和蔬菜都是自然生长的“绿色食品”,多用农家肥种植。特别是一些野菜,是自然界中自生自长的绿色蔬菜,各种维生素含量非常高。百岁老人所食的油料以火麻油、茶油、蝴蝶果油等为主,而这些油料也都是当地绿色的特产,很利于人体健康。
巴马人几乎都是清淡素食者,只有逢年过节才吃些肉食品。主要喜欢吃的肉食有:巴马香猪(当地一种体小肉嫩瘦肉多的特产猪)、黑山羊、油鱼(当地盘阳河中的一种特产鱼)、土鸡、土鸭及野猪等类的动物。特别值得一提的是,巴马的山区里种植许多豆类植物,如黄豆、竹豆、猫豆、弯豆、刀豆、四季豆、荷包豆、篱笆豆等,都是长寿老人最喜欢吃的食物。
各国医学专家考察巴马寿星的饮食结构后发现,他们“粗、杂、素、淡、鲜”的饮食中,具有低热量、低脂肪、低动物蛋白、低盐、低糖、高纤维素、高维生素的“五低两高”特点,这符合根除现代“富贵病”的寿膳饮食结构。从巴马百岁老人的一百一十例死亡原因回顾性调查资料表明,没有一位百岁老人死于高血压、糖尿病、脑血管意外或者癌症。
粗:长寿老人常年食用玉米、红薯、豆类、大米等粗粮,这是世界五大长寿地区寿星饮食的一个共同点,他们常年吃粗加工、粗制作的饭菜,很少尝到细加工的食品,这样的饭菜,营养保证多,破坏少。
杂:长寿老人不挑食也不偏食,除玉米为主,红薯和豆类杂粮为补外,还配吃多种蔬菜和野菜,不但吃的食物种类杂,而且菜的做法也是以“大杂烩”为主,常把粮、肉、菜混在一起煮着吃。
素:他们常年以素食为主,很少吃荤腥,逢年过节和红白喜事的宴席上才吃上点鱼肉,而所吃的肉类,也都以巴马特产的香猪肉为主。食用油也是以火麻仁植物油为主。
淡:长寿老人祖祖辈辈养成了吃盐少的习惯,平均每人每天食盐量在3克以下。
鲜:巴马人吃的都是本地产的自然生态作物,没有污染,都是天然的绿色食品。
三、火麻油的保健功能:
1.火麻油具有香味浓郁、营养丰富、色泽清中透绿的特点,可用来炒菜、油炸、凉拌、拌馅食用,是目前所有常见的食用植物油中不饱和脂肪酸含量最高的,脂肪含量达42.6%,其中不饱和脂肪酸达89%,含有丰富的氨基酸和多种维生素成分及钙、铁等人体必须的微量元素,尤其是硒、锌、锰、锗较高,也是目前世界上惟一能溶于水的植物油。
2.火麻油所含的Ω-6和Ω-3,是≤4:1的完美比值,符合国际卫生组织推荐的≤4:1最佳比值的特点,平衡营养,长期食用有益心、脑及血管的健康延年益寿,还具有降低血脂、血压、血糖等功效。
3.中医认为,火麻仁可润肠胃、清肺去肝火、滋阴补虚,助消化、明目保肝,对便秘高血压和胆固醇高等疾病具有特殊的疗效。
“火麻”是巴马长寿之乡的重要特产,巴马人有着常年食用“火麻油”的传统习惯,并称之为“长寿麻”、“长寿油”。巴马特有的生态环境十分利于火麻的生长,巴马火麻在生长过程中无须使用杀虫剂和除草剂,是名副其实的绿色食品原料。 国内外多家科研机构经过深入研究,认为火麻仁为植物中最集中、最完整、最平衡的必需氨基酸和必需脂肪酸的来源,是一种不可多得的食品于油料。
拉维尤 特级初榨橄榄油 原于橄榄油产量居世界之首的西班牙 ,直接从最好的橄榄果中纯物理压榨出最高品质的油提供给终端消费者。油体透亮,金黄透绿。淡淡的果香融合辛辣的口感,源于拉维尤纯正的品质。请直接百度搜索:拉维尤橄榄油。找到商城或在淘宝店直接购买。
采用低温冷榨的物理工艺制取的巴马火麻油,不但较好的保留了原料的天然活性营养成分,经检测 巴马火麻油还具有无胆固醇、人体必需脂肪酸含量高,特别是具有ω-6族亚油酸与ω-3族α-亚麻酸2.4 : 1的天然比值,符合国际卫生组织推荐的小于等于4 :1最佳比值的特点,是最具营养平衡性的油脂且可溶于水。巴马火麻油营养清香,长期食用巴马火麻油有效补充人体必需营养素α-亚麻酸、润燥滑肠、有益心、脑及血管的健康延年益寿 还具有降低血脂血压血糖等功效。
四、火麻油的美容功效:
随着科技的进步,越来越多的化妆品涌入市场,但是很多化学物质的引起了皮肤不良的反应,因此,天然的化妆品越来越受到商家和买家的青睐。经过很多实验证明,火麻油对于改善皮肤有很好的疗效。
火麻油的防晒作用 火麻油中多不饱和脂肪酸含量高达80%以上,其中亚麻油含量50%-60%,亚麻酸含量20%-30%,且含有γ-亚麻酸(GLA)和十八碳四烯酸(SDA)。火麻油在200-420nm有强吸收峰,能够吸收波长320-400nmUVA和波长275-320nmUVB。因此汉麻油能够有效地吸收紫外线。
火麻油的保湿作用 火麻油中含有丰富的火麻蛋白,其内含有大量的亲水因子,能够有效的吸收水分。
这是挑选了15名无皮肤病的志愿者通过实验得出的数据,由数据可见,火麻蛋白对于能够持续性保湿效果最好。
火麻油还具有良好的延展性和成膜性,在皮肤表面可以形成脂质屏障,防止水分挥发,
这是火麻籽油与其它三种油脂保湿剂在人体上实验得来的数据,结果表明火麻籽的水分保持率最高。
火麻油的延缓衰老的作用 火麻籽油中富含omega-3脂肪酸,含量是17.2 g/100 g。omega-3能强化围绕于每一个细胞周围的纤柔细胞膜,使细胞获得充分的滋养,同时能有效地把细胞内的废物排出。它能使真皮层分泌出更强力的胶原和弹性纤维,帮助消除皱纹和细纹,并挺实渐呈松弛的皮肤。
此外,火麻油对皮肤还有很好的清洁效果,是一种理想的卸妆产品,火麻还能防冻防裂等等,数不胜数,可谓万能之物。
温馨贴士:火麻油虽好,可是不能直接把油涂于皮肤之上哦,用时掺和一些对皮肤好、刺激小的天然护肤品能达到预想不到的效果哦。
61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1