[转载]HttpEntity调用getContent方法时的注意事项 - - ITeye技术网站

mikel阅读(1573)

[转载]HttpEntity调用getContent方法时的注意事项 – – ITeye技术网站.

今天调试程序时,Debug到下面这段代码时出的问题,具体是大括号里面的那句:

Java代码  收藏代码
  1. if(response.getEntity() != null && response.getEntity().getContent() != null)  
  2. {  
  3.                 message = IOUtils.toString(response.getEntity().getContent());  
  4. }  

抛出的异常是:

Java代码  收藏代码
  1. java.lang.IllegalStateException: Content has been consumed  

原因是在if的逻辑判断里已经调用过一次getContent方法,而此方法只能调用一次。

[转载]解决android.os.NetworkOnMainThreadException - iceskysl@eoe - eoe移动开发者社区

mikel阅读(762)

[转载]解决android.os.NetworkOnMainThreadException – iceskysl@eoe – eoe移动开发者社区.

好久不写Android代码手都生了,找出自己之前写的程序发现跑不了了,也没啥特别的错误提示,就看到一句有用的错误Caused by: Android.os.NetworkOnMainThreadException,查了下原因上在4.0之后在主线程里面执行Http请求都会报这个错,大概是怕Http请求时间太长造成程序假死的情况吧。

解决办法有两个思路,分别是:

第一种方法:直接忽视,强制使用(强烈不推荐,但是修改简单)
在MainActivity文件的setContentView(R.layout.activity_main)下面加上如下代码

1
2
3
4
if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}

第二种方法:使用Thread、Runnable、Handler (推荐使用)
在Runnable中做HTTP请求,不用阻塞UI线程~

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.share_mblog_view);
    new Thread(runnable).start();
}

Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        Bundle data = msg.getData();
        String val = data.getString("value");
        Log.i("mylog","请求结果-->" + val);
    }
}

Runnable runnable = new Runnable(){
    @Override
    public void run() {
        //
        // TODO: http request.
        //
        Message msg = new Message();
        Bundle data = new Bundle();
        data.putString("value","请求结果");
        msg.setData(data);
        handler.sendMessage(msg);
    }
}

[转载]eclipse运行android程序时提示找不到adb.exe错误的原因。 - shenyonghe525 - eoe移动开发者社区

mikel阅读(631)

[转载]eclipse运行android程序时提示找不到adb.exe错误的原因。 – shenyonghe525 – eoe移动开发者社区.

这个问题其实开发的时候还是很常见的,也困扰了我一段时间。后来查了很多资料才知道,主要原因是eclipse端口冲突问题,也就是说有程序在和adb.exe抢占端口。这些程序一般为豌豆荚或者360手机助手的连接手机的应用程序。
解决方法为:这里主要是用到windows下的DOS工具,点击”开始”–“运行”,输入”cmd”后点击确定按钮,进入DOS窗口,接下来分别运行以下命令:
>netstat -aon | findstr “–“(此处–代表着adb.exe的端口)
然后找到和adb.exe端口相同的进程,然后打开任务管理器将对应的进程杀死,之后重启eclipse,之后程序就正常运行了。

下面是高手重新编译好的adb.exe文件, 下载后替换掉Android SDK目录下的platform-tools文件夹中的adb.exe,然后重新启动eclipse即可解决。

 

  • adb.rar (152.6 KB)
  • 下载次数: 116

[转载]Android ui utils-简单实用的Android界面工具 - 蒋宇捷的专栏 - 博客频道 - CSDN.NET

mikel阅读(718)

[转载]Android ui utils-简单实用的Android界面工具 – 蒋宇捷的专栏 – 博客频道 – CSDN.NET.

也许有的开发者觉得在Android开发中用户界面设计和实现简陋而麻烦,缺乏有效的帮助和支持。Android-ui-utils开源项目包含了一系列工具,帮助我们更好的设计和开发Android用户界面。项目主页为http://code.google.com/p/android-ui-utils/。它主要包含以下几个主要工具:

一、Android Asset Studio

这是一个基于网页的工具,可以帮助用户生成Android的图像资源。地址为:http://android-ui-utils.googlecode.com/hg/asset-studio/dist/index.html。Android Asset Studio包含两个工具:
1、图标生成器 – 为应用创建图标
图标生成器可以很快速和方便的从现有图片、文本生成Android应用的图标。它可以分别生成如下类别的图标:
启动器图标
菜单图标
活动栏(Action bar)图标(Android 3.0+)
标签(Tab)图标
通知图标
图标生成器整体界面非常简单美观(使用了JQuery UI的界面),功能也很齐全,可以生成各种API Level以及分辨率的图标。

 

