今天学习了android蓝牙方面的基础知识,包含了打开和关闭蓝牙的操作,以及两部手机之间通过蓝牙实现的数据传输。下面看代码:
首先,需要在清单文件里添加蓝牙操作的权限:
<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 打开蓝牙的两种方式:
第一种:Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent,1);
这种方式会提示用户是否打开蓝牙
第二种:bluetoothAdapter.enable();
这种方式系统直接打开蓝牙
关闭蓝牙的操作:bluetoothAdapter.disable();
搜索附近蓝牙的基本操作:
1.BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//得到默认的蓝牙适配器
2.if (bluetoothAdapter.isDiscovering()) {//如果正好在搜索,则先取消搜索
bluetoothAdapter.cancelDiscovery();
}
bluetoothAdapter.startDiscovery();
第二部在搜索的时候,会发出一个广播BluetoothDevice.ACTION_FOUND
3.创建并注册BroadcastReceiver并在onReceive方法中进行操作,关键代码如下:
@Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub String action = arg1.getAction(); //获得已经搜索到的蓝牙设备 if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = arg1.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); //搜索到的设备不是已经绑定的设备 if (device.getBondState() != BluetoothDevice.BOND_BONDED) { //将搜索到的新蓝牙设备和名称显示到textview中 show.append(device.getName()+":"+device.getAddress()+"\n"); } }else if (bluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {//说明搜索已经完成 setProgressBarIndeterminateVisibility(false); setTitle("
前言部分 大家可以关注我的公众号,公众号里的排版更好,阅读更舒适。
正文部分 配置路径:
销售和分销 - 基本功能 - 科目分配/成本 - 收入帐户确定 - 分配总帐科目
T-CODE:
VKOA
半成品的配置半成品科目,原材料配置原材料科目
主数据科目设置组 不对,那么 MM02去修改
文章连接:SD模块-销售收入科目的配置
http://yingang-1982.iteye.com/blog/2084750 1.EditText 启动activity的时候弹出软件键盘
manifest对应的Activity的配置,将EditText设置属性 android:windowSoftInputMode=stateVisible,在进入这个页面的时候,默认弹出输入法。
<activity android:name=".ui.login"
android:configChanges="orientation|keyboardHidden|locale"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateVisible|adjustPan" >
</activity>
方法一:
在AndroidMainfest.xml中选择哪个activity,设置windowSoftInputMode属性为adjustUnspecified|stateHidden
例如:<activity android:name=".Main"
android:label="@string/app_name"
android:windowSoftInputMode="adjustUnspecified|stateHidden"
android:configChanges="orientation|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
方法二:
让EditText失去焦点,使用EditText的clearFocus方法
例如:EditText edit=(EditText)findViewById(R.id.edit);
edit.clearFocus();
方法三:
强制隐藏Android输入法窗口
例如:EditText edit=(EditText)findViewById(R.id.edit);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edit.getWindowToken(),0);
2.EditText始终不弹出软件键盘
例:EditText edit=(EditText)findViewById(R.id.edit);
edit.setInputType(InputType.TYPE_NULL);
/* 引言: 使用二进制权限控制,可以减少程序的逻辑判断,如有50 种权限需要验证, 一般会写 if...else if...else if 或 if(n==1 || n==2 || ... n=50 ) 这种写法。 如果使用二进制权限控制,则可使用一个if即可验证 if((权限码|n)==n), 注意 n 必须为 2的幂级。 c#中标记[System.Flags]特性的枚举,实质上是就是这种鉴权方式。 [System.Flags] public enum Role { read = 1, //001 write = 2, //010 delete= 4, //100 } 使用建议:权限被频繁验证,权限值多于32个 定义: 授权码:权限值的集合表示 授权值:单个权限值,该值必须为2的幂级数,取值范围 2^0 到 2^62 授权:“权限码”=“权限”组每项进行“或”操作) 回收:待收回的“权限”取反后,和“授权码”进行“与”操作 鉴权:有两个公式:“权限”=“授权码”&“权限”;“授权码”=“授权码”|“权限”; 1.权限值 long类型可表示的2的最大幂级数为:4611686018427387904 转为二进制数表示为:10000000...000(共63位;一个1,六十二个0;表示为2^62) 加上2^0=1 ,所以1个long最多可以表示 63 个状态,2^0 到 2^62 次方; 实例: bin name 授权码 0001 添加 (1) 0010 修改 (2) 0100 删除 (4) 1000 查看 (8) 0011 表示:添加 + 修改 权限 1011 表示:查看 + 修改 + 添加 权限 2.
最近几天开始重新学习Ogre,这次从源码编译了Ogre2.1,编译过程基本跟Ogre1.8.1类似,连第三方依赖库都是用的官网推荐的以前版本的,此处不多说了,网上有很多教程,现在给出下载连接。
Ogre2.1的源码: https://bitbucket.org/sinbad/ogre/branch/v2-1
Dependencies: https://bitbucket.org/cabalistic/ogredeps
编译好Ogre后开始尝试将其嵌入到Qt中,发现网上的指导教程非常的少,而且含糊不清,对于想上手的人来说非常困难。发现Ogre的Wiki有现成的结合Qt配置方案,给出网址 http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Setting+Up+An+Application+-+QtCreator 参考。具体来说,主要是在Qt项目的pro文件中配置。以下是个人结合参考做出的Ogre渲染QWidget的例子。
1、新建一个Qt Widgets Application,在pro文件中添加配置信息如下
OGRE_HOME = D:/OGRE/Ogre2.1 LIBS *= user32.lib LIBS += -L$${OGRE_HOME}/boost/lib debug: LIBS += -L$${OGRE_HOME}/lib/debug release: LIBS += -L$${OGRE_HOME}/lib/release INCLUDEPATH += $${OGRE_HOME}/include INCLUDEPATH += $${OGRE_HOME}/include/OGRE INCLUDEPATH += $${OGRE_HOME}/include/OIS INCLUDEPATH += $${OGRE_HOME}/boost CONFIG(debug, debug|release){ LIBS *= -lOgreMain_d -lOIS_d -lOgreTerrain_d DESTDIR = $${OGRE_HOME}/bin/debug } else{ LIBS *= -lOgreMain -lOIS -OgreTerrain DESTDIR = $${OGRE_HOME}/bin/release } 2、新建类 TestOgre,并继承自QWidget。在TestOgre这个类中,实现创建Ogre的Root对象,定义资源,设置渲染引擎,创建渲染窗口,初始化资源,创建场景, 设置第三方库和插件库,创建帧监听器,启动渲染循环等工作。主要参考了Ogre Wiki的教程6
http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Basic+Tutorial+6&structure=Tutorials
TestOgre.h
#ifndef TESTOGRE_H #define TESTOGRE_H #include <QtGui> #include <Ogre.
转自百科 转移概率矩阵(又叫跃迁矩阵,英文名:transition matrix)是俄国数学家马尔科夫提出的,他在20世纪初发现:一个系统的某些因素在转移中,第n次结果只受第n-1的结果影响,即只与当前所处状态有关,而与过去状态无关。 在马尔科夫分析中,引入状态转移这个概念。所谓状态是指客观事物可能出现或存在的状态;状态转移是指客观事物由一种状态转移到另一种状态的 概率。 例如对应于一个天气预报的问题,若天气状态转移概率表如左下: (其中列表示今天的状态,行表示明天的状态。注意每一列之和为1,因为已假设明天仅这三种状态。) 图1.天气转移概率矩阵 明/今 晴 阴 雨 晴 3/4 1/2 1/4 阴 1/8 1/4 1/2 雨 1/8 1/4 1/4 写作矩阵形式为图1所示。 其中转移矩阵 A的每一个元素都表示从今天的一种状态到明天的一种状态的概率,例如,第2行第3列的值为1/2,这表示今天下雨而明天转阴的概率是1/2。 称A为转移矩阵。
由于MTP协议在移动设备中的广泛应用,使其成为在设备互联产品中,必备的组件之一。设想在开车途中,接入车载设备,听听手机中的歌;或者在休息时,借用车载的大屏幕看看手机中的高清电影,这些都使得旅途变得轻松惬意。 本文尽量避免介绍MTP协议(文档已经写的很清楚),主要针对某个具体设备(Google Nexus 4),介绍MTP开发入门知识。
1. MTP设备模型 理解MTP设备模型要有基础的USB协议知识。MTP设备通过USB Descriptor描述设备的通信端点(Endpoint)。下面列出四太子的USB Descriptor: # lsusb -v -d18d1:
Bus 001 Device 003: ID 18d1:4ee1 Google Inc. Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x18d1 Google Inc. idProduct 0x4ee1 bcdDevice 2.28 iManufacturer 1 LGE iProduct 2 Nexus 4 iSerial 3 0054700f490d669a bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 39 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 500mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 3 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 255 Vendor Specific Subclass bInterfaceProtocol 0 iInterface 4 MTP Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x001c 1x 28 bytes bInterval 6 Device Qualifier (for other device speed): bLength 10 bDescriptorType 6 bcdUSB 2.
1.1数组初始化
数组是大多数编程语言都提供一种复合结构,如果程序需要多个类型相同的变量时,就可以考虑定义一个数组。java语言的数组变量引用是引用类型的变量,因此具有java独有的特性。
1.1. java数组是静态的
java语言是典型的静态语言,因此java的数组是静态的,即当数组被初始化之后,该数组的长度是不可变的。java程序中的数组必须初始化才可使用。所谓初始化,就是为数据对象元素分配内存空间,并为每个数组元素指定初始值。
数组的初始化有以下两种方式。
静态初始化:初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组长度。
动态数据初始化:初始化时程序员只指定数据长度,由系统为数组元素分配初始值。
不管采用哪个方式初始化java数组,一旦初始化完成,该数组的长度就不可改变,java语言允许通过数组lenght属性来访问数组的长度。示例如下:
public class ArrayTest
{
public static void main(String[] args) {
//采用静态初始化方式初始化第一个数组
String[] books = new String[]
{
"疯狂Java讲义",
"轻量级Java EE企业应用实战",
"疯狂Ajax讲义",
"疯狂XML讲义"
};
//采用静态初始化的简化形式初始化第二个数组
String[] names = {
"孙悟空",
"猪八戒",
"白骨精"
};
//采用动态初始化的语法初始化第三个数组
String[] strArr = new String[5];
//访问3个数组的长度
System.out.println("第一个数组的长度:" + books.length);
System.out.println("第二个数组的长度:" + names.length);
System.out.println("第三个数组的长度:" + strArr.length);
}
}
上面程序中的粗体字代表声明并初始化了3个数组,这3个数组的长度将会始终不变,程序输出3个数组的长度依次为4、3、5。
前面已经指出,java语言的数组变量是引用类型的变量,books、names、seansonsp这3个变量以及各自引用的数组在内存中的分配如图1.1所示。
从图1.1中可以看出,对于静态初始化方式而言,程序员无需指定数组长度,指定数组的数组元素,由系统来决定该数组的长度即可。例如books数组,为它指定了4个数组元素,那它的长度就是4,对于name数组,为它指定3个元素,那它的长度就是3。
执行动态初始化时,程序员只需指定数组的长度,即为每个数组元素指定所需的内存空间,系统将负责为这些数组元素分配初始值。指定初始化值时,系统将按如下规则分配初始化值。
数组元素的类型是基本类型中的整数类型(byte、short、int和long),则数组元素的值是0。
数组元素的类型是基本类型中的浮点类型(float、double),则数组元素的值是0.0。
数组元素的类型是基本类型中的字符类型(char),则数组元素的值是'\u0000'。
数组元素的类型是基本类型中的布尔类型(boolean),则数组元素的值是false。
数组元素的类型是引用类型(类、接口和数组),则数组元素的值是null。
注意:不要同时使用静态初始化和动态初始化。也就是说,不要在进行数组初始化时既指定数组的长度,也为每个数组元素分配初始值。
本篇文章篇幅比较长,但是细看下去相信对学习Shiro应该会有帮助。好了,闲话不多说,直接进入正题:
Shiro提供了与Web集成的支持,其通过一个ShiroFilter入口来拦截需要安全控制的URL,然后进行相应的控制,ShiroFilter类似于如Strut2/SpringMVC这种web框架的前端控制器,其是安全控制的入口点,其负责读取配置(如ini配置文件),然后判断URL是否需要登录/权限等工作。
而要在Spring中使用Shiro的话,可在web.xml中配置一个DelegatingFilterProxy,DelegatingFilterProxy作用是自动到Spring容器查找名字为shiroFilter(filter-name)的bean并把所有Filter的操作委托给它。
首先是在web.xml中配置DelegatingFilterProxy
<filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 配置好DelegatingFilterProxy后,下面只要再把ShiroFilter配置到Spring容器(此处为Spring的配置文件)即可:
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> </bean> 可以看到我们使用了ShiroFilterFactoryBean来创建shiroFilter,这里用到了Spring中一种特殊的Bean——FactoryBean。当需要得到名为”shiroFilter“的bean时,会调用其getObject()来获取实例。下面我们通过分析ShiroFilterFactoryBean创建实例的过程来探究Shiro是如何实现安全拦截的:
public Object getObject() throws Exception { if (instance == null) { instance = createInstance(); } return instance; } 其中调用了createInstance()来创建实例:
protected AbstractShiroFilter createInstance() throws Exception { // 这里是通过FactoryBean注入的SecurityManager(必须) SecurityManager securityManager = getSecurityManager(); if (securityManager == null) { String msg = "SecurityManager property must be set."; throw new BeanInitializationException(msg); } if (!
转载地址: http://www.spongeliu.com/415.html linux内核和其他一些开源的代码中,经常会遇到这样的代码: do{ ... }while(0) 这样的代码一看就不是一个循环,do..while表面上在这里一点意义都没有,那么为什么要这么用呢?
实际上,do{...}while(0)的作用远大于美化你的代码。查了些资料,总结起来这样写主要有以下几点好处:
1、辅助定义复杂的宏,避免引用的时候出错:
举例来说,假设你需要定义这样一个宏:
#define DOSOMETHING()\ foo1();\ foo2(); 这个宏的本意是,当调用DOSOMETHING()时,函数foo1()和foo2()都会被调用。但是如果你在调用的时候这么写:
if(a>0) DOSOMETHING(); 因为宏在预处理的时候会直接被展开,你实际上写的代码是这个样子的:
if(a>0) foo1(); foo2(); 这就出现了问题,因为无论a是否大于0,foo2()都会被执行,导致程序出错。
那么仅仅使用{}将foo1()和foo2()包起来行么?
我们在写代码的时候都习惯在语句右面加上分号,如果在宏中使用{},代码里就相当于这样写了:“{...};”,展开后就是这个样子:
if(a>0) { foo1(); foo2(); }; 这样甚至不会编译通过。所以,很多人才采用了do{...}while(0);
#define DOSOMETHING() \ do{ \ foo1();\ foo2();\ }while(0)\ ... if(a>0) DOSOMETHING(); ... 这样,宏被展开后,才会保留初始的语义。GCC提供了Statement-Expressions用以替代do{...}while(0); 所以你也可以这样定义宏:
#define DOSOMETHING() ({\ foo1(); \ foo2(); \ }) 转载于:https://www.cnblogs.com/457220157-FTD/p/4321939.html
WCF的相关概念信息就不在此赘述了,网上一搜一大把。
现在让我们动手搭建我们的第一个wcf程序吧,具体流程如下:
1. 新建立空白解决方案,并在解决方案中新建项目,项目类型为:WCF服务应用程序。
2、建立完成后如下图所示:
3、删除系统生成的两个文件IService1.cs与Service1.svc(或者自己重命名,在系统生成的基础文件中进行编码,此处感觉重命名麻烦,于是选择删除--新建)
4、添加自定义的WCF【服务文件】Test.svc
5、此时vs2010会自动生成WCF接口文件ITest.cs
6、我们在ITest中定义WCF方法TransferTest,在Test.svc.cs对该接口的方法进行实现,代码如下:
<span style="font-size:14px;"><pre name="code" class="csharp">namespace WCFServiceDemo { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“ITest”。 [ServiceContract] public interface ITest { [OperationContract] string TransferTest(int num); } } namespace WCFServiceDemo { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Test”。 public class Test : ITest { public string TransferTest(int num) { return "第"+num+"次WCF调用成功!"; } } } </span> 可以看到,在WCF中的接口与普通接口的区别只在于两个上下文,其他的和我们正常学习的接口一样。定义这个上下文要添加System.ServiceModel的引用。[ServiceContract],来说明接口是一个WCF的接口,如果不加的话,将不能被外部调用。[OperationContract],来说明该方法是一个WCF接口的方法,不加的话同上。
7、此时我们的第一个WCF服务程序就建立好了,将Test.svc“设为起始页”,然后F5运行一下试试,如下图所示,VS2010自动调用了WCF的客户端测试工具以便我们测试程序:
8、我们双击上图中的 TransferTest() 方法,出现如下图:
在请求窗口中的值中输入参数“99”,然后点击“调用”,在响应窗口中会出现返回值“"第99次WCF调用成功!",说明测试成功,点击下面的XML也可以看到XML的数据传输。
9、我们设计测试的场景是在生产中经常应用的场景,把WCF程序寄宿在IIS之上。假设场景如下:【A服务器】和【B服务器】。我们把我们刚刚建立的WCF程序“部署”在【B服务器】上,我们的目标是在【A服务器】的应用程序来访问【B服务器】的WCF程序,实现服务器端的应用程序通讯。
首先我们将WCF应用程序发布一下,然后部署在B服务器的IIS之上
部署步骤如下:http://blog.csdn.net/jiankunking/article/details/44118911
10、在客户端【A服务器】]创建服务的引用
我们这里以WinForm应用程序为例,建立地物理地址为【B服务器】的ip,
新建解决方案,并且创建WinForm应用程序的项目。命名为:WCFClient,如下图所示:
添加在之前部署的服务的引用。如下图所示:
点击“前往”-->“确定”按钮,效果如下:
此时我们完成了对服务的引用。我们再次查看解决方案,里面多了Service References的文件夹,通过资源管理器打开后里面多了些文件,这些文件用于客户端向服务端的调用。
举几个域名的例子:
google.com,baidu.com,163.com
可以明确的告诉你,加上www,就不再是域名了!
以http://mail.163.com/index.html为例进行说明:
1)http://:这个是协议,也就是HTTP超文本传输协议,也就是网页在网上传输的协议。
2)mail:这个是服务器名(主机名),代表着是一个邮箱服务器,所以是mail. 【www代表一个Web(万维网)服务器】
3)163.com:这个是域名,是用来定位网站的独一无二的名字。
4)mail.163.com:这个是网站名,由服务器名+域名组成。
5)/:这个是根目录,也就是说,通过网站名找到服务器,然后在服务器存放网页的根目录
6)index.html:这个是根目录下的默认网页(当然,163的默认网页是不是这个我不知道,只是大部分的默认网页,都是index.html)
7)http://mail.163.com/index.html:这个叫做URL,统一资源定位符,全球性地址,用于定位网上的资源。
Reference:
什么是域名?什么网站名?什么是URL? http://jingyan.baidu.com/article/2c8c281df0afd00008252aa7.html
转载于:https://www.cnblogs.com/lxw0109/p/internet.html
方法1.
之前由于公司项目需要,采集过google地图数据,还有一些大型网站数据。
经验如下: 1.IP必须需要,像@alswl 说的非常正确,ADSL。如果有条件,其实可以跟机房多申请外网IP。 2.在有外网IP的机器上,部署代理服务器。 3.你的程序,使用轮训替换代理服务器来访问想要采集的网站。 好处: 1.程序逻辑变化小,只需要代理功能。 2.根据对方网站屏蔽规则不同,你只需要添加更多的代理就行了。 3.就算具体IP被屏蔽了,你可以直接把代理服务器下线就OK,程序逻辑不需要变化。
方法2.
有小部分网站的防范措施比较弱,可以伪装下IP,修改X-Forwarded-for(貌似这么拼。。。)即可绕过。 大部分网站么,如果要频繁抓取,一般还是要多IP。我比较喜欢的解决方案是国外VPS再配多IP,通过默认网关切换来实现IP切换,比HTTP代理高效得多,估计也比多数情况下的ADSL切换更高效。
方法3.
ADSL + 脚本,监测是否被封,然后不断切换 ip设置查询频率限制 正统的做法是调用该网站提供的服务接口。 方法4.
8年多爬虫经验的人告诉你,国内ADSL是王道,多申请些线路,分布在多个不同的电信区局,能跨省跨市更好,自己写好断线重拨组件,自己写动态IP追踪服务,远程硬件重置(主要针对ADSL猫,防止其宕机),其余的任务分配,数据回收,都不是大问题。我的已经稳定运行了好几年了,妥妥的!
方法5.
1 user agent 伪装和轮换 2 使用代理 ip 和轮换 3 cookies 的处理,有的网站对登陆用户政策宽松些
友情提示:考虑爬虫给人家网站带来的负担,be a responsible crawler :)
方法6.
尽可能的模拟用户行为: 1、UserAgent经常换一换; 2、访问时间间隔设长一点,访问时间设置为随机数; 3、访问页面的顺序也可以随机着来
方法8.
网站封的依据一般是单位时间内特定IP的访问次数. 我是将采集的任务按 目标站点的IP进行分组 通过控制每个IP 在单位时间内发出任务的个数,来避免被封.当然,这个前题是你采集很多网站.如果只是采集一个网站,那么只能通过多外部IP的方式来实现了.
方法9.
1. 对爬虫抓取进行压力控制; 2. 可以考虑使用代理的方式访问目标站点。
-降低抓取频率,时间设置长一些,访问时间采用随机数 -频繁切换UserAgent(模拟浏览器访问) -多页面数据,随机访问然后抓取数据 -更换用户IP
先随便看看网页上有多少广告。
以某个网站的一个下载页面为例。
这是尚未屏蔽广告的:注意带黑框的部分,都是广告。
同一个页面,用AdBlock屏蔽广告之后的样子:页面内容基本消失了50%
我用的是google的Chrom浏览器,在Chrom应用商店中有AdBlock的下载。其它浏览器是否有就没试过了。
另外,现在很多网页中还有个百度DSP推广的广告也挺烦人的,貌似叫百度联盟之类的玩意儿,广告本身用AdBlock可以屏蔽,另外,看看这个文章,能更进一步:
http://jingyan.baidu.com/article/3c48dd3471947fe10be3583f.html
个人经历,不全面,但可以作为参考。
显卡是7850,有4个接口:1*DVI,1*HDMI,2*miniDP。打算配置成3屏显示。所用显示器都是VGA+DVI接口。
一个失败的方法:
用1根DVI电缆和2根miniDP转DVI电缆连接3台显示器,结果是虽然能够识别出3台显示器,但只能使用其中两台,第三台永远黑屏。结论是:显卡不支持这种接线方式。
一个成功的方法:
用1根DVI电缆、1根miniDP转DVI电缆和1根miniDP转VGA电缆连接3台显示器,成功。
原因:
仔细查看了AMD提供的关于7800系列产品的手册中关于多显示器的部分,发现最保险的办法是采用手册中推荐的多屏配置,如下图:
图中红线框住的部分就是最后成功的方案。
附带说一句:表格中凡是标注“native”的部分,是指不能使用接口转接线的。比如,如果采用倒数第二种方案组建3屏显示,那么必须有两台显示器是有DP接口的。
最近在学习PowerDesigner,在创建PDM模型的时候,遇到了一点儿小问题,本以为要重装SQLServer,百度了一下,问题就轻松解决了。问题的背景是这样的,在创建数据源的时候,总是测试连接不成功,我就想打开配置管理器查看一下是不是出了什么问题。结果,就出现了下面的弹窗:↓↓↓
出错提示: 启动SQL Server 2005 配置管理器时,出现以下提示错误
无法连接到WMI提供程序。您没有权限或者该服务器无法访问......
Invalid class [0x80041010]
出错原因: 上网百度了一下出现这个错误的原因是一个文件的问题,这个文件的名为 sqlmgmproviderxpsp2up.mof ,查看一下是否存在这个文件,如果存在就去用cmd命令更新一下。WMI(Windows Management Instrumentation, Windows 管理规范)是一项核心的 Windows 管理技术;用户可以使用 WMI 管理本地和远程计算机。我想,之所以打不开配置管理器是对文件做了修改。
解决方法: 以管理员身份运行“命令提示符”(在附件下面),进入后执行以下命令
1)cd /d C:\Program Files\Microsoft SQL Server\90\Shared
2)mofcomp "C:\Program Files\Microsoft SQL Server\90\Shared\sqlmgmproviderxpsp2up.mof"
当看到有如下信息时表明操作成功
MOF file has been successfully parsed
Storing data in the repository...
Done!
找到了解决方法,我就相当的兴奋啊,一点也不犯困了,就直接的复制粘贴到Cmd窗口。照着这个命令操作,我却出现了不同的结果:Not Found!总之不是Done!看来不能着急了。。↓↓↓
接下来,我查了一下这两句cmd命令是什么含义。
第一个:cd /d 意思是:显示当前目录名或改变当前目录。
第二个:mofcomp 意思是:将MOF文件编译为CIM类。
托管对象格式 (MOF) 文件是创建和注册提供程序、事件类别和事件的简便方法。 在 MOF 文件中创建类实例和类定义后,可以对该文件进行编译。编译 MOF 文件将在 CIM 储存库中注册所有的类定义和实例。之后,提供程序、事件类别和事件信息便可由 WMI 和 Visual Studio Analyzer 使用。 在 MOF 文件中创建提供程序、事件类别和事件类的实例,并且定义想要分析的自定义对象,之后,就可以对该文件进行编译。 编译 MOF 文件时,将其提交到 MOF 编译器 (Mofcomp.
软件版本: Matlab R2012a x64
Modelsim SE-64 10.2c
安装好以上版本的软件后,不用做其他设置,直接进行下面的步骤。如果matlab使用到S-function函数的话,需要安装和设置相应编译器等,在此不再详细描述。
操作步骤 1. 在matlab工作空间中输入cosimWizard,回车后弹出如下对话框:
如上图,如果正确安装了Modelsim软件,Matlab会自动识别出,请确认上面红色方框中的选择和图中一致。
2. 点击Next后,弹出如下对话框:
点击上图中Add按钮,将工程中的HDL文件添加进来,请注意工程文件中的顺序需要仔细考虑,如果次序错误,可能导致编译通不过(对于我们的工程需要先添加xxx.vhd,然后再添加其他文件,因为此文件中主要定义了一些常量和数据类型,需要被其他文件调用)。添加文件后的界面如下:
点击Next按钮后,会显示如下对话框:
再次点击Next,Status窗口中会显示“CompilingHDL files. Please wait ...”,matlab会对添加进去的文件进行编译(当然是调用了modelsim进行编译),如果没有任何问题会直接进入下一步,如果有问题,Status窗口会给出提示,返回去修改正确后重新按照上面的步骤操作即可。
3. 正确编译后,matlab会进入下一步,显示如下对话框:
在红色圈出的编译框中输入仿真的顶层模块名字xxx,其他不用更改,输入后点击Next按钮,matlab会弹出一个DOS窗口,进行一些文件生成和操作,不用管,完成后DOS窗口会自动关闭。
4. 然后会进入下一个步骤,设置输入输出端口。这里需要注意的,如果有时钟和复位信号的话,而且这两个信号在simulink工作空间中不单独给输入信号,就需要在此进行单独设置,设置后生成的仿真模块不在包含这两个引脚,但是会依据设置的情况内部直接给定激励。如下图,在此我们将clk_sys_s设置为时钟信号,并在随后弹出的对话框中对其进行设置。复位信号rst_sys我们在simulink中给出激励,在此不再进行设置。
5. 点击上图Next后进入下一步,设置输出信号的采样周期,在此我们将输出信号的采样周期设置为xxx(s),如下图:
需要注意,此处的采样周期需要填写数字,单位s,填写工作空间中定义好的变量名字有时会出错。
6. 点击Next按钮后,进入下一步,设置系统时钟信号,在此我们将系统时钟周期设置为xxxns,请注意时间的单位需要在下拉框中单独设置。如下图:
7. 点击Next按钮,进入下一步,如下图:
8. 上图中不用进行任何设置,直接点击Next按钮,进入下一步,如下图:
9. 上图中依然不用做任何设置,直接点Finish完成设置。完成后matlab会自动新建一个simulink模型文件,并在里面包含如下图所示三个文件。其中左边的一个是模型对应的接口文件;右上方的是模型的编译快捷方式,双击即可自动调用modelsim命令,完成模型对应的所有HDL文件的自动编译;右下方的是启动仿真器的快捷方式,双击即可自动启动modelsim,并完成simulink和modelsim的链接。可以将此三个文件拷贝到搭建好的simulink模型中即可使用。
10. 需要补充说明一点的是,正常情况下到上面第9步就可以结束了,但是因为我们的系统时钟周期为xx5ns,为奇数,在仿真时,时钟的占空比是50%,会产生带小数点的高电平和低电平周期,影响仿真速度,且容易出问题,我们需要双击上图中的matlab模块,对其进行手动修改。双击后弹出如下对话框:
选择Simulation选项卡,如下图
将图中的xxx2.5改为xxx3即可,如下图
点击Apply按钮和OK按钮即可。
上文用到的图,均因本人从事的是商业项目,不便透漏与项目有关的信息,因此涂抹掉了与项目相关的部分信息,如有不明白的,可以留言或发邮件,我会尽量全部答复。
此程序在Xilinx ISE综合工具中实现了综合和布局布线后仿真,功能正确。感兴趣的可以一起讨论研究。 `timescale 1ns / 1ps module TaskLearn(clk , reset , signal); input clk , reset; output reg signal; reg [3:0]counter; reg [3:0]state; parameter idle = 4'b0000; parameter state1 = 4'b0001; parameter state2 = 4'b0010; parameter state3 = 4'b0100; parameter state4 = 4'b1000; always@(posedge clk) begin if(reset) begin state <= idle; signal <= 1'bZ; end else case(state) idle: begin state <= state1; signal <= 1; end state1: begin signal <= 0; hold_10_clk(state2); end state2: begin signal <= 1; state <= state3; end state3: begin hold_10_clk(state4); //state <= state4;综合报告中采用两种方法资源使用几乎一样 signal <= 0; end state4: begin state <= state1; signal <= 1; end default: state <= idle; endcase end //----------------------------------------------------------------------------- //延时10个周期控制 task hold_10_clk; input [3:0]s; if(counter < 10) counter <= counter + 1; else begin counter <= 0; state <= s; end endtask //----------------------------------------------------------------------------- endmodule
最近安装了一次rabbitmq server,安装过程依旧顺利,但是打开web管理界面之后,却发现使用默认的用户名guest和密码guest无法登录成功。这才开始查看rabbitmq的文档,发现现在的3.3.1版中,处于安全的考虑,guest这个默认的用户只能通过localhost来登录,其他的IP无法直接使用这个账号。 为了解决这个问题,需要在rabbitmq的配置文件中将loopback_users配置设置为空,如编写配置文件:/etc/rabbitmq/rabbitmq.config,并在其中添加以下内容: [{rabbit, [{loopback_users, []}]}].
保存后重启rabbitmq-server即可随意使用guest用户名和密码来登录了(当然这个做法非常不安全)。
或者如果是在本地登录,则可以用http://localhost:15672
明明已经下载了SDK 安装了JDK 却提示找不到, 你说气人不。
害的小白还以为下载错了,卸载,重新下载,安装各种版本,折腾了许久,还是说找不到,你说这得多恶心人,得多伤心,得多大挫败感。
原来你还得在android studio中设置SDK路径
秀色书文软件 可听、可读、可写、可知识挖掘、可标注,再加上史上最强大的纯文本配色功能, 瞬间使您的书文秀色起来。 www.gudianxiaoshuo.com
今天分析了Object org.gradle.internal.service.DefaultServiceRegistry.doGet(Type serviceType) 函数
private Object doGet(Type serviceType) throws IllegalArgumentException { synchronized (lock) { if (closed) { throw new IllegalStateException(String.format("Cannot locate service of type %s, as %s has been closed.", format(serviceType), displayName)); } DefaultLookupContext context = new DefaultLookupContext(); ServiceProvider provider = context.find(serviceType, allServices); if (provider != null) { return provider.get(); } throw new UnknownServiceException(serviceType, String.format("No service of type %s available in %s.", format(serviceType), displayName)); } } 这里重点是context.find(serviceType, allServices);
allServices 是一个CompositeProvider型变量, 在serviceType是某些值的时候,会走到
配置JAVA环境变量如下: 1.下载安装jdk 2.安装完成后,右击“我的电脑”,点击“属性”; 3.选择“高级”选项卡,windows 7选择左边的“高级系统设置”,点击“环境变量”; 4.用户变量配置
JAVA_HOME指明JAVA安装路径,值设为:C:\Program Files\Java\jdk1.6.0_43(刚才安装时所选择的路径,每个人可能不一样)
5. 系统变量配置 Path= .;%JAVA_HOME%\bin; CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar (前面的.不要漏掉,表示当前路径)
在CMD里面运行java报不是内部命令解决方法(设置PATH路径 一定要把.;%JAVA_HOME%\bin;放在最前面);
解决的给个赞
或都在运行java命令前运行 set path=C:\Program Files\Java\jdk1.6.0_43\bin set classpath=C:\Program Files\Java\jdk1.6.0_43\lib\tools.jar;C:\Program Files\Java\jdk1.6.0_43\lib\dt.jar;C:\Java\jdk1.5.0_02\bin
成功
到http://ftp.gnu.org/gnu/glibc/下载glibc-2.14.tar.xz
tar glibc-2.14.tar.gz
cd glibc-2.14
mkdir build
cd build
../configure --prefix=/usr/local/glibc-2.14
make -j4
su
xxxx
make install
看看现在libc.so.6在哪个位置,然后修改软链接
ln -s /usr/local/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6
完成
删除C:\Windows\Prefetch里面的文件,或者重新选一次当前用户(这个只能解决当前问题)
/横竖屏/// private OrientationEventListener mOrientationListener; //screen orientation listener <pre name="code" class="java">private final void startOrientationChangeListener() { mOrientationListener = new OrientationEventListener(this) { @Override public void onOrientationChanged(int rotation) { // TODO Auto-generated method stub if(rotation == OrientationEventListener.ORIENTATION_UNKNOWN) { return; //手机平放时,检测不到有效的角度 } //只检测是否有四个角度的改变 if( rotation > 350 || rotation< 10 ) { //0度 rotation = 0; setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } else if( rotation > 80 &&rotation < 100 ) { //90度 rotation= 90; //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } else if( rotation > 170 &&rotation < 190 ) { //180度 rotation= 180; setRequestedOrientation(ActivityInfo.
1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址。
2.type: 要求为String类型的参数,请求方式(post或get)默认为get。注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持。
3.timeout: 要求为Number类型的参数,设置请求超时时间(毫秒)。此设置将覆盖$.ajaxSetup()方法的全局设置。
4.async: 要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为false。注意,同步请求将锁住浏览器,用户其他操作必须等待请求完成才可以执行。
5.cache: 要求为Boolean类型的参数,默认为true(当dataType为script时,默认为false),设置为false将不会从浏览器缓存中加载请求信息。
6.data: 要求为Object或String类型的参数,发送到服务器的数据。如果已经不是字符串,将自动转换为字符串格式。get请求中将附加在url后。防止这种自动转换,可以查看 processData选项。对象必须为key/value格式,例如{foo1:"bar1",foo2:"bar2"}转换为&foo1=bar1&foo2=bar2。如果是数组,JQuery将自动为不同值对应同一个名称。例如{foo:["bar1","bar2"]}转换为&foo=bar1&foo=bar2。
7.dataType: 要求为String类型的参数,预期服务器返回的数据类型。如果不指定,JQuery将自动根据http包mime信息返回responseXML或responseText,并作为回调函数参数传递。可用的类型如下:
xml:返回XML文档,可用JQuery处理。
html:返回纯文本HTML信息;包含的script标签会在插入DOM时执行。
script:返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时(不在同一个域下),所有post请求都将转为get请求。
json:返回JSON数据。
jsonp:JSONP格式。使用SONP形式调用函数时,例如myurl?callback=?,JQuery将自动替换后一个“?”为正确的函数名,以执行回调函数。
text:返回纯文本字符串。
8.beforeSend:
要求为Function类型的参数,发送请求前可以修改XMLHttpRequest对象的函数,例如添加自定义HTTP头。在beforeSend中如果返回false可以取消本次ajax请求。XMLHttpRequest对象是惟一的参数。
function(XMLHttpRequest)
{
this; //调用本次ajax请求时传递的options参数
}
9.complete:
要求为Function类型的参数,请求完成后调用的回调函数(请求成功或失败时均调用)。参数:XMLHttpRequest对象和一个描述成功请求类型的字符串。
function(XMLHttpRequest, textStatus)
{
this; //调用本次ajax请求时传递的options参数
}10.success:要求为Function类型的参数,请求成功后调用的回调函数,有两个参数。
(1)由服务器返回,并根据dataType参数进行处理后的数据。
(2)描述状态的字符串。
function(data, textStatus){
//data可能是xmlDoc、jsonObj、html、text等等
this; //调用本次ajax请求时传递的options参数
}
11.error:
要求为Function类型的参数,请求失败时被调用的函数。该函数有3个参数,即XMLHttpRequest对象、错误信息、捕获的错误对象(可选)。ajax事件函数如下:
function(XMLHttpRequest, textStatus, errorThrown){
//通常情况下textStatus和errorThrown只有其中一个包含信息
this; //调用本次ajax请求时传递的options参数
}
12.contentType:
要求为String类型的参数,当发送信息至服务器时,内容编码类型默认为"application/x-www-form-urlencoded"。该默认值适合大多数应用场合。
13.dataFilter:
要求为Function类型的参数,给Ajax返回的原始数据进行预处理的函数。提供data和type两个参数。data是Ajax返回的原始数据,type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。
function(data, type){
//返回处理后的数据
return data;
}
14.dataFilter:
要求为Function类型的参数,给Ajax返回的原始数据进行预处理的函数。提供data和type两个参数。data是Ajax返回的原始数据,type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。
function(data, type){
//返回处理后的数据
return data;
视频资料地址: E:\baiduyunpan\黑马28期Android全套视频无加密完整版\01、JavaWEB\day09 视频资料地址二: F:\50期\day14 SQL ======================================================================================================================= -------------------------------------------------------------------------------------------------- 一.数据库 1.创建数据库 create database [if not exists] db_name [character set xxx] [collate xxx] *创建一个名称为mydb1的数据库。 create database mydb1; *创建一个使用utf8字符集的mydb2数据库。 create database mydb2 character set utf8; *创建一个使用utf8字符集,并带校对规则的mydb3数据库。 create database mydb3 character set utf8 collate utf8_bin ; 2.查看数据库 show databases;查看所有数据库 show create database db_name; 查看数据库的创建方式 3.修改数据库 alter database db_name [character set xxx] [collate xxxx] 4.删除数据库 drop database [if exists] db_name; 5.使用数据库 切换数据库 use db_name; 查看当前使用的数据库 select database(); -------------------------------------------------------------------------------------------------- 二、表 1.
首先,说说实现的效果:
1、图片的展示与翻页;
2、点击图片放大图片。
实现的效果如下所示:
初始化和第一张
中间的图片
最后一张图片
单击放大显示图片详细与信息
实现的内容很简单,是常规图片的展示方式,下面说说我的实现思路。
1、图片的展示与翻页
a、图片展示
图片展示是通过<img />标签实现的:
<div class="container"> <div class="image-list"> <div id="prev" οnclick="updateImage('prev')"></div> <a id="img1" class="thumb-a" οnclick="showImg(1)"> <img class="thumb-img" width="200" height="150" src="img/demopage/thumb-1.jpg" alt="" /> </a> <a id="img2" class="thumb-a thumb-a-hide" οnclick="showImg(2)"> <img class="thumb-img" width="200" height="150" src="img/demopage/thumb-2.jpg" alt="" /> </a> <a id="img3" class="thumb-a thumb-a-hide" οnclick="showImg(3)"> <img class="thumb-img" width="200" height="150" src="img/demopage/thumb-3.jpg" alt="" /> </a> <div id="next" οnclick="updateImage('next')"></div> </div> </div>b、翻页 翻页是通过updateImage这个函数实现的,传递参数为type,判断操作时“上一张”还是“下一张”,updateImage函数如下:
function updateImage(type){ if(type==="prev"){ if(imgIndex>1){ imgIndex=imgIndex-1; } } else{ if(imgIndex<3){ imgIndex=imgIndex+1; } } for(var i=0;i<3;i++){ $("
select()系统调用提供一个机制来实现同步多元I/O:
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select (int n,
fd_set *readfds,
fd_set *writefds,
fd_set *exceptfds,
struct timeval *timeout);
FD_CLR(int fd, fd_set *set);
FD_ISSET(int fd, fd_set *set);
FD_SET(int fd, fd_set *set);
FD_ZERO(fd_set *set);
调用select()将阻塞,直到指定的文件描述符准备好执行I/O,或者可选参数timeout指定的时间已经过去。
监 视的文件描述符分为三类set,每一种对应等待不同的事件。readfds中列出的文件描述符被监视是否有数据可供读取(如果读取操作完成则不会阻塞)。 writefds中列出的文件描述符则被监视是否写入操作完成而不阻塞。最后,exceptfds中列出的文件描述符则被监视是否发生异常,或者无法控制 的数据是否可用(这些状态仅仅应用于套接字)。这三类set可以是NULL,这种情况下select()不监视这一类事件。
select()成功 返回时,每组set都被修改以使它只包含准备好I/O的文件描述符。例如,假设有两个文件描述符,值分别是7和9,被放在readfds中。当 select()返回时,如果7仍然在set中,则这个文件描述符已经准备好被读取而不会阻塞。如果9已经不在set中,则读取它将可能会阻塞(我说可能 是因为数据可能正好在select返回后就可用,这种情况下,下一次调用select()将返回文件描述符准备好读取)。
第一个参数n,等于所有set中最大的那个文件描述符的值加1。因此,select()的调用者负责检查哪个文件描述符拥有最大值,并且把这个值加1再传递给第一个参数。
timeout参数是一个指向timeval结构体的指针,timeval定义如下:
#include <sys/time.h>
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* 10E-6 second */
}; 如 果这个参数不是NULL,则即使没有文件描述符准备好I/O,select()也会在经过tv_sec秒和tv_usec微秒后返回。当select() 返回时,timeout参数的状态在不同的系统中是未定义的,因此每次调用select()之前必须重新初始化timeout和文件描述符set。实际 上,当前版本的Linux会自动修改timeout参数,设置它的值为剩余时间。因此,如果timeout被设置为5秒,然后在文件描述符准备好之前经过 了3秒,则这一次调用select()返回时tv_sec将变为2。
如果timeout中的两个值都设置为0,则调用select()将立即返回,报告调用时所有未决的事件,但不等待任何随后的事件。
文件描述符set不会直接操作,一般使用几个助手宏来管理。这允许Unix系统以自己喜欢的方式来实现文件描述符set。但大多数系统都简单地实现set为位数组。FD_ZERO移除指定set中的所有文件描述符。每一次调用select()之前都应该先调用它。
Windows下Socket编程主要包括以下几部分:
服务端
1、初始化Windows Socket库。
2、创建Socket。
3、绑定Socket。
4、监听。
5、Accept。
6、接收、发送数据。
客户端
1、初始化Windows Socket库。
2、创建Socket。
3、连接Socket。
4、接收、发送数据。
服务端每接收到一个客户端的Socket,则创建一个线程。满足一个服务端连接多个客户端。
服务器端代码:
//Server.cpp 2 #include <iostream> 3 #include <Windows.h> 4 5 using namespace std; 6 7 #define PORT 4000 8 #define IP_ADDRESS "192.168.1.145" 9 10 DWORD WINAPI ClientThread(LPVOID lpParameter) 11 { 12 SOCKET CientSocket = (SOCKET)lpParameter; 13 int Ret = 0; 14 char RecvBuffer[MAX_PATH]; 15 16 while ( true ) 17 { 18 memset(RecvBuffer, 0x00, sizeof(RecvBuffer)); 19 Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0); 20 if ( Ret == 0 || Ret == SOCKET_ERROR ) 21 { 22 cout<<"
dyld: Library not loaded: @rpath/MySDK.framework/MySDK
Referenced from: /var/mobile/Applications/08B6D2C2-5028-4A64-93F5-1252B0B0BCAB/MyApp.app/MyApp
Reason: no suitable image found. Did find:
/private/var/mobile/Applications/08B6D2C2-5028-4A64-93F5-1252B0B0BCAB/MyApp.app/Frameworks/MySDK.framework/MySDK: code signature invalid for '/private/var/mobile/Applications/08B6D2C2-5028-4A64-93F5-1252B0B0BCAB/MyApp.app/Frameworks/MySDK.framework/MySDK'
1、查看MySDK.framework是否为动态库(xcode6下默认是动态库) 2、若不需要使用动态库,则将其改为静态库,并重新生成framework
3、若必须使用动态库,则需要在MyApp的工程中做如下配置(未验证,网上是这么说的)
【PHP 目录读写权限】
//第二个参数即为文件目录的相关权限 mkdir('./log',0777); 有可能上面的mkdir 不好使的时候,可以使用下面的 一步解决
check_dir_exists('./log/'.$path.'/', true, true); 【Linux 目录文件修改权限】
chmod 相关命令: chattr, chown, chacl -R, --recursive 以递归方式更改所有的文件及子目录 --help 显示此帮助信息并退出 --version 显示版本信息并退出 每种 MODE 都应属于这类形式"[ugoa]*([-+=]([rwxXst]*|[ugo]))+"。 操作对像 u 文件属主权限 g 同组用户权限 o 其它用户权限 a 所有用户(包括以上三种) 权限设定 + 增加权限 - 取消权限 = 唯一设定权限 权限类别 r 读权限 w 写权限 x 执行权限 X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 s 文件属主和组id l 给文件加锁,使其它用户无法访问 r-->4 w-->2 x-->1 [root@localhost ~]# chmod ugo+r nginx_bak.conf #所有人皆可读取 [root@localhost ~]# chmod a+r nginx_bak.
原文:http://www.java123.net/v/951963.html
在new对象的时候有加上(),有不加(),不知道这个到底是什么区别? 比如: CBase *base = new CDerived(); CBase *base = new CDeviced; 很多人都说,加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数。这是有问题的。
对于自定义类类型:
如果该类没有定义构造函数(由编译器合成默认构造函数)也没有虚函数,那么class c = new class;将不调用合成的默认构造函数,而class c = new class();则会调用默认构造函数。
如果该类没有定义构造函数(由编译器合成默认构造函数)但有虚函数,那么class c = new class;和class c = new class();一样,都会调用默认构造函数。
如果该类定义了默认构造函数,那么class c = new class;和class c = new class();一样,都会调用默认构造函数。
对于内置类型:
int *a = new int;不会将申请到的int空间初始化,而int *a = new int();则会将申请到的int空间初始化为0。
以下两个语句的区别是:第一个动态申请的空间里面的值是随机值,第二个进行了初始化,里面的值为0:
int *p1 = new int[10]; int *p2 = new int[10](); 结论:别使用不带括号的new。
class A{ public: //A(){a=1;} public: int a; }; A *a1=new A; A *a2=new A(); cout<<a1->a<<endl; //输出:-842150451 cout<<a2->a<<endl; //输出0 A a3; cout<<a3.
MySQL:
Java代码 String Driver="com.mysql.jdbc.Driver"; //驱动程序 //连接的URL,db_name为数据库名 String URL="jdbc:mysql://localhost:3306/db_name"; String Username="username"; //用户名 String Password="password"; //密码 Class.forName(Driver); Connection con=DriverManager.getConnection(URL,Username,Password); Microsoft SQL Server 2.0驱动(3个jar):
Java代码 //连接SQL数据库的方法 String Driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"; //db_name为数据库名 String URL="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_name"; String Username="username"; //用户名 String Password="password"; //密码 Class.forName(Driver); //加载数据可驱动 Connection con=DriverManager.getConnection(URL,UserName,Password); Microsoft SQL Server 3.0驱动(1个jar): Java代码 //连接SQL数据库的方法 String Driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"; //db_name为数据库名 String URL="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_name"; String Username="username"; //用户名 String Password="password"; //密码 Class.forName(Driver); //加载数据可驱动 Connection con=DriverManager.getConnection(URL,UserName,Password); Oracle(用thin模式):
Java代码 String Driver="oracle.jdbc.driver.OracleDriver"; //连接数据库的方法 String URL="jdbc:oracle:thin:@loaclhost:1521:orcl"; //orcl为数据库的SID String Username="username"; //用户名 String Password="
1. 查看Linux启动的服务
chkconfig --list 查询出所有当前运行的服务
chkconfig --list sshd 查询sshd服务的当前状态
chkconfig --list iptables 查询防火墙的状态
2. 停止、开启 所有服务并且在下次系统启动时不再启动,如下所示:
chkconfig --levels 2345 sshd off 或者 chkconfig sshd off
chkconfig --levels 2345 sshd on :开机自动启动只需要设置5即可
3. 如果想查看当前处于运行状态的服务,用如下语句过滤即可
chkconfig --list |grep on
4. 如果只是想当前的设置状态有效,在系统重启动后即不生效的话,可以用如下命令停止服务,该命令只有超级管理员有权限操作证
service sshd stop service sshd start
service sshd status 是查看状态
最近在做项目是遇到了需求,就是一个界面为了考虑屏幕小的手机,界面上的布局需要使用ScrollView ,但是页面有一个供用户选择的地址,需要使用GridView,以九宫格的形式将地址列出供用户选择,于是就产生了一个很麻烦的问题,就是ScrollView中嵌套GridView是一个很麻烦的问题,于是上网查了一下资料,Google官方说是不允许这样的操作,认为这是不规范,不合法的。但是网上还是有办法解决,说白了就是自定义GridView,在OnMeasure方法中计算GridView中的内容,然后算出GridView的高度,这样就是的GridView内容全部显示出来,此时GridView不需要滚动,于是ScrollView就可以滚动,就不存在滚动冲突,ScrollView嵌套GridView的情况,由于这两款控件都自带滚动条,当他们碰到一起的时候便会出问题,即GridView会显示不全。 解决办法,自定义一个GridView控件
public class MyGridView extends GridView { public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } } 该自定义控件只是重写了GridView的onMeasure方法,使其不会出现滚动条,ScrollView嵌套ListView也是同样的道理,不再赘述。 XML布局代码 : <ScrollView Android:layout_height="wrap_content" Android:layout_width="fill_parent" android:id="@+id/scroll_content"> <com.yourclass.MyGridView xmlns:Android="http://schemas.android.com/apk/res/android" Android:id="@+id/grid_view" android:layout_width="fill_parent" Android:layout_height="wrap_content" android:numColumns="auto_fit" Android:horizontalSpacing="
1.新建虚拟机后开启虚拟机,当界面显示小图标时,按Esc键;
2.此时出现界面如下所示,选择中文;
3.进入系统后界面如图所示;
4.桌面右击,选择“更改桌面背景”,并点击,出现如下图所示;
5.点击左上角“全部设置”,显示界面如图所示:
6.硬件中选择“显示”,并点击,显示如下图所示;
7.此时可选择更改分辨率,使用Tab键到确定,更改分辨率后可进行后续操作,点击桌面安装ubuntu可按提示安装系统。
项目中需要将动态数据填充到模板中后生成的文件与其他用户上传的文件打包供审批人员下载,思路简单。但问题来了,利用freemaker将动态数据填充玩后会将流写入一个给定的OutputStream中,如果将此文件流存入物理硬盘,打包的时候再去下载。对物理硬盘的IO性能差不说,还占资源,果断否决。
方案一: ByteArrayOutputStream
此方案简单粗爆,如果遇到OutputStream写入的数据非常大的时间,就苦逼了,有内存溢出的风险,所以,勿必慎用。
public void testFrByteArray() throws Exception { // 业务对象,此处仅给空对象做示例,Freemarker将此model解析替换模板中的标签,生成业务文件. Object model = new Object(); // 新建字节输出流,Freemarker操作此输出流写入生成的业务文件. ByteArrayOutputStream out = new ByteArrayOutputStream(); // 自定义工具类,封装Freemarker操作细节 FreemarkerUtils.renderTemplate(out, model, "template.xml"); // 将outputstream转成inputstream ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); FileOutputStream fos = new FileOutputStream("D:\\test\result.rar"); ZipOutputStream zip = new ZipOutputStream(fos); // 生成压缩文件 ZipUtils.add(zip, in, "template-res.doc", true); } 方案二:PipedInputStream与PipedOutputStream
此方案有点高大上,但操作和理解起来有点难度。先看一下官方API的说明:
PipedInputStream,管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从PipedInputStream 对象读取, 并由其他线程将其写入到相应的 PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,可在缓冲区限定的 范 围内将读操作和写操作分离开。如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏。
红色字体部分很重要,因为很不巧笔者在这上面摔跟头了。
PipedOutputStream,可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入PipedOutputStream 对象,并由 其他线程从连接的PipedInputStream 读取。不建议对这两个对象尝试使用单个线程,因为这样可能会造成该线程死锁。如果某个线程正从连接的管道输入流中读取数据字节,但该线程不再处于活动状态,则该管道被视为处于毁坏状态。
通过官方API的两段解释,大概能摸到这种实现方式的设计思路了:PipedOutputStream(生产者)生产数据,PipedInputStream(消费者)读取数据,二者同步进行。但谁也不能先挂掉,一旦挂掉,管道便处于损坏状态。
public void testFrPiped() throws IOException { // 业务对象,此处仅给空对象做示例,Freemarker将此model解析替换模板中的标签,生成业务文件.
INPUT 背景色设置为透明 BACKGROUND-COLOR: transparent; 例如: <input nam="" style="BACKGROUND-COLOR: transparent;"/>
最近项目中需要使用到GridView,由于文字太长,内容多时竖直滚动GridView显得比较难看,于是找了一些资料发现可以实现GridView横向滚动。首先让GridView横向滚动需要HorizontalScrollView这个控件,例如:
main.xml布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<HorizontalScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="none" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<GridView
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center" >
</GridView>
</LinearLayout>
</HorizontalScrollView>
</LinearLayout>
<span style="font-family:'Microsoft YaHei';font-size:14px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" > <HorizontalScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" android:scrollbars="none" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <GridView android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" > </GridView> </LinearLayout> </HorizontalScrollView> </LinearLayout></span> 以上是主要布局,然后我们写GridView中每个item中的布局,比较简单,只是给大家介绍 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#00ff00" />
出现这个编译错误的原因在g++ gcc 版本不够高。
添加源(Ubuntu) ? 1 2 $ sudo add-apt-repository ppa:ubuntu-toolchain-r/test $ sudo apt-get update 安装4.8版本 1 $ sudo apt-get install gcc- 4.8 g++- 4.8 查看本地安装版本 ? 1 2 3 $ ls -lh /usr/bin/g++* 这里应该可以看到本机安装了 4.6 和 4.8 两个版本。 切换版本 ? 1 2 3 4 5 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc- 4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++- 4.6 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc- 4.8 40 --slave /usr/bin/g++ g++ /usr/bin/g++- 4.
官网:http://www.visifire.com/
一直没找到好的中文文档,希望有的这个的可以发个我!
效果图:
前台代码:
<UserControl x:Class="Text_Visifire.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:vc="clr-namespace:Visifire.Charts;assembly=SLVisifire.Charts" mc:Ignorable="d" xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" d:DesignWidth="1200" d:DesignHeight="680"> <Grid x:Name="LayoutRoot"> <StackPanel Orientation="Horizontal" > <!--第一個Chart--> <vc:Chart Grid.Row="0" Name="chtChartOne" Width="390"> <vc:Chart.AxesY> <!--Y間隔--> <vc:Axis Interval="20" Suffix="%"/> </vc:Chart.AxesY> </vc:Chart> <StackPanel> <Grid x:Name="ChartPanel" Height="250" Width="500"> </Grid> <Grid x:Name="ChartLine" Height="300" Width="500"> </Grid> </StackPanel> <StackPanel> <Grid x:Name="Chart1" Height="250" Width="500"> </Grid> <Grid x:Name="Chart2" Height="300" Width="500"> </Grid> </StackPanel> </StackPanel> <!--第二個Chart--> <!--<vc:Chart Grid.Row="1" Name="chtChartTwo"> <vc:Chart.AxesY> <vc:Axis Interval="20" Suffix="%"/> </vc:Chart.AxesY> <vc:Chart.Series> <vc:DataSeries RenderAs="Column" LabelEnabled="
if (e.KeyStates == Keyboard.GetKeyStates(Key.F4) && Keyboard.Modifiers == ModifierKeys.Alt) { e.Handled = true; } 转载于:https://www.cnblogs.com/gaobing/p/4088968.html
科目二考试流程相关总结 一、起步准备(按如下顺序起步): 1. 调整后视镜。
2. 调整座椅到舒适的位置。
3. 系好安全带。
4. 听到电脑播报考试开始语音提示,或引导员告诉你可以起步。
5. 打左转向灯。
6. 松手刹,踩离合,挂一档,松离合起步。
注意点:一定要电脑播报开始考试后在打转向等、挂一档松离合,提前操作无效扣分。开清车头属于1号路线还是2号路线,走错路线不合格。
二、坡道定点停车(按如下顺序起步): 1. 当窗花对准坡道提示标杆向右打满方向,当车身摆正时回正。
2. 保持车身左经线对准坡道左侧短线的右端,距离右端但还未到右端大约5cm的距离。缓慢径直开车上去。(身材比较高大的同学,需要杆子当对准窗花和皮条之间时打满方向,这个视个人情况微调)
3. 当收音机的顶角和小孔右侧1/4区间某个位置对准时,果断踩刹车(视个人情况而定,有的人是当红杆子和隔壁的栏杆子对齐时踩刹车,这个每个教练一种教法)。
4. 松离合抬刹车(我就是这个时候挂了,按照教练的教法,松离合当车微震时,松刹车,这种方法操控教练的车,毫无问题,但是用考试的车一试就会熄火,我熄火了10多次,网上找的其他答案是,离合一直不要动,然后缓慢的松刹车,就不会有问题的,这个方案待尝试)。
注意点:千万不好松离合再抬刹车,这样百分之百熄火,按照教练教的方式操控考试的车保准挂。另外注意上坡道最好走 1、3号车道,因为1、3号车道直接对准了直角转弯。
三、直角转弯(按如下顺序起步): 1. 左边的镜子下面的缝对准直角的边框驶入车道,当右侧的窗花对准边线时向右打满方向,即通过。
注意点:身材高大的同学,需要将右边线在窗花和皮条之间时再向右打满方向,这个问题都不大。
四、曲线行驶(按如下顺序起步): 1. 将车的正中央对准曲线行驶四个字的右侧位置驶入车道。同时看下左右两侧是否等宽,一般对转字的右侧都会等宽的。
2. 当左车头对准边线时,向左打一圈多一点,并适当修正保持左车头沿着曲线走。当转过S的第一道弯时,保持方向盘是一圈多一点,一直向前开,当左车头和曲线再次重合时,将方向回正,径直向前开,当车右经线与曲线交叉时,向右打方向一圈多一点,保持右车头与曲线有一拳头的距离。
3. 出曲线弯道,这个时候一定要保持车屁股出了曲线弯道到了安全区域再打方向,此时如果是2号路线需要修方向才能到侧方停车车道,1号线则直接对准侧方停车的位置。如果引导员朝你示意转弯,也不用鸟他,一定要保持出了车道到安全区域再调整。否则挂掉责任自负。
五、侧方停车(按如下顺序起步): 1. 在安全位置看下后视镜是否ok。一般是左后视镜可以看到车把手在镜子的中上沿,右后视镜可以看到车把手在中间的位置。
2. 将车的左侧经线对准车道“侧方停车”四个字的单人旁,然后径直驶入车道,并仔细看前面是否有四根短线,当左经线与第二根短线的右侧对准时ok,没有对准时则要微调。当肩膀超过大树一点时刹车。
3. 挂倒档,打左转向灯。当肩膀对准台阶时,向右打满方向,当左后视镜看到车把手与后边的铁杠子的右侧圆弧重合时,回正方向,看到左后视镜虚线到达镜子的下沿右侧1/3的位置时,向左打满方向。当车身摆正时刹车。(此时可以将车身向里也一点,也就是多倒一点,保证倾斜的前轮能在车框里)。
4. 挂前进挡,打左转向灯。方向不动,当左经线与前面的黄线交叉时,回正方向。当前车盖的中线与前面的黄线交叉时,向右打一圈,当车身回正时回正方向。径直向前开,保证车到了安全位置再转向。
注意:操作比较多,一定不要忘了挂档和转向灯。
六、倒车入库(按如下顺序起步): 1. 从侧方停车出来,径直向前开,当左后视镜上沿改过黄线时,向左打一圈,当左车头与花台交叉时,回正方向,并迅速向右打一圈。径直开,看到左侧经线对准前面4根短线中的第二根的左侧时径直驶入ok,没有对准时则要微调。保证车子的左后视镜驶过前面的短线一段距离后,一般是肩膀与大树对齐时刹车。挂倒档,打左转向灯。观察右后视镜,当右侧角度较小时,提前回正半圈,并适当微调。将车身摆正导库,当左后视镜与前面的黄线重合时刹车。
2. 打左转向灯,挂前进挡,当肩膀超过黄线10cm时向左打一圈1/4保证车轮压过左侧黄线再刹车。
3. 方向盘不动,挂倒档,倒库。微调方向驶入。当左后视镜与黄线重合时刹车。
4. 打右转向灯,当车盖与黄线重合时向左打满,当车身回正时回正方向。当肩膀和花台对齐时向右打满,驶入引导员所在的位置,这是应该会报考试合格了!恭喜你。
ps:以上是个人挂过一次的经验的总结和备忘录,不保证权威。仅供参考,如果描述的有什么错误导致哪位读者挂掉,本人不负任何责任哈!哈哈!
七、补考通过序:
本人在隔年补考通过了科目二考试,在这里总结下坡道定点,离合控制的方法。上次挂掉属于离合没有控制好,上坡时,瞄准适当位置刹车,踩下刹车,同时尽量保持踩离合那只脚不动,然后打转向灯起步时,特别慢的稍微抬起离合,然后慢慢的将刹车和离合一起抬起,当车向前走时,慢慢上坡。切忌离合或者刹车抬的太快。
oooO ↘┏━┓ ↙ Oooo ( 踩)→┃你┃ ←(死 ) \ ( →┃√┃ ← ) / \_)↗┗━┛ ↖(_/
跳转指令用于实现程序流程的跳转,在 ARM 程序中有两种方法可以实现程序流程的跳转: (1) 使用专门的跳转指令。 (2) 直接向程序计数器 PC 写入跳转地址值。 通过向程序计数器 PC 写入跳转地址值,可以实现在 4GB 的地址空间中的任意跳转,在跳转之前结合使用 MOV LR , PC 等类似指令,可以保存将来的返回地址值,从而实现在 4GB 连续的线性地址空间的子程序调用。 ===============================================
ARM 指令集中的跳转指令可以完成从当前指令向前或向后的 32MB 的地址空间的跳转,包括以下 4 条指令: (1) B 跳转指令 (2) BL 带返回的跳转指令 (3) BLX 带返回和状态切换的跳转指令 (4) BX 带状态切换的跳转指令 1、 B 指令 B 指令的格式为: B{条件} 目标地址 B 指令是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继
续执行。注意存储在跳转指令中的实际值是相对当前PC 值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB 的地址空间)。以下指令: B Label ;程序无条件跳转到标号 Label 处执行 CMP R1 ,# 0 ;当 CPSR 寄存器中的 Z 条件码置位时,程序跳转到标号 Label 处执行 BEQ Label 2、 BL 指令 BL 指令的格式为: BL{条件} 目标地址 BL 是另一个跳转指令,但跳转之前,会在寄存器R14 中保存PC 的当前内容,因此,可以通过将R14 的内容重新加载到PC 中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。以下指令: BL Label ;当程序无条件跳转到标号 Label 处执行时,同时将当前的 PC 值保存到 R14 中 3、 BLX 指令 BLX 指令的格式为: BLX 目标地址 BLX 指令从ARM 指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM 状态切换到Thumb 状态,该指令同时将PC 的当前内容保存到寄存器R14 中。因此,当子程序使用Thumb 指令集,而调用者使用ARM 指令集时,可以通过BLX 指令实现子程序的调用和处理器工作状态的切换。 同时,子程序的返回可以通过将寄存器R14 值复制到PC 中来完成。 4、 BX 指令 BX 指令的格式为: BX{条件} 目标地址 BX 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM 指令,也可以是Thumb指令。
linux下安装james邮件服务器,搞了一天终于搞定,mark一下!! 我安装的版本是apache-james-2.3.2.tar.gz,据说新版本比较简单(本人没有尝试,毕竟新版本目前都是beta版) 好了开始安装的步骤 1、lsof -i:25,使用这个命令检查25端口是否被占用,如果安装了sendmail,需要手工关闭(网上的文章比较多 这里不再赘述,读者去问谷哥或者度娘吧) 2、下载james-2.3.2的版本,可以通过apache官网获得,链接地址是:http://mirrors.hust.edu.cn/apache//james/server/apache-james-2.3.2.tar.gz 3、在自己喜欢的目录下下载并解压安装文件,笔者的安装的目录在/usr/local/james目录下(需要先mkdir james) 4、# tar zxvf apache-james-2.3.2.tar.gz,解压后,会多了一个目录james-2.3.2 5、进入james-2.3.2/bin目录,运行run.sh,生成james的配置文件config.xml: 6、# sh run.sh run.sh: line 37: /usr/local/james-2.3.2/bin/phoenix.sh: 权限不够 权限不够(估计是解压后run.sh文件没有赋予执行权限),可以执行以下命令: # chmod +x run.sh phoenix.sh 然后再次运行run.sh命令: # sh run.sh Using PHOENIX_HOME: /usr/local/james/james-2.3.2 Using PHOENIX_TMPDIR: /usr/local/james/james-2.3.2/temp Using JAVA_HOME: /usr/java/jdk1.5.0 Running Phoenix: Phoenix 4.2 James Mail Server 2.3.2 Remote Manager Service started plain:4555 POP3 Service started plain:110 SMTP Service started plain:25 NNTP Service started plain:119 FetchMail Disabled 说明James启动成功。 7、按Ctrl + C退出James,编辑config.
OS X 10.9 Mavericks正式发布,免费更新,立即去更新看看效果。 不过升级后安装命令行工具(Command Line Tools)时发现官网没有clt的下载安装包了,原来改了,使用命令在线安装。
打开终端,输入命令:xcode-select --install
手机系统的版本相对于Xcode的版本比较高,将xcode的版本升级就行了。
1.列举所有的任务
调用EnumWindows这个函数 BOOL EnumWindows( WNDENUMPROc lpEnumFunc, // callback f1.列举所有的任务
1.列举所有的任务1.列举所有的任务
调用EnumWindows这个函数
BOOL EnumWindows(
WNDENUMPROc lpEnumFunc, // callback function
LPARAM lParam // application-defined value
); 如: ::EnumWindows((WNDENUMPROc)enumProc,(LPARAM)this);
enumProc就是那个回调函数,真正的操作,都在这个函数里实现
第二个参数,是用户自定义传送的,比如这里,可以是对话框的指针
enumProc的原型是
BOOL cALLBAcK cPListDlg::enumProc(HWND hwnd, LPARAM lParam)
如果是类成员函数,必须是static函数,声明如下
BOOL static cALLBAcK enumProc(HWND hwnd, LPARAM lParam);
其中,那个HWND hwnd就是窗口句柄
BOOL cALLBAcK cPListDlg::enumProc(HWND hwnd, LPARAM lParam)
{
cPListDlg * pDlg = (cPListDlg *)lParam;
if (hwnd == NULL)
{
return FALSE;
}
if (hwnd == pDlg->m_hWnd) //这是为了不把自己这个程序列出来,呵呵
首先,JAVA自身支持调试功能,并提供了一个简单的调试工具--JDB,类似于功能强大的GDB,JDB也是一个字符界面的 调试环境,并支持设置断点,支持线程线级的调试。 JAVA的调试方法如下: 1。首先支持JVM,并设置参数,使之工作在DEBUG模式下,加入参数:-Xdebug -Xrunjdwp,transport=dt_socket,server=y,address=5432,suspend=n,onthrow=java.io.IOException,launch=/sbin/echo 其中,-Xdebug是通知JVM工作在DEBUG模式下,-Xrunjdwp是通知JVM使用(java debug wire protocol)来运行调试环境。该参数同时了一系列的调试选项: transport指定了调试数据的传送方式,dt_socket是指用SOCKET模式,另有dt_shmem指用共享内存方式,其中,dt_shmem只适用于Windows平台。 server参数是指是否支持在server模式的VM中. onthrow指明,当产生该类型的Exception时,JVM就会中断下来,进行调式。该参数可选。 launch指明,当JVM被中断下来时,执行的可执行程序。该参数可选 suspend指明,是否在调试客户端建立起来后,再执行JVM。 onuncaught(=y或n)指明出现uncaught exception 后,是否中断JVM的执行. 虚拟机参数设置 1.启用调试服务 -Xdebug 启用调试 -Xrunjdwp:<sub-options> 加载JVM的JPDA参考实现库 2.Xrunjdwp子参数(sub-options)配置 Xrunjdwp子参数的配置格式如下 -Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]... 几个例子 -Xrunjdwp:transport=dt_socket,server=y,address=8000 在8000端口监听Socket连接,挂起VM并且不加载运行主函数直到调试请求到达 -Xrunjdwp:transport=dt_shmem,server=y,suspend=n 选择一个可用的共享内存(因为没有指address)并监听该内存连接,同时加载运行主函数 -Xrunjdwp:transport=dt_socket,address=myhost:8000 连接到myhost:8000提供的调试服务(server=n,以调试客户端存在),挂起VM并且不加载运行主函数 -Xrunjdwp:transport=dt_shmem,address=mysharedmemory 通过共享内存的方式连接到调试服务,挂起VM并且不加载运行主函数 -Xrunjdwp:transport=dt_socket,server=y,address=8000, onthrow=java.io.IOException,launch=/usr/local/bin/debugstub 等待java.io.IOException被抛出,然后挂起VM并监听8000端口连接,在接到调试请求后以命令/usr/local/bin/debugstub dt_socket myhost:8000执行 -Xrunjdwp:transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe 等待一个RuntimeException被抛出,然后挂起VM并监听一个可用的共享内存,在接到调试请求后以命令d:\bin\debugstub.exe dt_shmem <address>执行,<address>是可用的共享内存 2。启动调试工具。 最简单的调试工具就是上面提到的JDB,以上述调试用JVM为例,可以用下面的命运行启动JDB: jdb -connect com.sun.jdi.SocketAttach:port=5432,hostname=192.168.11.213 另外,还有好多的可视化调试工具,如 eclipse,jsawt等等。Eclipses可用 ant debug来建立一个调试方法。 其实就是使用了JDK的JPDA,在启动服务器(Jboss或者Tomcat等)的命令行参数里面加上: -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n Java远程调试 -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=3999,suspend=n -XDebug 启用调试。 -Xnoagent 禁用默认sun.tools.debug调试器。 -Djava.compiler=NONE 禁止 JIT 编译器的加载。 -Xrunjdwp 加载JDWP的JPDA参考执行实例。 transport 用于在调试程序和 VM 使用的进程之间通讯。 dt_socket 套接字传输。 dt_shmem 共享内存传输,仅限于 Windows。 server=y/n VM 是否需要作为调试服务器执行。 address=3999 调试服务器的端口号,客户端用来连接服务器的端口号。 suspend=y/n 是否在调试客户端建立连接之后启动 VM 。 Resin: RESIN_HOME\bin\httpd.