send.cpp:
#include <WinSock2.h> #include <stdio.h> #include <Windows.h> #pragma comment(lib,"ws2_32.lib") int main() { unsigned long ip; ip=inet_addr("127.0.0.1"); short port; port=8000; printf("Connecting to 127.0.0.1:8000...."); WSADATA wsa; if (WSAStartup(MAKEWORD(2,2),&wsa)!=0) { printf("socket init error"); exit(-1); } SOCKET sock; if ((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_ATOM) { printf("create socket error"); exit(-1); } struct sockaddr_in serverAddress; memset(&serverAddress,0,sizeof(sockaddr_in)); serverAddress.sin_family=AF_INET; serverAddress.sin_addr.S_un.S_addr=ip; serverAddress.sin_port=htons(port); if (connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR) { printf("link error"); exit(-1); } char buf[4096]; while (1) { printf(">"); gets(buf); if (send(sock,buf,strlen(buf),0)==SOCKET_ERROR) { printf("send error"); exit(-1); } int bytes; if ((bytes=recv(sock,buf,sizeof(buf),0))==SOCKET_ERROR) { printf("
cl;
w=0.7; %放大或缩小的宽度
h=1.5; %放大或缩小的高度
img=imread('Corner.png');
imshow(img);
[m n]=size(img);
imgn=zeros(h*m,w*n);
rot=[h 0 0;0 w 0;0 0 1]; %变换矩阵x=h*u,y=w*v
for u=1:m
for v=1:n
pix=[u v 1]*rot;
if (pix(1)>=0.5 && pix(2)>=0.5) %matlab没有(0,0)这样的元素
%操作要取得的是整数,没听说过小数坐标吧.
imgn(round(pix(1)),round(pix(2)))=img(u,v); %放大还没有进行插值,缩小不用插值
end end
end
figure,imshow(uint8(imgn)) 转载于:https://www.cnblogs.com/tiandsp/archive/2012/03/07/2384368.html
cl;
H=1; %索引pix中第一个元素,即高度
W=2; %索引pix中第二个元素,即宽度
jiaodu=0; %要旋转的角度,旋转方向为顺时针
img=imread('Corner.png'); %这里v为原图像的高度,u为原图像的宽度
imshow(img); %这里y为变换后图像的高度,x为变换后图像的宽度
[v u]=size(img);
h=v; %原图像的高度
w=u; %原图像的宽度
pro=w/h; %宽高比
%虽然这段程序是本人写的,不过这个仿射变换系数还是不太好表述,暂时是本人现在的理解。
%仿射变换系数,变换后图像的倾斜强度。取值区间为(0,1)为图像向右上错切;取0时不变换图像;取1时为垂直错切,不显图像;大于1时向左下错切图像
%区间为(-1,0)为向左上错切图像;为-1时垂直错切,不显图像;小于-1时为右下错切图像。 系数过大或过小处理时间会很长,再大/再小就会报错
aff_cof=0.6; theta=jiaodu/180*pi;
rot1=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1]; %旋转变换矩阵
rot2=[1 aff_cof*pro 0;aff_cof*(1/pro) 1 0;0 0 1]; %错切变换矩阵
rot=rot2*rot1; %联合变换矩阵
inv_rot=inv(rot);
pix1=[1 1 1]*rot; %变换后图像左上点的坐标
pix2=[1 u 1]*rot; %变换后图像右上点的坐标
pix3=[v 1 1]*rot; %变换后图像左下点的坐标
pix4=[v u 1]*rot; %变换后图像右下点的坐标
height=round(max([abs(pix1(H)-pix4(H))+0.5 abs(pix2(H)-pix3(H))+0.5])); %变换后图像的高度
width=round(max([abs(pix1(W)-pix4(W))+0.5 abs(pix2(W)-pix3(W))+0.5])); %变换后图像的宽度
imgn=zeros(height,width);
delta_y=abs(min([pix1(H) pix2(H) pix3(H) pix4(H)])); %取得y方向的负轴超出的偏移量
#include <vector> #include <iostream> #include <thread> #include <windows.h> using namespace std; void test(int a,int b) { for (size_t i = 0; i < 5; i++) { cout << a <<" "<<b << endl; Sleep(100); } } int main(int argc, char* argv[]) { vector<thread> vT; for (size_t i = 0; i < 10; i++) vT.push_back(thread(test, i,i+100)); for (size_t i = 0; i < 10; i++) vT[i].join(); system("pause"); return 0; } 转载于:https://www.
转自:https://blog.csdn.net/sanoseiichirou/article/details/50180533
C++标准文档——n2347(学习笔记) 链接:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf
旧版enum存在的问题 1 问题1向整形的隐式转换2 问题2无法指定底层所使用的数据类型3 问题3enum的作用域4 不同编译器解决该问题的方法不统一enum class 和 enum struct 1 enum class 和 enum struct 是等价的2 声明3 类型转换4 指定底层数据类型underlying type5 域C11enum的一些新特点转载请注明出处 1. 旧版enum存在的问题 问题描述1向整形的隐式转换(Implicit conversion to an integer)2无法指定底层所使用的数据类型(Inability to specify underlying type)3enum的作用域(Scope)4不同编译器解决该问题的方法不统一 1.1 问题1:向整形的隐式转换 在开始这个问题之前,我们需要知道什么是整形提升
查看之前的博文:C\C++中的整形提升
在看完什么是整形提升之后,我们开始这个问题:
旧版enum其实并不具有非常完全的类型安全(当然它也体现了一定的类型安全:1.禁止不同枚举体之间的赋值 2.禁止整形向枚举体的隐式转换等),也就是面对整形提升,旧版enum是没有抗拒力的。
例如:
#include <iostream> enum colorA{redA,greenA,grayA}; enum colorB {redB,greenB,yellowB}; void test(int data) { std::cout << "test called" << std::endl; } int main() { colorA ca(redA); colorB cb(greenB); //ca = cb; ERROR , 无法从“colorB”转换为“colorA” //ca = 2; ERROR , 无法从“int”转换为“colorA” bool res(ca < cb); //OK std::cout << std::boolalpha << res << std::endl; test(ca); //OK std::cin.
I got more info about breast massager from my united states friends.
Now many many people started use this kind of device to make their breast grow bigger.
So i bought one from breast massager website online.
Maybe some months later i can share some idea about how to use this good device to make breast bigger.
转载于:https://www.cnblogs.com/zhuzhupets/archive/2011/01/13/1934821.html
Yaoo Messenger For Vista发布了,下载地址 http://messenger.yahoo.com/download_vista.php。 转载于:https://www.cnblogs.com/tangpepper/archive/2007/12/07/987081.html
从源代码中查看到的加密算法(MD5 单次加密)