2、设备结构生成器 – 查看设计图在不同屏幕Android手机上的真实效果
设备结构生成器可以快速的把一张设计图放到不同的Android设备上,以便于比较和查看真实效果。它支持几种常见的手机,分别为Nexus One、Nexus S、Galaxy Nexus、Motorola XOOM。地址为http://android-ui-utils.googlecode.com/hg/asset-studio/dist/device-frames.html
使用方法是将电脑里的图片拖拽到如下几个手机设备上,右边将会显示实际的效果图(这个拖拽交互效果的实现我们又要感谢HTML5,所以请用Chrome打开):

 

对于这个工具,我的感受是如果支持更多机型和Tab就更好了。

二、Android Design Preview

你们的设计师是不是经常把设计图导入到手机上,然后和产品经理、开发工程师一起查看和讨论界面设计?Android Design Preview可以让这一个流程更加方便和简单。它让人可以实时的在真实设备上查看Android高保真的设计图,让视觉设计师像开发工程师一样所见即所 得的工作。这个工具的作者是Google的Roman Nurik,它还同时支持Mac和Windows平台。

 

使用方法:
1、先在http://code.google.com/p/android-ui-utils/左下方选择合适的包下载(Windows是jar包,Mac是dmg格式)。
2、连接到Android手机并双击运行下载后的文件,运行界面如下图所示(同时它还在你的Android手机上安装了名为Design Preview的应用):

 

3、点击“Select Mirror Region”,电脑屏幕上会出现如下的界面,这个格子可以拖动,双击或者按Esc隐藏(注意:仅仅是隐藏而已)。

 

4、 把格子拖动到任何你想要的地方,你可以同时看到格子里面的内容已经实时出现在你的Android手机上。如果你在Photoshop里设计Andoid应 用的界面,你所有的变更将所见即所得的同步显示在Android手机上。下面是我在电脑上的格子里查看Word文档时手机上显示的内容:

 

现在很多工作都变得非常方便和容易,是不是?

