主要修改的地方。
1.返回值的类型。 由rpcgen生成的文件,返回的值一般是enum clnt_stat 但是在项目中做了修改,对应文件修改
修改为只返回需要的信息, 如newmdsadd_1()只返回了metadata_info的信息,因为只有这个信息是我们所关心的。
2.在rpcgen生成的文件中,是直接return掉很多东西,而在spnfsd中代替的是if语句。如果成功的话==RPC_SUCCESS
返回metadata_info类型的变量,否则直接返回NULL
这样的好处是可以实现,程序的鲁棒性。robust。
3.加入了一些语句,memset(),将简要返回值大小的空间,内容清空。以免影响正常的程序运行。
转载于:https://www.cnblogs.com/xindufresne/p/3425466.html
I never use GDB before though I’ve heard of it long times ago. Well, I never use it simply because I never really debug program. And maybe I never write programs complicated enough that needs to debug. Though I’ve found time spent on debugging code is quite a lot. I never think of how to improve this. And I never care about the potential bugs left in the code as long as the code begins to work.
let与var的区别
http://www.cnblogs.com/snandy/archive/2015/05/10/4485832.html
es6 导入导出
http://www.csdn.net/article/2015-04-30/2824595-Modules-in-ES6
React入门实例教程
http://www.cocoachina.com/webapp/20150604/12035.html
Redux中的connect和provider
http://www.jianshu.com/p/94c988cf11f3
combineReducers
通过combineReducers将多个reducer合并成一个rootReduce
箭头函数
https://yq.aliyun.com/articles/3163
30分钟掌握ES6/ES2015核心内容
http://www.jianshu.com/p/ebfeb687eb70
Rest
http://www.cnblogs.com/snandy/p/4482463.html
babel
http://cnodejs.org/topic/56460e0d89b4b49902e7fbd3
转载于:https://www.cnblogs.com/benchan2015/p/5373459.html
要使用angularjs,首先得下载并且在页面中调用它
先上源码
<html ng-app="app1"> <head> <meta name="generator" content="HTML Tidy for HTML5 (experimental) for Windows https://github.com/w3c/tidy-html5/tree/c63cc39" /> <title>angularJs Test</title> <script src="angular.min.js"></script> </head> <body ng-controller='ctrl1' > <span ng-bind='name'>aaaaaaaaaaaa</span> <script> var app=angular.module('app1',[]); app.controller('ctrl1',['$scope',function($scope){ $scope.name="China"; }]) </script> </body> </html> 几个说明
1.ng-app代表这是一个angularJs app
2.ng-controller代表这是一个控制器,简单来讲它定义了作用域;
3.如何绑定字符串
<span ng-bind='name'>aaaaaaaaaaaa</span> <span ng-bind-template='this is :{{name}}'>aaaaaaaaaaaa</span> 第一种方式直接绑定了scope的一个变量
第二种方式可以在绑定scope name的情况下,可以在前面加上this is:
但是无论哪种方式,都会冲掉span里面有的aaaaaaaaaaaaa内容
效果如下
第一种解析结果
第二种解析结果
其实还有第三种方式,不过这种方式当angular没有加载完时,会直接显示在页面上,简单讲页面会显示没有解析的结果,代码和效果也上吧
<span >aaaaaaaa:{{name}}</span> 转载于:https://www.cnblogs.com/benchan2015/p/4797853.html
Section 1: Papoulis's Formula
Lemma 1: If the random variables $y_1,\ldots,y_n$ are the linear combination of random variables $x_1,\ldots,x_n$, say ${\left[ y_1,\ldots,y_n \right]^T} = A{\left[ x_1,\ldots,x_n \right]^T}$, then
\begin{equation} \nonumber
h\left( {{y_1}, \ldots ,{y_n}} \right) = h\left( {{x_1}, \ldots ,{x_n}} \right) + \log \left| \det A \right|
\end{equation}
Lemma 2: If a function $H\left( z \right) = \sum\nolimits_{n = 0}^\infty {{h_n}{z^{ - n}}} $ is minimum-phase and $h_0 \ne 0$, then
1. $\forall 1 \le p < q \le \infty \Rightarrow {\ell ^p} \subset {\ell ^q}$ (which means that ${\ell ^p}$ is in and, however, not equal to ${\ell ^q}$).
2. Two spaces $\left( {C\left[ {0,1} \right],{{\left\| \cdot \right\|}_\infty }} \right),\left( {{C^1}\left[ {0,1} \right],{{\left\| \cdot \right\|}_\infty }} \right)$, an operator $T:\mathop {C\left[ {0,1} \right] \to {C^1}\left[ {0,1} \right]}\limits_{f\left( x \right) \mapsto f'\left( x \right)} $, is $T$ bounded?
3. $T:\mathop {{L^2}\left[ {a,b} \right] \to {L^2}\left[ {a,b} \right]}\limits_{f\left( x \right) \mapsto \int_a^x {f\left( t \right)dt} } $, prove that $T$ is bounded.
Visual Studio 打包安装七宗罪
开发.NET的人,肯定会使用Visual Studio里面自带的MSI打包安装工具框架。如果是在一般情况下,这个打包安装框架已经完全足够满足产品发布安装的需要了。它的制成品,是一个setup.exe,一个MSI安装文件,如果你选择项目以来的其他.NET,Windows Install 框架,并且确定随产品发布,那制成品中还会包含这些东西的安装文件。
但是VS打包发布出来的安装包,安装体验实在是非常差,举个例子,如果你的项目是依赖于.NET 4.0以及VC++ 2010,并且你的目标客户机中没有安装过任何该类产品,那当你执行setup.exe的时候,先是会弹出.NET 4.0客户安装协议,用户点击“同意”后,再弹出VC++ 2010客户安装协议,用户再次点击“同意”,才能开始真正安装。并且在安装过程中,每安装一个东西,如果是在Vista之上的系统上,就会弹出一次需要确认安装并且提升权限的对话框,实在是不胜其烦。
并且这个打包的选项也非常奇怪,如果会使用Installer发布工具的,就会记得里面永远只能在“网上下载所需依赖项”和“本地包含所需依赖项”中二选其一。那如果我想定制发布安装包,如果发现依赖项不存在,再自动去网上下载呢?不好意思,做不到。而且如果我打包出来的MSI是中文的,那发布的时候必定会带上.NET的中文语言包。如果不是修改系统的bootstrapper配置,这个语言包就是必须跟着的,真是完全无厘头,我产品是多语言安装的,难道.NET也要多语言包吗?
必须掌握的一些基础概念
Wix的全称是(Windows Installer XML),简而言之,就是用XML来配置和定制个性化的安装方案。其中一部分称为Burn,是本文接下去要着重介绍的Bootstrapper开发框架,另一部分则为Setup开发框架。
先说一下Bootstrapper和MSI的区别,MSI是微软比较新的一套安装解决方案,依赖于Microsoft Install Service,其实MSI可以理解为一套强格式的安装库,MSI文件中包含了一系列数据结构和文件,数据结构说明了例如要创建哪些目录,要创建哪些注册表项,要拷贝哪些文件到哪些目录中,创建什么快捷方式等配置信息,以及需要拷贝发布的所有文件数据。然后安装服务通过这些配置信息,读取并一步步执行,最终就完成了一个MSI的安装过程。MSI文件就是一个更强大的压缩文件安装包。
问题是如果你的城西使用纯C++开发的,那只要一个MSI发布就解决问题了,因为发布以后不依赖于其他东西可以直接执行。但是既然你用了微软的东西,现在.NET几乎是Windows上必须会涉及的框架,那大多数程序都会依赖于.NET。这时候问题就来了,如果客户机上没有安装.NET,怎么办?你又不能把.NET单独带在你的MSI中一起发布。这个时候就需要在安装MSI之前判断一下系统的安装环境,比如有没有安装.NET,如果已经装了就不用再安装了,当然其他的一些框架也需要判断,这些提前判断的事情MSI是做不了的,当然你的程序也做不了,因为还没有.NET环境啊,你的程序是用.NET写的!这不是鸡生蛋蛋生鸡的问题吗?
这些问题其实微软也想到了,因此他们自己做了一个简单的setup.exe,你看,这个是exe文件,不依赖于任何其他框架,这个exe会先判断系统环境,并且做出需要下载安装其他框架的决定,然后等基础环境搞定了,就可以安装后我们的MSI了。这个exe,就被称为bootstrapper。
WiX Bootstrapper开发教程
以上所说的这些问题,在WiX中都可以得到解决,当然你甚至可以不用VS的打包发布工具,因为之前我们已经知道,WiX可以开发自己的MSI,只是文本对这个不再详述,VS的打包工具制作出MSI,再用WiX的Bootstrapper安装,相得益彰,省时省力,WiX毕竟只能XML编写,还是很麻烦的。
首先,我们在http://wixtoolset.org/releases中下载WiX Toolset安装文件,VS 2010好像最多支持到3.7版本,然后点击中间齿轮的那一行Install进行框架安装。这个工具是支持VS插件的,安装完成后,VS中就会多出一种项目类型“Wix Toolset”,并且选中后我们选择“Bootstrapper Project”,即可创建出新项目,我们在这个项目中进行我们的bootstrapper开发。
创建完成后,就会多出一个Bootstrapper项目,其中有Bundle.wxs文件,这个文件就是打包安装配置文件。所有的XML元素,都可以通过http://wix.sourceforge.net/manual-wix3/schema_index.htm查询,默认代码如下:
<?xml version="1.0" encoding="UTF-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Bundle Name="Bootstrapper1" Version="1.0.0.0" Manufacturer="" UpgradeCode="5240b0e0-2b53-44c9-9837-05e9a4b63dbc"> <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" /> <Chain> <!-- TODO: Define the list of chained packages. --> <!-- <MsiPackage SourceFile="path\to\your.msi" /> --> </Chain> </Bundle> </Wix> 下面我们来逐个标签元素来看一下这个文件是如何影响运行的
Bundle,这个是所有配置的根节点,其中Name就是我们发布的产品名称,可自定义,注意该名称会出现在安装对话框的标题栏以及卸载程序列表中的名称。Version是版本号,Manufacturer是开发者名称,这些都会出现在卸载程序列表中,UpdateCode是很重要的属性,如果两个产品的UpdateCode一样,那Version更大的产品会自动将小版本程序卸载后再安装,也就是自动的覆盖安装。这些概念都是所有的安装框架通用的。
BootstrapperApplicationRef这个概念比较复杂,按照我使用下来的经验,这个就是使用已经定义完成的安装框架模板,Id="WixStandardBootstrapperApplication.RtfLicense"是一个已经现有的安装框架界面,表示这个Bootstrapper执行后会显示一个客户安装协议对话框,对话框中的文本是可以自定义的。我们会在之后的篇幅中讲到这个元素的详细自定义。
Chain,这个就是表示安装的序列,所有的自定义安装顺序就在这个节点中完成,比如我们可以先定义安装a.exe,再安装b.msi,再安装c.msp等等,都可以在这个节点中进行配置。
我们来编辑一下wxs文件,指定Bundle/@Manufacturer的属性内容,以及为Chain增加一个子节点,Chain节点中必须有一个子节点,我们可以随便生成一个.msi安装文件,然后复制到我们的bootstrapper项目中,然后增加Chain中的子元素Msi,并且生成一下这个工程,最后的wxs文件如下:
<?xml version="1.0" encoding="
import threading import time class myThread (threading.Thread): #继承父类threading.Thread def __init__(self, threadID, name): threading.Thread.__init__(self) self.name = name def run(self): #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数 while 1: print("Starting " + self.name) time.sleep(1) # 创建新线程 thread1 = myThread(1, "this is thread1") thread2 = myThread(2, "this is thread2") thread3 = myThread(3, "this is thread3") # 开启线程 thread1.start() thread2.start() thread3.start() 转载于:https://www.cnblogs.com/tiandsp/p/8504194.html
注意:qt creator工程中一般都已经存在*.pro文件,里面存放着一些自己配置的包含头文件和lib库文的信息,最好不要再重新使用qmake -project生成,若重新生成,则可能要重新增加配置
1、命令行中,进入在工程的最顶层目录中,使用qmake -tp vc -r 命令,-r表示级联作用到子目录,此时在顶层目录中生成了*.sln文件,在子目录中生成了*.vcproj文件。(顶层目录中一般没有头文件和源文件,只有一个pro文件,用于管理其子目录中的工程)
2、进入VS2003,选择“File->Open solution...”,选择顶层目录下的sln文件,则子目录中对应的工程都打开了,qt creator中配置的需要的头文件的路径,需要的库文件和其路径都在生成sln文件和vcproj文件时自动生成。(可以用记事本打开vcproj文件查看)
3、若是单层工程,只能生成vcproj文件,用VS2003打开后,编译时会要求打开相应的sln文件,此时取消,关闭vs2003会提示保存成sln文件,保存后,再次打开编译即可。
可以使用VS2003自带的命令行工具编译程序,注意不能再命令行工具中直接使用nmake编译,会提示不可用。
此时需要先用qmake生成MakeFile文件,然后才能用nmake编译。
转载于:https://www.cnblogs.com/tiandsp/p/7580587.html
package sdfg; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class sdfg { public static String createMD5(String pw) throws NoSuchAlgorithmException { MessageDigest md; md=MessageDigest.getInstance("SHA"); md.update(pw.getBytes()); String re=new BigInteger(1,md.digest()).toString(16); return re; } public static void main(String[] args) throws NoSuchAlgorithmException { String pw="dfgdf"; System.out.println(createMD5(pw)); } } 转载于:https://www.cnblogs.com/tiandsp/p/7467833.html
#include <stdio.h> int main() { if(remove("1.txt")) printf("Could not delete the file &s \n","1.txt"); else printf("OK \n"); return 0; } 转载于:https://www.cnblogs.com/tiandsp/p/7440796.html
1.this.Close(); 只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出;
2.Application.Exit(); 强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净地退出;
3.Application.ExitThread(); 强制中止调用线程上的所有消息,同样面临其它线程无法正确退出的问题;
4.System.Environment.Exit(0); 这是最彻底的退出方式,不管什么线程都被强制退出,把程序结束的很干净。
转载于:https://www.cnblogs.com/tiandsp/p/7440458.html
这两天用chrome默认google搜索引擎搜出的结果全都打不开,可能是因为通过.hk域名的原因,功夫网不知又在搞什么动作。
添加新搜索引擎:http://www.google.com/search?q=%s
把这个粘贴到第三栏里面。前面两栏随便写什么都行。
转载于:https://www.cnblogs.com/tiandsp/archive/2012/10/22/2734179.html
#include <time.h> #include <stdio.h> int main() { struct tm *tm_ptr; time_t the_time; (void) time(&the_time); tm_ptr=gmtime(&the_time); printf("Raw time is %ld\n",the_time); printf("gmtime gives:\n"); printf("date: %02d/%02d/%02d\n", tm_ptr->tm_year,tm_ptr->tm_mon+1,tm_ptr->tm_mday); printf("time: %02d:%02d:%02d\n", tm_ptr->tm_hour,tm_ptr->tm_min,tm_ptr->tm_sec); return 0; } 函数原型:
#include <time.h>
struct tm *gmtime(const time_t timeval);
tm结构体包括:
int tm_sec;秒,0-61(有润秒)
int tm_min;分,0-59
int tm_hour;小时,0-23
int tm_mday;月份中的日期,1-31
int tm_mon;年份中的月份,0-11(0代表一月)
int tm_year;从1900年开始计算的年份(今年就是112)
int tm_wday;星期几,0-6(0代表周日)
int tm_uday;年份中的日期,0-356
int tm_isdst;日否为夏日制
转载于:https://www.cnblogs.com/tiandsp/archive/2012/09/09/2677437.html
ctrl+alt+t
转载于:https://www.cnblogs.com/tiandsp/archive/2012/07/09/2582487.html
cl;
img=imread('fupeng.jpg');
z=3;
[x y]=size(img);
imshow(img);
img=double(img);
img_cai=zeros(x,y,z);
Max=max(max(img));
Min=min(min(img));
img=(255/(Max-Min))*img-(255*Min)/(Max-Min);
figure,imshow(uint8(img));
r=1;
g=2;
b=3;
for i=1:x
for j=1:y
temp=(2*pi/(Max-Min))*img(i,j)-(2*pi*Min)/(Max-Min); if temp<=pi/2
img_cai(i,j,r)=0;
img_cai(i,j,g)=0;
img_cai(i,j,b)=255*(sin(temp));
end
if temp>pi/2 && temp<=pi
img_cai(i,g,r)=0;
img_cai(i,j,g)=255*(-cos(temp));
img_cai(i,j,b)=255*(sin(temp));
end
if temp>pi && temp<=pi*3/2
img_cai(i,j,r)=255*(-sin(temp));
img_cai(i,j,g)=255*(-cos(temp));
img_cai(i,j,b)=0;
end
if temp>pi*3/2
img_cai(i,j,r)=255*(-sin(temp));
img_cai(i,j,g)=0;
img_cai(i,j,b)=0; end
% img_cai(i,j,1)=127.5*(-sin(temp))+127.5;
% img_cai(i,j,2)=127.5*(-cos(temp))+127.5;
% img_cai(i,j,3)=127.5*(sin(temp))+127.5; end
end
figure,imshow(uint8(img_cai)); 转载于:https://www.cnblogs.com/tiandsp/archive/2012/03/04/2379220.html
#include <iostream>
#include <string>
using namespace std;
void main()
{
string card="card(s)";
double num=2;
double res=0;
double end;
cin>>end;
int what=0;
while (res<=end)
{
res+=1/(num++);
what++;
}
if (end>0)
cout<<what<<" "<<card<<endl;
} 转载于:https://www.cnblogs.com/tiandsp/archive/2012/02/09/2343983.html
cl;
img=imread('1.bmp');
img=double(img);
imshow(mat2gray(img));
[m n]=size(img);
imgn=zeros(m-3,n-3);
temp=[];
for i=1:m-3
for j=1:n-3 temp=img(i:i+3,j:j+3);
imgn(i,j)=median(temp(:));
end
end
figure,imshow(mat2gray(imgn))
imgn=img(1:m-3,1:n-3)-imgn;
figure,imshow(mat2gray(imgn))
imgn=imgn .* (imgn>0);
figure,imshow(mat2gray(abs(imgn))) 转载于:https://www.cnblogs.com/tiandsp/archive/2012/02/02/2335632.html
bool isNumber(char s)
{
if (s >= 48 && s <= 57)
return true;
else
return false;
}
bool isLetter(char s)
{
if (s >= 97 && s <= 122)
return true;
else
return false;
}
//函数的作用是把如“-45+2*a-a^2-4*a^6+a^8”这样的字符串提取成这样:(-45,2,-1,0,0,0,-4,0,1),只提取系数,并根据指数安排起位置.
//s为传入的字符串,result为处理后的一组数,返回这组数的个数
//恩,我需要这样的一个函数
int fenxi(string &s,double **result)
{
// string s("-45+2*a-a^2-4*a^6+a^8");
int letter = 0; //字符串中字母的个数
int operators = 0; //字符串中运算符的个数(+ - * ^),包括最开头隐藏的+号
double *num = new double[s.length()]; //存储数字,存储已经判断过正负号的数字
int dijige_num = 0; //和num配合,定位每一个数字,是合起来的数字,不是单个字符数字
#include <iostream>
#include <malloc.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
double *zuigan(double *a,double *b,double *c,double *f,int n) //追赶法求线性方程组
{
double *x=NULL;
double *p=NULL;
double *q=NULL;
x=(double*)malloc(sizeof(double)*n);
p=(double*)malloc(sizeof(double)*(n-1));
q=(double*)malloc(sizeof(double)*n);
double t=0;
p[0]=f[0]/b[0];
q[0]=c[0]/b[0];
for (int i=1;i<n;i++)
{
t=b[i]-a[i-1]*q[i-1];
p[i]=(f[i]-a[i-1]*p[i-1])/t;
q[i]=c[i]/t;
}
for (int i=0;i<n;i++)
{
x[i]=p[i];
}
for (int i=n-2;i>=0;i--)
{
x[i]=p[i]-q[i]*x[i+1];
}
return x;
}
int main()
{
double x[]={-3,-2,1,3};
double y[]={2,0,3,1};
double S1=-1,S2=1; //上下边界导数值
double resX=1.5;
double resY=0.
void CnoneDlg::SetBitmap(UINT uBmpResource, UINT uCtrlResource)
{
HBITMAP hBitmap;
CStatic *pStatic = (CStatic *)GetDlgItem(uCtrlResource);
hBitmap = (HBITMAP)LoadImage(
AfxGetInstanceHandle(),
MAKEINTRESOURCE(uBmpResource),
IMAGE_BITMAP,
0,
0,
LR_LOADMAP3DCOLORS);
pStatic->ModifyStyle(0xF, SS_BITMAP);
pStatic->SetBitmap(hBitmap);
}
void CnoneDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
SetBitmap(IDB_BITMAP1,IDC_STATIC);
} 转载于:https://www.cnblogs.com/tiandsp/archive/2011/10/18/2216313.html
vi /etc/profile
文件最后输入export PATH=$PATH:/usr/abc/def/
保存
输入source /etc/profile刷新刚刚修改过的环境变量文件
转载于:https://www.cnblogs.com/tiandsp/p/9294713.html
该系列文章总纲链接:专题分纲目录 Android Framework 窗口子系统
本章关键点总结 & 说明: 导图是不断迭代的,该图主要关注➕思维导图中左上:Choreographer机制 部分即可,主要说明Choreographer机制的对外接口,这里做了简单的源码分析,对其原理有一定的了解。放大 Choreographer机制 的局部图,效果如下:
Choreographer机制说明:该机制是android 4.2之后 推出的API,和handler的post机制类似,区别在于Choreographer的处理时机是 屏幕的垂直同步Vsync事件到来之时,其处理回调的过程被当作渲染下一帧工作的一部分。
对于动画而言,Choreographer对外接口说明如下:
postCallback(int callbackType, Runnable action, Object token):下一次Vsync时执行action参数指定的操作。callbackType的参数可以是CALLBACK_INPUT、CALLBACK_ANIMATION、CALLBACK_TRAVERSALpostCallbackDelayed(...):同上,只是加了延迟时间而已。postFrameCallback(int callbackType, Runnable action, Object token):分析源码可知,就是封装了postCallback,callbackType参数为CALLBACK_ANIMATION而已。postFrameCallbackDelayed(...):同上,只是加了延迟时间而已。 后面会通过源码进行深入的说明。接下来开始进入Choreographer源码解读
1 Choreographer分析
在Activity启动过程,执行完onResume后,层层调用后会到addView(),再到ViewRootImpl构造器,代码如下:
public ViewRootImpl(Context context, Display display) { //... mChoreographer = Choreographer.getInstance(); //... } 继续分析getInstance,代码如下:
public static Choreographer getInstance() { return sThreadInstance.get(); } 继续分析sThreadInstance.get,代码如下:
private static final ThreadLocal<Choreographer> sThreadInstance = new ThreadLocal<Choreographer>() { @Override protected Choreographer initialValue() { Looper looper = Looper.
该系列文章总纲链接:专题分纲目录 Android Framework 窗口子系统
本章关键点总结 & 说明: 该图关注➕思维导图中左上:窗口布局&说明 部分即可。布局分两步:relayoutWindow和PerformLayoutAndPlaceSurfaceLocked前者主要以修改窗口/屏幕属性为主,后者为窗口/屏幕重新计算布局。放大 窗口布局 & 说明 的局部图,效果如下:
WMS窗口属性变更的流程如下:
修改窗口/屏幕属性-->WMS的relayoutWindow函数根据窗口/屏幕属性,为所有窗口重新计算新的布局-->PerformLayoutAndPlaceSurfaceLocked函数以动画方式将窗口移动至指定的布局位置,附加其他所需特效-->Choreographer驱动的一系列WindowAnimator 这里主要关注前面两个过程,后一个过程会在后面 动画系统中说明。
1 relayoutWindow分析
public int relayoutWindow(Session session, IWindow client, int seq, WindowManager.LayoutParams attrs, int requestedWidth, int requestedHeight, int viewVisibility, int flags, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets, Rect outVisibleInsets, Rect outStableInsets, Configuration outConfig, Surface outSurface) { //权限检查... //WMS统一使用mWindowMap 所有窗口操作进行同步 synchronized(mWindowMap) { //关键点1:从mWindowMap中取出需要进行relayout的WindowState对象,根据参数进行属性更新 WindowState win = windowForClientLocked(session, client, false); WindowStateAnimator winAnimator = win.mWinAnimator; if (viewVisibility !
该系列文章总纲链接:专题分纲目录 Android Framework 窗口子系统
本章关键点总结 & 说明: 该图关注➕思维导图中左边:窗口尺寸&确定 部分即可。首先说明了overscan区域和窗口尺寸的数据结构;之后说明了计算尺寸的流程和计算得到的结果。放大 窗口尺寸&确定 的局部图,效果如下:
说明:虽然可以在创建窗口时指定窗口大小,但更多时候窗口大小是由系统计算得到的,本章节主要分析窗口计算基础和流程。
1 OverScan区域与表示窗口尺寸的数据结构
@1 overScan是边缘区域(四周有一圈黑色的区域),该区域是显示屏的一部分,但通常不显示画面,在PhoneWindowManager中有4个变量与此有关,代码如下:
public class PhoneWindowManager implements WindowManagerPolicy { ... //分表表示overscan区域上下左右的宽度、高度值 int mOverscanLeft = 0; int mOverscanTop = 0; int mOverscanRight = 0; int mOverscanBottom = 0; ... } 初始化是在WMS配置显示设备时完成的,代码如下:
private void configureDisplayPolicyLocked(DisplayContent displayContent) { mPolicy.setInitialDisplaySize(displayContent.getDisplay(), displayContent.mBaseDisplayWidth, displayContent.mBaseDisplayHeight, displayContent.mBaseDisplayDensity); DisplayInfo displayInfo = displayContent.getDisplayInfo(); mPolicy.setDisplayOverscan(displayContent.getDisplay(), displayInfo.overscanLeft, displayInfo.overscanTop, displayInfo.overscanRight, displayInfo.overscanBottom); } 这里mPolicy,即PhoneWindowManager中setDisplayOverscan的实现(得以完成初始化),代码如下:
public void setDisplayOverscan(Display display, int left, int top, int right, int bottom) { if (display.
该系列文章总纲链接:专题分纲目录 Android Framework 窗口子系统
本章关键点总结 & 说明: 该图关注➕思维导图中右下方:窗口次序 部分即可。通过代码分析先说明了主序、次序、窗口类型的基础知识;之后说明了窗口次序的流程,排序和调整是如何实现的?同时解释了实现的原理。
说明:手机屏幕是以左上角为原点,向右为X轴方向,向下为Y轴方向的一个二维空间。为方便管理窗口显示次序,手机屏幕被扩展为了一个三维空间,多定义了一个Z轴,方向为垂直于屏幕表面指向屏幕外。多个窗口依照其前后顺序排布在这个虚拟的Z轴上,因此窗口的显示次序又被称为Z序(Z order)。
1 主序、子序、窗口显示类型
从WS的构造方法开始分析,代码如下:
WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token, WindowState attachedWindow, int appOp, int seq, WindowManager.LayoutParams a, int viewVisibility, final DisplayContent displayContent) { ... //如果是子窗口,使用它依附的窗口类型来计算 if ((mAttrs.type >= FIRST_SUB_WINDOW && mAttrs.type <= LAST_SUB_WINDOW)) { mBaseLayer = mPolicy.windowTypeToLayerLw( attachedWindow.mAttrs.type) * WindowManagerService.TYPE_LAYER_MULTIPLIER + WindowManagerService.TYPE_LAYER_OFFSET;//计算mBaseLayer,关键点1 //表示子窗口和父窗口的相对位置 mSubLayer = mPolicy.subWindowTypeToLayerLw(a.type);//计算mSubLayer,关键点2 ... } else {//非子窗口,直接使用窗口类型来计算 //注:TYPE_LAYER_MULTIPLIER的值是10000,TYPE_LAYER_OFFSET的值是1000 mBaseLayer = mPolicy.windowTypeToLayerLw(a.type) * WindowManagerService.TYPE_LAYER_MULTIPLIER + WindowManagerService.
该系列文章总纲链接:专题分纲目录 Android Framework 窗口子系统
本章关键点总结 & 说明: 该图关注➕思维导图中右下方:应用进程 & WMS部分即可。主要从actvity.attach这一步骤开始分析和WMS之间的关系。
1 以应用启动为契机分析Window和WindowManager
每个Activity中含有2个关键成员变量:mWindow和mWindowManager,这里以Activity启动为契机开始对它们进行分析,
@1 应用中的Window和WindowManager
从handleLaunchActivity->...->performLaunchActivity->...->activity.attach分析,在构造完上下文后我们调用的是
activity.attach(appContext, this, getInstrumentation(), r.token, r.ident, app, r.intent, r.activityInfo, title, r.parent, r.embeddedID, r.lastNonConfigurationInstances, config, r.voiceInteractor); 因此这里直接从attach开始分析,它的内部实现如下所示:
final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token, int ident, Application application, Intent intent, ActivityInfo info, CharSequence title, Activity parent, String id, NonConfigurationInstances lastNonConfigurationInstances, Configuration config, String referrer, IVoiceInteractor voiceInteractor) { attachBaseContext(context); mFragments.attachActivity(this, mContainer, null); mWindow = PolicyManager.
该系列文章总纲链接:专题分纲目录 Android Framework 窗口子系统
本章关键点总结 & 说明: 该图主要讲解windowManagerService的基础知识,从WMS概念、WMS启动到WMS的成员变量,最后到窗口类型进行了说明。旨在对整个WindowManagerService有个概要的了解。
1 WindowMangerService基本概念
windowManagerService中一些常见以及相关的基本概念进行阐述:
基本概念阐述说明WindowManagerService(WMS)Framework层的窗口管理服务,职责是管理Android系统中的所有的Window。窗口管理服务,继承IWindowManager.Stub,Binder服务端,因此WM与WMS的交互也是一个IPC的过程。Window手机上一块显示区域,添加一个Window的过程,也就是申请分配一块Surface的过程。Surface每个显示界面的窗口都是一个Surface。WindowManager(WM)应用与窗口管理服务WindowManagerService交互的接口PhoneWindowManager实现了窗口的各种策略。Choreographer用于控制窗口动画、屏幕旋转等操作。DisplayContent 用于描述多屏输出相关信息。
根据窗口的显示位置将其分组。隶属于同一个DisplayContent的窗口将会被显示在同一个屏幕中。每一个DisplayContent都对应这唯一ID,在添加窗口时可以通过指定这个ID决定其将被显示在那个屏幕中。
DisplayContent是一个非常具有隔离性的一个概念。处于不同DisplayContent的两个窗口在布局、显示顺序以及动画处理上不会产生任何耦合。
WindowState描述窗口的状态信息以及和WindowManagerService进行通信,一般一个窗口对应一个WindowState。它用来表示一个窗口的所有属性。WindowToken 窗口Token,用来做Binder通信;同时也是一种标识,比如
@1 在进行窗口Zorder排序时,属于同一个WindowToken的窗口会被安排在一起,而且在其中定义的一些属性将会影响所有属于此WindowToken的窗口,这些都表明了属于同一个WindowToken的窗口之间的紧密联系;
@2 应用组件在需要新的窗口时,必须提供WindowToken以表明自己的身份,并且窗口的类型必须与所持有的WindowToken的类型一致。
@3 在创建系统类型的窗口时不需要提供一个有效的Token,WMS会隐式地为其声明一个WindowToken,看起来谁都可以添加个系统级的窗口。难道Android为了内部使用方便而置安全于不顾吗?非也,addWindow()函数一开始的mPolicy.checkAddPermission()的目的就是如此。它要求客户端必须拥有SYSTEM_ALERT_WINDOW或INTERNAL_SYSTEM_WINDOW权限才能创建系统类型的窗口。
Session信对象,App进程通过建立Session代理对象和Session对象通信,进而和WMS建立连接。SurfaceFlingerSurfaceFlinger负责管理Android系统的帧缓冲区(Frame Buffer),Android设备的显示屏被抽象为一个帧缓冲区,而Android系统中的SurfaceFlinger服务就是通过向这个帧缓冲区写入内容来绘制应用程序的用户界面的。 同时,由于AMS、WMS、ViewRootImpl这些都是显示系统的相关环节,因此有必要对Activity相关信息,尤其是关键成员变量有一定的了解,这里Activity持有一个Window,负责UI的展示与用户交互,里保存了很多重要的信息,关键信息如下:
关键成员变量意义mWindowPhoneWindow对象,继承于Window,是窗口对象。mWindowManagerWindowManagerImpl对象,实现WindowManager接口。mMainThreadActivity对象,并非真正的线程,是运行在主线程里的对象。mUIThread:Thread对象,主线程。mHandlerHandler对象,主线程Handler。mDecorView对象,用来显示Activity里的视图。 每个Android应用中都有唯一的WindowManagerGlobal对象,这个对象包含了能和WMS进行双向通信的通道,如图所示:
2 WindowManagerService启动流程分析
在SystemServer中startOtherServices函数中启动,代码如下:
private void startOtherServices() { ... wm = WindowManagerService.main(context, inputManager, mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL, !mFirstBoot, mOnlyCore); ServiceManager.addService(Context.WINDOW_SERVICE, wm); ServiceManager.addService(Context.INPUT_SERVICE, inputManager); mActivityManagerService.setWindowManager(wm); inputManager.setWindowManagerCallbacks(wm.getInputMonitor()); inputManager.start(); ... wm.displayReady(); //初始化显示尺寸信息,结束后WMS会根据AMS进行一次configure ... wm.systemReady(); //直接调用mPolicy的systemready方法 } 这里继续分析WindowManagerService.main,代码如下:
public static WindowManagerService main(final Context context,final InputManagerService im, final boolean haveInputMethods, final boolean showBootMsgs,final boolean onlyCore) { final WindowManagerService[] holder = new WindowManagerService[1]; DisplayThread.
(1) char*转换成CString 若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。例如:
char chArray[] = "This is a test";
char * p = "This is a test"; 或
LPSTR p = "This is a test"; 或在已定义Unicode应的用程序中
TCHAR * p = _T("This is a test"); 或
LPTSTR p = _T("This is a test");
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p; (2) CString转换成char*
若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:
方法一,使用强制转换。例如:
CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString; 方法二,使用strcpy。例如:
CString theString( "
1、保证本机的代码和服务器上部署的一样。
2、添加远程tomcat。
3、配置远程服务器ip以及端口。
4、配置本地开启调试的端口号。
5、将调试信息拷贝到tomcat/bin/catalina文件中。
JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8222,suspend=n,server=y" 拷贝到catalina文件的上方即可
6、重启tomcat,判断配置是否成功。
7、idea中debug启动。
远程调试原理:
Java程序的执行过程分为以下几个步骤:Java的文件 - - 编译生成的类文件(class文件) - - JVM加载类文件 - - JVM运行类字节码文件 - - JVM翻译器翻译成各个机器认识的不同的机器码。
众所周知,Java 程序是运行在Java 虚拟机(JVM )上的,具有良好跨平台性,是因为Java程序统一以字节码的形式在JVM中运行,不同平台的虚拟机都统一使用这种相同的程序存储格式。因为都是类字节码文件,只要本地代码和远程服务器上的类文件相同,两个JVM通过调试协议进行通信(例如通过插座在同一个端口进行通信),另外需要注意的时,被调试的服务器需要开启调试模式,服务器端的代码和本地代码必须保持一致,则会造成断点无法进入的问题。
这个架构其实质还是JVM,只要确保本地的的的Java的源代码与目标应用程序一致,本地的Java源码就可以用插座连接到远端的JVM,进而执行调试。因此,在这种插座连接模式下,本地只需要有源码,本地的Java应用程序根本不用启动。
传输方式:默认为Socket。
套接字:MACOS及的的Linux的系统使用此种传输方式。
共享内存:WINDOWS系统使用此种传输方式。
调试模式:默认为Attach。
Attach:此种模式下,调试服务端(被调试远程运行的机器)启动一个端口等待我们(调试客户端)去连接。
听:此种模式下,是我们(调试客户端)去监听一个端口,当调试服务端准备好了,就会进行连接。
一直以来用户非正常退出系统 即:用户按右上角的 X 按纽后 服务器端 session 无法销毁! 一直要等到其过期时间到了才销毁 这样通过session进行在线人
数统计就无法准确了!
我今天试了才发现 其实关闭浏览器事件可以捕捉到的 那么我们就可以在关闭事件里调用Session.Abandon();了
(我下面这个例子特别适合页面是框架结构信息管理系统,因为这个样的结构都有一个公用的主框架页面)
废话少说!说正题!
main.aspx
1、<body οnbefοreunlοad="LeaveWin()">
2 <head>之间 加入!
<script language=javascript>
function LeaveWin()
{
//alert("您点击了关闭按纽右上角的");
window.location.href = "../LoginOut.aspx";
}
</script>
LoginOut.aspx 3、LoginOut.aspx 的Page_Load里只有一句话
protected void Page_Load(object sender, EventArgs e)
{
Session.Abandon();
}
以上两个页面完成后 如果不放心 打开你的VS2003 或者 2005 在Session.Abandon();前设置断点开始调试
当关闭了main.aspx 后 程序是可以运行到Session.Abandon();的
转载于:https://www.cnblogs.com/Tim_Liu/archive/2010/11/09/1872595.html
一、下载
方式1:在百度中搜索“Endnote x9”,点链接进入下载页面。软件大小为108MB,下载的是一个压缩包,如下图所示,双击解压之后是右侧的图标,解压到文件夹,双击即可安装。
方式二:百度网盘下载 百度网盘 请输入提取码 t4n2
方式三:CSDN下载 EndNote_cn.rar_endnote安装教程-互联网文档类资源-CSDN下载
二、安装
1、直接安装即可,可以更换安装路径。
2、备注:安装成功后
使用汉化版,可以将CHS文件夹里的[EndNote.exe]拷贝到EndNote的安装目录下。
使用英文版,可以将ENG文件夹里的[EndNote.exe]拷贝到EndNote的安装目录下。
不论用的是英文版还是中文版,替换之后即可使用。
3、EndNote 的安装目录默认为:
64位系统:C:\Program Files (x86)\EndNote X9
32位系统:C:\Program Files\EndNote X9
三、使用方法(备注:以下方式出自一篇文章,但是现在原文已经链接失效)
(一)在桌面创建快捷图标,方便每次使用。
1、如何添加引用
双击桌面快捷图标,打开EndNote x9。点击文件-->新建,在弹出的对话框中选择一个地址,修改文件名,新建文献库。
新建之后的效果如图所示:
2、在谷歌学术、百度学术或知网上搜索自己需要的文献,输入文献名字(以百度学术为例),搜索出来后,点击名字下方的引用,如图所示:
弹出一个框,在“导入链接”中选择EndNote,如图所示:
在弹出的对话框中修改文件名和下载到的地址。
下载之后的效果如图所示:
3、将下载的文件导入到EndNote x9中
打开EndNote x9软件,找到刚刚创建的库,点击向下的箭头,在弹出的对话框中点击“选择”,找到要导入的文件,导入选项为“EndNote导入”,点击“导入”。
导入文献之后的效果,如下图所示。
保存之后就可以使用这个文献了。
(二)插入特定格式的引用
1、国内本科毕业论文的引用格式是 GB/T 7714-2005 。但是EndNote中没有这个样式,所以我们需要手动添加一下这个样式。
(1)首先下载模板样式 https://cnzhx.net/blog/endnote-output-style-cnzhx/endnote_template_cnzhx/
下载后解压,里面名为 geebinf modified byzz.ens 就是我们需要的模板文件了。将解压得到的 geebinf modified by zz.ens 文件放到 EndNote 安装目录的 Styles 文件夹里就可以了。如果不知道安装目录,可以右键单击 EndNote 程序图标,选择“属性”来查看。通常是在系统盘的程序文件夹里。如,C:\Program Files (x86)\EndNote X9\Styles,我的安装路径是:D:\Program Files (x86)\EndNote X9。
1.Motivations(目的) Identify grouping structure of data so that objects within the same group are closer (more similar) to each other while farther (less similar) to those in different groups Various distance/proximity functionsintra-cluster distance vs. inter-cluster distance Unsupervised learning: used for data exploration Can also be adapted for supervised learning purpose Types of cluster analysis Partitional vs. Hierarchical: one point can belong to one or multiple clusterskmeans algorithm vs. HAC (Hierarchical Agglomerative Clustering) algorithm 中:
Window上我们常见的资源泄露包括内存和对象句柄泄露, 下面讨论下对各类泄露的检测方法。 关于内存泄漏,我以前写过2篇文章: C++中基于Crt的内存泄漏检测 , 基于WinDbg的内存泄漏分析 用上面提到的方法检测泄露很多时候太麻烦,所以有时候我们会考虑用工具 VLD: Visual Leak Detector源于Code Project:Visual Leak Detector - Enhanced Memory Leak Detection for Visual C++, 安装包可以到 这里 下载。
使用很简单,基本上安装完了就之可以直接用, 具体可以参考 这篇
关于对象句柄泄露, 主要分GDI对象,Kernel对象,User对象:
GDI对象只在本进程有效,主要是指Brush, Pen,DC等, 具体可以参考 这里
User对象只在同一Session内有效,同一user对象在不同进程内值都相等,可以跨进程使用, 主要是指Menu, window, cursor, hook等,具体可以参考 这里
Kernel对象可以跨进程使用, 但是因为每个进程都有自己的内核对象表,所以同一对象的句柄值在不同进程里会不相等(尽管最终指向同一个内核对象),主要是指各类HANDLE,具体可以参考 这里
对于对象句柄泄露,免费来说没有太好的工具可以直接使用, 很多时候我们可以直接通过任务管理器来观察各类对象的个数, 如果有持续增长, 则说明有泄露存在。很多时候GDI泄露是大头,我们要判断哪类GDI对象正在泄露,可以考虑使用工具GDIView。(对于对象句柄泄露,谁有好的工具,可以提示下。)
对于内核对象泄露,我们可以考虑使用WinDbg的 !htrace 命令, 使用很简单:通过 !htrace -enable 命令打开栈回溯, 然后通过 !htrace -snapshot 命令保存一个当前所有句柄的快照, 最后再通过 -htrace -diff 命令获取所有前面保存快照后打开但没有关闭的句柄对象。
如果公司有钱,可以考虑购买Boudcheck, 这个工具非常强大,可以帮我们快速的检测出各类内存和对象泄露,包括API的参数错误等。思考Boundcheck的实现原理,实际上并不复杂,主要就是API Hook, 大概过程如下:
(1) 将注入对方进程
(2) 通过API Hook替代系统资源分配和释放相关的API, 并且记录调用栈
我们知道,关于高DPI的支持, Windows XP时代就开始有了, 那时关于高DPI的支持比较简单, 但是从Vista/Win7 到现在Win8 /Win8.1, Windows关于高DPI的支持已经发生了很大的变化, 下面我们依次简单介绍下。 如果说以前XP时代我们还有理由不关注高DPI, 那么在移动设备时代和大显示器的高分辨率时代, 我们就没有理由不关注高DPI了, 比如Surface Pro的分辨率是1920x1080, 这种情况下如果系统我们不设置高DPI, 基本上就没法触摸和操作了,所以现在普通程序对高DPI的支持已经成为趋势了。 什么DPI? 全称是dots per inch (DPI), 也就是每英寸的点数,在显示器上就是每英寸的像素个数,Window上一般默认是96 dpi 作为100% 的缩放比率, 但是要注意的是该值未必是真正的显示器物理值, 只是Windows里我们的一个参考标准。 下面我们思考为什么DPI设置高了之后, 我们看到的字体会变大? 因为系统字体是是以固定大小(宋体10号字,物理尺寸为(10/72)英寸)设计的, 当我们DPI设置高了之后 ,说明该字体要占有更多的像素, 在屏幕分辨率不变的前提下, 看起来也就大了。所以如果我们设置高DPI,通常也意味着我们的显示器是高分辨率, 里面的字体看起来太小了, 我们需要提高DPI来把内容放大。 那么我们的程序如何才能支持高DPI? 对于高DPI的支持, 不同操作系统有不同的方案。通常来说如果我们程序支持高DPI, 意味着我们要对绘画的内容进行相应的放大, 比如字体,图片和控件等。当然, 如果我们用的是系统字体(比如GetStockObject(DEFAULT_GUI_FONT)), 那么这种情况下我们不用操心, 因为系统会对该字体在高DPI时进行相应的放大; 如果我们是用CreateFont自己创建的字体, 那就要我们自己对该字体进行放大了。 下面我们看XP是如何对高DPI进行支持的? XP对高DPI的支持比较差劲, 大部分情况下就是字体的放大, 当然我们程序也可以通过GetDeviceCaps(hDC, LOGPIXELSX)获取DPI后自己对绘画的内容进行缩放。 下面我们看Vista/Win7/Win8是如何对高DPI进行支持的? 我们知道Vista/Win7我们可以禁止DWM(Desktop Window Manager), 该模式我们称之为Basic模式, 这种模式下的高DPI效果和XP一样。 对于DWM没有禁掉的情况, Vista/Win7/Win8 对高DPI的支持又分为2种情况, 具体看下图: 一种XP风格的高DPi支持, 这种方式我们上面讨论过了; 还有一种是通过 DWM 虚拟化支持的 高DPI方式, 下面我们讨论下该方式: 该种方式的高DPI支持是通过DWM的缩放实现的, 具体过程是这样的, 比如我们当前系统的DPI是200%, 我们程序运行时,系统会告诉你当前DPI仍然是96(100%), 所以我们程序会仍然按照100%的方式进行绘画, 但是但是系统给我们的坐标是根据DPI缩小过后的(也就是我们对窗口调用GetWindowRect或是通过GetSystemMetrics(SM_CXSCREEN)得到的大小会比实际大小减半) , 当我们画完之后, DWM再对整个窗口进行200% 放大后画到屏幕上, 这样看起来我们的程序就自动支持高DPI了。 这种方式看起来很美妙, 但是它也有缺点, 主要是经过缩放后的内容看起来会变模糊, 比如文字会有明显的锯齿。 既然DWM虚拟化用户效果有时不是那么好, 那么我们很多时候可能会自己支持高DPI, 如何让我们的程序禁用该效果? 事实上我们可以对每个进程对DWM虚拟化的支持进行设置和查询, 系统给我们提供了2个APi: SetProcessDPIAware 和 IsProcessDPIAware , 通过调用 SetProcessDPIAware , 我们告诉系统不要对我们的程序进行DWM虚拟化。 这里还有特殊情况也提一下: 我们在高DPI下通过窗口句柄取到的坐标信息是和目标程序是否支持DWM虚拟化相关联的, 我们对其他支持DWM虚拟化的程序窗口调用GetWindowRect, 取到的坐标也是经过DWM缩放后的坐标; 对禁用DWM虚拟化程序的窗口调用GetWindowRect, 取到的坐标则是没有经过缩放的原始坐标。 最后我们再讨论下Win8.
我们知道ATL(活动模板库)是一套很小巧高效的COM开发库,它本身的核心文件其实没几个,COM相关的(主要是atlbase.h, atlcom.h),另外还有一个窗口相关的(atlwin.h), 所以拿来学习应该是很方便的。但是因为ATL的代码充满了模板和宏,内部还夹杂着汇编,所以如果没有比较丰富的C++模板和系统底层的知识,一般人会看得一头雾水。 下面我们主要分析一下ATL中的一些汇编代码。 ATL中出现汇编代码主要是2处,一处是通过Thunk技术来调用类成员函数处理消息;还有一处是通过打开_ATL_DEBUG_INTERFACES宏来跟踪接口的引用计数。 通过Thunk技术来调用类成员函数
我们知道Windows窗口的消息处理函数要求是面向过程的C函数,所以我们C++普通成员函数就不能作为窗口的消息处理函数,所以这里的问题就是如何让我们的C++成员函数和Windows的窗口的消息处理函数关联起来?MFC是通过一个Map来实现的,而ATL选择了更为高效的Thunk技术来实现。
我们将主要代码贴出来,然后介绍它的创建过程: template < class TBase, class TWinTraits> HWND CWindowImplBaseT< TBase, TWinTraits >::Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName, DWORD dwStyle, DWORD dwExStyle, UINT nID, ATOM atom, LPVOID lpCreateParam) { ATLASSERT(m_hWnd == NULL); if (atom == 0) return NULL; _Module.AddCreateWndData( & m_thunk.cd, this ); if (nID == 0 && (dwStyle & WS_CHILD)) nID = (UINT) this ; HWND hWnd = ::CreateWindowEx(dwExStyle, (LPCTSTR)MAKELONG(atom, 0), szWindowName, dwStyle, rcPos.
摘要: 正如我们不能确定微软的Win8 Metro能否成功,我们现在还不能确定这种PC没落的趋势是否会持续下去, 新生平台究竟会是昙花一现,还是主流趋势? 作为一名技术人员,有时候真的很无奈,虽然理论上计算机的本质和设计思想永远不会过时, 但是你一旦停止了自身对新技术的汲取,你可能会很快被淘汰。 阅读全文 Richard Wei 2012-06-21 22:36 发表评论 转载于:https://www.cnblogs.com/weiym/archive/2012/06/21/2653025.html
摘要: Win8 Metro 相关的一些开发资料 阅读全文 Richard Wei 2012-05-17 17:46 发表评论 转载于:https://www.cnblogs.com/weiym/archive/2012/05/17/2653036.html
今天在参看别人的博客代码是,发现Func<string,string>()代码,以前没有看见过。特此记录下来。
HandlerItem(exchangeValues, key, StringHandlerHelper.Change);
//在以上语句中,直接传递方法名。
private void HandlerItem(RouteValueDictionary values, string key, Func<string, string> handler) { if (!values.ContainsKey(key)) return;
var v = values[key]; if (!(v is string)) return;
values[key] = handler(v as string);
//具体的参数传递,方法调用执行,返回值的赋值,在 values[key] = handler(v as string); 语句中执行。 } public static string Change(string s) { StringBuilder sb = new StringBuilder(); int index = 0;
foreach (var c in s) { if (c >= 'A' && c <= 'Z') //c等于大写字母时,加入'-',然后加入小写的c。 { if (index > 0) sb.
Datepicker时间控件的使用 A、在需要调用对话框的页面<head></head>标签中引入。
<script type="text/javascript" src="JS/datepicker/WdatePicker.js" > </script>
B、在文本框中加入时间控件的样式(class="Wdate")和事件调用οnclick="javascript:WdatePicker();"。
<input type="text" name="Accept/SubmitDate" class="Wdate w_bfb98" readonly="readonly" title="申请提交日期" myClass="txt|y|0|25" id="Accept/SubmitDate" style="width:45%;" οnclick="javascript:WdatePicker();">
<xsl:attribute name="value">
<xsl:call-template name="FormatDate">
<xsl:with-param name="DateTime" select="Accept/SubmitDate"/>
</xsl:call-template>
</xsl:attribute>
</input>
artDialog对话框控件 A、 在public.js中将artDialog的相关方法进行封装。 //****************************************************
// 名 称:initSkin
// 说 明:初始化art.dialog的Skin
// 参 数:无
// 返 回 值:无
//****************************************************
function initSkin() {
var d = art.dialog.defaults;
// 按需加载要用到的皮肤,数组第一个为默认皮肤
// 如果只使用默认皮肤,可以不填写skin
d.skin = ['chrome', 'default', 'facebook', 'aero'];
}
//****************************************************
// 名 称:showAlertDialog
SpringBoot使用Sharding-JDBC分库分表 1.有关Sharding-JDBC 有关Sharding-JDBC介绍这里就不在多说,之前Sharding-JDBC是当当网自研的关系型数据库的水平扩展框架,现在已经捐献给Apache,具体可以查看Github,地址是:https://shardingsphere.apache.org/document/current/cn/overview/
shardingsphere文档地址是:https://shardingsphere.apache.org/document/current/cn/overview/。
目前貌似还不能从Maven仓库下载依赖,需要手动下载源码打包使用,所以本文使用的还是当当网的依赖。
2.本文场景 2.1 数据库 接下来介绍一下本文的场景,本文是分别创建了2个数据库database0和database1。其中每个数据库都创建了2个数据表,goods_0和goods_1,如图所示。这里蓝色的代表database0中的表,红色的代表database1中的表。绿色goods表是虚拟表(图画的比较丑,审美不好,凑合看吧)。
2.2 分库 本文分库样例比较简单,根据数据库表中字段goods_id的大小进行判断,如果goods_id大于20则使用database0,否则使用database1。
2.3 分表 分样例比较简单,根据数据库表中字段goods_type的数值的奇偶进行判断,奇数使用goods_1表,偶数使用goods_0表。
2.4 代码流程 流程大致是这样,在应用程序中我们操作虚拟表goods,但是当真正操作数据库的时候,会根据我们的分库分表规则进行匹配然后操作。
3.代码实现 本文使用SpringBoot2.0.3,SpringData-JPA,Druid连接池,和当当的sharding-jdbc。
3.1 建表SQL 创建表和数据库的SQL如下所示。
CREATE DATABASE database0; USE database0; DROP TABLE IF EXISTS `goods_0`; CREATE TABLE `goods_0` ( `goods_id` bigint(20) NOT NULL, `goods_name` varchar(100) COLLATE utf8_bin NOT NULL, `goods_type` bigint(20) DEFAULT NULL, PRIMARY KEY (`goods_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; DROP TABLE IF EXISTS `goods_1`; CREATE TABLE `goods_1` ( `goods_id` bigint(20) NOT NULL, `goods_name` varchar(100) COLLATE utf8_bin NOT NULL, `goods_type` bigint(20) DEFAULT NULL, PRIMARY KEY (`goods_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; CREATE DATABASE database1; USE database1; DROP TABLE IF EXISTS `goods_0`; CREATE TABLE `goods_0` ( `goods_id` bigint(20) NOT NULL, `goods_name` varchar(100) COLLATE utf8_bin NOT NULL, `goods_type` bigint(20) DEFAULT NULL, PRIMARY KEY (`goods_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; DROP TABLE IF EXISTS `goods_1`; CREATE TABLE `goods_1` ( `goods_id` bigint(20) NOT NULL, `goods_name` varchar(100) COLLATE utf8_bin NOT NULL, `goods_type` bigint(20) DEFAULT NULL, PRIMARY KEY (`goods_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 3.
一、Collection集合接口
在之前学习链表的时候可以发现,当使用add()方法向链表增加数据的时候,每次保存的都是一个对象的数据,而Collection操作过程之中每次也只能够保存一个对象。在Collection接口之中一共定义了15个方法,那么常用的方法如下:
No.
方法名称
类型
描述
1
public boolean add(E e)
普通
向集合之中保存数据
2
public void clear()
普通
清空集合
3
public boolean contains(Object o)
普通
查询集合之中是否包含有指定对象,需要equals()
4
public boolean remove(Object o)
普通
删除对象,需要equals()
5
public boolean isEmpty()
普通
判断集合是否为空集合
6
public int size()
普通
取得集合的长度
7
public Object[] toArray()
普通
将集合以对象数组的形式返回
8
public Iterator iterator()
普通
为Iterator接口实例化
在以上所给出的方法之中,99%的情况下是使用add()、iterator()两个方法,其它的方法都很少使用。但是在开发之中不会去直接使用Collection(时代已经结束了),都会使用Collection下的两个子接口:List(允许重复)、Set(不允许重复)。
二、List集合接口
List接口是Collection之中最为常用的子接口,也是大家在开发过程之中主要使用的接口。但是List子接口针对于Collection子接口做了大量的功能扩充,而主要扩充的方法有如下几个:
No.
方法名称
类型
描述
1
public E get(int index)
常用权限:
读写存储卡
装载和卸载文件系统 android.permission.WRITE_EXTERNAL_STORAGE android.permission.READ_EXTERNAL_STORAGE android.permission.MOUNT_UNMOUNT_FILESYSTEMS 网络连接 android.permission.INTERNET android.permission.ACCESS_NETWORK_STATE android.permission.ACCESS_WIFI_STATE android.permission.CHANGE_WIFI_STATE 开机启动 android.permission.RECEIVE_BOOT_COMPLETED 精准的GPS位置 基于网络的粗略的位置 获取模拟定位信息(调试) android.permission.ACCESS_FINE_LOCATION android.permission.ACCESS_COARSE_LOCATION android.permission.ACCESS_MOCK_LOCATION 短信 android.permission.BROADCAST_SMS android.permission.READ_SMS android.permission.SEND_SMS android.permission.RECEIVE_SMS android.permission.WRITE_SMS 拨打电话 允许程序拨打电话 (任何电话) android.permission.CALL_PHONE android.permission.CALL_PRIVILEGED 读取联系人 读取通话记录 android.permission.READ_CONTACTS android.permission.WRITE_CONTACTS android.permission.READ_CALL_LOG android.permission.WRITE_CALL_LOG 安装/卸载快捷方式 com.android.launcher.permission.INSTALL_SHORTCUT com.android.launcher.permission.UNINSTALL_SHORTCUT 录音 修改声音设置 android.permission.RECORD_AUDIO android.permission.MODIFY_AUDIO_SETTINGS 振动 android.permission.VIBRATE 默认 android.permission.BAIDU_LOCATION_SERVICE 读写手机状态和身份 android.permission.READ_PHONE_STATE 装载和卸载文件系统 android.permission.MOUNT_UNMOUNT_FILESYSTEMS 查阅敏感日志数据 android.permission.READ_LOGS 发送持久广播 android.permission.BROADCAST_STICKY 修改全局系统设置 android.permission.WRITE_SETTINGS 唤醒 android.permission.WAKE_LOCK 关闭程序 android.permission.RESTART_PACKAGES android.permission.KILL_BACKGROUND_PROCESSES android浏览器插件开发 android.webkit.permission.PLUGIN 禁用键盘锁 android.permission.DISABLE_KEYGUARD 写入浏览器的收藏夹和历史记录 读 com.android.browser.permission.WRITE_HISTORY_BOOKMARKS com.
http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/ android Build系统 超链接
转载于:https://www.cnblogs.com/sunfb/p/3368025.html
Python 简明教程 (入门必看) * 在线 浏览: http://www.woodpecker.org.cn:9081/doc/abyteofpython _cn/chinese/index.html * PDF: http://bbs.chinaunix .net/attachm ... 0ZGdmUnJJUXlNZVE%3D Python Tutorial 简体中文版 (March Liu翻译) * 在线浏览: http://www.woodpecker.org.cn:9081/projects/pythontutorial/py2.5/html/tut/tut.html * PDF: http://www.woodpecker.org.cn:908 ... .5/Py2_5_tut_cn.pdf * 最新3.x打包地址: http://openbookproject.google cod ... utorial_zh081031.7z Dive Into Python -- 《深入Python》 * 在线浏览: http://www.woodpecker.org.cn/diveintopython/toc/index.html * 打包下载 : http://www.woodpecker.org.cn/diveintopython/#download * 最新DIP3地址: http://www.woodpecker.org.cn/diveintopython3/ :) 另外 Python 官方文档和下载请参见置顶帖.
转载于:https://www.cnblogs.com/moiyer/archive/2010/03/25/1952697.html
启用Ad Hoc Distributed Queries: exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure 关闭Ad Hoc Distributed Queries: exec sp_configure 'Ad Hoc Distributed Queries',0 reconfigure exec sp_configure 'show advanced options',0 reconfigure 启用xp_cmdshell:
-- To allow advanced options to be changed. EXEC sp_configure 'show advanced options', 1 GO -- To update the currently configured value for advanced options. RECONFIGURE GO -- To enable the feature. EXEC sp_configure 'xp_cmdshell', 1 GO -- To update the currently configured value for this feature.
使用winzip命令行对文件打包压缩 ,通过程序和命令行对WinZip进行调用。
去http://www.winzip.com/downcl.htm 下载dos版的winzip,下载后直接安装,就会在winzip的目录中产生两个dos命令行程序WZZIP.exe,WZUNZIP.EXE,可以直接在dos窗口下运行。 现在看看两个命令的基本用法 一、压缩文件命令 WZZIP.exe 格式:wzzip [options] zipfile [@listfile] [files...] [options]包括: -a 默认的操作,压缩文件 -a+ 压缩文件,并删除要压缩的文件 -b[drive|path] 是在另外的驱动器上创建临时压缩文件 -d 删除zip文件中指定的目标文件 -e 是设置压缩比率,x最大,0最小 -f 替换zip文件中存在的文件 -h|-? 察看帮助 -v 创建一个压缩文件的列表信息 -@list 先创建一个包含所有要解压的文件的文件,然后按所包含的的文件名压缩 [@listfile] 是压缩文件的列表信息纪录 [files...] 则是要压缩的多个文件,用空格隔开,也可以用通配符 例: 1.压缩当前目录的所有文件 wzzip test.zip *.* 2.压缩类型为txt的所有文件 wzzip test.zip *.txt 3.压缩两个文件 wzzip test.zip abc.txt def.txt 4.压缩类型为txt的所有文件除了abc.txt wzzip -xABC.TXT test.zip *.txt 5.压缩D:\docs下的所有类型为txt的文件及子目录 wzzip -rp test.zip d:\docs\*.txt 6.把zipit.1st里的文件更新到test.zip wzzip -u test.zip @Zipit.lst 7.列出一个压缩文件的列表内容 wzzip -v test.zip 二、解压文件命令 WZUNZIP.
一、托盘简介
所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。其实,托盘区的编程很简单,下面简要阐述一下子喽^_^
二、托盘编程相关函数
其实呢,把程序放到托盘上的本质就是先在托盘区绘制一个图标,然后把程序隐藏不见,再对托盘的图标进行消息处理,就可以了。
绘制图标以及确定图标所传送消息的函数只有一个,那就是——————
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
);
这个函数呢,负责向系统传递消息,以添加、修改或删除托盘区的图标。她的返回值呢,是个布尔类型的。就是说,如果返回0,那就是成仁啦,非0才成功。
参数dwMessage 是表示这个函数的应用功能是哪一方面,是添加、删除,还是修改图标。如果是添加,则它的值为NIM_ADD;删除则是NIM_DELETE;而修改是NIM_MODIFY。参数pnid就是具体的和程序在托盘区的图标有关系的结构了。它的定义如下:
typedef struct _NOTIFYICONDATA { DWORD cbSize; HWND hWnd; UINT uID; UINT uFlags; UINT uCallbackMessage; HICON hIcon; char szTip[64]; } NOTIFYICONDATA, *PNOTIFYICONDATA; 下面就对该结构各个参数进行刨析:
cbSize : 结构的长度,用“位”来做单位。一般在程序中,我们用(DWORD)sizeof(NOTIFYICONDATA) 给它赋值。
HWnd : 一个句柄,如果对托盘中的图标进行操作,相应的消息就传给这个句柄所代表的窗口。自然了,大多数情况下是this->m_hWnd喽。
uID : 在工程中定义的图标ID
uFlags : 这个成员标志着其他哪些成员的数据是有效的,分别为NIF_ICON, NIF_MESSAGE, NIF_TIP,分别代表着数据有效的成员是hIcon, uCallbackMessage, szTip。当然,三个值可以用“|”联系到一起。下面分别对涉及到的成员进行阐述
hIcon : 要增加,删除或修改的图标句柄。如果只知道个uID, 一般可能会用函数LoadIcon来得到句柄。例如LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE (IDR_MAINFRAME) )。
uCallbackMessage : 这在对托盘区的操作中,是比较重要的数据成员。这是个消息标志,当用鼠标对托盘区相应图标进行操作的时候,就会传递消息给Hwnd所代表的窗口。所以说,在uFlags中,一般都得标志它有效。这里一般都是自定义的消息。
szTip : 鼠标移动到托盘图标上时的提示文字。
/定义函数、变量// void resize(); POINT Old;//存放对话框的宽和高 /// void CNewFrameDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if(nType==SIZE_RESTORED||nType==SIZE_MAXIMIZED)//窗体大小发生变动。处理函数resize { resize(); } } void CNewFrameDlg::resize() { float fsp[2]; POINT Newp; //获取现在对话框的大小 CRect recta; GetClientRect(&recta); //取客户区大小 Newp.x=recta.right-recta.left; Newp.y=recta.bottom-recta.top; fsp[0]=(float)Newp.x/Old.x; fsp[1]=(float)Newp.y/Old.y; CRect Rect; int woc; CPoint OldTLPoint,TLPoint; //左上角 CPoint OldBRPoint,BRPoint; //右下角 HWND hwndChild=::GetWindow(m_hWnd,GW_CHILD); //列出所有控件 while(hwndChild) { woc=::GetDlgCtrlID(hwndChild);//取得ID if (woc == IDC_LIST1||woc==IDC_STATICFRAME) { GetDlgItem(woc)->GetWindowRect(Rect); ScreenToClient(Rect); OldTLPoint = Rect.TopLeft(); TLPoint.x = long(OldTLPoint.x*fsp[0]); TLPoint.y = long(OldTLPoint.
Pingip.cpp #include “stdafx.h” #include “ping.h” void CPing::Ping(UINT nRetries,LPCSTR pstrHost,HWND hWnd) { SOCKET rawSocket; LPHOSTENT lpHost; UINT nLoop; int nRet; struct sockaddr_in saDest; struct sockaddr_in saSrc; DWORD dwTimeSent; DWORD dwElapsed; u_char cTTL; m_hWnd = hWnd; CString str; //创建一个Raw套接字 rawSocket = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP); if (rawSocket == SOCKET_ERROR) { CString strMsg; strMsg.Format(“创建套接字发生错误 – WSAError: %ld”,WSAGetLastError()); //发送报错信息 SendMessage(m_hWnd,WM_MSG_STATUS,0,(LPARAM) AllocBuffer(strMsg)); return; } //获得主机信息 lpHost = gethostbyname(pstrHost); //构造目标套接字地址信息 saDest.sin_addr.s_addr = *((u_long FAR *)(lpHost->h_addr)); saDest.sin_family = AF_INET; saDest.
HBITMAP CopyScreenToBitmap(LPRECT lpRect,BOOL bSave) //lpRect 代表选定区域 { HDC hScrDC, hMemDC; // 屏幕和内存设备描述表 HBITMAP hBitmap, hOldBitmap; // 位图句柄 int nX, nY, nX2, nY2; // 选定区域坐标 int nWidth, nHeight; // 确保选定区域不为空矩形 if (IsRectEmpty(lpRect)) return NULL; //为屏幕创建设备描述表 hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL); //为屏幕设备描述表创建兼容的内存设备描述表 hMemDC = CreateCompatibleDC(hScrDC); // 获得选定区域坐标 nX = lpRect->left; nY = lpRect->top; nX2 = lpRect->right; nY2 = lpRect->bottom; //确保选定区域是可见的 if (nX < 0) nX = 0; if (nY < 0) nY = 0; if (nX2 > m_xScreen) nX2 = m_xScreen; if (nY2 > m_yScreen) nY2 = m_yScreen; nWidth = nX2 - nX; nHeight = nY2 - nY; // 创建一个与屏幕设备描述表兼容的位图 hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight); // 把新位图选到内存设备描述表中 hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把屏幕设备描述表拷贝到内存设备描述表中 if(bSave) { CDC dcCompatible; dcCompatible.
BOOL CMyEdit::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default //************************************************************************************** //取消文字复选 this->SetSel(0,0); //设置位图背景 CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); BITMAP bmp; bitmap.GetBitmap(&bmp); CDC dcCompatible; dcCompatible.CreateCompatibleDC(pDC); dcCompatible.SelectObject(&bitmap); CRect rect; GetClientRect(&rect); pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY); return TRUE; //********************************************************************************* //CEdit::OnEraseBkgnd(pDC); } 转载于:https://www.cnblogs.com/rogee/archive/2011/03/31/2000963.html
删除方法:
1.首先删除用户
2.删除表空间
转载于:https://www.cnblogs.com/rongweifeng/archive/2009/10/28/1591442.html
.Net Framework 3.0带了个System.Speech.dll,装个语音包,然后就可以实现文字朗读等功能。最近在使用的时候,发现随着程序的运行,程序占用的内存一直在增长,直到程序崩溃。
用WinDbg抓了个Dump,然后看了下,里面一堆没有释放的SPVTEXTFRAG、AudioDeviceOut+InItem、WAVEHDR、WaveHeader对象,于是写了一小段来测试:
1: //happyhippy.cnblogs.com 2: using System.Speech.Synthesis; 3: using (SpeechSynthesizer ss = new SpeechSynthesizer()) 4: { 5: for (int i = 0; i < int.MaxValue; i++) 6: { 7: ss.Speak(i.ToString()); 8: } 9: } 跑了几个小时,然后抓了个内存,开始干活:
1. 看下内存中有哪些对象
1: 0:000> .load clr20/sos.dll 2: 0:000> !dumpheap -stat 3: PDB symbol for mscorwks.dll not loaded 4: total 275193 objects 5: Statistics: 6: MT Count TotalSize Class Name 7: 70441ff8 1 12 System.
Visual InterDev Technical Articles Date and Time Arithmetic in JScript Mike Pope, Visual InterDev User Education
Microsoft Corporation
June 1998
When it comes to computers, calendars are messy. You and I can easily work with dates such as "next Tuesday" or "an hour and half from now," or "the first of next month." Computers, however, with their relentlessly sequential style of thinking, don't take as well to the arbitrary-seeming algorithms of calculating schedule intervals.
解决办法:
1、去百度搜索“QTCF.dll”,找到一个靠谱的下载地址获取到该dll文件;
2、将文件放到 安装目录:Safari\Apple Application Support 下边。
转载于:https://www.cnblogs.com/miaochw/p/3210571.html
1.写好的avs脚本用播发器不能播放,并且报unexpected chatacter?错误
解决办法:1.尽管avs支持汉语文件路径,但是仍要确认标点符号是否为英文状态下。
2.将AVS脚本用记事本打开,重新存为并把编码格式修改成ASNI格式,
转载于:https://www.cnblogs.com/flychaochao/archive/2009/12/04/1617059.html
官方网站:http://cassandra.apache.org/download/ NOSQL debrief上的视相关资料:http://blog.oskarsson.nu/2009/06/nosql-debrief.html
Cassandra PPT: http://static.last.fm/johan/nosql-20090611/cassandra_nosql.ppt Cassandra Video: http://vimeo.com/5185526 1、windows下搭建Cassandra :
http://www.cnblogs.com/lovko/archive/2010/05/12/1733511.html (博客园上最详细的图文并貌)
2、大话Cassandra数据模型
http://www.cnblogs.com/gpcuster/archive/2010/03/12/1684072.html 3、基于Cassandra搭建简单Blog程序后台
http://www.cnblogs.com/gpcuster/archive/2010/03/16/1687717.html
4、 .Net Developer's Guide to Getting Started with Cassandra
http://www.ridgway.co.za/archive/2009/11/06/net-developers-guide-to-getting-started-with-cassandra.aspx 转载于:https://www.cnblogs.com/DanielChow/archive/2010/06/06/1752553.html
构思:写一个全局的Queue , 然后开一个线程去循环. 不善言语,直接看代码吧!
public class MyQueue
{
public decimal Id { get ; set ; }
public decimal Type { get ; set ; }
}
static Queue < MyQueue > TaskQueue = new Queue < MyQueue > ();
static void Main( string [] args)
{
ServiceStart();
Console.ReadLine();
}
public static void ServiceStart()
{
Thread TaskThread = new Thread( new ThreadStart(ThreadInvoke));
TaskThread.IsBackground = true ;
TaskThread.Start();
}
public static void ThreadInvoke()
--加法 select sysdate,add_months(sysdate,12) from dual;--加1年 select sysdate,add_months(sysdate,1) from dual;--加1月 select sysdate,to_char(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual; --加1星期 select sysdate,to_char(sysdate+1,'yyyy-mm-dd HH24:MI:SS') from dual; --加1天 select sysdate,to_char(sysdate+1/24,'yyyy-mm-dd HH24:MI:SS') from dual; --加1小时 select sysdate,to_char(sysdate+1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual; --加1分钟 select sysdate,to_char(sysdate+1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual; --加1秒 --减法 select sysdate,add_months(sysdate,-12) from dual; --减1年 select sysdate,add_months(sysdate,-1) from dual; --减1月 select sysdate,to_char(sysdate-7,'yyyy-mm-dd HH24:MI:SS') from dual; --减1星期 select sysdate,to_char(sysdate-1,'yyyy-mm-dd HH24:MI:SS') from dual; --减1天 select sysdate,to_char(sysdate-1/24,'yyyy-mm-dd HH24:MI:SS') from dual; --减1小时 select sysdate,to_char(sysdate-1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual; --减1分钟 select sysdate,to_char(sysdate-1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual; --减1秒 转载于:https://www.
先看3个参数: autovacuum_freeze_max_age | 500000 vacuum_freeze_min_age | 10 vacuum_freeze_table_age | 100000 首先如果pg_class表age(relfrozenxid)大于autovacuum_freeze_max_age,那么数据库系统会自动做vacuum,回收年龄 没有达到500000之前,不做vacuum hank=> select oid::regclass,age(relfrozenxid) from pg_class where relname='hank' and relowner=16392; oid | age ------+-------- hank | 495471 (1 row) 达到后,立即做vacuum hank=> select oid::regclass,age(relfrozenxid) from pg_class where relname='hank' and relowner=16392; oid | age ------+-------- hank | 504559 (1 row) 可见日志: 2017-08-07 17:23:44.193 CST,,,4774,,5988319d.12a6,2,,2017-08-07 17:23:41 CST,3/5308,0,LOG,00000,"automatic vacuum of table ""hank.hank.hank"": index scans: 0 pages: 0 removed, 1596 remain, 0 skipped due to pins, 0 skipped frozen tuples: 0 removed, 307278 remain, 0 are dead but not yet removable buffer usage: 3204 hits, 1 misses, 1278 dirtied avg read rate: 0.
python保存视频中的每一帧 import cv2 import os def save_img(): video_path = r'./dataset/sample/video' videos = os.listdir(video_path) for video_name in videos: file_name = video_name.split('.')[0] folder_name = video_path + file_name os.makedirs(folder_name, exist_ok=True) print(video_path+'/'+video_name) vc = cv2.VideoCapture(video_path+'/'+video_name) #读入视频文件 c=0 rval=vc.isOpened() while rval: #循环读取视频帧 c = c + 1 rval, frame = vc.read() pic_path = folder_name+'/' if rval: cv2.imwrite(pic_path + str(c) + '.png', frame) #存储为图像,保存名为 文件夹名_数字(第几个文件).jpg cv2.waitKey(1) else: break vc.release() print('save_success') print(folder_name) save_img()
Traceback (most recent call last): File "train_ammeter_twoclass.py", line 189, in <module> train(epoch) File "train_ammeter_twoclass.py", line 133, in train outputs = net(inputs) File "/home/iot/miniconda2/envs/pytorch3/lib/python3.6/site-packages/torch/nn/modules/module.py", line 477, in __call__ result = self.forward(*input, **kwargs) File "/home/iot/chenjun/1_program/classifer/src/model.py", line 79, in forward x = self.net(x) # inception会返回两个矩阵 File "/home/iot/miniconda2/envs/pytorch3/lib/python3.6/site-packages/torch/nn/modules/module.py", line 477, in __call__ result = self.forward(*input, **kwargs) File "/home/iot/miniconda2/envs/pytorch3/lib/python3.6/site-packages/torchvision/models/inception.py", line 109, in forward aux = self.AuxLogits(x) File "/home/iot/miniconda2/envs/pytorch3/lib/python3.6/site-packages/torch/nn/modules/module.py", line 477, in __call__ result = self.
This code i have got Ittool box.com.
It is very usefull. we usually have requirement when we want to hide some translate values from translate field on page for some business reason.
In this case we can use AddDropDownItem(),ClearDropDownItem().
The fact is that we need to use ClearDropDownItem() function first. so whatver values it had will bec leared out and then we will have to manually add values using AddDropDownItem().
1. GL相关:Journal Template和GL BU手动添加
GL_ACCOUNT_TBL
GP_GL_GROUP
GP_GL_GROUP_DTL
GP_GL_MAP
GP_GL_MAP_DTL
2. Pay Entity:
GP_PYENT
GP_PYENT_COMB
GP_PYENT_DTL
GP_PYENT_LANG
GP_PYENT_SOVR
GP_PE_SBANK
GP_PE_SBANK_DT
GP_PE_SBANK_DTL
3. Pay Group: GP_PYGRP
GP_PYGRP_DTL
GP_PYGRP_LANG
GP_PYGRP_SOVR
4. Eligibility Group: GP_ELIG_GRP
GP_ELIG_GRP_LNG
GP_ELIG_GRP_MBR
5. Absence Type and Self Service: GP_ABS_TYPE
GP_ABS_TP_LANG
GP_ABS_SS
GP_ABS_SS_LANG
6 Run Type: GP_RUN_TYPE
GP_RUN_TYPE_DTL
GP_RUN_TYPE_RTO
GP_RUN_TYP_LANG
转载于:https://www.cnblogs.com/GoDevil/archive/2011/03/26/1996092.html
ExcelToCI的时候,报错:THE RESPONSE TEXT IS NOT VALID XML. LOGIN DATA CLEARED
一般来讲,这个常见错误可能的原因:
1. 网络服务无响应:关掉Excel然后重新打开,重新上传就好了
2. 用户名密码错误
3. CI没有加到Permission List里面
今天碰到这个问题,三方面都检查过,依然报错。无奈中,在application designer里测试,可以上传成功。
偶然实验了下重新New Template,结果报错了:
Error retrieving structure of component interface gpmx_pi
<html dir='ltr' lang='zh-cn'>
<!-- Copyright(c) 2000,2009.Oracle.All rights reserved.-->
授权错误-与安全管理员联系</html>
去Google搜索这个报错信息,发现需要把WEBLIB_SOAPTOCI 添加到Web Libary中去:
Before you can use the Excel To CI Spreadsheet, you’ll need to know the name of the Component Interface that you’re working with as well as the WEBLIB_SOAPTOCI web library and the SOAPTOCI web service added to one of your permission lists
This article explains how to create XML Publisher also called BI Publisher reports in PeopleSoft. XML Publisher is the only Reporting platform in the Fusion Application. Before we talk about how to create an XML Publisher report in PeopleSoft, I would like to give a brief overview. Overview:
XML Publisher consists of the following components:
• Data Source
• Template
• XML Publisher Engine
• Report
Data source can be defined using in the following forms:
All PeopleCode objects can be passed as function parameters. You can pass complex data structures between PeopleCode functions (as opposed to passing long lists of fields). If a function is passed an object, the function works on the actual object, not on a copy of the object. In the following simple example, a reference to the Visible property is passed, not the value of Visible. This enables the MyPeopleCodeFunction either to get or set the value of the Visible property: MyPeopleCodeFunction(&MyField.
Below is a sample piece of SQR code which you can use to call Datamover to export data perform some processing, and call another SQR within that SQR to posibly load the data. It's a good sample! !************
Begin-Program
!************
do Init-Report
call system using 'r:\hr700\bin\client\winx86\psdmt.exe -CT MICROSFT
-CS servername -CD databasename -CO user -CP password -CI user -CW
password -FP c:\temp\ccc_pers_data_export.dms' #status1
show 'DataMover Export Status: ' #status1
对于ERP项目来说,其核心就是企业管理流程。这里我将给大家介绍的第一个流程是应付帐款流程。
应付帐款流程说说是一个流程,其实,根据应付帐款形式的不同,其还可以细分为好几个流程。如应付帐款逐笔结转流程、应付帐款月结流程、应付帐款暂估流程等等。出于篇幅的限制,我这里对于应付帐款逐笔结转流程与应付帐款月结流程将合并讲述。而因为应付帐款暂估流程比较特殊,我将分开来讲解。
我先以应付帐款月结为例,进行说明。
假设,某企业当月的某个供应商一共有四笔交易记录,明细如下:
1、5月4日供应商送货20万,企业开入库单A。
2、5月10日供应商送货15万,企业开入库单B。
3、5月26日供应商送货10万,企业开入库单C。
4、5月31日供应商送货20万,企业开入库单D。
到5月底、6月初,企业就要进行应付帐款作业。结合ERP系统,企业用户该如何开展相关工作呢?
第一步:采购员提出应付帐款的需求。
在月底,采购要跟供应商进行对帐。对帐是一件比较头疼的问题,因为其比较烦琐,没有多少技术含量,只要人细心就可以了。其实在对帐中,还是有些技巧的。
我以前有个客户,对帐的大部分工作由企业自己做。具体的说,就是月底供应商送来一份出货明细表,然后,公司的采购员根据此表一张张的寻找进货记录与采购记录,进行逐笔的核对。如此,对帐的工作明显都推给了企业。其实,我们若采用了ERP系统后,我们可以反过来。每月底,我们可以从系统里导出一份当月的进货记录,然后把这份记录发给供应商,让其进行核对。我们只需要对于供应商有异议的条目进行复核即可。如此,对于企业来说,工作量就会轻松很多。 再对帐时,要注意两个问题。
一是月结的时间问题。我遇到的大部分客户,都是按自然月结帐,也就是说,以自然月为单位,跟供应商对帐。但是,也有不少的客户,不采取自然月,而手工的划分月结时间。如我有一个客户,其规定的月结时间是25日截止,26日送的货都当是下个月进的货。故若遇到这种情况,我们在系统里导出进货明细表的时候,要注意选择具体的日期,如4月26日到5月25日,这就是5月份应该结帐的进货记录。也就是说,若按照这个客户的要求,则以上的例子中,只有第一、二条记录可以作为5月份的货款依据。
二是发票的问题。在大部分生产企业中,都有增值税发票的管理要求,因为其可以用来抵扣销项税额。一般情况下,有两种发票管理方法。一是逐项开发票,也就是说,每进一次货就开一次发票。这种发票管理比较简单,因为其跟采购单、入库单是一一对应的,但是,工作量比较大。无论是供应商开发票还是企业自己认证发票,都比较麻烦。另外是一个月开一次发票。也就是说,跟供应商对完帐后,供应商就开一张发票过来,发票的金额就是当月产生的总金额。对于ERP系统来说,这两者都支持。前者,就是逐笔结帐流程,后者就是月结流程。由于增值税发票,在一定程度上也是企业的资产,所以,在供应商材料入库单上,ERP也作了限制。当采购员收到发票时,采购员需要在入库单上注明发票的号码,以表示供应商开了发票。若没有发票信息,则系统可以控制,该入库单不能生成应付帐款信息。
采购员对帐完成后,就会把相关的单据递交给财务人员,让其再次对相关内容进行核对。
第二步:财务人员核对
采购员对帐无误后,填写付款申请单给财务,财务会再次核对相关信息。
到了财务部门,财务人员主要会核对单据是否齐全。不同的企业对于申请货款需要哪些单据有其不同的要求。我的客户,大部分都是四单合一,即采购单、供应商送货单、原材料入库单与发票申请单四单一致。为了方便财务人员核对,系统提供了“四单报表”。这张报表以入库单为依据,查找对应的供应商入库单单号(如果在系统中有输入的话)、采购单号及发票号码。通过这张报表财务人员就可以一目了然的知道,单据是否齐全。若单据不齐全,财务人员就可以把付款申请单退回给采购,让其重新整理,直到单据齐全为止。
一般情况下,入货的数量、价格等基本信息经过采购员对帐后,很少会有错误。不过有时候,发票的金额可能会产生误差。如当月供应商当月发生退货时,本来应该开红字发票对冲的,但是,这么处理起来比较麻烦。所以,可能退货的金额直接在当月发票上扣掉。所以,当月的开票金额跟当月的应付金额可能不一致。系统会提示相关的报警信息,若用户觉得这没有错,则可以忽略这个报警信息。
第三步:自动生成应付单据。
财务人员核对无误后,就可以进行自动生成应付单据作业。这支作业的主要用途就是把“原材料入库单”转换成“应付帐款”单据。
在这个转换的过程中,有很多后台的命令要处理。如:
1、价税分离。现在大部分企业供应商报价时,都是含税价格。也就是说,采购价格中包含17%的增值税。但是,在应付帐款时,是要价税分离的。所以,在自动生成应付单据这支作业运行时,会根据相关信息,与判断该张单据是否是含税,及对应的税率,然后执行价税分离动作。不过,不同的ERP软件可能价税分离的运行时点不一样,如有的在采购单审核时就会进行价税分离。
2、预计付款日期的计算。现在大部分企业出于现金流的考虑,一般不会采取立即付款的付款策略。而会采取如到货后一个月或者结帐后一个月等类似的付款条件。系统会根据客户对应的付款条件及其他的一些信息来计算预计付款的日期。这里作为实施顾问或者系统管理员,要注意不同的付款条件具体代表的含义是什么。如上例中,若客户采取的是到货后几天付款的付款条件的话,则可能会根据不同的付款日期生成多张应付帐单;而若客户采取的是结帐后几日付款的话,则当月的入库单只生成一张应付单据。所以,付款条件的设置,也会影响到应付帐款的生成。
3、进货单信息的更新。在进货单上,有个结帐字段,若该字段选中,表示该笔进货单已经结帐,已经不能做任何的修改,包括删除动作。这是一个非常重要的功能。这可以保证入库单跟应付帐款单据的内容一致。当某张应付帐款单据因为某种原因删除时,也会更新这个字段,更新为不选中。如此,又可以更改相关的入库单,我们也可以重新的结帐。
第四步:应付凭单错误的修改。
一般情况下,应付凭单是不会产生什么错误的。其若真的出现什么错误的话,也是入库单或者其他基本信息的错误而造成的。如供应商的付款条件错误或者进货单上的进货日期错误,可能导致应付帐款上的预计付款日期错误;进货单上的价格或者数量错误,也会影响到应付帐款上的金额,等等。
若应付凭单真的发生错误改如何处理呢?
一般情况下,我们是不建议用户直接修改应付凭单。因为这会导致跟原始单据不一致,以后稽核时,容易产生问题。所以,我们建议,在应付凭单上发现问题时,最好把应付凭单删除或者作废掉。然后修改入库单等原始单据,修改完成后,再重新结帐。这么做,虽然比较麻烦一点,但可以保证应付帐款凭证跟原始单据一致,方便以后的管理。这不仅是系统的要求,也是企业管理实务的要求。当然,若用户觉得没必要重头开始改起,那用户也可以直接在应付凭单上进行更改。只是,用户要记住为什么要更改,否则的话,以后要查询更改原因的话,那就比较困难了。时过境迁,到时候不一定有人会记得。
转载于:https://www.cnblogs.com/GoDevil/archive/2008/11/04/1326397.html
Many times we came across situation where we have Page name but we dont know the navigation for this page in Portal.
Following SQL makes the job easy for us.
Execute the following SQL in Database.
SELECT REPLACE (navigation, '', ' > ' ) "PIA Navigation" , url , MENU_NAME , COMPONENT_NAME , portal_objname , portal_prntobjname , portal_uri_seg3 ,portal_label FROM ( SELECT SYS_CONNECT_BY_PATH (a.portal_label, '>>' ) navigation , '/EMPLOYEE/ERP/c/' || a.
decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
该函数的含义如下:
IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2)
......
ELSIF 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END IF
· 使用方法:
1、比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
例如:
变量1=10,变量2=20
则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。
2、表、视图结构转化
现有一个商品销售表sale,表结构为:
month char(6) --月份
sell number(10,2) --月销售金额
现有数据为:
200001 1000
200002 1100
200003 1200
200004 1300
200005 1400
200006 1500
200007 1600
200101 1100
200202 1200
200301 1300
想要转化为以下结构的数据:
year char(4) --年份
month1 number(10,2) --1月销售金额
month2 number(10,2) --2月销售金额
重新启动,进入到安装系统提示界面,然后选择安装到C盘,就可[在这里插入图片描述](https://img-
来自http://blog.csdn.net/softart/archive/2007/10/27/1846041.aspx
一.什么是多态(Polymorphism) 多态(Polymorphism)是面向对象(Object-Oriented,OO)思想"三大特征"之一,其余两个分别是封装(Encapsulation)和继承(Inheritance)--可见多态的重要性。或者说,不懂得什么是多态就不能说懂得面向对象。
多态是一种机制、一种能力,而非某个关键字。它在类的继承中得以实现,在类的方法调用中得以体现。
先让我们看看MSDN里给出的定义:
Through inheritance, a class can be used as more than one type; it can be used as its own type, any base types, or any interface type if it implements interfaces. This is called polymorphism. In C#, every type is polymorphic. Types can be used as their own type or as a Object instance, because any type automatically treats Object as a base type.
datareader对象提供只读单向数据的快速传递,单向:你只能依次读取下一条记录;只读:datareader中的数据是只读的,不能修改;相对的,dataset中的数据可以任意读取和修改。
SqlDataReader有一个很重要的方法,read,是个bool值。作用是前进到下一条数据,一条条的返回数据 。当bool为真时返回数据,为假时跳出。
while(dr.Read()) { Response.write(dr["UserName"] } dr.close(); 用这种方法不仅能判断用户名是否合法,还可以很方便地获取更多关于该用户的信息,其中,我比较喜欢用的是string Password = reader["UserPassword"].ToString();这种方法,但是这种方法似乎不能获取int类型的字段数据,比如这里的 UserId,只能用int UserID = reader.GetInt32(0);这种方法获取它的值。不知道用字段名有没有方法获取到UserId的值。
转载于:https://www.cnblogs.com/Eleanore/archive/2012/05/25/2518207.html
对象是一种非常重要的数据类型,是自我包含的数据集合。包含在对象里的数据可以通过两种形式——即属性(property)和方法(method)访问。
属性是隶属于某个特定对象的变量。方法是只有某个特定对象才能调用的函数。 对象是由一些彼此相关的属性和方法集合在一起而构成的一个数据实体。
对象是统体,实例是个体。为给定对象创建一个新实例,需要new关键字。如:
var jeremy = new person;然后就可以利用person对象的属性来检索关于jeremy的信息了:jeremy.age / jeremy.mood等。
javascript中的内建对象
Array(数组):若干元素的有序集合
数组的特点
1.数组元素不要求类型相同 arr1[0]=10; //数值型arr1[1]="程度信息工程学院"; //字符串arr1[2]=false; //逻辑型 2.数组元素还可以是对象,如创建二维数组
var arr=new Array(10);
for(i=0;i<10;i++)
arr[i] = new Array(5);
得到一个10*5的二位数组
3.数组长度可动态变化
属性——length方法 join():返回数组中所有元素连接成的字符串reverse():逆转数组中的元素sort():数组元素排序 String(字符串)
属性:lengthcharAt(position)——返回String对象实例中的位于pisition位置上的字符indexOf(str),indexOf(str,startposition)在String对象实例中(从startposition或0位置开始)查找str,找到,返回起始位置,否则返回-1.lastIndexof(str) substring(position1.position2)ToLowerCase(),toUpperCase()将string对象实例中的所有字符改成小写、大写。 Math(数学对象)
封装了常用的数学函数和运算
Math对象本身就是一个实例,不能用new创建 Date(日期时间对象)
该对象无属性
var current_date = new Date();
var today = current_date
Number对象
Boolean对象
Functiondx 转载于:https://www.cnblogs.com/Eleanore/archive/2012/05/25/2518175.html
我们只需要注意一个最重要的type 的信息很明显的提现是否用到索引:
type结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。possible_keys:sql所用到的索引key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULLrows: 显示MySQL认为它执行查询时必须检查的行数。
EXPLAIN select count((order_state = 2 or order_state = 3)) from t_order where passenger_id = 12
EXPLAIN select count(*) from t_order where passenger_id = 12 and (order_state = 2 or order_state = 3)
基本的Linux操作可以在菜鸟教程中学习:https://www.runoob.com/linux/linux-intro.html
日期:2014.8.6 PartⅣ The C API 26 Extending Your Application 使用Lua很重要的一点是用来做配置语言。配合主语言做一些功能的配置。 26.1 The Basics 有的时候程序需要配置一些功能信息,很多时候可能有许多别的方法比用lua做配置要更简单:如使用环境变量或者读取文件,读取文件涉及到文件的解析。如果使用Lua进行配置的话,相当于用lua文件替代了要读取的如csv、txt文件等。 使用Lua进行配置的时候,就需要使用Lua API去控制Lua来解析文件了,然后从Lua的全局变量中得到要配置的值。Load函数承担了加载文件的功能,函数调用luaL_loadfile从给定名字的文件中读取语句快,然后调用lua_pcall来运行语句快。假如遇到了错误(例如:配置文件中的语法错误),此时函数将错误信息push至栈中然后返回一个非零的错误代码;此时我们的程序使用lua_tostring 带参数index -1 从栈顶得到信息。 e.g. lua_tostring(L,-1) --从栈顶得到信息 加载完文件之后,就需要从Lua的全局变量中得到变量值了。此时调用lua_getglobal得到需要的值,参数为全局变量的名字。每一次调用都会将找到的全局变量值push值栈中,然后相应的主程序就从栈中得到相应的值。然后使用lua_is* 来确定值的类型,然后调用lua_to* 得到相应类型的值。 使用Lua做配置的好处就是,Lua帮你做了所有的语法检测处理,(配置文件中甚至可以有注释?);用户可以用Lua来做更为复杂的配置处理,如配置文件可以提示用户一些信息,或者检测某个环境变量来选择合适的值: e.g. --configuration file if getenv("DISPLAY") == ":0.0" then width = 300;height = 300 else width = 200;height = 200 另外一个原因便是:现在来看很容易使用Lua给程序添加新的配置信息,这个特性使得程序更为灵活。 26.2 Table Manipulation 假设一个这样的场景:需要配置窗口的背景颜色。此时需要有三个值:RGB值。通常在C中,每个值的范围是[0,255],而Lua中,因为所有的number都是实数,所以使用的是[0,1]这个范围。 通常为每一个值声明一个变量会带来很多麻烦,如:假如程序需要多种配置,如前景色、按钮颜色等等,那这样会需要很多的变量;而且这种方法不适合用预定义颜色,或者说默认值。此时,Lua中的table就适合做这样的配置工作了: e.g. background = {r = 0.30,g = 0.10,b = 0} 使用table将会给脚本带来非常大的便利性;此时也可以方便的使用一些预定值了,如: e.g. BLUE = { r = 0, g = 0, b = 1.
STM32串口通信乱码解决方法 STM32使用USART做串口通信实验的时候,串口调试助手能够接收到数据但出现乱码现象,显示开发板发来的数据总是问号或者不规则字体,主要原因可能是串口波特率设置不对或者系统时钟设置出问题。
波特率设置 波特率设置须与串口接收调试助手设置一致。尝试降低波特率为9600,依然出现乱码。可能就是系统时钟设置出问题。
系统时钟设置 本人核心板使用的晶振为8M,而系统初始化程序使用的是25M。打开stm32f10x.h文件,将晶振修改为核心板对应的大小。将25000000修改为80000000。
或者直接将这一段注释掉,直接设置晶振为核心板的晶振大小。
链接: https://blog.csdn.net/aizaiyueye/article/details/79049816.
1.过滤器对客户端发送的请求进行过滤,如果通过过滤器则chain.doFilter(request, response);向下一个过滤器传递或者进入请求资源的地方,如果请求失败则会重定向或者其他操作
View Code
2.过滤器的配置
复制代码
loginFilter
com.kgc.web.filter.LoginFilter//过滤器的类所在位置
loginFilter
/jsp/admin/*//设置过滤器的范围 是admin文件夹下的所有文件,只要想访问admin下的资源必须先经过该过滤器
复制代码
3.过滤器的范围的几种设置方式
完全匹配 /index.jsp
目录匹配: /admin/*
扩展名匹配: .do
全部匹配: /
当路径对以上匹配方式都适用时范围越小优先级越高
网站服务器的安全组是什么?有什么用?
答:具体内容请参看:https://justgogoal.com/?post=13
在使用vue-cli命令行创建后使用npm run serve时出现下面的错误
在网上找的时候大部分都是说把build文件夹下的一部分内容注释掉,但我这里并没有build文件夹
最后在下面这个文件将部分内容注释掉就可以了
然后就可以使用npm run serve了
php 默认时间戳11 13位获取毫秒数
<?php class sisi { public function javatime() { #microtime — 返回当前 Unix 时间戳和微秒数 #将微妙数和时间戳 赋值给 $t1 $t2 list($t1, $t2) = explode(' ', microtime()); #ceil — 进一法取整 return $t2 . ceil( ($t1 * 1000) ); } } $time = new sisi(); $javatime = $time->javatime(); var_dump($javatime); ?> 得到 13位时间戳
0.0 可以使用 元素 lookup-method 来取代 ApplicationContextAware 接口,避免应用代码直接和和 Spring 代码耦合在一起注意:元素 lookup-method 会 override 覆盖指定名称的所有同名方法,如果想要覆盖指定的 overload 重载方法,可是使用元素 replaced-method 替代。 1. 使用 ApplicationContextAware 接口实现 假设对单例 bean A 中某个方法 method-a 的每次调用,都需要获取一个新的 bean B 实例。这种情景中,可以让 bean A 实现 ApplicationContextAware 接口,从而可以在 bean A 中访问 bean 工厂,再从 bean 工厂每次获取一个新的 bean B 的实例。代码示例如下: 定义一个接口 package com.willhonor.test.useApplicationContext3LookupOrReplaceMethods; public interface FFruit { void say(); } 接口 FFruit 的一个具体实现类(用作上述中的 bean B) package com.willhonor.test.useApplicationContext3LookupOrReplaceMethods; public class FApple implements FFruit { public void say() { System.
Visual Studio 2010 Ultimate 和 Visual Studio 2010 Premium 这两个版本配备了一个名为Coded UI Test的UI自动化测试的工具,它提供了UI界面的功能测试和UI界面上控件的验证。UI自动化测试可以很方便地根据不同的业务逻辑修改自动化测试代码后,测试出你的应用程序是否还能继续工作,这比传统的手工测试会快很多。
那么目前Coded UI Test又支持哪些平台呢,请看下图:
IE7/IE8-HTML/AJAX
Windows Forms 2.0+
WPF3.5+
SharePoint 2007&2010
Windows Win32
MFC
Firefox 3.5 and 3.6-HTML/AJAX
Silverlight 4.0
Dynamics(Ax)
Citrix/Terminal Services
Office Client Apps
IE6
Chrome/Opera/Safari
Flash/Java
SAP
完全支持
部分支持,将来会完全支持
存在一些无法解决的issue,但用户仍能使用Coded UI Test完成基本的测试,微软将不会继续解决这些issue
当前不支持,不过将来会支持
当前和将来,微软都不会支持该平台
如果你将测试的平台还不支持,你可以通过Coded UI Test的扩展功能,使其得到支持,Coded UI Test的扩展支持将会在以后的博客中详细讲述。
转载于:https://www.cnblogs.com/lenshen/archive/2012/04/20/2459382.html
先将24点直接转化为浮点型来运算,这样可以省去除0的处理。
本文中是归一思路,4个数求24点--> 3个数求24点-- 2个数求24点-->1个数是不是24点。
bool chk(double a[],int n)
{
if(n == 1)
{
if(fabs(a[0]-24) < 10e-12) {cout << a[0] << endl; return 1;}
else return 0;
}
for(int i = 0; i< n; ++i)
{
for(int j = i+1; j< n; ++j)
{
double t1 = a[i];
double t2 = a[j];
double b[4];
int r = 0;
for(int k = 0; k< n; ++k)
{
if((k != i) && (k !
public static void main(String[] args) { //创建JaxWsDynamicClientFactory作为调用客户端; JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); //下面的是接口wsdl的地址 String wsUrl = "http://localhost:8080/services.asmx?wsdl"; //这是需要调用的方法名字 String method = "A_StateInf"; try { //客户端调用wsdl地址 Client client = dcf.createClient(wsUrl); //把webservice接口的方法放入 后面为请求参数 xml格式的 后面的参数看传参是上面类型的, //我的是string类型,经过测试,后面其实写什么都行,只要类型一样就行 Object[] objects = client.invoke(method,"1"); System.out.println(objects[0].toString()); } catch (Exception e) { e.printStackTrace(); } 还请各位指教,我看有的博客说是只能是调用java的,还请知道的说一下
方法一:
Config=tf.ConfigProto(allow_soft_placement=True) ##:如果你指定的设备不存在,允许TF自动分配设备 Config.gpu_options.allow_growth=True ##动态分配内存 sess=tf.session(config=config) 方法二:
gpu_options = tf.GPUOptions(allow_growth=True) gpu_options =tf.GPUOptions(per_process_gpu_memory_fraction=0.8,allow_growth=True) ##每个gpu占用0.8 的显存 config=tf.ConfigProto(gpu_options=gpu_options,allow_soft_placement=True) sess=tf.session(config=config)##如果电脑有多个GPU,tensorflow默认全部使用。如果想只使用部分GPU,可以设置CUDA_VISIBLE_DEVICES。 控制使用哪个gpu
os.environ[“CUDA_DEVICE_ORDER”] = “PCI_BUS_ID” ##指定的设备名称
os.environ[‘CUDA_VISIBLE_DEVICES’] = ‘0’ #使用 GPU 0
os.environ[‘CUDA_VISIBLE_DEVICES’] = ‘0,1’ # 使用 GPU 0,1
问题描述:
You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.
Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>今日头条APP顶部点击可居中导航</title> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" /> <link rel="stylesheet" href="https://cdn.bootcss.com/Swiper/4.0.6/css/swiper.min.css"> <style> * { margin: 0; padding: 0; } #topNav { width: 100%; overflow: hidden; font: 18px; } #topNav .swiper-slide { padding: 0 10px; width: auto; text-align: center; } #topNav .swiper-slide span { transition: all .3s ease; display: block; } #topNav .active span { color: #FF2D2D; border-bottom: 3px solid #FF2D2D; } .
目录
1.创建Schema数据模型对象
2.创建数据迁移模型(默认数据数组)
3.Realm管理
4.批量数据插入处理
5.完整代码示例
1.创建Schema数据模型对象 const MoviesSchema={ name:'Movies', primaryKey:'id', properties:{ id:'string', title:'string', year:'int', // newTitle:'string', //版本2新增字段 // testTitle:'string', //版本3新增字段 mpaa_rating:'string', test1:'string', test2:'string', test3:'string', newtest3:'string' } }; 2.创建数据迁移模型(默认数据数组) 版本2将title和test1合并为newTitle,title和test1直接去掉即可,在migration:(oldRealm, newRealm)方法中查询旧版本数据将旧版本数据迁移到新版本的数据库中,完成版本数据库结构升级;
const MoviesSchema={ name:'Movies', primaryKey:'id', properties:{ id:'string', //title:'string', year:'int', newTitle:'string', //版本2新增字段 // testTitle:'string', //版本3新增字段 mpaa_rating:'string', //test1:'string', test2:'string', test3:'string', newtest3:'string' } }; 版本3将newTitle和test2合并为testTitle,newTitle和test2直接去掉即可,在migration:(oldRealm, newRealm)方法中查询旧版本数据将旧版本数据迁移到新版本的数据库中,完成版本数据库结构升级;
const MoviesSchema={ name:'Movies', primaryKey:'id', properties:{ id:'string', //title:'string', year:'int', //newTitle:'string', //版本2新增字段 // testTitle:'string', //版本3新增字段 mpaa_rating:'string', //test1:'string', //test2:'string', test3:'string', newtest3:'string' } }; 每个数据库版本的升级迁移模型
一、 varnish 服务器软件
在Centos / RHEL 系安装需要以下 packages (官方说明)
autoconfautomakejemalloc-devellibedit-devellibtoolncurses-develpcre-devel (名叫pcre的版本貌似不能用)pkgconfigpython-docutilspython-sphinx 前面试过装 4.0.1 报错中途没有安装结束。 因为我这里确实要用 3.0.+ 的,所以直接安装了 varnish 3.0.6
虽然写了一大篇, 其实本文的配置设置挺简单。
# wget -c https://repo.varnish-cache.org/source/varnish-3.0.6.tar.gz
# tar -zxvf varnish-3.0.6.tar.gz
# cd varnish-3.0.6
# ./configure --prefix=/usr/local/varnish
# make && make install # cd /usr/local/varnish # sbin/varnishd -V
// 看到 copyright 就是安装成功了
配置并设置启动:
// 在varnish解压包下,有两个文件 varnish.initrc, varnish.sysconfig # cp /usr/local/src/varnish-3.0.6/redhat/varnish.initrc /etc/init.d/varnish
# cp /usr/local/src/varnish-3.0.6/redhat/varnish.sysconfig /etc/sysconfig/varnish
# cp /usr/local/src/varnish-3.0.6/redhat/varnish_reload_vcl /usr/local/varnish/bin # chkconfig --level 2345 varnish on
一、 后台订单列表grid页
1) 在订单grid列表中显示订单商品等,或联合查询其他表输出
奈何google又TM被封死了,百度能找到的方法,用起来不行。
因为我参照了 http://www.atwix.com/magento/adding-sku-column-to-orders-grid/(注:此文档已有两年多了,可以参考,硬搬会有几处错误), 几经修改将此功能写成了插件(Ludao_Adminrender), 试过简单暴力的方法,都不能翻页。
增加如支付方式、地址等, 由于join的数据表都是单列, 会简单一些。 而这里增加订单物品列(与显示物品缩略图类似), 用到 group_concat 。
网上的暴力方法,join了另外的数据表翻不了页,所以要重写block、 collection。
此方法需要新建一个插件模块,以下是我插件用的重要部分:
<!-- app/code/local/Ludao/Adminrenderer/etc/config.xml 重写后台的 sales_order_grid(block)、 Order_Grid_Collection(resource) --> <global> ... <blocks> <adminhtml> <rewrite> <sales_order_grid>Ludao_Adminrenderer_Block_Adminhtml_Sales_Order_Grid</sales_order_grid> </rewrite> </adminhtml> </blocks> <models> ... <sales_resource> <rewrite> <order_grid_collection>Ludao_Adminrenderer_Model_Resource_Sales_Order_Grid_Collection</order_grid_collection> </rewrite> </sales_resource> ... </models> ... </global> 俺插件的block: app/code/local/Ludao/Adminrenderer/Block/Adminhtml/Sales/Order/Grid.php <?php
class Ludao_Adminrenderer_Block_Adminhtml_Sales_Order_Grid extends Mage_Adminhtml_Block_Widget_Grid { public function __construct() { parent::__construct(); $this->setId('sales_order_grid'); $this->setUseAjax(true); $this->setDefaultSort('created_at'); $this->setDefaultDir('DESC'); $this->setSaveParametersInSession(true); } /** * Retrieve collection class * * @return string */ protected function _getCollectionClass() { return 'sales/order_grid_collection'; } // 修改了这个方法 protected function _prepareCollection() { $collection = Mage::getResourceModel($this->_getCollectionClass()); // 增加 $itemTable = $collection->getTable('sales/order_item'); $collection->getSelect()->joinLeft( $itemTable, "
请求类型 StringRequestInfo 用在 SuperSocket 命令行协议中。
你也可以根据你的应用程序的需要来定义你自己的请求类型。 例如, 如果所有请求都包含 DeviceID 信息,你可以在RequestInfo类里为它定义一个属性
SuperSocket 还提供了另外一个请求类 "BinaryRequestInfo" 用于二进制协议:
转载于:https://www.cnblogs.com/fanweisheng/p/11126637.html
记录在刷题过程中经常用到的,总结一下加深印象,方便以后查询。
目录 vector(动态数组)stringlist(双向链表)algorithm头文件下的常用函数sortnext_permutation()max(),min(),abs(),reverse(),swap()fill() setmapqueuepriority_queuedequestack vector(动态数组) 需要头文件<vector>
构造函数
vector<int> nums; //构造数据元素类型为int的空动态数组
vector<int> nums2(nums1); //构造元素与nums相同的动态数组(拷贝)
vector<int> nums(size); //数据元素类型为int,个数为size的动态数组
vector<int> nums(size,val); //数据元素类型为int,个数为size,初始值为val的动态数组
vector<int> nums[arraySize]; //定义长度为arraySize的vector动态数组数组。
访问 vector内元素有两种访问方式,通过下标或迭代器访问。
通过下标访问时和普通数组差不多,范围为(0到nums.size()-1)
通过迭代器访问如下:
vector<typename>::iterator it; //typename是类型名,通过*it 来访问
注意:
(nums[i]和*(it.begin()+i)等价)(it.end()是尾元素的下一个地址)
排序 需要头文件<algorithm>(具体细节见algorithm)
sort(nums.begin(),nums.end());
nums.push_back(val); //在数组末尾插入一个值为val的 元素
string 头文件为<string>
子串
string s;
s.substr(begin,len) //返回字符串s从begin位置开始长度为len的子串。
list(双向链表) 头文件为<list>,list无法通过下标访问。
双向链表的每一个元素中都有一个指针指向后一个元素,也有一个指针指向前一个元素。
在 list 容器中,在已经定位到要增删元素的位置的情况下,增删元素能在常数时间内完成。(比vector要快)。
注意:list无法用algorithm中的sort进行排序,可以用自己的成员函数进行排序。
构造函数:
list<int> lst; //创建空list
list<int> lst1(5,5); //创建含有5个值为5的元素的list
list<int> lst2(lst); //用lst初始化lst2
常用函数:
list.begin()、list.end()list.front()、list.back()list.push_back(val)、list.push_front(val)list.pop_back()、list.pop_front()list.erase() algorithm头文件下的常用函数 sort sort(首元素地址(必须填),尾元素地址的下一个地址(必填),比较函数(非必填))
如果不写比较函数,默认对区间递增排序,实例如下(参考《算法笔记》)
注意: 在写cmp函数时,针对两个比较的对象,如果相等一定要返回false!
1.ajax请求时,设置请求头 Connection:keep-alive 2.数据库连接不要写localhost,改成127.0.0.1 然后你就会发现,速度飞一般的快!
转于:https://www.cnblogs.com/q735613050/p/8969452.html
Windows 10 编译 Pycocotools 踩坑记
COCO数据库简介
一、下载链接 [1] - train2014 images: (13GB)
http://images.cocodataset.org/zips/train2014.zip
[2] - val2014 images:(6GB)
http://images.cocodataset.org/zips/val2014.zip
[3] - train2014/val2014 annotations:(241MB)
http://images.cocodataset.org/annotations/annotations_trainval2014.zip
[4] - test2014 images: (12GB)
http://images.cocodataset.org/zips/test2014.zip
[5] - test2015 images: (12GB)
http://images.cocodataset.org/zips/test2015.zip
[6] - train2017 images: (18GB)
http://images.cocodataset.org/zips/train2017.zip
[7] - val2017 images: (1GB)
http://images.cocodataset.org/zips/val2017.zip
[8] - train2017/val2017 annotations: (241MB)
http://images.cocodataset.org/annotations/annotations_trainval2017.zip
[9] - stuff train2017/val2017 annotations: (1.1GB)
http://images.cocodataset.org/annotations/stuff_annotations_trainval2017.zip
[10] - test2017 images: (6GB)
http://images.cocodataset.org/zips/test2017.zip
[11] - Panoptic train2017/val2017 annotations: (821MB)
由于我们是从10月31日开始进行Daily Scrum的,所以我们的Daily Scrum时间段为10.31-11.12共10天(包括一天周六)。
成员角色今天工作明天计划王安然PM, Dev完成了EnermyCraft抽象类,并进行Shield类的编写(190)继续进行Shield和TouchLayer类的编写(190&191)黄杨PM, Dev, Art改良星空背景的demo实现,改进背景美术设计(201、202)编写Explsion和Background和Decoration子类(182、183、184)谢伯炎Dev 刘俊伟Test 围观world类,加以若干测试 视ship类完成情况进行测试韩佳胤Art, Test 完成剩余的敌机设计 完成转会事宜谭传奇Dev, QA 完成EnermyCraft的子类(185)进行CraftFactory类的编写(188) 林璐Art, QA 燃尽图稍后更新。
转载于:https://www.cnblogs.com/buaashine/archive/2012/11/12/2767122.html
今天是 2012 年 10 月 31 日
这是我们的第一次Daily Scrum。
在那之前我们,我们走的是Weekly Scrum。
首先汇报一下改变世界的项目进展:
Glede:
{
前几天干了啥:
1.设计文档:
1.1 重新制定并完成了游戏风格、基本规则、游戏组件的详细设定,更改了大量的原有设计。
1.2 与王安然讨论了基本规则,除了在金币收集方式的问题上仍保留分歧外其他细节达成共识。
1.3 版本更新至ver0.3内部上传。
今天干了啥:
1.原型演示工程:
1.1 修正了一个在iOS真机测试中随机出现 “敌人全灭” 的BUG。
1.2 丰富了演示敌机的动作,使演示敌机的动作更接近设计的游戏效果。(这是一个典型的使用CCAction简化状态机实现的例子)
1.3 在测试程序中添加了演示用的火神炮武器,未完成能量,在演示程序里可以无限制地启动,但还不能通过手势控制。
1.4 添加了代码注释。 2.其他:
2.1 体验了一下极品飞车17:
2.2 Criterion还是延续了一贯的风格,同时也不能否认还是有一些创新在里面的……总体来说的设计还是不错的,展现了很多新的思路。
2.3 吐个糟:说引擎用的不是寒霜2,是大幅改进的变色龙……但是这个画面风格一看就觉得是寒霜2,而不是14给我们带来清晰靓丽又不吃显卡体验良好变色龙……
明天要干啥: 1. 原型演示工程:
1.1 还是把原型演示程序的武器演示搞定、重写TouchDelegate的输入管理。
1.2 写进能量积攒的一些相关方法。
1.3 继续在演示程序上进行游戏体验的测试,寻找一个合适的设计体验。
1.4 想到现在的演示程序工程还是很搓,整理一下设计的失误和改进方法,给安然一些建议。
2. 设计文档:
2.1 有空想想具体的敌机设计……虽然也只是想想,但是首先第一个要想清楚!
3.其他:
3.1 上编译课
3.2 干数据库作业
遇到的问题:
1.原型演示工程
1.1 在iOS真机调试上,三架敌机使用action控制运行,无太多子弹和盾的绘制,DEBUG配置下每帧时间能够达到0.015~0.017s,在RELEASE配置下每帧时间0.01s~0.02s,效率略有些伤感,哪里中弹还没有头绪。
1.2 对单位使用scheduleUpdateWith决定update的优先级,没有起到应有的效果,怀疑是Action的更新时间与update顺序的交叉,正式工程开始之前要进一步研究。
2.未来的第一版工程
2.1 我觉得我们还是应该快速讨论、决定单位运动编写的方法,还有保存、回放的处理。用Action做状态机真的是方便的让人不再想看update……