{
if (string.IsNullOrEmpty(str))
{
return string.Empty;
}
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] arr = UTF8Encoding.Default.GetBytes(str);
byte[] bytes = md5.ComputeHash(arr);
str = BitConverter.ToString(bytes);
//str = str.Replace("-", “”);
return str;
}
从数据库查询的加密文件
E4-ED-0F-5C-D9-6B-E5-F5-4B-79-86-3B-71-C8-11-61
https://pmd5.com/(MD5在线解密网址)
查询到用户admin的密码 Qwert
问题描述:
解决办法 依次使用下面的步骤,如果第一步没解决则继续第二步,依次类推 步骤 1:
isa 2004/6 控制台 > 配置 > 插件 > web过滤器 > 右击选择压缩过滤器的属性 > 选择启用这个过滤. > 确定 > 应用.
步骤 2:
取消验证正则化
如果url有高位字符请求,同样要取消选框
把http过滤器禁用了试试
详情请见:
http://www.microsoft.com/china/technet/prodtechnol/isa/2004/plan/httpfiltering.mspx
步骤 3:
1. 打开防火墙管理控制台. 2. 防火墙策略-->相应的策略-->配置http
3. 常规-->取消“阻止高位字符”-->应用 附一个常见的问题: 当下载文件名中含.exe扩展名时,还是会出现这种错误,很明显,.exe被block掉了,仔细看了一下,http策略,发现在常规标签中有一个:阻止包含 windows可执行文件内容的响应 复选框,取消即问题解决! 转载于:https://www.cnblogs.com/yanghb/archive/2011/08/25/2152732.html
大家好,很久没写博客了,最近在部署网站的时候,需要将写成console运算模块一并部署到服务器上。
然而Windows自带的任务计划程序是满足不了了,之前的公司有人开发过GerneralServiceHost,也就是个托管服务的程序,可惜没源码,那么自己写一个!
特点: 指定一个可执行文件作为任务,可以管理这个任务做增删改指定任务的运行方式,可以周期运行,也可以一次运行有进程守护功能(挂掉直接重新运行),还有不间断运行模式(挂掉或者正常结束后都重新运行)。运行状态和运行统计,日志查看和导出 安装说明: 下载安装包 https://raw.githubusercontent.com/jevonsflash/GeneralServiceHost/master/GSH/gsh.zip
解压并双击 setup.exe 安装
运行环境 Microsoft Windows 7 x64 及以上
包含.Net 4.6.1运行时
已知问题: 如要运行管理员权限的任务,需要在管理员模式下启用该程序
在Windows 7下若程序出现异常,会弹出异常对话框,这在进程守护勾选的情况下,可能需要您手动关闭它才能继续执行
整个项目由WPF技术提供支持 项目地址:
https://github.com/MatoApps/GeneralServiceHost
有兴趣的同鞋可以看看,谢谢!
转载于:https://www.cnblogs.com/jevonsflash/p/9255607.html
我们的项目中几乎都会有配置文件,里面可能会存储一些敏感信息,比如数据库连接字符串、第三方 API 的 AppKey 和 SecretKey 等。
对于开源项目,这些敏感信息肯定不能随着源代码一起提交到托管平台。
对于网站应用大多都是要部署到有公开 IP 的服务器上的,存有敏感信息的文件放在 Web 目录下也不安全。
较好的办法是把敏感信息文件存在项目以外的地方。
在.NET Core 中,我们可以使用 Secret Manager 工具来管理敏感信息,这个工具可以将敏感信息保存在一个 secrets.json 文件中,它不在项目文件夹下,而是存放在另外的地方。对于三种操作系统,它的位置是:
Windows: %APPDATA%/Microsoft/UserSecrets/<UserSecretsId>/secrets.json
Linux : ~/.microsoft/usersecrets/<UserSecretsId>/secrets.json
Mac : ~/.microsoft/usersecrets/<UserSecretsId>/secrets.json 一个.NET Core 应用对应一个唯一的 UserSecretsId,一般是一个 GUID。
这也限制了每个开发者都必须有自己的 UserSecrets 文件夹。虽然有些麻烦,但这也有个好处。就是每个开发者可以使用不同于其它开发者的敏感数据进行开发。比如有些公司的数据库为每个开发者创建了独立的数据库访问账号。
在 VS 中可以很方便地操作 secrets.json。右击项目,选择[Manage User Secrets],如图:
编辑打开的 secrets.json 文件,把敏感信息填入其中,如:
{
"ConnectionString": "server=localhost;database=testdb;uid=root;pwd=123456;"
} 保存后,.csproj 文件中会自动生成一个 UserSecretsId:
如果不用 VS,也可以在此处手动添加 UserSecretsId,然后在项目目录下通过命令来添加或删除配置项,例如:
dotnet user-secrets set "Foo:ApiKey" "123456"
dotnet user-secrets remove "Foo:ApiKey" 如果 secrets.json 和 appsettings.
今天遇到一个比较有意思的bug, 这里简单记录下。 Bug的症状是通过拖拉边框把我们客户端主窗口拖小之后,再最大化,会发现窗口显示有问题, 看起来像是刷新问题, 有些地方显示的不对了。 这里要说明的是我这里的主窗口是非常复杂的窗口, 里面集成了很多组件(cpmponent),有很多层的子窗口。 这个问题只有在特定条件下才会发生, 正常情况下都是好的。 遇到这种问题,我们怎么处理? 首先当然是观察症状, 究竟是刷新问题, 还是Layout出错了。 我们可以通过Spy++查看窗口层次是不是正确, 窗口位置是不是对的。 查看结果是窗口的层次和Layout位置都没有问题。 既然我们这里遇到的刷新问题,所以我们要从WM_PAINT消息着手, 我们通过Spy++查看相关窗口的WM_PAINT是不是正确。 很快我们就会发现某个窗口正在不停地收到WM_PAINT消息, 很可能与我们的bug有关。 一个窗口不停的收到WM_PAINT重画, 无非大概有几类原因: 正常情况是我们正在做动画, 可能是通过定时器之类的东西让窗口不停地InvalidateRect重画某块区域, 我们的窗口明显不属于这种情况。 讨论异常情况前先讨论WM_PAINT消息,我们知道WM_PAINT消息里一定要调用BeginPaint和EndPaint, 前者告诉系统绘画开始,系统会把当前窗口的无效区域变得有效, 后者结束某次绘画。 异常情况有时是WM_PAINT消息里我们的消息处理函数在某些条件下直接返回了,从而没有调用BeginPaint告诉窗口无效区域已经有效, 这样会因为因为窗口一直有无效区域存在,导致窗口一直收到WM_PAINT消息。 还有一种异常情况情况是我们是在WM_PAINT消息里调用BeginPaint后又调用了InvalidateRect, 这样会导致窗口后面会再次收到WM_PAINT消息, 最后窗口陷入WM_PAINT的死循环。 那么我们这里的问题窗口属于哪类? 用什么方法可以判断出来? 注意到这里关键的三个API:BeginPaint, EndPaint, InvalidateRect的第一个参数都是窗口句柄, 我们可以通过WinDbg的API断点来跟踪执行过程, Attach WinDbg到我们的主窗口进程,比如我们的窗口句柄是0x209A0, 我们可以这样设置API断点: bp USER32!NtUserInvalidateRect ".if(dwo(@esp+0x4)==0x209A0) {kv;gc} .else {gc}" bp USER32!NtUserBeginPaint ".if(dwo(@esp+0x4)==0x209A0) {kv;gc} .else {gc}" bp USER32!NtUserEndPaint ".if(dwo(@esp+0x4)==0x209A0) {kv;gc} .else {gc}" 上面的条件断点表示,当调用我们的对应的API,并且第一个参数(窗口句柄)是我们的目标窗口时,打印堆栈。 很快我定位出Bug发生的原因了, 条件断点显示了API如下的调用次序: BeginPaint->InvalidateRect->InvalidateRect->EndPaint 找到Bug的原因后,然后把Bug assign给该模块的负责人。 (看我够意思吧,不仅找到原因,还把调用栈都提供了) 另外 ,后面还发现这个bug发生时窗口的某些行为会不对, 测试发现原因是所有窗口的定时器都不能正常工作了。 关于这个问题, 你能想到原因吗? 如果想不到, 请把我的这篇博客《 从点击Button到弹出一个MessageBox, 背后发生了什么》看一遍。 如果看了还想不到, 重点看第4条。 最后, 简单总结下:计算机的好处是它永远不会欺骗你, 它只会按部就班的执行, 所以很多看似奇怪(甚至看似不可思议的问题), 只要你理解了程序背后的机制原理,都是可以找出根本原因的。 转载于:https://www.
public class RouteTable { // Fields private static RouteCollection _instance = new RouteCollection();
// Properties public static RouteCollection Routes { get { return _instance; } } }
在外部方法中调用RouteTable.Routes时,默认先实例化一个RouteCollection类型的实例_instance。然后再获取Routes属性的值。
为什么要这样使用呢?
转载于:https://www.cnblogs.com/lanchong/archive/2011/12/02/2272217.html
default 关键字。
default 关键字可在 switch 语句或泛型代码中使用。
switch 语句:指定默认标签。
泛型代码:指定类型参数的默认值。这对于引用类型为空,对于值类型为零。
switch语句 在switch语句中,如果没有任何case表达式与开关值匹配,则控制传递给跟在可选default标签后的语句。如果没有default标签,则控制传递到 switch 以外。 switch (key) { case 1: Console.WriteLine("1"); break; case 2: Console.WriteLine("2"); break; default: Console.WriteLine("Sorry, no one matches!"); break; }
泛型代码 在泛型类和泛型方法中,在预先未知以下情况时,如何将默认值分配给参数化类型 T: T 是引用类型还是值类型。
如果 T 为值类型,则它是数值还是结构。
给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。解决方案是使用 default 关键字,此关键字对于引用类型会返回空,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或空的每个结构成员,具体取决于这些结构是值类型还是引用类型。 public class GenericClass<T> { public T Function(arg) { T temp = default(T); if (arg !
文件名:JS/common/Grid.js
简介:这是基于Jquery的扩展库
用途:这个扩展库控件是针对JMJS系统的列表页面而开发的。主要功能包括:分页、排序、全选。
模板的创建、设置 A、 创建xslt列表模版
在列表模板中引入一下模板
<xsl:import href="../common/BlankLineExtend.xslt"/>
<xsl:import href="../common/Pagination.xslt"/>
<xsl:import href="../common/Function.xslt"/>
B、 创建列表的表头
<table id="tblList" border="0" cellpadding="0" cellspacing="0" class="tab_style001" width="100%">
<thead>
<tr style="font-size:12px;">
<th width="25px" align="center">
<input type="checkbox" id="chkAll" />
</th>
<th width="80px" align="center" order="ProjectAcceptNum">受理编号</th>
<th width="80px" align="center" order="AcceptDate" >受理日期</th>
<th width="150px" align="center" order="UnitName">申请单位</th>
<th width="*" align="center" order="ProjectName">项目名称</th>
<th width="150px" align="center" order="ApplyCategory">项目类型</th>
<th width="100px" align="center" order="UnitTel" >联系电话</th>
</tr>
</thead>
请注意:<thead></thead><th></th><tbody></tbody>这三个标签 如需要设置全选功能,请在第一例中添加CheckBox标签。
如果需要排序,请在<th>标签中设置order属性。
C、 创建数据列表
<tbody>
<xsl:for-each select="ReturnResult/Data/Accept">
xslt是一种用于将xml文档转换成xhtml的语言。
xslt文档是一个xml文件 <?xml version="1.0" encoding="utf-8"?>
声明文档的命名空间 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
或者:
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xslt:import>元素: 用于把一个样式表中的内容倒入另一个样式表中 <xsl:import href="AcceptLeft.xslt"/>
href属性:设置引入模版的路径。
<xslt:output>元素: 定义输出文档的格式 <xsl:output method="html" indent="yes"/>
method: 定义输出的格式。默认为xml。
Indent: 在输出结果树时是否要增加空白。
<xslt:template>元素 模板元素 <xsl:template match="/" name="AcceptInfoEdit">
match: 属性用于把模板关联到某个 XML 元素("/" 定义了整个文档)。
name:定义模版的名称。
<xslt:call-template>元素 可调用一个指定的模板 <xsl:call-template name="AcceptBaseInfo"></xsl:call-template>name:被调用的模版名称。
注意:必须在当前模版为使用<xslt:import href= ‘AcceptBaseInfo> 倒入模版,才能使用<salt:call-template>调用。
<xslt:value-of>元素 用于提取某个选定节点的值 <xsl:value-of select="Accept/ApprovalItemName"/>
select:指定xml元素中摸个具体节点的值。
<xslt:attribute>元素 用于给某个元素添加属性 <img src="images/icon_upload.gif" width="16" height="16">
<xsl:attribute name="onclick">
SelectRegion(<xsl:value-of select="Accept/Project/UserRegionID"/>);
</xsl:attribute>
</img>
Name:属性名称。
<xsl:attribute>具体的属性值</xsl:attribute>
<xslt:if>元素 用于放置针对 XML 文件内容的条件测试 <xsl:if test="
Android 的activity中onCreateOptionsMenu onMenuItemSelected onOptionsItemSelected onCreateContextMenu onContextItemSelected 五个方法的使用:
onCreateOptionsMenu :此方法为创建菜单方法,这个菜单就是你在点击手机menu键时会看到的菜单。
onCreateContextMenu :此方法为创建菜单方法,你还需要对此菜单进行注册Activity.registerForContextMenu(View view),这个菜单是在你长按前面注册的view时看到的菜单。
onMenuItemSelected :当你选择上面两种菜单任意一种时都会触发这个事件。
onOptionsItemSelected :这个方法只在onCreateOptionsMenu 创建的菜单被选中时才会被触发。
onContextItemSelected :这个方法只在onCreateContextMenu 创建的菜单被选中时才会被触发。
/*因为在一个Activity中都使用onMenuItemSelected和onContextItemSelected时会冲突, 也就是说,当有长按弹出菜单的时候,点击菜单的选项响应的是onMenuItemSelected(),如果被 点击的Item Id不在 onMenuItemSelected中,事件就不会响应,此时不会再调用onContextItemSelected。 这样的话,我们在onContextItemSelected中定义的事件就不会执行,这就是很多人遇到的“onContextItemSelected失效”的原因. 这个时候,需要在onContextItemSelected做相应的判断,如果执行的事件不在onMenuItemSelected中,就执行onContextItemSelected。 */
@Override public boolean onMenuItemSelected(int featureId, MenuItem item) { switch (item.getItemId()) { case R.id.about: Intent intent = new Intent(); intent.setClass(BaseActivity.this, AboutActivity.class); startActivity(intent); return true; case R.id.bgsettings: Intent changeBgIntent = new Intent(); changeBgIntent.setClass(BaseActivity.this, BgActivity.class); startActivity(changeBgIntent); return true; case R.id.help: Intent helpIntent = new Intent(); helpIntent.
理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼
得水,享受游刃有余的乐趣.
Proxy 是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结 构,Proxy 是代理的意思,我们也许有代理服务器等概念,代理概念可以解释为:在出发点到 目的地之间有一道中间层,意为代理. 设计模式中定义: 为其他对象提供一种代理以控制对这个对象的访问. 为什么要使用Proxy? 1.授权机制 不同级别的用户对同一对象拥有不同的访问权利,如Jive 论坛系统中,就使用 Proxy 进行授权机制控制,访问论坛有两种人:注册用户和游客(未注册用户),Jive 中就通过 类似ForumProxy 这样的代理来控制这两种用户对论坛的访问权限. 2.某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动. 举例两个具体情况: (1)如果那个对象是一个是很大的图片,需要花费很长时间才能显示出来,那么当这个图片包 含在文档中时,使用编辑器或浏览器打开这个文档,打开文档必须很迅速,不能等待大图片处 理完成,这时需要做个图片Proxy 来代替真正的图片. (2)如果那个对象在Internet 的某个远端服务器上,直接操作这个对象因为网络速度原因可 能比较慢,那我们可以先用Proxy 来代替那个对象. 总之原则是,对于开销很大的对象,只有在使用它时才创建,这个原则可以为我们节省很多宝 贵的Java 内存. 所以,有些人认为Java 耗费资源内存,我以为这和程序编制思路也有一定的 关系. 比如:我们有一个很大的Collection,具体如hashtable,有很多客户端会并发同时访问它. 其中一个特别的客户端要进行连续的数据获取,此时要求其他客户端不能再向hashtable 中 增加或删除 东东. 最直接的解决方案是:使用collection 的lock,让这特别的客户端获得这个lock,进行连续 的数据获取,然后再释放lock. public void foFetches(Hashtable ht){ synchronized(ht){ //具体的连续数据获取动作.. } } 但是这一办法可能锁住Collection 会很长时间,这段时间,其他客户端就不能访问该 Collection 了. 第二个解决方案是clone 这个Collection,然后让连续的数据获取针对clone 出来的那个 Collection 操作.这个方案前提是,这个Collection 是可clone 的,而且必须有提供深度 clone 的方法.Hashtable 就提供了对自己的clone 方法,但不是Key 和value 对象的clone, 关于Clone 含义可以参考专门文章. public void foFetches(Hashtable ht){ Hashttable newht=(Hashtable)ht.
企业管理器 --管理 --SQL Server代理 --右键作业 --新建作业 --"常规"项中输入作业名称 --"步骤"项 --新建 --"步骤名"中输入步骤名 --"类型"中选择"Transact-SQL 脚本(TSQL)" --"类型"中选择"SQL SERVER INTEGRATION SERVERS 包 --"数据库"选择执行命令的数据库 --"命令"中输入要执行的语句: --确定 --"调度"项 --新建调度 --"名称"中输入调度名称 --"调度类型"中选择你的作业执行安排 --如果选择"反复出现" --点"更改"来设置你的时间安排为一天一次 然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行 设置方法: 我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定. 转载于:https://www.cnblogs.com/qiangshu/p/5241613.html
A UDF (user defined function) to calculate distance between two zip codes as follow: 首先获取zip地址对应的经纬度值,从zip表中可以得到。 string sqlSel = " select latitud,longitud from ziptable where zip_cd = " + zip;
using (SqlDataReader dr = SqlHelper.ExecuteReader(strCon, CommandType.Text, sqlSel))
{
if (dr.Read())
{
latitud = Convert.ToDouble(dr[ 0 ]); // 得到zip地址的经度值 longitud = Convert.ToDouble(dr[ 1 ]); // 得到zip地址的纬度值 }
} 计算任意两个zip之间的距离:
其中,参数latitud,longitud为其中一个zip的经纬度;lat,lon为另一个zip的经纬度。然后计算两个zip之间的距离。 private double GetDistance( double latitud, double longitud, double lat, double lon)
>>>>>用途一:
定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:
char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量;
以下则可行:
typedef char* PCHAR; // 一般用大写
PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针
虽然:
char *pa, *pb;
也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。
>>>>>用途二:
用在旧的C的代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名 对象名,如:
struct tagPOINT1
{
int x;
int y;
};
struct tagPOINT1 p1; 而在C++中,则可以直接写:结构名 对象名,即:
tagPOINT1 p1;
估计某人觉得经常多写一个struct太麻烦了,于是就发明了:
typedef struct tagPOINT
{
int x;
int y;
}POINT;
POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候
或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。
>>>>>用途三:
用typedef来定义与平台无关的类型。
比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:
typedef long double REAL; 在不支持 long double 的平台二上,改为:
下载地址(VS2010不含MSDN):
http://download.microsoft.com/download/2/4/7/24733615-AA11-42E9-8883-E28CDCA88ED5/X16-42552VS2010UltimTrial1.iso
还有大家关心的问题,是什么呢?
提示一下,下载的是30天试用版,现在就想起来了吧?
YCFHQ - 9DWCY - DKV88 - T2TMH - G7BHP 转载于:https://www.cnblogs.com/rogee/archive/2010/10/12/1848781.html
procedure TForm1.btn1Click(Sender: TObject); var c:TCanvas; begin c:= TCanvas.Create; c.Pen.Width := 5; c.Font.Size := 20; c.Font.Name := '微软雅黑'; c.Font.Color := clRed; c.Brush.Color := clBlack; try //c.Handle := GetDC(0); c.Handle := GetWindowDC(1181728); // 这句是在一个指定窗体上写字 c.TextOut(20,20,'曲终的BLOG'); finally c.Free; end; end; 转载于:https://www.cnblogs.com/rogee/archive/2010/09/14/1827253.html
VC学习笔记1:按钮的使能与禁止
用ClassWizard的Member Variables为按钮定义变量,如:m_Button1;
则
m_Button1.EnableWindow(true); 使按钮处于允许状态
m_Button1.EnableWindow(false); 使按钮被禁止,并变灰显示
VC学习笔记2:控件的隐藏与显示
用CWnd类的函数BOOL ShowWindow(int nCmdShow)可以隐藏或显示一个控件。 例1:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT为控件ID号
pWnd->ShowWindow( SW_HIDE ); //隐藏控件
例2:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT为控件ID号
pWnd->ShowWindow( SW_SHOW ); //显示控件
以上方法常用于动态生成控件,虽说用控件的Create函数可以动态生成控件,但这种控件很不好控制,所以用隐藏、显示方法不失为一种替代手段。
VC学习笔记3:改变控件的大小和位置
用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置。
void MoveWindow(int x,int y,int nWidth,int nHeight);
void MoveWindow(LPCRECT lpRect);
第一种用法需给出控件新的坐标和宽度、高度;
第二种用法给出存放位置的CRect对象;
例:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT1为控件ID号
pWnd->MoveWindow( CRect(0,0,100,100) ); //在窗口左上角显示一个宽100、高100的编辑控件
SetWindowPos()函数使用更灵活,多用于只修改控件位置而大小不变或只修改大小而位置不变的情况:
BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
1 新建一个mfc extension dll 这个我想用VC的人都会做的事情吧–!名字叫做mydll
2 点击 文件—新建 选择文件 建立一个Header File文件 我们就暂定他的名字叫做Hook吧
3 在刚才建立的Hook.h的文件中加入复制以下的函数进去
extern “C” LRESULT CALLBACK keybordproc(int code,WPARAM wparam,LPARAM lparam); //钩子处理函数
extern “C” bool WINAPI starthook(DWORD threadID); //启动钩子
extern “C” bool WINAPI stophook();//停止钩子
4 在mydll.CPP的#include “stdafx.h”下面添加
#include “Hook.h”
#pragma data_seg(“publicdata”)
HHOOK hhook=NULL;
HINSTANCE pinstance=NULL;
#pragma data_seg()
5 找到DllMain…….在里面初始化
pinstance = hInstance;
6 同时 在mydll.CPP中找到空白的地方 复制下面的代码进去
extern “C” bool WINAPI starthook(DWORD threadID)//打开钩子函数
{
hhook=SetWindowsHookEx(WH_GETMESSAGE,keybordproc,pinstance,threadID);
if(hhook!=NULL)
return true;
else
1 解决办法1:
2 卸载IE8
3 解决办法2:(自己使用的方法)
4 5 打开注册表编辑器
6 7 选择“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet 8 Settings\Zones“ (如果该项中没有名为1000的项,则建一个key名为1000)
9 10 在1000中建一个DWORD属性如下:
11 12 Name = 1207 13 14 Type = REG_DWORD 15 16 Data = 0x000000 转载于:https://www.cnblogs.com/rogee/archive/2011/04/04/2005171.html
在WIN32下,实现程序互斥运行的方法有很多种,我简单分析以下几种不同的实现:
在VC下的实现 Visual C++ 是WIN32编程最主要也是最强大的编程工具这一,引用一名话来说VC就是“只有你想不到的,没有VC做不到的”。废话少说,下面看看用VC是如何这个功能。
使用编译器来实现(使用MFC框架) 在.cpp文件开头加上以下几行:
#pragma data_seg("Shared") int volatile g_lAppInstance =0; #pragma data_seg() 我们来看一下上面的内容:
第一句 #pragma data_seg("Shared") 创建一个称为Shared 的新节。第二句 int volatile g_lAppInstance =0 将 g_lAppInstance 放入Shared节中。注意此时只有将g_lAppInstance初始化,编译器才会将其放入Shared节中,否则,将放入Shared以外的 节。(实际上Visual C++ 编译器提供了一个allocate 说明符,使我们可以将数据放到任何节中。)第三句指示编译器Shared 节结束。 #pragma comment(linker,"/section:Shared,RWS") 这一句,我们使编译链接器知道我们的Shared节具有读,写,共享的属性。这是我们实现互斥运行的关键。这样我们就可以在应用程序之间的多个实例之间共享g_lAppInstance 变量。在InitInstance() 函数中加入:
if(++g_lAppInstance>1) { AfxMessageBox("程序已经运行!"); return FALSE; } 以上代码的作用是在程序是开始对g_lAppInstancd 加1 ,如果发现其值大于1,那么显示Message Box ,并返回FALSE。(注意:在MFC中如果InitInstance返回FALSE,程序将不会被运行!)
使用命名互斥对象 使用API函数CreateMutex来创建命名互斥对象来实现程序互斥是一个比较通用的方法,我们可以在IninInstance()函数加入如下代码:
HANDLE hObject = CreateMutex(NULL,FALSE,"LJPXYXC"); if(GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hObject); AfxMessageBox("程序已经运行!"); return FALSE; } 以上的CreateMutext函数创建一个称为“LJPXYXC”的命名的互斥对象,当程序的第二个实例运例时,调用CreateMutex 返回ERROR_ALREADY_EXISTS。我们根据这个值来实现程序的互斥运行。
VB的实现 在VB实现的程序中,全局对象App.PreInstance可以实现这个功能。App.PreInstance 是一个boolean型的值。如果其值为True说明程序已有一个实例在运行,如果为False那么,程序可以运行。
概述 前几天要做一段程序,把文字和位图图像合成并保存为位图文件。但问了好久都没人给一个满意的答复,只好在黑暗中摸索,费了一番功夫,实现了图像与文字的合成,并且可用鼠标拖动文字。现在我把代码贴出,希望能给需要的朋友以帮助。
关键函数 i nt SetDIBits( HDC hdc, // 兼容DC的句柄 HBITMAP hbmp, // 兼容位图的句柄 UINT uStartScan, // 扫描起始行的编号 UINT cScanLines, // 扫描的行的数目 CONST VOID *lpvBits, // 位图缓冲区的指针,要求已经分配空间 CONST BITMAPINFO *lpbmi, // 位图信息 UINT fuColorUse // 颜色格式 ); 这个函数把位图数据一个像素一个像素的贴到一个兼容位图上,hdc是选择了兼容位图的兼容DC。
int GetDIBits( HDC hdc, // 兼容DC的句柄 HBITMAP hbmp, // 兼容位图的句柄 UINT uStartScan, // 扫描起始行的编号 UINT cScanLines, // 扫描的行的数目 LPVOID lpvBits, // 位图缓冲区的指针,要求已经分配空间 LPBITMAPINFO lpbi, // 位图信息 UINT uUsage // 颜色格式 ); 这个函数的作用和SetDIBits刚好相反,它把兼容位图内已存在的数据一个像素一个像素的拷贝到数据缓冲区(lpvBits)中。这样程序的实现就比 较明朗了,首先根据位图的尺寸,创建一个兼容位图,然后把图片绘制到兼容位图,接着把文字也写到兼容位图上,然后再从兼容位图得到合成的数据。
/*推荐给想学C++的朋友一个简单但是完整的学习C++的读书路线图:
C++ Primer-> c++标准程序库-> effective C++-> effective STL->深入探索C++对象模型
C程序常用算法源码
算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。
通常使用自然语言、结构化流程图、伪代码等来描述算法。
一、计数、求和、求阶乘等简单算法
此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。
例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。
本题使用数组来处理,用数组a[100]存放产生的确100个随机整数,数组x[10]来存放个位上的数字分别为 1,2,3,4,5,6,7,8,9,0的数的个数。
即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]中,……个位是0的个数存放在 x[10].
void main()
{
int a[101],x[11],i,p;
for(i=0;i<=11;i++)
x=0;
for(i=1;i<=100;i++)
{
a=rand() % 100;
printf("%4d",a);
if(i%10==0)printf("\n");
}
for(i=1;i<=100;i++)
{
p=a%10;
if(p==0) p=10;
x[p]=x[p]+1;
}
for(i=1;i<=10;i++)
{
p=i;
if(i==10) p=0;
printf("%d,%d\n",p,x);
}
printf("\n");
}
二、求两个整数的最大公约数、最小公倍数
分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)
(1) 对于已知两数m,n,使得m>n;
(2) m除以n得余数r;
(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);
(4) m ← n,n ← r,再重复执行(2)。
例如: 求 m=14 ,n=6 的最大公约数。 m n r
1 public static T Mapper<S, T>(S source) 2 { 3 T t = Activator.CreateInstance<T>(); 4 try 5 { 6 var s_type = source.GetType(); 7 var t_type = typeof(T); 8 foreach (PropertyInfo sp in s_type.GetProperties()) 9 { 10 foreach (PropertyInfo dp in t_type.GetProperties()) 11 { 12 if (dp.Name.ToUpper() == sp.Name.ToUpper()) 13 { 14 dp.SetValue(t, sp.GetValue(source, null), null); 15 } 16 } 17 } 18 } 19 catch (Exception ex) 20 { 21 throw ex; 22 } 23 return t; 24 } 转载于:https://www.
现需求,读取FTP上的JSON文件,操作完成后把源文件删除并且创建备份文件夹被封。
在网上找了好多例子都用不了。自己尝试着取写了一个。
经测试可用。
public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) { FTPClient ftpClient = new FTPClient(); try { ftpClient = new FTPClient(); ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器 ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器 if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { ftpClient.disconnect(); logger.error("未连接到FTP,用户名或密码错误。"); } else { logger.info("FTP connection success"); } } catch (SocketException e) { e.printStackTrace(); logger.error("FTP的IP地址可能错误,请正确配置。"); } catch (IOException e) { logger.error("FTP的IP地址可能错误,请正确配置。"); } return ftpClient; } public static List<String> downloadFtpFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath) throws IOException { //所读出来的JSON全部放在List里,最终循环LIST去解析操作 List<String> list = new ArrayList<String>(); FTPClient ftpClient = null; /*BufferedReader read = null;*/ try { ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort); ftpClient.
BGP 距离矢量协议,基于TCP,端口号179,应用层,属于EGP
AS 自治系统(Autonomous Systems)
运行同一种选路策略
取值:1-65535
Peer:对等体
EBGP:位于AS之间
IBGP:只需能彼此到达对方,完成TCP握手即可
AD值:IBGP 200 EBGP 20
实验
首先234运行OSPF(IGP),将他们放进区域0,让区域内的他们互通
要注意的是,12网段是不属于AS234的,并不需要运行IGP
一个路由器只能有一个BGP进程
建立邻居:
R1与R2建立BGP邻居,因为处于不同的AS,所以为EBGP邻居
R2与R4建立IBGP邻居,因为同处AS234(R3身上会有路由黑洞)
R4与R5建立EBGP邻居
查看邻居:sh ip bgp sum
路由通告:
network x.x.x.x mask x.x.x.x
只有最优路由才会放进路由表里面&传递给自己的邻居 (”>”最优路由)
条件:1.IGP路由表里必须要有该路由 2.精确匹配
邻居建立 idle 空闲:查找是否有去邻居的路由
connect 连接:发送TCP握手包
active 活动:TCP三次握手成功
open sent 发送open报文
open confirm 协商取得一致
established 建立
一般来说,如果停在idle状态,在本路由排错,停在active状态,去邻居路由排错。
如果需要使用回环接口建立邻居
1.需使用静态路由
2.使回环接口成为updata-source
3.EBGP修改multhop,增大其跳数
传递路由 1.BGP路由器不应该使用或向EBGP邻居通告从IBGP邻居那里学习到的BGP路由信息
对于R4来说,从IBGP R2学习到的路由不会使用,也不会传递给EBGP R5
同步规则:要求BGP库与IGP库同步,避免路由黑洞
2.next-hop 下一跳
如果next-hop到达不了,那么它就不是一最优路由
比如在R2身上,因为next hop 45.1.1.5到达不了,所以不是最优路由(>)
解决:
R4
今天中午做了个滚动字幕的实例,和基础培训百例里的不同的是,要求控件来回滚动,从左到右从右到左的滚动,一开始按着面向对象的编程思想想了想,主要的架子就是控件滚动、一个计时触发的就可以了。
1、
Private Sub Timer1_Timer() Label1.Left = Label1.Left + 2000 If Label1.Left >= Me.Width Then Label1.Left = Me.Width Label1.Left = Label1.Left - 2000 End If If Label1.Left < Me.Width Then label1.Left= Label1.Left+2000 End If 这几行代码并没有实现那种来回滚动效果,而是在第一次向左返回的时候停住了,在那里闪,这就是因为没有对两个If具体判断取舍,没有很好的间隔这两个判断,导致试验失败。
2、
Option Explicit Private Sub Timer1_Timer() '判断label1向右的位置 Label1.Left = Label1.Left + 2000 If Label1.Left > Me.Width Then Label1.Left = Me.Width Timer2.Enabled = True Timer1.Enabled = False End If End Sub Private Sub Timer2_Timer() '判断label1在返回左边时的位置 If Label1.
今天晚上,要给我们软08级的新生做一个交流会,要我去做专业学习方面的,自己最多也算是勉强刚刚入门,我面对的是没有任何基础的学弟学妹,想来想去就那这个番茄鸡蛋作比喻了,希望大伙给点意见!
1. 怎么学习编程
分析:这个应该是大家最关心的问题,也是我觉得最不好讲的问题。编程就相当于做菜,老师课堂讲的语法知识相当于菜谱,至于你能炒出什么样的菜,就看你自己在下面的练习和体会了。
如何炒好一盘番茄鸡蛋?
第一步, 确定一个菜系
中国有八大菜系,鲁菜 、 川菜 、 苏菜、 粤菜 、 闽菜 、 浙菜 、 湘菜 、 徽菜 ,也就是说同样的番茄鸡蛋至少会有八种不同的风味,你要选择那种作为学习的起点呢。其实,不同的编程语言就相当于不同的菜系,区别在于实现同样的功能(番茄鸡蛋)采用了各自不同的处理机制(风味不同)。 对于一个从没做过菜的人,学习那个菜系的番茄鸡蛋是不是一样的,选择菜系的意义在于通过该菜系去了解番茄鸡蛋的入门级的基本方法,同样选择一们编程语言的目的在于选择你是从哪个门去进入编程这个领域的,对于什么都不同的新手而言,最开始学哪一门都是一样的。
第二步,记菜谱。
选好了菜系,那么就要记菜谱了,菜谱告诉了我们:1.不能番茄鸡蛋里没有番茄,也不能番茄鸡蛋里没有鸡蛋。2.以怎样的方式使用番茄鸡蛋,比如放多少盐,什么时候放。菜谱告诉你炒番茄鸡蛋一些规则和方法,也就是说我们在学习编程的时候,书本上的语法知识仅仅是告诉了我们一些编程的必须遵循的规则和方法,这个是所有编程开发的基础。
第三步,炒出能吃的番茄鸡蛋。
菜谱记的再熟不见的你能炒出好吃的番茄炒鸡蛋。课本上的语法记得再熟不见得你能写出漂亮的程序。厨师要把菜谱告诉的信息变成现实中的番茄鸡蛋才有意义,我们要把课堂学到的变成实际存在的代码才能体会到编程的意义。这个转化的过程中目的在于学习,只要你炒出来的东西能吃就行了,只要你能实现老师布置的作业或者书上的练习题就好。
第四步,炒出好吃的番茄鸡蛋。
我们的要求不能这么低吧,肯定不能满足于能吃而已,那我们尝试做一盘好吃的番茄鸡蛋。重复的背菜谱能提高番茄鸡蛋水平吗,不能!多炒几盘才是硬道理。那么重复的记忆书上的语法规程能提高编程水平吗,不能!多写几遍才是王道。从能吃到好吃这个过程是经验的积累,从实现功能到熟练的编程这个过程也是经验的积累。
第五步,炒出创意的番茄鸡蛋
已经能中规中距的炒出一盘好吃的番茄鸡蛋了,还不满足,那就在创意点吧。比如,我们能不能变化番茄鸡蛋的存在形式,菜谱上一定是最好的吗。把鸡蛋换成煮好的茶鸡蛋怎么样,换成鸭蛋呢。换到编程上来,同样的功能,我们是不是可以用另外的方法实现,老师讲的就一定是最好的方案吗?我们完全可以去尝试使用自己的方法实现同样的功能。从好吃到创意是个思维延展的过程,从熟练到怀疑的态度也是个是思维延展的过程,但这个过程有一点很重要,不论的你的思维怎么延展,一定要把你想的编程现实,能用了才是对的。就相当于光更改菜谱没有用,创意版本的番茄鸡蛋能不能吃,还要炒出来尝尝看。
第六步,炒出人性化的番茄鸡蛋
经过前面的训练,我们现在已经可以炒出来相当有水准的番茄鸡蛋了,但是我们忽略了点,我们炒番茄鸡蛋的目的是什么,也就是说我们编程的目的是什么。 除了自炒自吃,更多的时候是炒出来的番茄鸡蛋给顾客吃的,而这个顾客又是厨师所不能控制的,顾客的爱好有很多,稍咸一点儿、清淡一点、要辣椒、不要辣椒等等,这个时候你要根据不同的顾客去炒出不同的番茄鸡蛋了,才能让顾客满意。那么编程呢,除了自娱自乐,编程或者说软件开发最重要的是服务于客户,你不能去要求客户什么,那么就需要我们自己根据不同的应用环境来变通了。从创意到人性化这个是认识挺高的过程,不要把自己的思维局限于技术本身,某种程度上可以说是客户的需求决定你要选择的一切。当然类似于番茄鸡蛋不要鸡蛋,这个没事找抽的可以不予理会。
第七步,炒出其他菜系的番茄鸡蛋
经历以上六步,修炼成一个番茄炒鸡蛋的高手是没有问题的了。这时候你肯定会发现各个菜系的番茄鸡蛋从菜谱到手法上其实差不多的,区别仅仅是一些调料的或者其他方面的小差距。对于编程而言,你会发现其实很多语言在设计上同样有很多相同的地方,但是由于一些具体细节的实现机制不同会有一些细微的差别。对于番茄鸡蛋而言,炒菜所需的方法是固定的,具体实现上会有些小差别,对于编程而言,编程的思想是固定的,具体到实现方式上会有一些不同。
当然番茄鸡蛋比较简单,编程又是个比较复杂的东西,这个我体会的方法希望会对大家有所帮助。经常炒才炒出好吃的菜,经常练才能写出漂亮的程序。 菜谱记得再熟,饭店不会要这样的厨师。决定厨师水平的就烧菜的能力怎么样,也就是菜烧得好不好吃。 语法记得再熟,公司不会要这样的程序员,决定程序员水平的是编程的能力怎么样,也就是程序写得好不好。
重要的不是菜谱,而是使用菜谱的能力。对于学习编程而言,重要的不是语言本身,而是驾驭语言的能力。
转载于:https://www.cnblogs.com/flychaochao/archive/2008/09/18/1293178.html
windows 平台 MySql 5.5 中当my.ini 中设置了:
lower_case_table_names = 0 #表名大写 数据库引擎为InnoDb , 此时创建约束就会导致:
Error Code: 1005. Can't create table '**.#sql-15f0_**' (errno: 150) 转载于:https://www.cnblogs.com/DanielChow/archive/2011/10/08/2202396.html
原理:JSONP即JSON with Padding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。这种跨域的通讯方式称为JSONP。
个人理解:
就是在客户端动态注册一个函数function a(data),然后将函数名传到服务器,服务器返回一个a({/*json*/})到客户端运行,这样就调用客户端的function a(data),从而实现了跨域.
<! DOCTYPE html PUBLIC " -//W//DTD XHTML Transitional//EN " " http://www.worg/TR/xhtmlDTD/xhtmltransitional.dtd " > < html xmlns = " http://www.worg/xhtml " > < head > < title > Test Jsonp < / title> < script src = " http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.js " type = " text/javascript " >< / script> < script type = " text/javascript " > function jsonpCallback (result) { $.each(result.items, function (i,item){
一个数字S={a1,a2,...,an}。
假设划分两个子数组X, Y 是S 的,并且XUY=S。
假设X元素之和为x, y元素之和为y, S元素之和为s。
则x+y=s, 目标min: y-x(假设y>=x)
y-x=s-x-x=s-2*x
欲使其min, 只需令2*x最大,即在满足2x<=s,也就是x<=s/2的情况下,求最大的x。
这是一个背包问题。
struct T{ int v; int p; } void func(int a[], int n){ s=sumof(a,n); int i,j; T c[n+1][s/2+2]; for(i=1;i<=n;i++) for(j=1;2*j<=s;j++) { if(j>=a[i]&&c[i-1][j-a[i].v]+a[i]>c[i-1][j].v) { c[i][j].v=c[i-1]j-a[i]].v; c[i][j].p=i; } else { c[i][j]=c[i-1][j]; } } i=n; if(s %2 ) m=s/2; else m=s/2+1; while(m>0){ printf("a[%d]=%d,", c[i][m].p, a[c[i][m].p]); m=m-a[c[i]][m].v; i--; } } 转载于:https://www.cnblogs.com/gaoqichao/archive/2013/01/26/2878102.html
hbase 查询通用shell命令
(>=意思为包含,=意思是等于)
1.
按family(列族)查找,取回所有符合条件的“family”:
scan ‘scores’, {FILTER => “FamilyFilter(<=,‘binary:grc’)”}
或者
scan ‘scores’, {FILTER => “FamilyFilter(<=,‘binary:grc’)”}
2.
类似于FamilyFilter,取回所有符合条件的“列:
scan ‘scores’, {FILTER => “QualifierFilter(=,‘binary:b’)”}
3.
类似于FamilyFilter,符合条件的row都返回:
scan ‘scores’, {FILTER => “RowFilter(<=,‘binary:zhangsan01’)”}
4.
PrefixFilter,取回rowkey以指定prefix开头的所有行:
scan ‘scores’, {FILTER => org.apache.hadoop.hbase.filter.PrefixFilter.new(org.apache.hadoop.hbase.util.Bytes.toBytes(‘li’))}
或者
scan ‘scores’, {FILTER => “PrefixFilter(‘li’)”}
5.
由于其原生带有PrefixFilter这种对ROWKEY的前缀过滤查询,因此想着实现的后缀查询的过程中,发现这一方面相对来说还是空白。因此,只能采用一些策略来实现,主要还是采用正则表达式的方式:
scan ‘scores’, {FILTER => “RowFilter(=,‘regexstring:.*n01’)”}
6
scan ‘scores’, {FILTER => “ColumnPrefixFilter(‘ar’)”}
或者
scan ‘scores’, {FILTER => org.apache.hadoop.hbase.filter.ColumnPrefixFilter.new(org.apache.hadoop.hbase.util.Bytes.toBytes(‘ar’))}
7.
MultipleColumnPrefixFilter
a,返回有此前缀的所有列,
b,在byte[][]中定义所有需要的列前缀,只要满足其中一条约束就会被返回(ColumnPrefixFilter的加强版)
scan ‘scores’, {FILTER => “MultipleColumnPrefixFilter(‘ar’,‘ma’)”}
ng-app 指令告诉 AngularJS,<div> 元素是 AngularJS 应用程序 的"所有者"。
ng-model 指令把输入域的值绑定到应用程序变量 name。
ng-bind 指令把应用程序变量 name 绑定到某个段落的 innerHTML。
AngularJS 表达式 与 JavaScript 表达式 类似于 JavaScript 表达式,AngularJS 表达式可以包含字母,操作符,变量。
与 JavaScript 表达式不同,AngularJS 表达式可以写在 HTML 中。
与 JavaScript 表达式不同,AngularJS 表达式不支持条件判断,循环及异常。
与 JavaScript 表达式不同,AngularJS 表达式支持过滤器。
转载于:https://www.cnblogs.com/yk123/p/5857067.html
We can use the connect by prior function provided by Oracle to traverse the Dept security Tree . Suppose an Organization has 7 levels in Dept tree i.e. 1 to 7 .
We want to traverse the dept tree from level 3 to level 6.
Also we know the deptid at the level 3 say 'LVL3-DPT' . We can use the following SQL to traverse the whole tree (3-6) starting from 'LVL3-DPT'.
If you have any specific fields that are lengthy and are left padded with zeroes, you can save your users a lot of time by alowing them to type ONLY the right most numbers. For example, lets say you have a field INV_ITEM_ID and the length is 18 and left padded with zeroes. The number is 000000000000123456. Your user can just enter 123456 and when they tab out of that field, you left pad all the zero's.
本人十分想做关于企业咨询顾问方面的工作,故找到写资料跟大家分享~~
一、主持访谈的能力
访谈目的:获取信息、发布信息、推销一个主意,使之被认可。
向一个人提问不是一件容易的事情,需要对被访者充满尊重和善意。
访谈必须遵守的规则:
准备访谈
1. 确定访谈主题。
2. 列出所要涉及的访谈要点。
3. 对所有问题按轻重缓急进行分类,在此基础上制定访谈计划。
4. 选好访谈对象:掌握信息的人、有决定权的人、有影响力的人。
5. 与被访者进行预约,告知访谈的目的、持续时间、地点和你的联系方法。
进行访谈
1. 选择最合适的时间,以免过多地影响对方的工作。
2. 在对方工作的地方进行访谈。
3. 访谈时间不要超过两小时。
4. 自我介绍,并再次说明访谈的目的。 5. 请对方作自我介绍、说明其职位。
6. 按预先指定的计划进行访谈,对对方的发言做好记录。 7. 对不清楚的地方或需要详细说明的地方进行复述。 8. 访谈结束时作一个简要的综述,以确保没有遗漏或误解。
9. 结束访谈并致谢。
访谈后
1. 撰写访谈报告,分清哪些是对方的语录,哪些是自己的理解。
2. 让被访者确认访谈报告。
3. 将所收集的信息交叉确认。
Ø 建议
访谈计划不是一成不变的框框, 要善于突破计划的框架接受被访者主动说出的重要信息。
访谈中要主动,要及时分析对方给出的信息以调整提问方向。
Ø 提问举例 问:您收到的文档怎么样?
答:尽是错误。
回答中缺少信息,应深究。
补充问题 :什么样的错误?从哪儿来的?
问:你们的服务价格怎样?
答:人们认为太贵。
补充问题:谁认为这样?相对于什么标准而言?
问:你们部门工作质量怎么样?
答:有些部门的工作更糟。
补充问题:哪些部门?更糟是什么意思?质量标准是什么?
问:质量好吗?
答:我知道工作质量好。
补充问题:您怎么知道工作质量好?
问:你们为什么使用这个流程?
答:因为我们必须这样,这是规矩。因为我没有别的办法。
补充问题:为什么非要这样不可呢?如果不这样将会出现什么情况呢?你们为什么不能?如果你们能这样做,将会怎样?
问:第一级检验是否做好了?
答:从来不对检验负责(主观判断)。
补充问题:所有人都这样吗?您就从没有见过一人对其工作负责?就您一个人这样认为吗?您为什么说雇佣从来不?
When you have a grid that is filled with data; data that you don't want. How do you clear it out and then fill it with the data set that you do want? Well, here are the simple steps to do just that. Lets say we have a Grid on a page and the main record on the grid is called COMPETENCIES. Well we would first want to define a Rowset object to manipulate.
今天有时间认真来学习mvc,记录一点基础的知识。
1. Global.asax.cs文件夹中的一个RegisterRoutes()方法,如下图定义。
1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 5 routes.MapRoute( 6 "Default", // 路由名称 7 "{controller}/{action}/{id}", // 带有参数的 URL 8 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值 9 ); 10 11 } 其中id是定义网址路径如何对应MVC参数。
MapRoute() 方法是定义MVC网址路由最主要的方式。每一特路由都定义了一下3个参数。
路由名称。 对网址路径如何对应到控制器、动作与路由值的设定。
控制器、动作和其他路由值的默认值。
通过这个默认的MapRoute()方法可以得知,在浏览器地址栏输入"http://localhost/Home/About"时,通过Routing的对应,由于网址路径一部分为"Home/About",所以会对应出"{controller}"为"Home","{action}"为"About"。因此,MVC会先进入"Controllers"目录,找到Home控制器(也就是HomeController.cs文件),然后再找到这个控制器内的About公开方法(Public Method)。这个公开方法就是MVC的Action,也是实际执行网页主要 程序的入口。
TIP:在定义Routing时,你可能会注意到有一堆大括号"{}"包裹着一个变量,这个变量就是路由变量。在所有路由变量中最重要的就是controller变量和action变量,而且它们必须存在。就算没有设置网址路径,也必须制定路由变量的默认值才能使MVC正常运作。这两个变量在执行MVC动作时,会先被传送到System.Web.Mvc.MvcHandler类中,然后再被传送到DefaultControllerFactory类中,以建立Controller实体并执行制定的Action。其他的路由变量则可以由你自定义,而且也能被适当的用于Action中。
2.HomeController类的默认内容,如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.
LBound函数
LBound 函数与 UBound 函数共同使用,可以确定数组的大小。使用 UBound 函数可以找到数组某一维的上界。
Looping 语句
vb中使用4种循环语句:
For...Next 语句运行一段语句指定的次数For Each...Next 语句针对集合中的每个项目或者数组中的每个元素来运行某段语句。Do...Loop 语句运行循环,当条件为 true 或者直到条件为 true 时。
VBScript 我们可以使用三种条件语句: if 语句 假如你希望在条件为 true 时执行一系列的代码,可以使用这个语句。 if...then...else 语句 假如你希望执行两套代码其中之一,可以使用这个语句。 if...then...elseif 语句 假如你希望选择多套代码之一来执行,可以使用这个语句。 select case 语句 假如你希望选择多套代码之一来执行,可以使用这个语句。 IsNumeric 函数 描述 返回 Boolean 值指明表达式的值是否为数字。 语法 IsNumeric( expression ) expression 参数可以是任意表达式。
Left函数
Left(string,length)返回指定数目从字符串的左边算起的字符。
length:数值表达式,指明要返回的字符数目。如果是 0,返回零长度字符串 ("");如果大于或等于 string 参数中的字符总数,则返回整个字符串。
LTrim、RTrim 和 Trim 函数
返回不带前导空格(LTrim)、后续空格(RTrim)或前导与后续空格(Trim)的字符串副本。
Rnd函数
Rnd[(number)]
number 参数可以是任意有效的数值表达式。
Round函数
Round(expression):返回按指定位数四舍五入的值。 转载于:https://www.cnblogs.com/Eleanore/archive/2012/05/25/2518191.html
$('#searchBox').closest('div'); 链接: http://www.cnblogs.com/lzhdim/archive/2012/04/28/2474943.html .closest() 遍历元素 .scrollLeft() 从左侧开始匹配的第一个相关元素..(貌似是这样额) 转载于:https://www.cnblogs.com/Eleanore/archive/2012/05/25/2518142.html
1.现有数据和目标成果
1.1现有数据
源数据保存在数据库中,使用的数据库管理软件是PostgreSQL。
本质上来说,数据存储在数据库中是以记录存储在表上实现的,在excel表格中也是以记录的形式存在。所以数据库中表的列(字段)可以与excel表的列一一对应。形式大致如下:
1.2目标成果
导出成果是excel表格,文件后缀名是.xlsx。形式大致如下:
2.代码过程
2.1连接数据库获取数据
要获取数据库数据必须要先连接数据库,连接PostgreSQL的方法网上很多参考,也可以参考我源代码的方式。
执行SQL(结构化查询语言),获取数据库要导出数据的表的字段数,以及要导出的记录。
一个简单的示例如下:
'''连接数据获取数据,WHU_Fan,0704''' def getData(): '''databese是要连接数据库的名字,user是访问用户(创建数据库时设置),password是创建数据库的密码,host填localhost,端口为安装数据库时设置的端口''' '''这里是PostgreSQL的连接方法,MySQL也类似,端口可能不一样''' conn = psycopg2.connect(database='test2',user='postgres',password='admin',host='localhost',port='5432') cur = conn.cursor() ''''设置自己的sql语句''' '''例如''' tableName = 'outcome' commandFindColumn = "select COLUMN_NAME from information_schema.COLUMNS where table_name='%s' "% (tableName) '''执行SQL语句获取数据''' cur.execute(commandFindColumn) columnRows = cur.fetchall() '''SQL语句:导出outcome表的全部''' commandFindRecord = "select * from %s order by 相似度 desc"%(tableName) '''执行SQL语句获取数据''' cur.execute(commandFindRecord) recordRows = cur.fetchall() '''提交确认''' conn.commit() '''关闭连接''' cur.close() conn.close() '''返回数据''' return columnRows,recordRows 2.2解析数据
获取的字段变量columnRows,是一个list,顺序的包含数据库对应表的每一个字段。
获取的记录信息recordRows,也是一个list,包含所有满足条件的记录。
PHP微信公众开发笔记系列 日期:2014.9.4 今天主要是完善了搜索,加入了管理员模块,优化了身份验证,将学生信息管理封装为了一个类(整这个真是好累呀,主要是数据库操作那里语法老是出问题,一直是各种小问题) 感受: PHP开发没有断点、不能及时打印log真是好累呀(我是用sublime写的,然后直接微信公众号调试,累屎我了),错误信息经常不能及时发觉、或者说有些问题能通过断点排除掉了没能够排除。但是也说明了,我写代码还是太马虎了啊。 2014.9.10整理笔记: 写这个笔记的时候,在赶功能,所以也就是简单的记几笔当时的工作内容,现在功能开发得差不多了,就来整理之前的笔记。 在笔记五中我提到了,将公众平台上需要实现的一些功能按类型进行了分类处理:菜单、数据库都抽离出来了。这样做的好处就是在今后我做功能调整或者新增功能不会影响现有的功能,利于开发维护。 在笔记四中提到了在SAE上我搭建了一个云端数据库,并做了一个简单的数据检索功能(在菜单-查询菜单中回复姓名,或者学号便能得到对应的相关信息),在同学的建议下,需要快捷查找信息,因此在这里实现了一个我称之为快捷检索的功能:用户回复姓名+电话、姓名+老家、姓名+地址便可以得到对应的相关信息;这个功能的实现也是建立在对数据库的检索和关键词监测的基础之上的。 一、完善搜索 在这里为了维护方便,封装了一个学生信息管理的类,也就是对之前提到的数据库管理进行一个包装,因为我当时是想到了后期可能会有更多的数据库需求,后期的开发维护需求会更高;因此现阶段数据库处理的相关文件有:
1、student_info_sql.class.php 也就是对mysql_sae.func.php的一层包装: 1)在mysql_sae.func.php中提供对数据库操作的语句,函数接受相关的参数
2)然后我在student_info_sql.class.php的使用过程中,传递对应的参数过去就可
而且这样一层包装,就可以保证我可以自由控制需要显示的信息,即我显示学生信息就再这里控制显示,当我需要弄一个关键词之类的数据表,那么我就只需要新建一个对应的php文件,然后在该文件中控制格式就可以了; 在这里提一下上上图中出现的sae_log()函数,这个函数也是查找网上的资料得到的一个打印log而包装出来的:
我这样包装的目的在于,假如某天我不需要打印log了,直接注释掉这里就可以了。 包装的这个student数据库管理类也是提供诸如检索、添加等的操作。这里也没什么需要额外笔记的。 2、然后就是提到的优化数据检索了,也就是根据同学提出的需求---能快捷检索到信息,这里的关键点就是关键词捕获了,这里便是使用到了php中对字符串相关处理函数的使用: strstr()、str_replace() 我主要是使用到了这两个;第一个函数用来判断给定字符串中某个特定字符是否出现,第二个函数用来做字符替换。 在用户发送消息过来的时候,我这样做了处理:
对这三个关键词进行处理,如果用户发送过来的消息有这三个关键词,然后用str_replace,将关键词替换为空,就得到了姓名,那么就会有相应的响应操作。上图中出现的check_userinfo是我用来做用户身份验证的;menu_Distribution_Center即我之前提到的整理菜单功能而封装的一个函数,菜单分发。在独立封装的基础之上,我只需要捕获关键词,然后调用已实现的查询菜单的相关功能便很快的就实现了这个功能。功能实现上很简单,当时遇到的问题就主要是诸如php语法问题、数据库语法问题,各种坑,也体现了我这个人有的时候马大哈,写代码的时候太马虎,还有就是php毕竟没有系统的学过,直接是边写代码边学习的,所以难免会碰到各种问题。 二、添加管理员模块 因为有的时候没有用电脑,而此时又需要操作如数据库信息更新之类的,该怎么办?我就想到了可以实现一个管理员功能,在验证身份的条件下,可以通过发送特定指令而实现相应的功能。我实现的具体思路是,封装成一个类,一个统一的入口,然后身份验证。因此我新建了一个称之为admin_sys.class.php的文件,封装成了一个类,有了统一的入口之后,假如我之后有新的需求,那么我也只需要在这个类里面添加就可以了,不会影响到别的系统功能: 1、一个统一的入口:
2、在这里实现的验证功能和之前实现的用户身份验证类似,也是使用到了$_SESSION进行信息保存:
先判断是否验证了管理员身份,验证了之后就进入到具体的操作环节,具体的操作环境也是根据相对应的指令进行操作的。这里也就不提了,实现了这个管理员功能是挺便捷的,我可以很方便的更新用户信息、添加用户信息等。 转载于:https://www.cnblogs.com/zhong-dev/p/4044549.html
PHP微信公众开发笔记系列 日期:2014.9.2 今天主要的任务是昨天提到的那个处理缓存信息的问题,我需要保存一些消息用来做二次判断。 首先,记录一些PHP语法知识吧。 1、PHP中字符串的连接语法: 在lua中,两个字符串的连接很简单,加入有两个字符串 "aaa";"bbb"; 需要将这两个字符串连接起来,只需要用两个句点 .. 便可以了:"aaa" .. "bbb"; 这里要注意,字符串与句点直接需要有空格,没有空格会报错;(2014.10.13 修正:今天准备面试的时候再测试了一下之前提到的这个错误,发现lua中即便是没有空格也不会报错的,可能是之前我是有别的语法错误,才导致我误以为是要添加空格的) 而在PHP中,连接只需要一个句点就可以了:"aaa"."bbb"; 而且不需要强制在字符串和句点之间用空格; 2、得到时间,转换为日期格式: 使用date函数,格式为:date('Y-m-d H:i:s',time());挺简单的,记录一下 公众平台开发需求完成进度。 现在回到昨天留下的那个任务:利用session缓存记录信息,实现我们构想的那个菜单: php中关于session的使用,我不是很清楚,所以就一直度娘度娘的,折腾了一番,总算是实现了我的功能需求了,不过还是觉得有一些不足的地方,留给以后再来修正吧。 昨天提到了,我要实现的菜单,希望能记住上一条信息。即提醒用户输入查询,进入查询菜单,在用户发送过来“查询”之后,下一条信息就应该转入查询菜单了,即我需要记住用户发送过“查询”这个信息。在度娘度了好久之后,查找到了要么就用数据库,要么就用session,在PHP中用数据库还不会,然后我感觉就简单的处理一下记住信息应该不需要动用数据库,所以采用的是使用session。 使用Session来实现我们的需求: php中关于session具体该怎么用,以后还是需要度娘来详细了解一番,现在我们这只是简单的使用。 在查阅资料的时候,有网友提到用用户的username作为唯一id,这样就使得针对每个用户存储的信息会不一致(因为我们现在是服务器发送消息,每个用户都会发送消息过来,不能影响别的用户的使用),所以代码实现如下: session_id($postObj->fromUsername); //这个是微信服务器post过来的xml数据包中用户名字,用这个作为id session_start(); //这个应该是开启session的意思吧? 而我这两行代码该放到哪里也不是很清楚,现在我是将这个代码放在 responseMsg函数中了,不知道是不是这样的,后面的测试是有用的。 开启了session之后,就是记录信息了: $_SESSION['menu_type'] = $this->getUserMenu($textWord); //这里的getusermenu是我用来根据用户输入得到菜单类型的函数;记录信息用到了$_SESSION这个变量,这里是以数组形式使用?? 在我们记录好了信息之后,该进行信息的判断了,使用到: isset($_SESSION['menu_type']); //用isset来判断我们是否设置了这个值,这样就能判断用户是否选择了一个菜单了 然后在我们不需要使用的时候,则使用以下函数来销毁这个: unset($_SESSION['menu_type']; 在代码中再做相应的调整,便可以实现我们的需求了。然后现在觉得不足的地方是,我该在哪个时候销毁保存的用户选择的菜单类型呢?假如用户选择了“查询”菜单,那么我们这边就是响应用户的查询行为了,至少在用户查询的过程中我们不应该销毁掉保存的菜单类型。我感觉合理的销毁有三种情况:用户关掉了对话框(即用户退出了和我们这个公众号的聊天框,但网上没查到怎么知道用户退出了);用户长时间内没有执行查询操作(即用户在选择了“查询”菜单的前提下,经过了一个给定的时间内没有执行相应的查询操作,这个时候自动销毁);最后就是用户自动选择退出。不销毁记录的信息,会出现这样的问题,在用户选择了“查询”菜单,然后用户退出了与公众号的聊天,下一次再进入的时候,还会保存记录的用户选择的菜单信息,感觉这样是不合理的。 抛开上面提到的问题,至少这一步我们需要的功能是实现了,有关的问题慢慢修复吧。 转载于:https://www.cnblogs.com/zhong-dev/p/4044555.html
笔记是先写在印象笔记上的,晚上没事的时候整理整理。
PHP微信公众开发笔记系列 日期:2014.9.1 今天开始正式开始做班上的微信公众平台的开发者服务了。因为是第一次做这个,对PHP也不了解,所以一边学PHP,一边整理微信的公众平台,当做是自己的练手学习好了。 在登录了微信的公众平台之后,左边功能区的最底部就是开发者中心了: 在没有开启开发者服务前,这里面啥也没有。启用这个服务后,在网站上编辑的自动回复功能便取消了,用户跟微信公众平台的交互信息便会转到开发者接入的功能。废话少说,开启开发者功能需要配置好服务器配置: 我这里是已经配置好了的,主要就是两个信息:URL 和 Token。一个链接和一个验证标签。URL就是我们服务器的链接?(这个该咋形容呢?),在这里我是使用SAE来创建应用的,主要就是图它的免费(注册送了500云豆,据说是对普通用户来说是够用了的),注册链接: http://sae.sina.com.cn/ 注册好了之后,就可以干坏事啦。 一、开始配置服务器信息: 1、创建好了SAE帐号之后,就开始创建我们的应用了(服务器是否可以理解为一个应用?这块真是不熟悉,菜鸟一个),我的首页-控制台-应用管理-创建新应用: 点击创建之后: 二级域名就是到时候我们会用到的那个URL链接; 应用名-描述这些自己填写; 开发语言就选择 php; 应用类型选择 web应用; 创建过程中会验证独立的安全密码啥的,这个就是在注册的时候设置的,不是登录用的那个密码噢。 2、创建好了之后,便进入下一步了,将代码传上去 首先点击我们创建好的那个应用,在左边的功能区选择代码管理: 左边操作区就对应有操作显示了: 点击操作按钮,会有两个操作选择: 上传代码- 删除。选择上传代码,就可以了。到这一步,服务器这一块就这样了,然后我们需要整理我们要上传的代码了。 二、PHP代码 最简单的当然是下载微信开发者文档中提供的示例代码啦: http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.20140819.zip 这个链接便是直接下载了。 代码开始部分: define("TOKEN","weixin") 在这里便出现了我们配置开发者服务时需要填写的TOKEN,在这里设置好然后在配置里填写正确好就可以了。因为我们开启开发者服务,首先需要做验证,所以一开始代码的执行情况是: $wechatObj = new wechatCallbackapiTest(); $wechatObj->valid(); 可以在示例代码中看到,valid函数执行的是检测工作,在检测完之后这个就不需要了,要改为相应的回复信息,所以在我们成功验证完,开启了开发者服务功能之后,这段代码需要修改为: $wechatObj->responseMsg(); 这个函数就是对应于执行响应回复的操作了。 跳转到responseMsg函数,PHP的语法看不懂,但是函数比较简单,可以大致了解一下: 这一段看到了welcome to wechat world 就差不多是响应用户输入的消息吧,看到msgType = "text",意思应该是用户发过来的是文本信息类型,然后返回就是这段欢迎语。随便改改,就能用这个php文件传到我们创建好的那个SAE应用上了,然后检测一下效果。 在这里我也有疑问:我将这个php文件重命名为xxx.php,然后压缩为xxx.zip包,执行上面提到的那个上传代码操作之后,设置好开发者的URL和TOKEN,提示的是服务器没有响应操作,试了几遍都没有效果,后来我点开编辑代码: 发现里头的文件除了我的那个xxx.php文件之外,还有一个index.php,然后网上查到类似的一个资料是说zip包要命名为index.zip,然后我们的php文件也需要命名为index.php,这样才可以。照着这个做了一次修改,确实是成功了,但是为什么要这样呢? 设置好了之后,检测--随便发送一个文本消息给公众号,便会返回我们设置好的返回信息了。至此,开启开发者服务便成功了,之后的进一步折腾就开始了。 转载于:https://www.cnblogs.com/zhong-dev/p/4044557.html