转载请说明:来自蒋宇捷的博客(http://blog.csdn.net/hfahe)。

[转载]DeviceMonitor Adb connection Error:远程主机强迫关闭了一个现有的连接 解决方法 - Trinea 全面切换至www.trinea.cn @Java @Android 欢迎关注 - ITeye技术网站

mikel阅读(729)

转载DeviceMonitor Adb connection Error:远程主机强迫关闭了一个现有的连接 解决方法 – Trinea 全面切换至www.trinea.cn @Java @Android 欢迎关注 – ITeye技术网站.

本文主要解决adb connection error的问题——reset adb.

 

环境为真机测试,偶尔会报如下错误

Java代码  收藏代码
  1. [20120424 20:41:34 – DeviceMonitor]Adb connection Error:远程主机强迫关闭了一个现有的连接。  
  2. [20120424 20:41:36 – DeviceMonitor]Connection attempts: 1  
  3. [20120424 20:41:38 – DeviceMonitor]Connection attempts: 2  
  4. [20120424 20:41:40 – DeviceMonitor]Connection attempts: 3  
  5. [20120424 20:41:42 – DeviceMonitor]Connection attempts: 4  
  6. [20120424 20:41:44 – DeviceMonitor]Connection attempts: 5  
  7. [20120424 20:41:46 – DeviceMonitor]Connection attempts: 6  
  8. [20120424 20:41:48 – DeviceMonitor]Connection attempts: 7  
  9. [20120424 20:41:50 – DeviceMonitor]Connection attempts: 8  
  10. [20120424 20:41:52 – DeviceMonitor]Connection attempts: 9  
  11. [20120424 20:41:54 – DeviceMonitor]Connection attempts: 10  
  12. [20120424 20:41:56 – DeviceMonitor]Connection attempts: 11  
  13. [20120424 20:44:06 – ddms]ADB rejected shell command (ls -l /): closed  
  14. [20120424 20:44:11 – ddms]ADB rejected shell command (ls -l /): closed  

之前都是重启eclipse解决,但偶尔还解决不了。对于真机需要拔掉数据线,关闭eclipse重启,重新连接手机解决。

 

但由于eclipse实在过于笨重,关闭重启时间过长。找到另外一种解决方法:

eclipse中视图模式选择DDMS(还有常见的java和Debug视图), 显示Devices窗口,若无可通过选择window->show view->Devices显示,再选择下拉箭头中的reset adb

此时eclipse会再自动重试一次,输入Connection attempts:1即表示成功啦

[转载]动态封杀与解封IP (转) - greatqn - 博客园

mikel阅读(1026)

[转载]动态封杀与解封IP (转) – greatqn – 博客园.

我们在应对网站的恶意请求时候,一个解决方法就是把有问题的请求IP封杀掉。

如果想快速处理这种问题,就需要编写一段代码,达到一定门槛,自动封杀。再复杂点就是不是永久封杀,还可以自动在一定时间后解封。

封杀的逻辑代码看后面提供的。

需要说明的是:IIS7时,情况发生了不同。

 

下面的代码,在处理封杀IP时候,不论IIS6还是IIS7 都可以把需要封杀的IP加入封杀列表。但是需要注意的是我们代码写的是全部替换原先的数据。但是在IIS7下,执行的效果是原先的不替换,新加一批封杀 IP。当然IIS7下,如果新加的IP原来就有了,则会报如下异常:

System.Runtime.InteropServices.COMException was caught
Message=”当文件已存在时,无法创建该文件。 (异常来自 HRESULT:0x800700B7)”
Source=”System.DirectoryServices”
ErrorCode=-2147024713
StackTrace:
在 System.DirectoryServices.DirectoryEntry.CommitChanges()
在 IIS_Security_ConsoleApplication.Program.IPDeny() 位置 D:\MyCodes\IIS_Security_ConsoleApplication \IIS_Security_ConsoleApplication\Program.cs:行号 109
InnerException:

这就是说,IIS7, 我们可以通过编程接口增加封杀IP名单,但是没发通过编程接口剔出封杀IP。

 

参考代码:

这里提供了两套参考代码,其实原理都是一样的。

在IIS 6 下,都没有任何问题, IIS 7 下都会有没发删除原先已有数据的问题。

代码一:

using System.DirectoryServices;
using System.Reflection;
using System;

class Program
{

static void IPDeny()
{

try
{
string serverName = "localhost";
// retrieve the directory entry for the root of the IIS server
System.DirectoryServices.DirectoryEntry IIS = new System.DirectoryServices.DirectoryEntry(
string.Format("IIS://{0}/w3svc/1/root", serverName));

// retrieve the list of currently denied IPs
Console.WriteLine("Retrieving the list of currently denied IPs.");

// get the IPSecurity property
Type typ = IIS.Properties["IPSecurity"][0].GetType();
object IPSecurity = IIS.Properties["IPSecurity"][0];


// retrieve the IPDeny list from the IPSecurity object
Array origIPDenyList = (Array)typ.InvokeMember("IPDeny", BindingFlags.DeclaredOnly | BindingFlags.Public 
| BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty, null, IPSecurity, null);

// 罗列已经被拒绝的地址
foreach (string s in origIPDenyList)
Console.WriteLine("Before: " + s);

// check GrantByDefault.  This has to be set to true, 
// or what we are doing will not work.
bool bGrantByDefault = (bool)typ.InvokeMember("GrantByDefault", BindingFlags.DeclaredOnly | BindingFlags.Public 
| BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty, null, IPSecurity, null);

Console.WriteLine("GrantByDefault = " + bGrantByDefault);
if (!bGrantByDefault)
{
// 必须设置  默认允许访问
typ.InvokeMember("GrantByDefault", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic 
| BindingFlags.Instance | BindingFlags.SetProperty, null, IPSecurity, new object[] { true });
}


// 更新被拒绝的IP列表
// 注意这里是完全替换
// 如果你想保留原先的拒绝列表,需要原先的拒绝列表也在这个数组中

Console.WriteLine("Updating the list of denied IPs.");

object[] newIPDenyList = new object[4];
newIPDenyList[0] = "192.168.1.21, 255.255.255.255";
newIPDenyList[1] = "192.168.1.22, 255.255.255.255";
newIPDenyList[2] = "192.168.1.23, 255.255.255.255";
newIPDenyList[3] = "192.168.1.24, 255.255.255.255";

Console.WriteLine("Calling SetProperty");

// add the updated list back to the IPSecurity object
typ.InvokeMember("IPDeny", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic 
| BindingFlags.Instance | BindingFlags.SetProperty, null, IPSecurity, new object[] { newIPDenyList });



IIS.Properties["IPSecurity"][0] = IPSecurity;

Console.WriteLine("Commiting the changes.");

// commit the changes
IIS.CommitChanges();
IIS.RefreshCache();

// 检查更新后的数据
Console.WriteLine("Checking to see if the update took.");

IPSecurity = IIS.Properties["IPSecurity"][0];
Array y = (Array)typ.InvokeMember("IPDeny",
BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance 
| BindingFlags.GetProperty, null, IPSecurity, null);

foreach (string s in y)
Console.WriteLine("After:  " + s);
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.ToString());
}

}
}

 

代码二:

        using System.DirectoryServices;
using System.Reflection;
using System;


static void SetIPSecurityProperty(string metabasePath, string member, string item)
{
//  metabasePath is of the form "IIS://<servername>/<path>"
//    for example "IIS://localhost/SMTPSVC/1" 
//  member is of the form "IPGrant|IPDeny|DomainGrant|DomainDeny"
//  item is of the form "<ipaddress|domain>", for example, 157.56.236.15 or domain.microsoft.com
Console.WriteLine("\nEnumerating the IPSecurity property at {0}:", metabasePath);

try
{
if (("IPGrant" != member) && ("IPDeny" != member) && ("DomainGrant" != member) && ("DomainDeny" != member))
{
Console.WriteLine(" Failed in SetIPSecurityProperty; second param must be one of IPGrant|IPDeny|DomainGrant|DomainDeny");
}
else
{
DirectoryEntry path = new DirectoryEntry(metabasePath);
path.RefreshCache();
object ipsecObj = path.Invoke("Get", new string[] { "IPSecurity" });
Type t = ipsecObj.GetType();
Array data = (Array)t.InvokeMember(member, BindingFlags.GetProperty, null, ipsecObj, null);
Console.WriteLine(" Old {0} =", member);
bool exists = false;
foreach (object dataItem in data)
{
Console.WriteLine("  {0}", dataItem.ToString());
if (dataItem.ToString().StartsWith(item))
{
exists = true;
}
}

if (exists)
{
Console.WriteLine(" {0} already exists in {1}", item, member);
}
else
{
object[] newData = new object[data.Length + 1];
data.CopyTo(newData, 0);
newData.SetValue(item, data.Length);

t.InvokeMember(member, BindingFlags.SetProperty, null, ipsecObj, new object[] { newData });

path.Invoke("Put", new object[] { "IPSecurity", ipsecObj });

path.CommitChanges();

path.RefreshCache();
ipsecObj = path.Invoke("Get", new string[] { "IPSecurity" });
data = (Array)t.InvokeMember(member, BindingFlags.GetProperty, null, ipsecObj, null);
Console.WriteLine(" New {0} =", member);
foreach (object dataItem in data)
Console.WriteLine("  {0}", dataItem.ToString());
Console.WriteLine(" Done.");
}
}
}
catch (Exception ex)
{
if ("HRESULT 0x80005006" == ex.Message)
Console.WriteLine(" Property IPSecurity does not exist at {0}", metabasePath);
else
Console.WriteLine("Failed in SetIPSecurityProperty with the following exception: \n{0}", ex.Message);
}
}

        static void Main(string[] args)
{

// 获取目前服务器上有哪些站点
DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC");
foreach (DirectoryEntry dir in root.Children)
{
if (dir.SchemaClassName == "IIsWebServer")
{
string ww = dir.Properties["ServerComment"].Value.ToString();

Console.Write("IIS://localhost/W3SVC/{0}/ROOT/  {1}\r\n", dir.Name, ww);
}
}


// IPDeny();

SetIPSecurityProperty("IIS://localhost/w3svc/1/root", "IPDeny", "192.168.5.79");

Console.ReadLine();
}

 

参考资料:

Blocking IIS IP Addresses with ASP.NET
http://www.west-wind.com/WebLog/posts/59731.aspx

How to Programmatically add IP Addresses to IIS’s Deny Access List
http://www.codeproject.com/KB/security/iiswmi.aspx

HOWTO: 通过 IP 地址或域名称限制站点访问
http://support.microsoft.com/default.aspx/kb/324066

使用ADSI来操作IIS的路径
http://blog.joycode.com/ghj/archive/2004/06/08/24047.aspx

Setting IP Security Using System.DirectoryServices
http://www.cnblogs.com/drw/articles/17951.html

如何通过WEB方式,来控制iis的禁用IP名单。
http://blog.joycode.com/ghj/archive/2004/06/08/24075.aspx

Setting IP Security Using System.DirectoryServices
http://msdn.microsoft.com/en-us/library/ms524322(VS.85).aspx

how to automate adding denied IPs for IIS

http://www.nukeforums.com/forums/viewtopic.php?p=54746&highlight=&sid=1176c746e2037ed24acac86dd53ca747

IIS 7.0: Configure IPv4 Address and Domain Name Allow Rules
http://technet2.microsoft.com/windowsserver2008/en/library/d0de9475-0439-4ec1-8337-2bcedacd15c71033.mspx?mfr=true

[转载]Android使用Java Mail API发送邮件 - juejiang - 博客园

mikel阅读(816)

[转载]Android使用Java Mail API发送邮件 – juejiang – 博客园.

  最近在考虑为已经有的一个应用程序增加一个用户反馈的功能,用户可以通过反馈功能将用户的意见和建议、程序出现的问题以一种更符合用户习惯的方式反馈回 来。网上也有一些实现好的反馈程序的服务,包括bug的提交、程序的建议、程序使用中的问题,但是这样的服务基本上不是完全开源和免费的,并且我对程序反 馈的定位还是用户可以把他的想法通过写文字的方法发送回来就可以(不需要记录崩溃时的系统状况),所以还是决定在完全了解实现机制的基础上来实现反馈功 能。

采用发送邮件的方式不需要自己构建服务器,同时也符合我对反馈的管理习惯,因此决定采用在通过在应用程序内发送邮件的方式来实现反馈功能。

stackoverflow上的回答http://stackoverflow.com/a/2033124/1767800基 本给出了在Android中实现在应用程序内部发送邮件的方法,在阅读该代码的时候我一直在找smtp是如何认证的。后来发现该实现方法中 GmailSender直接继承了javax.mail.Authenticator类,实现了getPasswordAuthentication方 法,并且通过Session.getDefaultInstance(props, this)(getDefaultInstance(Properties props, Authenticator authenticator) )语句在建立session的同时将authenticator属性写入。

为了实现在Android的应用程序内部发送邮件,其中有两点可能的修改需要注意:

1.该回答使用的是Gmail账户作为发送邮件的账户,如果采用其它的账户需要对发送邮件服务器和端口号进行单独的设置。

对于126或者163邮箱而言,只需要将properties设置的部分修改为:

复制代码
        Properties props = new Properties();   
        props.setProperty("mail.transport.protocol", "smtp");   
        props.setProperty("mail.host", mailhost);   
        props.put("mail.smtp.auth", "true");   
        props.put("mail.smtp.port", "25"); 

复制代码

参考:http://www.cnblogs.com/peakzheng/archive/2012/02/04/2338671.html

2.需要将UI线程(主线程)中的发送邮件操作转移到单独的线程进行处理

Google在honeycomb的发布版之后就对主线程中的操作进行了更加严格的要求。为了保证用户体验,在主线程中不能网络数据传输操作,因为在主线程中进行网络数据传输可能会带来主界面的长时间不响应用户的点击操作,从而带来不好的用户体验(参考)。对于轻量级的网络操作,Android系统中,通常通过AsyncTask类来实现。

按说Android在高版本的系统中对应用程序在主界面访问网络的操作都会提示android.os.NetworkOnMainThreadException 错误,但是在使用Java Mail API进行应用程序内的邮件发送时,我遇到的情况是在2.3版本的模拟器上运行程序,接收方可以收到发送的邮件。同样的代码在在4.2.2版本的手机上却 无法成功发送邮件,在Eclipse下的logcat界面中没有任何错误提示。stackoverflow上的回答http://stackoverflow.com/a/2033124/1767800后也有人给出了类似的评论。

  但是,在将sender.sendMail()函数转移到asyncTask类中之后,在4.2.2的手机中也可以成功发送邮件了。具体实现是:

1)新建一个继承自AsyncTask的类

复制代码
class SendMailTask  extends AsyncTask<URL, Integer, Long> {
    MailSender sender;
    public SendMailTask(MailSender sender) {
        // TODO Auto-generated constructor stub
        this.sender=sender;
    }
    protected Long doInBackground(URL... urls) {

        long totalSize = 0;
        try {
            this.sender.sendMail("This is Subject",   
                    "This is Body",   
                    "senderAddress",   
                    "receiverAddress");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return totalSize;
    }

    protected void onProgressUpdate(Integer... progress) {
    }

    protected void onPostExecute(Long result) {
    }
}
复制代码

2)通过如下语句发送邮件

            new SendMailTask(sender).execute();

通过gmail接收的邮件如下图所示

[转载]你还可以再诡异点吗——SQL日志文件不断增长 - i6first - 博客园

mikel阅读(1086)

[转载]你还可以再诡异点吗——SQL日志文件不断增长 – i6first – 博客园.

前言

 

今天算是遇到了一个罕见的案例。

SQL日志文件不断增长的各种实例不用多说,园子里有很多牛人有过介绍,如果我再阐述这些陈谷子芝麻,想必已会被无数次吐槽。

但这次我碰到的问题确实比较诡异,其解决方式也是我第一次使用。

下文将为各位看管详细介绍我的解决思路。

 

现象

 

一客户反馈数据库的日志文件不断增长,已分配的磁盘空间快使用完,尝试过事务日志截断(事务日志备份)的操作,但没有任何效果。

 

分析

 

遇到这个问题,我最直接的感受:肯定有大的事务一直在执行,导致日志备份无法截断事务日志的大小。

首先,我在该数据库下运行DBCC loginfo()

clip_image002

                                          图一

从图一的红色框可以看到,数据库的多个VLF的状态都为2,也就是active状态。(如果为0 ,表示为inactive)。

这表明这些日志文件确实都在活动状态,一般而言,导致这种现象的原因主要有三种:长事务的运行、replication和mirroring延迟。

但这个客户没有采用replication和mirroring,所以我初步锁定问题是因为长事务的运行导致。按照常规的方法,我只需分析下这个事务是否遇到阻塞、死锁等情况,然后给出对应的解决方案即可。(但实际情况并非如此)

为保险起见,我运行如下语句来验证下我的判断:

SELECT log_reuse_wait_desc, * FROM sys.databases WHERE NAME=’dbname’

image                                                                                           图二

 

显然,我的判断错了,可以看到,目前【log_reuse_wait_desc】的状态为【REPLICATION】。也就是说正是事务日志分发导致日志文件不断增大的原因。

正如前文分析的,这个数据库并没有用作发布订阅,怎么会出现这个状态呢?

经与客户沟通,了解这个数据库其实是从一个发布订阅的数据库中还原过来的,尽管新的数据库并没有采用发布订阅,但数据库中发布订阅的一些配置选项还在,从而导致了数据库的误判,致使日志文件不断增大。

 

方案

 

知道了原因就好办了。

起初我想通过sp_droppublication来完全删除分发订阅的配置,但无法通过sp_helppublication获取到@publication的名字(提示:命令已执行完!),因此这条路走不通了。

在网上找些资料,发现了sp_removedbreplication这个存储过程,执行后再去收缩日志文件,问题果然解决!

EXEC sp_removedbreplication dbname

DBCC SHRINKFILE(Logfilename)

DBCC loginfo()

clip_image007

图三

 

 

总结

 

尽管本文的场景比较少见,但总体解决的思路与其他(日志文件不断增长)其实是一样的。少许地方不太明白可以通过网络等一些工具获得。这也说明了SQL原理的重要性,借用一本书的序言中的一句话【越接触本质越不会迷茫!】。多接触原理,很多东西都是触类旁通的。

 

[转载]Android 二维码 生成和识别(附Demo源码) - 泡泡糖 - 博客园

mikel阅读(998)

[转载]Android 二维码 生成和识别(附Demo源码) – 泡泡糖 – 博客园.

  今天讲一下目前移动领域很常用的技术——二维码。现在大街小巷、各大网站都有 二维码的踪迹,不管是IOS、Android、WP都有相关支持的软件。之前我就想了解二维码是如何工作,最近因为工作需要使用相关技术,所以做了初步了 解。今天主要是讲解如何使用ZXing库,生成和识别二维码。这篇文章实用性为主,理论性不会讲解太多,有兴趣可以自己查看源码。

 

1、ZXing库介绍

  这里简单介绍一下ZXing库。ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。该项目可实现的条形码编码和解码。目前支持以下格式:UPC-A,UPC-E、EAN-8,EAN-13、39码、93码。ZXing是个很经典的条码/二维码识别的开源类库,以前在功能机上,就有开发者使用J2ME运用ZXing了,不过要支持JSR-234规范(自动对焦)的手机才能发挥其威力。

  下面是ZXing的demo运行,我这里创建了一个二维码,内容是我博客的网址,大伙可以用微信的扫一扫功能,试一下。就可以直接打开我博客。
 (PS:新建的QQ群,有兴趣可以加入一起讨论:Android群:322599434)
2、ZXing库主要类

  下面给大家介绍一下,ZXing库里面主要的类以及这些类的作用:

  • CaptureActivity。这个是启动Activity 也就是扫描器。
  • CaptureActivityHandler 解码处理类,负责调用另外的线程进行解码。
  • DecodeThread 解码的线程。
  • com.google.zxing.client.Android.camera 包,摄像头控制包。
  • ViewfinderView 自定义的View,就是我们看见的拍摄时中间的框框了。

 

3、使用ZXing生成二维码

  下面针对二维码生成和解析做个简单介绍,至于详细的使用方法,建议大家还是自己看看源码,使用起来很简单,不过这个开源项目的代码,值得好好看看。首先给出二维码生成的方法:

复制代码
    
//Edited by mythou
//http://www.cnblogs.com/mythou/
  //要转换的地址或字符串,可以是中文
    public void createQRImage(String url)
    {
        try
        {
            //判断URL合法性
            if (url == null || "".equals(url) || url.length() < 1)
            {
                return;
            }
            Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            //图像数据转换,使用了矩阵转换
            BitMatrix bitMatrix = new QRCodeWriter().encode(url, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);
            int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
            //下面这里按照二维码的算法,逐个生成二维码的图片,
            //两个for循环是图片横列扫描的结果
            for (int y = 0; y < QR_HEIGHT; y++)
            {
                for (int x = 0; x < QR_WIDTH; x++)
                {
                    if (bitMatrix.get(x, y))
                    {
                        pixels[y * QR_WIDTH + x] = 0xff000000;
                    }
                    else
                    {
                        pixels[y * QR_WIDTH + x] = 0xffffffff;
                    }
                }
            }
            //生成二维码图片的格式,使用ARGB_8888
            Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
            //显示到一个ImageView上面
            sweepIV.setImageBitmap(bitmap);
        }
        catch (WriterException e)
        {
            e.printStackTrace();
        }
    }
复制代码

  上面就是二维码生成的方法接口,如果你只是使用者方法,很简单,只要传入一个 URL即可,就像我截图里面一样,传入一个合法的网址即可。或者像现在一些移动APP的推广,把APP下载地址转为二维码,只要扫一下就可以下载相应的 APP。这个也是目前比较流行的APP的推广方式。

  上面代码做的事情不多,主要是调用ZXing库里面QRCodeWriter().encode的方法对我们传进去的URL进行编码,具体如何编码,这个我这里就不详细说,有兴趣可以看ZXing的源码。文章最后会给出ZXing的源码和例子代码。

 

4、扫描二维码获取信息

  扫描获取二维码信息的工作稍微复杂一些,主要是需要编写Camera的使用, 这个跟我们一般使用Camera一样,需要使用Surfaceview作为预览,这一部我这里就不说了,这个应该不是太复杂。对于使用过Camera做预 览的朋友,应该是挺简单的事情。获取二维码数据的关键处理是在Camera的自动对焦回调函数哪里,调用ZXing的解码接口。

复制代码

//Edited by mythou
//http://www.cnblogs.com/mythou/
  private void restartPreviewAndDecode() {
    if (state == State.SUCCESS) {
      state = State.PREVIEW;
      CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
      CameraManager.get().requestAutoFocus(this, R.id.auto_focus);
      activity.drawViewfinder();
    }
  }
复制代码

  这里稍微多说一句,由于解码需要一定时间,所以ZXing的解码调用,都是使用了Handler作为线程通信机制,解码的工作都是放在独立线程里面使用的,如果你直接在主线程解码,恐怕ANR问题是避免不了。

 

复制代码
//Edited by mythou
//http://www.cnblogs.com/mythou/
public void handleMessage(Message message) {
    switch (message.what) {
      case R.id.auto_focus:
        //Log.d(TAG, "Got auto-focus message");
        // When one auto focus pass finishes, start another. This is the closest thing to
        // continuous AF. It does seem to hunt a bit, but I'm not sure what else to do.
        if (state == State.PREVIEW) {
          CameraManager.get().requestAutoFocus(this, R.id.auto_focus);
        }
        break;
      case R.id.restart_preview:
        Log.d(TAG, "Got restart preview message");
        restartPreviewAndDecode();
        break;
      case R.id.decode_succeeded:
    //解码成功,获取到界面的结果和原来的二维码数据
        Log.d(TAG, "Got decode succeeded message");
        state = State.SUCCESS;
        Bundle bundle = message.getData();
        Bitmap barcode = bundle == null ? null :
            (Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP);
        activity.handleDecode((Result) message.obj, barcode);
        break;
      case R.id.decode_failed:
        // We're decoding as fast as possible, so when one decode fails, start another.
        state = State.PREVIEW;
        CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
        break;
      case R.id.return_scan_result:
        Log.d(TAG, "Got return scan result message");
        activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
        activity.finish();
        break;
      case R.id.launch_product_query:
        Log.d(TAG, "Got product query message");
        String url = (String) message.obj;
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
        activity.startActivity(intent);
        break;
    }
  }
复制代码

 

  上面是解码的线程处理不同状态的时候需要注意的地方,我们这里只看获取图像成 功的地方,成功获取图片解码的实在DecodeThread里面实现,DecodeThread里面解码成功后,会把数据序列化,然后保存到Bundle 里面,我们可以直接通过Bundle的序列化,获取到图片数据。同时会把解码后的结果保存到MSG里面,然后就可以根据实际情况进行处理,例如上面代码, 解码成功后,会调用一个处理函数:

复制代码

//Edited by mythou
//http://www.cnblogs.com/mythou/
  public void handleDecode(final Result obj, Bitmap barcode)
    {
        inactivityTimer.onActivity();
        playBeepSoundAndVibrate();
        AlertDialog.Builder dialog = new AlertDialog.Builder(this);
        if (barcode == null)
        {
            dialog.setIcon(null);
        }
        else
        {

            Drawable drawable = new BitmapDrawable(barcode);
            dialog.setIcon(drawable);
        }
        dialog.setTitle("扫描结果");
        dialog.setMessage(obj.getText());
        dialog.setNegativeButton("确定", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                //用默认浏览器打开扫描得到的地址
                Intent intent = new Intent();
                intent.setAction("android.intent.action.VIEW");
                Uri content_url = Uri.parse(obj.getText());
                intent.setData(content_url);
                startActivity(intent);
                finish();
            }
        });
        dialog.setPositiveButton("取消", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                finish();
            }
        });
        dialog.create().show();
    }
复制代码

  上面就是整个二维码的解码流程,里面因为涉及很多Camera的使用,所以你如果需要使用二维码识别,需要注意一下你的程序需要申请下面的权限,一般的Camera使用以及Camera的自动对焦等。

//Edited by mythou
//http://www.cnblogs.com/mythou/
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

 

5、结语

  上面就是生成和识别二维码的关键流程和代码,有兴趣的朋友可以自己查看 ZXing的源码,里面有很多图像分析的知识可以学习。具体使用也可以参考我下面给出的Demo。二维码对于现在移动开发来说很是很常用的技术,所以有空 可以了解一下,说不定什么时候就用上了。另外,ZXing库除了二维码外,其实对于条形码也是支持的,只是我这里没有介绍。有需要的自己去看看源码即可。

 

2013-8-16

Edited by 泡泡糖

ZXing开源项目Google Code地址:https://code.google.com/p/zxing/

ZXingDemo下载:ZXingDemo2013-8-25.rar

Edited by mythou

原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3280023.html

[转载]jQuery EasyUI 1.3.4 离线API、Demo (最新) - purediy - 博客园

mikel阅读(1145)

[转载][原]jQuery EasyUI 1.3.4 离线API、Demo (最新) – purediy – 博客园.

本文下载包为 JQuery EasyUI 1.3.4 离线API、Demo。

API 按照分类整理做成了离线版本,文档保证和官网完全一致;

Demo 按照分类整理为合集。

1.3.3版本中新增 tooltip 新组件,由于1.3.3未作整理,故此说明;

官网提供一个 Theme Builder 地址,可以更丰富的自定义主题皮肤;

其他Bug修复和改进功能详见下载包中changlog.txt或官网

预览图

Demo:

easyui-1.3.4-demo

API:

easyui-1.3.4-api

下载地址

JQuery-easyui-1.3.4.zip

兄弟版本:

jQuery EasyUI 1.2.6

jQuery EasyUI 1.3.0

jQuery EasyUI 1.3.2