[转载]利用iframe技巧获取访问者qq - molaifeng的专栏 - 博客频道 - CSDN.NET

mikel阅读(1008)

[转载]利用iframe技巧获取访问者qq – molaifeng的专栏 – 博客频道 – CSDN.NET.今天工作时,有个临时加的好友问我,怎么利用web页面获取访问者的qq。

 

以前没有接触过,感觉到很好奇,但是工作中脑子很亢奋,转的快,利用 所学的知识迅速想到一条技巧,那就是假想用户在进入我们设定的页面前,已经通过qq进入空间或是邮箱,对,一定会在咱们电脑的浏览器上留下cookie, 那么我们设法通过这个cooke做做文章呢,于是在google上找了下,不到几秒就找到了一个比较接近的答案,但是原来问问题的楼主接近90%,死在了 10%上了,那我就补上这10%吧。

 

http://kf.qq.com/cgi-bin/loginTitle?rand对,就是这个链接,各位点击这链接,会跳到一个页面,里面返回的是xml格式,显示如下

<root>
<er>0</er>
<login>1</login>
<nick>昵称</nick>
<uin>qq号</uin>
</root>

我勒个去,这是多么爽的事啊,这不一下子就解决了么。原楼主发现了这个链接,但是没弄出来,他想的是用ajax啥的,岂不知我们的大iframe是多么的牛叉,在页面上放入个0宽高的iframe,只要用户之前登录过qq相关网站,在浏览器下留下cookie,那么准能获取qq号码和昵称,当然了用户同时登录两个只能获取一个qq号码,昵称为空,没有登录,显示的是三个0。偷偷的告诉你,也可以利用这个iframe做xss。啥,我可不会xss,我是好人,恩,对,是的。

<iframe src="http://kf.qq.com/cgi-bin/loginTitle?rand"></iframe>  

就这样,就获取到了访问者的qq,接下来的活就不用我交了吧。啥,不知道接下来的活是啥,营销啊,进入你的页面说明有企图啊,不多说了。

看完后,要是用的着的话,不用感谢我,实在想谢我的话,请叫我雷锋。

[转载]C# Excel操作类 ExcelHelper - 年华时代 - 博客园

mikel阅读(898)

[转载]C# Excel操作类 ExcelHelper – 年华时代 – 博客园.

实现C#与Excel文件的交互操作,实现以下功能:

1、DataTable 导出到 Excel文件

2、Model数据实体导出到 Excel文件[List<Model>]

3、导出数据到模版

4、多DataTable导入到同一Excel文件

对于第四项功能,常见的用途为:最后一行显示的是百分比,为字符型,而这列其它类型为数据型,如果放在同一个DataTable中,显然不合适。此操作类可实现

5、将Excel文件导入到数据库表中

可以指定每个字段的数据类型

 

此帮助类的代码量不算少,但注释比较详细,导出数据集中在一个方法,导入数据集中在一个方法。只看完整的两个方法就可以了,其它方法为便于使用所写的辅助简化方法,看看就清楚了:

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using Microsoft.Office.Interop.Excel;
using System.Data;
using System.Reflection;
using System.Data.OleDb;

namespace Common
{
    /// <summary>
    /// C#与Excel交互类
    /// </summary>
    public class ExcelHelper
    {
        #region 导出到Excel
        #region ExportExcelForDataTable
        /// <summary>
        /// 从DataTable导出Excel,指定列别名,指定要排除的列
        /// </summary>
        /// <param name="dt">DataTable</param>
        /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
        /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
        /// <param name="colName">各列的列名List string </param>
        /// <param name="excludeColumn">要显示/排除的列</param>
        /// <param name="excludeType">显示/排除列方式 0为所有列 1指定的为要显示的列 2指定的为要排除的列</param>
        /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
        /// <param name="TemplatePath">模版在项目服务器中路径 例:tp.xlsx 为空字符串时表示无模版</param>
        /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
        /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
        /// <returns>bool</returns>
        public static bool ToExcelForDataTable(System.Data.DataTable dt, string excelPathName, string pathType, List<string> colName, List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
        {
            try
            {
                if (dt == null || dt.Rows.Count == 0) return false;
                Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
                if (xlApp == null)
                {
                    return false;
                }
                System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture;
                System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
                Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;

                Microsoft.Office.Interop.Excel.Workbook workbook = null;
                if (TemplatePath == "")
                {
                    workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
                }
                else
                {
                    workbook = workbooks.Add(TemplatePath); //加载模板
                }
                Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
                Microsoft.Office.Interop.Excel.Range range;

                long totalCount = dt.Rows.Count;
                if (exDataTableList != null && exDataTableList.Count > 0)
                {
                    foreach (System.Data.DataTable item in exDataTableList)
                    {
                        totalCount += item.Rows.Count;
                    }
                }
                long rowRead = 0;
                float percent = 0;
                string exclStr = "";//要排除的列临时项
                object exclType;//DataTable 列的类型,用于做
                int colPosition = 0;//列位置
                if (sheetName != null && sheetName != "")
                {
                    worksheet.Name = sheetName;
                }
                #region 列别名判定
                if (colName != null && colName.Count > 0)
                {
                    #region 指定了列别名
                    for (int i = 0; i < colName.Count; i++)
                    {
                        worksheet.Cells[1, i + 1] = colName[i];
                        range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1];
                        range.Interior.ColorIndex = 15;
                        range.Font.Bold = true;
                        exclType = dt.Columns[i].DataType.Name;
                        if (exclType.ToString() != "DateTime")
                        {
                            //range.EntireColumn.AutoFit();//全局自动调整列宽,不能再使用单独设置
                            ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.AutoFit();
                        }
                        else
                        {
                            //规定列宽
                            ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.ColumnWidth = 20;
                        }
                        //((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.ColumnWidth = 20;
                    }
                    #endregion
                }
                else
                {
                    #region 未指定别名
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
                        range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1];
                        range.Interior.ColorIndex = 15;
                        range.Font.Bold = true;
                        exclType = dt.Columns[i].DataType.Name;
                        if (exclType.ToString() != "DateTime")
                        {
                            //range.EntireColumn.AutoFit();//全局自动调整列宽,不能再使用单独设置
                            ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.AutoFit();
                        }
                        else
                        {
                            //规定列宽
                            ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.ColumnWidth = 20;
                        }
                        //((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]).Columns.ColumnWidth = 20;
                    }
                    #endregion
                }
                #endregion
                #region 排除列判定
                if (excludeColumn != null && excludeColumn.Count > 0)
                {
                    switch (excludeType)
                    {
                        case "0":
                            {
                                #region 0为显示所有列
                                #region 常规项
                                int r = 0;
                                for (r = 0; r < dt.Rows.Count; r++)
                                {
                                    colPosition = 0;
                                    for (int i = 0; i < dt.Columns.Count; i++)
                                    {
                                        if (TemplatePath == "")
                                        {
                                            worksheet.Cells[r + 2, colPosition + 1] = dt.Rows[r][i].ToString();
                                        }
                                        else
                                        {
                                            worksheet.Cells[r + TemplateRow, colPosition + 1] = dt.Rows[r][i].ToString();
                                        }
                                        colPosition++;
                                    }
                                    rowRead++;
                                    percent = ((float)(100 * rowRead)) / totalCount;
                                }
                                #endregion
                                #region 扩展项
                                if (exDataTableList != null && exDataTableList.Count > 0)
                                {
                                    foreach (System.Data.DataTable item in exDataTableList)
                                    {
                                        for (int k = 0; k < item.Rows.Count; r++, k++)
                                        {
                                            colPosition = 0;
                                            //生成扩展 DataTable 每行数据
                                            for (int t = 0; t < item.Columns.Count; t++)
                                            {
                                                if (TemplatePath == "")
                                                {
                                                    worksheet.Cells[r + 2, colPosition + 1] = item.Rows[k][t].ToString();
                                                }
                                                else
                                                {
                                                    worksheet.Cells[r + TemplateRow, colPosition + 1] = item.Rows[k][t].ToString();
                                                }
                                                colPosition++;
                                            }
                                            rowRead++;
                                            percent = ((float)(100 * rowRead)) / totalCount;
                                        }
                                    }
                                }
                                #endregion
                                #endregion
                            }; break;
                        case "1":
                            {
                                #region 1指定的为要显示的列
                                #region 常规项
                                int r = 0;
                                for (r = 0; r < dt.Rows.Count; r++)
                                {
                                    colPosition = 0;
                                    for (int i = 0; i < dt.Columns.Count; i++)
                                    {
                                        exclStr = dt.Columns[i].ColumnName;
                                        if (excludeColumn.Contains(exclStr))
                                        {
                                            if (TemplatePath == "")
                                            {
                                                worksheet.Cells[r + 2, colPosition + 1] = dt.Rows[r][i].ToString();
                                            }
                                            else
                                            {
                                                worksheet.Cells[r + TemplateRow, colPosition + 1] = dt.Rows[r][i].ToString();
                                            }
                                            colPosition++;
                                        }
                                        else
                                        {

                                        }
                                    }
                                    rowRead++;
                                    percent = ((float)(100 * rowRead)) / totalCount;
                                }
                                #endregion
                                #region 扩展项
                                if (exDataTableList != null && exDataTableList.Count > 0)
                                {
                                    foreach (System.Data.DataTable item in exDataTableList)
                                    {
                                        for (int k = 0; k < item.Rows.Count; r++, k++)
                                        {
                                            colPosition = 0;
                                            //生成扩展 DataTable 每行数据
                                            for (int t = 0; t < item.Columns.Count; t++)
                                            {
                                                exclStr = dt.Columns[t].ColumnName;
                                                if (excludeColumn.Contains(exclStr))
                                                {
                                                    if (TemplatePath == "")
                                                    {
                                                        worksheet.Cells[r + 2, colPosition + 1] = item.Rows[k][t].ToString();
                                                    }
                                                    else
                                                    {
                                                        worksheet.Cells[r + TemplateRow, colPosition + 1] = item.Rows[k][t].ToString();
                                                    }
                                                    colPosition++;
                                                }
                                                else
                                                {

                                                }
                                            }
                                            rowRead++;
                                            percent = ((float)(100 * rowRead)) / totalCount;
                                        }
                                    }
                                }
                                #endregion
                                #endregion
                            }; break;
                        case "2":
                            {
                                #region 2指定的为要排除的列
                                #region 常规项
                                int r = 0;
                                for (r = 0; r < dt.Rows.Count; r++)
                                {
                                    colPosition = 0;
                                    for (int i = 0; i < dt.Columns.Count; i++)
                                    {
                                        exclStr = dt.Columns[i].ColumnName;
                                        if (excludeColumn.Contains(exclStr))
                                        {

                                        }
                                        else
                                        {
                                            if (TemplatePath == "")
                                            {
                                                worksheet.Cells[r + 2, colPosition + 1] = dt.Rows[r][i].ToString();
                                            }
                                            else
                                            {
                                                worksheet.Cells[r + TemplateRow, colPosition + 1] = dt.Rows[r][i].ToString();
                                            }
                                            colPosition++;
                                        }
                                    }
                                    rowRead++;
                                    percent = ((float)(100 * rowRead)) / totalCount;
                                }
                                #endregion
                                #region 扩展项
                                if (exDataTableList != null && exDataTableList.Count > 0)
                                {
                                    foreach (System.Data.DataTable item in exDataTableList)
                                    {
                                        for (int k = 0; k < item.Rows.Count; r++, k++)
                                        {
                                            colPosition = 0;
                                            //生成扩展 DataTable 每行数据
                                            for (int t = 0; t < item.Columns.Count; t++)
                                            {
                                                exclStr = dt.Columns[t].ColumnName;
                                                if (excludeColumn.Contains(exclStr))
                                                {

                                                }
                                                else
                                                {
                                                    if (TemplatePath == "")
                                                    {
                                                        worksheet.Cells[r + 2, colPosition + 1] = item.Rows[k][t].ToString();
                                                    }
                                                    else
                                                    {
                                                        worksheet.Cells[r + TemplateRow, colPosition + 1] = item.Rows[k][t].ToString();
                                                    }
                                                    colPosition++;
                                                }
                                            }
                                            rowRead++;
                                            percent = ((float)(100 * rowRead)) / totalCount;
                                        }
                                    }
                                }
                                #endregion
                                #endregion
                            }; break;
                        default:
                            break;
                    }

                }
                else
                {
                    //生成每行数据
                    int r = 0;
                    for (r = 0; r < dt.Rows.Count; r++)
                    {
                        //生成每列数据
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            worksheet.Cells[r + 2, i + 1] = dt.Rows[r][i].ToString();
                        }
                        rowRead++;
                        percent = ((float)(100 * rowRead)) / totalCount;
                    }
                }
                #endregion
                switch (pathType)
                {
                    case "0": { workbook.Saved = false; }; break;
                    case "1": { workbook.Saved = true; workbook.SaveCopyAs(excelPathName); }; break;
                    default:
                        return false;
                }
                xlApp.Visible = false;//是否在服务器打开
                workbook.Close(true, Type.Missing, Type.Missing);
                workbook = null;
                xlApp.Quit();
                xlApp = null;
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        /// <summary>
        /// 从DataTable导出Excel,指定列别名
        /// </summary>
        /// <param name="dt">DataTable</param>
        /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
        /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
        /// <param name="colName">各列的列名List string </param>
        /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
        /// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
        /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
        /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
        /// <returns>bool</returns>
        public static bool ToExcelForDataTableC(System.Data.DataTable dt, string excelPathName, string pathType, List<string> colName, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
        {
            List<string> excludeColumn = new List<string>();
            string excludeType = "0";
            return ToExcelForDataTable(dt, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
        }

        /// <summary>
        /// 从DataTable导出Excel,指定要排除的列
        /// </summary>
        /// <param name="dt">DataTable</param>
        /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
        /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
        /// <param name="excludeColumn">要显示/排除的列</param>
        /// <param name="excludeType">显示/排除列方式 0为所有列 1指定的为要显示的列 2指定的为要排除的列</param>
        /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
        /// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
        /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
        /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
        /// <returns>bool</returns>
        public static bool ToExcelForDataTableE(System.Data.DataTable dt, string excelPathName, string pathType, List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
        {
            List<string> colName = new List<string>();
            return ToExcelForDataTable(dt, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
        }
        /// <summary>
        /// 从DataTable导出Excel,使用默认列名,不排除导出任何列
        /// </summary>
        /// <param name="dt">DataTable</param>
        /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
        /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
        /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
        /// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
        /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
        /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
        /// <returns>bool</returns>
        public static bool ToExcelForDataTableZ(System.Data.DataTable dt, string excelPathName, string pathType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
        {
            List<string> colName = new List<string>();
            List<string> excludeColumn = new List<string>();
            string excludeType = "0";
            return ToExcelForDataTable(dt, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
        }
        #endregion

        #region ExportExcelForModelList
        /// <summary>
        /// 从DataTable导出Excel,指定列别名,指定要排除的列
        /// </summary>
        /// <param name="dt">DataTable</param>
        /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
        /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
        /// <param name="colName">各列的列名List string </param>
        /// <<param name="excludeColumn">要显示/排除的列</param>
        /// <param name="excludeType">显示/排除列方式 0为所有列 1指定的为要显示的列 2指定的为要排除的列</param>
        /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
        /// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
        /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
        /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
        /// <returns>bool</returns>
        public static bool ToExcelForModelList<T>(List<T> md, string excelPathName, string pathType, List<string> colName, List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
        {
            System.Data.DataTable dt = ModelListToDataTable(md);
            return ToExcelForDataTable(dt, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
        }

        /// <summary>
        /// 从DataTable导出Excel,指定列别名
        /// </summary>
        /// <param name="dt">DataTable</param>
        /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
        /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
        /// <param name="colName">各列的列名List string </param>
        /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
        /// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
        /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
        /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
        /// <returns>bool</returns>
        public static bool ToExcelForModelListC<T>(List<T> md, string excelPathName, string pathType, List<string> colName, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
        {
            List<string> excludeColumn = new List<string>();
            string excludeType = "0";
            return ToExcelForModelList(md, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
        }

        /// <summary>
        /// 从DataTable导出Excel,指定要排除的列
        /// </summary>
        /// <param name="dt">DataTable</param>
        /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
        /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
        /// <param name="excludeColumn">要显示/排除的列</param>
        /// <param name="excludeType">显示/排除列方式 0为所有列 1指定的为要显示的列 2指定的为要排除的列</param>
        /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
        /// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
        /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
        /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
        /// <returns>bool</returns>
        public static bool ToExcelForModelListE<T>(List<T> md, string excelPathName, string pathType, List<string> excludeColumn, string excludeType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
        {
            List<string> colName = new List<string>();
            return ToExcelForModelList(md, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
        }

        /// <summary>
        /// 从DataTable导出Excel,使用默认列名,不排除导出任何列
        /// </summary>
        /// <param name="dt">DataTable</param>
        /// <param name="excelPathName">含Excel名称的保存路径 在pathType=1时有效,其它请赋值空字符串</param>
        /// <param name="pathType">路径类型。只能取值:0客户自定义路径;1服务端定义路径,标识文件保存路径是服务端指定还是客户自定义路径及文件名</param>
        /// <param name="sheetName">sheet1的名称 为空字符串时保持默认名称</param>
        /// <param name="TemplatePath">模版在项目服务器中路径 为空字符串时表示无模版</param>
        /// <param name="TemplateRow">模版中已存在数据的行数,无模版时请传入参数 0</param>
        /// <param name="exDataTableList">扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同</param>
        /// <returns>bool</returns>
        public static bool ToExcelForModelListZ<T>(List<T> md, string excelPathName, string pathType, string sheetName, string TemplatePath, int TemplateRow, List<System.Data.DataTable> exDataTableList)
        {
            List<string> colName = new List<string>();
            List<string> excludeColumn = new List<string>();
            string excludeType = "0";
            return ToExcelForModelList(md, excelPathName, pathType, colName, excludeColumn, excludeType, sheetName, TemplatePath, TemplateRow, exDataTableList);
        }
        #endregion

        #region 从DataTable导出Excel; ToExcelModel实体传参
        /// <summary>
        /// 从DataTable导出Excel; ToExcelModel实体传参
        /// </summary>
        /// <param name="tem">ExcelHelper.ToExcelModel</param>
        /// <returns></returns>
        public static bool ToExcelForDataTable(ToExcelModel tem)
        {
            if (tem != null)
            {
                return ToExcelForDataTable(tem.DataTable, tem.excelPathName, tem.pathType, tem.colNameList, tem.excludeColumn, tem.excludeType, tem.sheetName, tem.TemplatePath, tem.TemplateRow, tem.exDataTableList);
            }
            else
            {
                return false;
            }
        }
        #endregion

        #region Model To DataTable
        /// <summary>
        /// 实体类转换成DataTable
        /// </summary>
        /// <param name="modelList">实体类列表</param>
        /// <returns></returns>
        public static System.Data.DataTable ModelListToDataTable<T>(List<T> modelList)
        {
            System.Data.DataTable dtReturn = new System.Data.DataTable();

            // column names
            PropertyInfo[] oProps = null;

            if (modelList == null) return dtReturn;

            foreach (T rec in modelList)
            {
                if (oProps == null)
                {
                    oProps = ((Type)rec.GetType()).GetProperties();
                    foreach (PropertyInfo pi in oProps)
                    {
                        Type colType = pi.PropertyType;

                        if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
                        == typeof(Nullable<>)))
                        {
                            colType = colType.GetGenericArguments()[0];
                        }

                        dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
                    }
                }

                DataRow dr = dtReturn.NewRow();

                foreach (PropertyInfo pi in oProps)
                {
                    dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue
                    (rec, null);
                }

                dtReturn.Rows.Add(dr);
            }
            return dtReturn;
        }
        #endregion

        #region 说明 如何使用
        /*
         * 功能:
         *      1、将System.Data.DataTable数据导出到Excel文件
         *      2、将Model(Entity)数据实体导出到Excel文件
         * 完整调用:
         *      1、ExcelHelper.ToExcelForDataTable(DataTable,excelPathName,pathType,colName,excludeColumn,excludeType,sheetName,TemplatePath,TemplateRow,exDataTableList);
         *      2、ExcelHelper.ToExcelForModelList(Model,excelPathName,pathType,colName,excludeColumn,excludeType,sheetName,TemplatePath,TemplateRow,exDataTableList);
         * 参数说明:
         *      1、DataTable:DataSet.DataTable[0];数据表
         *      2、Model:Model.Users users = new Model.Users(){...};数据实体
         *      3、excelPathName:含Excel名称的保存路径 在pathType=1时有效。用户自定义保存路径时请赋值空字符串 ""。格式:"E://456.xlsx"
         *      4、pathType:路径类型。只能取值:0用户自定义路径,弹出用户选择路径对话框;1服务端定义路径。标识文件保存路径是服务端指定还是客户自定义路径及文件名,与excelPathName参数合用
         *      5、colName:各列的列别名List string,比如:字段名为userName,此处可指定为"用户名",并以此显示
         *      6、excludeColumn:要显示/排除的列,指定这些列用于显示,或指定这些列用于不显示。倒低这些列是显示还是不显示,由excludeType参数决定
         *      7、excludeType:显示/排除列方式。 0为显示所有列 1指定的是要显示的列 2指定的是要排除的列,与excludeColumn合用
         *      8、sheetName:sheet1的名称,要使期保持默认名称请指定为空字符串 ""
         *      9、TemplatePath:模版在项目服务器中路径 例:tp.xlsx 。当为空字符串 "" 时表示无模版
         *      10、TemplateRow:模版中已存在数据的行数,与TemplatePath合用,无模版时请传入参数 0
         *      11、exDataTableList:扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同
         * 注意:
         *      1、exDataTableList参数为一个List<System.Data.DataTable> 集合,当数据为 Model 时,可先调用 ExcelHelper.ModelListToDataTable(System.Data.DataTable dt)将Model转为System.Data.DataTable
         */
        #endregion
        #endregion
        #region 从Excel导入数据到 Ms Sql
        /// <summary>
        /// 从Excel导入数据到 Ms Sql
        /// </summary>
        /// <param name="excelFile">Excel文件路径(含文件名)</param>
        /// <param name="sheetName">sheet名</param>
        /// <param name="DbTableName">存储到数据库中的数据库表名称</param>
        /// <param name="columnType">对应表格的数据类型,如果为null,则为默认类型:double,nvarchar(500),datetime</param>
        /// <param name="connectionString">连接字符串</param>
        /// <returns></returns>
        public static bool FromExcel(string excelFile, string sheetName, string DbTableName, List<string> columnType, string connectionString)
        {
            DataSet ds = new DataSet();
            try
            {
                //获取全部数据   
                //string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties=Excel 8.0;";
                string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + excelFile + ";Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'"; //此连
                #region 知识扩展
                //HDR=Yes,代表第一行是标题,不做为数据使用。HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES
                //IMEX=0 只读模式
                //IMEX=1 写入模式
                //IMEX=2 可读写模式
                #endregion
                #region 命名执行
                using (OleDbConnection conn = new OleDbConnection(strConn))
                {
                    conn.Open();
                    string strExcel = "";
                    OleDbDataAdapter myCommand = null;
                    strExcel = string.Format("select * from [{0}$]", sheetName);
                    myCommand = new OleDbDataAdapter(strExcel, strConn);
                    myCommand.Fill(ds, sheetName);

                    #region 数据库表是否存在的 T-SQL 检测语句准备
                    //如果目标表不存在则创建   
                    string strSql = string.Format("if object_id('{0}') is null create table {0}(", DbTableName != "" ? DbTableName : sheetName);
                    if (columnType != null && columnType.Count > 0)
                    {
                        #region 手动指定定每个字段的数据类型
                        //指定数据格式,要求一一对应
                        for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
                        {
                            System.Data.DataColumn c = ds.Tables[0].Columns[i];
                            strSql += string.Format("[{0}] {1},", c.ColumnName, columnType[i]);
                        }
                        #endregion
                    }
                    else
                    {
                        #region 使用默认数据类型
                        foreach (System.Data.DataColumn c in ds.Tables[0].Columns)
                        {
                            //使用默认格式:只有double,DateTime,String三种类型
                            switch (c.DataType.ToString())
                            {
                                case "DateTime":
                                    {
                                        strSql += string.Format("[{0}] DateTime,", c.ColumnName);
                                    }; break;
                                case "Double":
                                    {
                                        strSql += string.Format("[{0}] double,", c.ColumnName);
                                    }; break;
                                default:
                                    strSql += string.Format("[{0}] nvarchar(500),", c.ColumnName);
                                    break;
                            }
                        }
                        #endregion
                    }
                    strSql = strSql.Trim(',') + ")";
                    #endregion
                    #region 执行 T-SQL 如果数据库表不存在则新建表,如果存在则不新建
                    using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))
                    {
                        sqlconn.Open();
                        System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();
                        command.CommandText = strSql;
                        command.ExecuteNonQuery();
                        sqlconn.Close();
                    }
                    #endregion
                    #region 向数据库表插入数据
                    using (System.Data.SqlClient.SqlBulkCopy sbc = new System.Data.SqlClient.SqlBulkCopy(connectionString))
                    {
                        sbc.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
                        sbc.BatchSize = 100;//每次传输的行数   
                        sbc.NotifyAfter = 100;//进度提示的行数   
                        sbc.DestinationTableName = DbTableName != "" ? DbTableName : sheetName;//数据库表名表名
                        sbc.WriteToServer(ds.Tables[0]);
                    }
                    #endregion
                }
                #endregion
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }
        #region 进度显示
        /// <summary>
        /// 进度显示
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void bcp_SqlRowsCopied(object sender, System.Data.SqlClient.SqlRowsCopiedEventArgs e)
        {
            e.RowsCopied.ToString();
        }
        #endregion
        #endregion
    }
    public class ToExcelModel
    {
        #region ToExcelModel自动属性
        /// <summary>
        /// 数据表
        /// </summary>
        public System.Data.DataTable DataTable { get; set; }
        /// <summary>
        /// 含Excel名称的保存路径 在pathType=1时有效。用户自定义保存路径时请赋值空字符串 ""。格式:"E://456.xlsx"
        /// </summary>
        public string excelPathName { get; set; }
        /// <summary>
        /// 路径类型。只能取值:0用户自定义路径,弹出用户选择路径对话框;1服务端定义路径。标识文件保存路径是服务端指定还是客户自定义路径及文件名,与excelPathName参数合用
        /// </summary>
        public string pathType { get; set; }
        /// <summary>
        /// 各列的列别名List string,比如:字段名为userName,此处可指定为"用户名",并以此显示
        /// </summary>
        public List<string> colNameList { get; set; }
        /// <summary>
        /// 要显示/排除的列,指定这些列用于显示,或指定这些列用于不显示。倒低这些列是显示还是不显示,由excludeType参数决定
        /// </summary>
        public List<string> excludeColumn { get; set; }
        /// <summary>
        /// 显示/排除列方式。 0为显示所有列 1指定的是要显示的列 2指定的是要排除的列,与excludeColumn合用
        /// </summary>
        public string excludeType { get; set; }
        /// <summary>
        /// sheet1的名称,要使期保持默认名称请指定为空字符串 ""
        /// </summary>
        public string sheetName { get; set; }
        /// <summary>
        /// 模版在项目服务器中路径 例:tp.xlsx 。当为空字符串 "" 时表示无模版
        /// </summary>
        public string TemplatePath { get; set; }
        /// <summary>
        /// 模版中已存在数据的行数,与TemplatePath合用,无模版时请传入参数 0
        /// </summary>
        public int TemplateRow { get; set; }
        /// <summary>
        /// 扩展 DataTable List 用于当上下两个及以上DataTable数据类型不一至,但又都在同一列时使用,要求格式与参数第一个 DataTable的列名字段名一至,仅字段类型可不同
        /// </summary>
        public List<System.Data.DataTable> exDataTableList { get; set; }
        #endregion
    }
    public class FromExcelModel
    {
        /// <summary>
        /// Excel文件路径(含文件名)
        /// </summary>
        public string excelFile { get; set; }
        /// <summary>
        /// sheet名<
        /// </summary>
        public string sheetName { get; set; }
        /// <summary>
        /// 存储到数据库中的数据库表名称
        /// </summary>
        public string DbTableName { get; set; }
        /// <summary>
        /// 对应表格的数据类型,如果为null,则为默认类型:double,nvarchar(500),datetime
        /// </summary>
        public List<string> columnTypeList { get; set; }
        /// <summary>
        /// 连接字符串 server=serverip;database=databasename;uid=username;pwd=password;
        /// </summary>
        public string connectionString { get; set; }
    }
}

调用示例:

/// <summary>
        /// 导出至Excel
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button1_Click(object sender, EventArgs e)
        {
            try
            {
                BLL.COMMON_UserInfo cu = new BLL.COMMON_UserInfo();
                List<Model.COMMON_UserInfo> cuiList = cu.GetModelList("");
                BLL.manager_log bll = new BLL.manager_log();
                DataSet ds = bll.GetList(10, "", "id");
                System.Data.DataTable dt = ds.Tables[0];
                List<string> colName = new List<string>() { 
                "用户ID",
                "用户名",
                "备注",
                "用户IP",
                "操作时间",
                "操作时间1",
                "操作时间2"
                };
                List<string> tt = new List<string>() { "action_type" };
                DataSet dss = bll.GetList(10, "", "id");
                List<System.Data.DataTable> dtss = new List<System.Data.DataTable>();
                dtss.Add(dss.Tables[0]);
                dtss.Add(dss.Tables[0]);
                dtss.Add(dss.Tables[0]);
                ExcelHelper.ToExcelForDataTable(dt, Server.MapPath("~").ToString() + "456.xlsx", "0", colName, tt, "2", "", "", 0, dtss);//指定了列别名,指定了要排除的列
                ToExcelModel tem = new ToExcelModel()
                {
                    DataTable = dt,
                    excelPathName = "",
                    pathType = "0",
                    colNameList = colName,
                    excludeColumn = tt,
                    excludeType = "0",
                    sheetName = "成功",
                    TemplatePath = "",
                    TemplateRow = 0,
                    exDataTableList = dtss
                };
                ExcelHelper.ToExcelForDataTable(tem);
            }
            catch (Exception ex)
            {
                FileLog.Log(ex.Message, "ExportExcelByDataTable");
            }
        }
/// <summary>
        /// 导入数据到数据库
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button2_Click(object sender, EventArgs e)
        {
            string excelFile = "G://123.xls";
            string sheetName = "Sheet1";
            string DbTableName = "test_new_table";// "test_new_table";
            List<string> columnType = new List<string>() { 
                "int",
                "nvarchar(100)",
                "decimal(18,2)",
                "nvarchar(100)",
                "datetime"
            };
            string connectionString = "server=.;database=Test1;uid=sa;pwd=zhangquan;";
            ExcelHelper.FromExcel(excelFile, sheetName, DbTableName, columnType, connectionString);
        }

[转载]Android的AsyncTask(异步任务) - yly123 - 博客园

mikel阅读(1016)

[转载]AsyncTask(异步任务) – yly123 – 博客园.

一、为了解决新线程不能更新UI组件的问题,Android提供了如下几种解决方案。

1)使用Handler实现线程之间的通信;

2)Activity.runOnUiThread(Runnable);

3)View.post(Runnable);

4)View.postDelayed(Runnable,long).

二、AsyncTask适用于简单的异步处理,不需要借助线程和Handler即可实现。AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask时需要指定如下三个泛型参数。

1)Params:启动任务执行的输入参数类型

2)Progress:后台任务完成的进度值的类型

3)Result:后台执行任务完成后返回结果的类型

三、实现AsyncTask实现步骤:

1)创建AsyncTask的子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,可将它指定为Void。

2)根据需要,实现AsyncTask的如下方法:

(1)doInBackground(Params…):重写该方法是后台线程将要完成的任务。该方法可以调用publishProgress(Progress… values)方法更新任务的执行进度。

(2)onProgressUpdate(Progress.. values):在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,将会触发该方法。

(3)onPreExecute():该方法将在执行后台耗时操作前被调用。通常该方法用于完成一些初始化的准备工作,比如在界面上显示进度条等。

(4)onPostExecute(Result result):当doInBackground()完成后,系统会自动调用0nPostExecute()方法,并将doInbackground()方法的返回值传给该方法。

3)调用AsyncTask子类的实例的execute(Params… params)开始执行耗时任务。

四、使用AsyncTask时必须遵守如下规则:

1)必须在UI线程中创建AsyncTask的实例。

2)必须在UI线程中调用AsyncTask的execute()方法。

3)AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params…)、onProgressUpdate(Progress.. values)方法,不应该由程序员代码调用,而是由Android系统负责调用。

4)每个AsyncTask只能被执行一次,多次调用将会引发异常。

10分钟学会做威客

mikel阅读(930)

什么是威客

威客的 英文Witkey是由wit智慧、key钥匙两个单词组成,也是The key of wisdom 的缩写,是指那些通过互联网把自己的智慧、知识、能力、经验转换成实际收益的人,他们在互联网上通过解决科学,技术,工作,生活,学习中的问题从而让知 识、智慧、经验、技能体现经济价值。

国内知名的威客网站有:
猪八戒威客网www.zhubajie.com
一品威客网:    www.epweike.com 
任务中国 :www.TaskCn.com
时间财富(威客中国):www.680.com

更多威客网站和教程可以访问威客宝(www.weikebao.com

威客网站的一般模式就是雇主发布任务,托管佣金到威客网站,然后威客按照任务要求提交自己稿件,雇主审核通过后支付佣金给威客,下面以我发布的一个威客任务为例讲解下如何做威客

1. 首先你需要到上面的威客网站注册账号
猪八戒威客网的注册地址:http://u.zhubajie.com/register/ 

2.注册完成后登录账号

3.可以根据任务分类做你擅长的任务, 比如设计logo、建设网站之类的,也可以做做转发微博、注册用户之类的计件任务,下面说下我发布的一个注册类的任务(http://task.zhubajie.com/4582497/)如何做

4. 按照任务要求里面的链接,注册用户,注意一定要看清任务要求的描述

5.注册成功后,按要求提交注册的用户ID和用户名,等待雇主审核 ,通过后佣金即可到你的猪八戒账户,然后你可以提现到银行卡

总结:
其实做威客对于想通过互联网赚钱的新手很适合做,没有技术门槛,每天做做发帖和转发注册类的任务,能赚到钱,总比那些刷量、培训的来得实在,虽然赚不到大钱,但是不至于上当受骗

[转载]discuz 模块模板标签说明 DIY模块模板语法详解 - 冰点の爱 - 博客园

mikel阅读(1093)

[转载]discuz 模块模板标签说明 DIY模块模板语法详解 – 冰点の爱 – 博客园.

基本语句

  • [loop]…[/loop]标签来循环显示模块中的数据;如果要在模板中多处循环可以使用[loop1]…[/loop1]的方式扩展(只能扩展1-9个)
  • [order=N]…[/order]标签来替代默认loop中的第N个位置数据的展示,你可以使用[order1=N]…[/order1]的方式来扩展(对应[loop1],只能扩展1-9个)
其中:[order=odd]为奇数行,[order=even]为偶数行
  • [index=N]…[/index]的方式来指定第N条数据的展示方式,由该语法指定的数据不再在loop循环中出现,可以通过[index1]…[/index1]的方式来扩展(只能扩展1-9个)以实现同一条数据多处展示

通用变量

  • 当前数据的链接地址:{url}
  • 当前数据的标题:{title}
  • 当前数据的图片地址:{pic}
  • 当前数据的简介:{summary}
  • 当前数据顺序:{currentorder}
  • 当前数据是否在奇数行:{parity},奇数行为1,偶数行为0
  • 可设置打开方式的链接:<a href=”{url}”{target}>{title}</a>
  • 可设置缩略图大小的图片:<img src=”{pic}” width=”{picwidth}” height=”{picheight}” />

特殊字段变量

  • 在PHP数据类的fields方法中定义的变量都可以使用,如帖子类有{author},{authorid},{forumname},{dateline}等等
变量只在[loop]、[order]、[index]标签内生效

百变幻灯片语法

幻灯片的HTML结构分为整体大结构和三个内部部分,你可以在自己的模板中使用,也可以在DIY模块模板中使用

整体大结构

  • 幻灯片的识别样式名为slidebox,可以使用任何容器类的HTML标签,如div,table等
  • 属性值
timestep 控制幻灯片播放的速度,单位是毫秒,默认是2500毫秒
slidenum 表示显示数量,默认是0
slidestep 表示每点击一次左右(上下)按扭 移动的个数,默认是0
当slidenum和slidestep同时有值时,幻灯片将不自动播放,需要配合左右(上下)按钮来实现变动

  • 必须的JS代码
<script type="text/javascript">
runslideshow();
</script>
  • 普通幻灯片示例代码
<div class="module cl slidebox" timestep="3000">
...
</div>
  • 列表显示示例代码
<div class="module cl slidebox" slidenum="4" slidestep="1">
...
</div>

主体显示部分

  • 识别样式名为slideshow,slideshow元素下的每一个子节点元素(非空白节点)将做为一个显示元素
  • 示例代码
<ul class="slideshow">
[loop]
<li style="width: {picwidth}px; height: {picheight}px;"><a href="{url}"{target}><img src="{pic}" width="{picwidth}" height="{picheight}" /></a><span class="title">{title}</span></li>
[/loop]
</ul>

控制部分

  • 识别样式名为slidebar、slidebarup、slidebardown
slidebar元素下的每一个子节点元素(非空白节点)将做为一个控制元素,
slidebarup为上一个按钮,slidebardown为下一个按钮,slidebarup和slidebardown这两个不是必须的

  • 属性值
mevent 控制元素鼠标响应事件,click或mouSEOver,默认为click

  • 示例代码
<ul class="slidebar" mevent="mouseover">
[loop]
<li>{currentorder}<li>
[/loop]
</ul>

附加显示部分

  • 识别样式名为slideother,一个幻灯片里可以有多个slideother,slidebar元素下的每一个子节点元素(非空白节点)将做为一个附加显示元素
  • 示例代码
<ul class="slideother">
[loop]
<li>{summary}<li>
[/loop]
</ul>
<ul class="slideother">
[loop]
<li>{avatar_big}<li>
[/loop]
</ul>

[转载]利用bloom filter算法处理大规模数据过滤 - waruqi - 博客园

mikel阅读(804)

[转载]利用bloom filter算法处理大规模数据过滤 – waruqi – 博客园.

Bloom Filter是由Bloom在1970年提出的一种快速查找算法,通过多个hash算法来共同判断某个元素是否在某个集合内。可以用于网络爬虫的url重复过滤、垃圾邮件的过滤等等。

它相比hash容器的一个优势就是,不需要存储元素的实际数据到容器中去来一个个的比较是否存在。
只需要对应的位段来标记是否存在就行了,所以想当节省内存,特别适合海量的数据处理。并且由于省去了存储元素和比较操作,所以性能也比基于hash容器的高了很多。

但是由于bloom filter没有去比较元素,只通过多个hash来判断唯一性,所以存在一定的hash冲突导致误判。误判率的大小由hash函数的个数、hash函数优劣、以及存储的位空间大小共同决定。

并且删除也比较困难,解决办法是使用其变种,带计数的bloom filter,这个这里就不多说了。

对于bloom filter算法的实现,相当简单:
首先分配一块固定的连续空间,大小是m个比特位(m/8+1个字节),然后再提供k个不同hash函数,同时对每个元素进行计算位索引。如果每个位索引对应的位都为1,则存在该元素,否则就是不存在。

可以看出,如果判断为不存在,那么肯定是不存在的,只有在判断为存在的时候,才会存在误判。

bloom filter主要的难点其实在于估算:
保证指定误判率的情况下,到底需要多少个hash函数,多少的存储空间。

首先来看下bloom filter的误判率计算公式:

假定有k个hash函数,m个比特位的存储空间,n个集合元素,则有误判率p:

p = (1 - ((1 - 1/ m) ^ kn))^k ~= (1 - e^(-kn/m))^k

根据这个,官方给出了一个计算k的最优解公式,使其满足给定p的情况下,存储空间达到最小:

k = (m / n) * ln2

把它带入概率公式得到:

p = (1 - e ^-((m/nln2)n/m))^(m/nln2)
简化为:

lnp = -m/n * (ln2)^2

因此,如果指定p,只需要满足如果公式,就可以得到最优解:

s = m/n = -lnp / (ln2 * ln2) = -log2(p) / ln2
k = s * ln2 = -log2(p)

理论值:

p < 0.1: k = 3.321928, m/n = 4.79
p < 0.01: k = 6.643856, m/n = 9.58
p < 0.001: k = 9.965784, m/n = 14.37
p < 0.0001: k = 13.287712, m/n = 19.170117

可以看出,这个确实能够在保证误判率的前提下,使其存储空间达到最小,但是使用的hash函数个数k
相对较多,至少也得4个,要满足p < 0.001,需要10个才行,这个对于字符串hash的计算来讲,性能损耗相当大的,实际使用中根本没法接受。

因此我们需要另外一种推到公式,可以认为指定p和k的情况下,来计算空间使用s=m/n的大小,这样我们在实际使用的时候,灵活性就大大提高了。

下面来看下,我自己推到出来的公式,首先还是依据误判率公式:

p = (1 - e^(-kn/m))^k

假定s=m/n,则有

p = (1 - e^(-k/s))^k

两边取导,得到:

lnp = k * ln(1 - e^(-k/s))

交换k:

(lnp) / k = ln(1 - e^(-k/s))

重新上e:

e^((lnp) / k) = 1 - e^(-k/s)

化简:

e^(-k/s) = 1 - e^((lnp) / k) = 1 - (e^lnp)^(1/k) = 1 - p^(1/k)

再求导:

-k/s = ln(1 - p^(1/k))

得出:

s = -k / ln(1 - p^(1/k))

假定c = p^(1/k)

s = -k / ln(1 - c)

利用泰勒展开式:ln(1 + x) ~= x - 0.5x^2 while x < 1 化简得到:

s ~= -k / (-c-0.5c^2) = 2k / (2c + c * c)

最后得出公式:

c = p^(1/k)
s = m / n = 2k / (2c + c * c)

假定有n=10000000的数据量,则有理论值:

p < 0.1 and k = 1: s = m/n = 9.523810
p < 0.1 and k = 2: s = m/n = 5.461082
p < 0.1 and k = 3: s = m/n = 5.245850, space ~= 6.3MB
p < 0.1 and k = 4: s = m/n = 5.552045, space ~= 6.6MB

p < 0.01 and k = 1: s = m/n = 99.502488
p < 0.01 and k = 2: s = m/n = 19.047619
p < 0.01 and k = 3: s = m/n = 12.570636, space ~= 15MB
p < 0.01 and k = 4: s = m/n = 10.922165, space ~= 13MB

p < 0.001 and k = 1: s = m/n = 999.500250
p < 0.001 and k = 2: s = m/n = 62.261118
p < 0.001 and k = 3: s = m/n = 28.571429, space ~= 34MB
p < 0.001 and k = 4: s = m/n = 20.656961, space ~= 24.6MB

p < 0.0001 and k = 1: s = m/n = 9999.500025
p < 0.0001 and k = 2: s = m/n = 199.004975
p < 0.0001 and k = 3: s = m/n = 63.167063, space ~= 75.3MB
p < 0.0001 and k = 4: s = m/n = 38.095238, space ~= 45.4MB
p < 0.0001 and k = 5: s = m/n = 29.231432, space ~= 24.8MB

可以看到,在k=3的情况下,其实已经可以达到我们平常使用所能的接受范围内了,没必要非得
使用最优解,除非在空间使用极为苛刻的情况下,而且这个公式,针对程序空间使用的调整,更加的灵活智能。

特别提下,经过实测,如果每个hash的实现非常优质,分布很均匀的情况下,其实际的误判率比理论值低很多:

就拿TBOX的bloom filter的实现做测试,n=10000000:

p < 0.01 and k = 3的情况下,其实际误判率为:0.004965
p < 0.001 and k = 3的情况下,其实际误判率为:0.000967

所以好的hash函数算法也是尤为的重要。

下面来看下TBOX提供的 bloom filter的使用,用起来也是相当的方便:

// 总的元素个数
tb_size_t count = 10000000;

/* 初始化bloom filter
 *
 * TB_BLOOM_FILTER_PROBABILITY_0_01: 预定义的误判率,接近0.01
 * 注:由于内部使用位移数来表示:1 / 2^6 = 0.015625 ~= 0.01
 * 所以实际传入的误判率,有可能稍微大一点,但是还是相当接近的
 *
 * 3:为k值,hash函数的个数,最大不超过15个
 *
 * count:指定的元素规模数
 *
 * tb_item_func_long():容器的元素类型,主要是用其内定的hash函数,如果要自定义hash函数,可以替换:
 *
 * tb_size_t tb_xxxxxx_hash(tb_item_func_t* func, tb_cpointer_t data, tb_size_t mask, tb_size_t index)
 * {
 *      // mask为hash掩码,index为第index个hash算法的索引
 *      return compute_hash(data, index) & mask;
 * }
 *
 * tb_item_func_t func = tb_item_func_long();
 * func.hash = tb_xxxxxx_hash;
 *
 * 来进行
 */
tb_bloom_filter_ref_t filter = tb_bloom_filter_init(TB_BLOOM_FILTER_PROBABILITY_0_01, 3, count, tb_item_func_long());

if (filter)
{
    tb_size_t i = 0;
    for (i = 0; i < count; i++)
    {
        // 产生随机数
        tb_long_t value = tb_random();
        
        // 设置值到filter内,如果不存在,则返回tb_true表示设置成功
        if (tb_bloom_filter_set(filter, (tb_cpointer_t)value))
        {
             // 添加元素成功,之前元素不存在
             // 不会存在误判
        }
        else
        {
             // 添加失败,添加的元素已经存在
             // 这里可能会存在误判
        }
        
        // 仅仅判断元素是否存在
        if (tb_bloom_filter_get(filter, (tb_cpointer_t)data)
        {
             // 元素已经存在
             // 这里可能会存在误判
        }
        else
        {
             // 元素不存在
             // 不会存在误判
        }
    }
    
    // 退出filter
    tb_bloom_filter_exit(filter);
}

// 常用预定义的误判率,也可以指定其他值,注:必须是位移数,而不是实际值
typedef enum __tb_bloom_filter_probability_e
{
    TB_BLOOM_FILTER_PROBABILITY_0_1         = 3 ///!< 1 / 2^3 = 0.125 ~= 0.1
,   TB_BLOOM_FILTER_PROBABILITY_0_01        = 6 ///!< 1 / 2^6 = 0.015625 ~= 0.01
,   TB_BLOOM_FILTER_PROBABILITY_0_001       = 10 ///!< 1 / 2^10 = 0.0009765625 ~= 0.001
,   TB_BLOOM_FILTER_PROBABILITY_0_0001      = 13 ///!< 1 / 2^13 = 0.0001220703125 ~= 0.0001
,   TB_BLOOM_FILTER_PROBABILITY_0_00001     = 16 ///!< 1 / 2^16 = 0.0000152587890625 ~= 0.00001
,   TB_BLOOM_FILTER_PROBABILITY_0_000001    = 20 ///!< 1 / 2^20 = 0.00000095367431640625 ~= 0.000001
        
}tb_bloom_filter_probability_e;

一切不以用户为中心的O2O 都是耍流氓

mikel阅读(787)

今天去万达广场逛街,手机搜了下附近的Wifi,发现有万达的免费Wifi,想起前些日子网上说万达要做O2O的试运营,于是尝试连接了下,结果弹出页面,要输入手机号,然后发送验证码才能登陆,结果输入手机号,等了60秒,短信验证码还没过来!结果自动断线了!

让我这些想尝鲜儿的用户,情何以堪?!

于是又连接,还是那个手机验证码页面,既然收不到验证码,有没有其他方法,还好提供了一个客户端下载的连接,点击后手机开始下载,杯具从此开始!下载到80%多,Wifi又到时了,然后重新连接,结果不能续传下载,又从头下载!这次到90%多超时!

既然要搞O2O总得拿出点儿诚意来吧? 用户注册不能注册,下载个客户端你都不让下载完?!你真的就缺那几秒的wifi流量?!

用户还没体验呢,更谈不上用户体验了!

一切不以用户为中心的O2O 都是耍流氓!到时候赚了眼球儿,成了摆设儿!

[转载]如何让无线路由器刷DD-WRT系统(含wifidog功能)? | 摇钱树官方网站 -您真正的网吧管理专家

mikel阅读(779)

[转载]如何让无线路由器刷DD-WRT系统(含wifidog功能)? | 摇钱树官方网站 -您真正的网吧管理专家.

如何给路由器刷DD-WRT固件?

首先确定您的路由器是否支持DD-WRT,您可以在百度中搜索路由器型号+DD-WRT (如:D-link 615 DD-WRT)根据结果来判断是否支持刷固件。
您也可以在DD-WRT官方网站来查询
http://www.dd-wrt.com/site/support/router-database
在输入框中输入你的路由器型号 如: tp-  就会显示出tp-link 相关列表来
如果后边显示yes  就说明该路由器支持dd-wrt

DD-WRT(简称DD)是一个Linux开源操作系统,实质它是第三方的路由器固件。路由和网管功能非常强大,通常我们使用的路由器设备,都具有一个独 立的操作系统(英文简称OS),用于对路由器设备进行各种功能设置和管理。其实我们通常所说的升级路由器固件,也就是指升级刷新路由设备里面的操作系统, 以使得路由器设备的功能更加强大。常见的第三方路由器固件还有番茄(Tomato)等。DD-WRT固件刷机流程如下。

一、为什么要刷DD-WRT?

DD-WRT固件可以实现中继、AP、VPN、VOIP、UPNP、DHCP、端口映射、DDNS、IPv6、SNMP、SSH、计费功能、封杀BT、VLAN划分、调整无线信号发射功率等扩展功能。

二、DD-WRT收费吗?

常规版本都不用收费,但也是特别版需要付费。付费版功能更加强大。如:PPPoE验证、ARP欺骗等。

三、哪些路由器可以刷DD-WRT固件

1、支持刷DD-WRT的路由器种类很多,可以参考官方的硬件支持列表。主要是Broadcom芯片方案的路由器,其他的的也有支持,但是并不是很多。

2、首先要了解自己的路由器是否支持DD-WRT、支持那种版本的DD-WRT。其次刷固件方式,如有特殊说明,一般都会有提示。如有一些路由器就提到只能使用TFTP方法刷,否则有可能不成功!

3、DD-WRT的MINI(迷你版)和STD(标准版)固件大小差不多,Flash(闪存)通常在4M或8M就可以刷标准版或增强版的固件。如果你 FLASH(闪存)有8MB的话当然是刷MEGA(完整版)好。对于新手你可以先刷好MINI(迷你版)再升级到其他版本,STD(标准版)固件支持的功 能要比MINI(迷你版)的多。

版本介绍:
Micro(最小版) 需要 2MB FLASH
Mini(迷你版) 需要 4MB FLASH
Standard(STD标准版) 需要 4MB FLASH
VOIP(VOIP功能版) 需要4MB FLASH
Mega(完整版) 需要 8MB FLASH

四、需要哪些设备或工具

刷路由器通常不需要特殊设备,电脑一台、网线一根、路由器一台即可。而且大部分路由器刷固件都可以在Web界面进行。

五、固件刷新方法种类

1、路由器自带的Web配置界面刷固件。

2、使用TFTP方法刷。

具体使用那种方法新,请参照DD-WRT硬件支持列表的方法。不过一旦升级到了DD-WRT,以后更新的时候可以通过Web界面进行。

六、采用Web方法刷

确认自己的路由器可否使用Web方式刷新,当然大部分路由器都可以这样做。Web方式刷新其实就是路由器设置菜单里面的“更新路由器固件”功能。虽然不是更新同厂的固件,但是也是可以用的,这种升级方式最为方便。

1、确认路由器支持DD、没有特别刷新方法的说明。本教程是以Linksys WRT150N V1 无线路由器为例。

2、下载适合路由器的固件版本。通常都会支持中文或其他网友发布的汉化。最好准备一份路由器的原厂固件,以备恢复时使用。

注意:如果想要下载最新版本,可以进入Feko目录下载,不过这个目录里的固件不是最终版,属于SVN(Subversion)。如果不是为了尝新或者路由器有兼容问题,建议还是不要这么做了。

3、登录Linksys的管理界面→固件升级,点击“浏览”找到下载的DD-WRT固件。这款路由器提供两种升级方式,一种是常规的“升级”,一种是“安全升级”(见下图)。

4、后者将进入Boot模式将新的固件加载到路由器上,优点是可以避免内存不足而造成的失败。

5、如果提示刷新失败,建议重启路由器再进行刷新。如果重启后还是失败,那么就得分析具体原因了,看看是不是版本不合适引起的。例如是不是固件太大了,超过路由器的容量等。

注意:下载的DD固件通常是bin为扩展名,如果路由器不支持这种格式升级,可以尝试修改扩展名为支持的类型;强烈建议大家使用有线连接路由器的方式刷新;刷新期间不要关闭路由器电源,一直要等刷新结束再进行操作。

七、采用TFTP方法刷

TFTP是Windows内置的一个命令。在命令提示符下进行操作。使用TFTP刷新请用网线把电脑和路由器的LAN口相连接。

1、确认路由器支持DD,且只能用TFTP的刷新方法。然后根据路由器型号、下载对应的DD固件版本。某些路由器刷DD使用TFTP有特别说明,一定要看仔细。

2、在开始菜单中选运行然后输入CMD并回车进入命令提示符。输入ipconfig /all了解当前的路由器的IP地址,一般默认都是 192.168.1.1。建议手动分配一个地址。防止重启后IP发生变化。请设置电脑和路由器在同一个网段,例如192.168.1.2。然来将dd- wrt.bin固件文件放到C盘的根目录。

3、假设路由器IP是192.168.1.1,输入命令ping 192.168.1.1 -t并回车看通不通得了,通了就OK。然后重启路由器(通过Web界面)。

4、因为需要在启动的时候刷新,所以先输入tftp -i 192.168.1.1 put dd-wrt.bin,但是先不要敲下回车键。

5、重启路由器(有的路由器非要使用Reset按钮才能进入TFTP模式),按下回车。也有一种说法是看路由器指示灯,当所有指示灯一闪而灭的瞬间,按下 回车输入命令。成功之后会出现successful的提示,如果失败就再来一次。出现successful之后,还需要你耐心等待几分钟,不要进行任何操 作。

八、刷新失败怎么办?

先断开电源重启、按复位(Reset)键等操作看有没有变化。如果没有变化,试试看用TFTP法刷新。如果还不行,可以去买一条路由器相配套的JTAG线,通过它可以把路由器救活。淘宝有些卖家在质保期内也会提供免费救活服务。

PS: DD-WRT里不要盲目加大功率,毕竟信号太强会对身体有伤害。如果信号够用还可以适当降低标准信号功率,从而减少无线信号对人体的辐射。对有些 路由器作用并不大,反而是增加无线干扰或导致无线网卡损坏导致经常断线和无信号,而且这种损害是不可逆的和不能修复的,坏了就成砖头,有可能导致路由报 废。请大家切记!

刷机有风险,升级请慎重!

 

[转载]Ecshop后台分页原理详解_Tomener_新浪博客

mikel阅读(981)

[转载]Ecshop后台分页原理详解_Tomener_新浪博客.今天仿照后台评论列表来研究了一下Ecshop后台的分页功能,取得成功!
comment_manage.php

//-- 获取没有回复的评论列表

if ($_REQUEST['act'] == 'list')
{
   
    admin_priv('comment_priv');

    $smarty->assign('ur_here',      $_LANG['05_comment_manage']);
    $smarty->assign('full_page',    1);

    $list = get_comment_list();

    $smarty->assign('comment_list', $list['item']);
    $smarty->assign('filter',       $list['filter']);
    $smarty->assign('record_count', $list['record_count']);
    $smarty->assign('page_count',   $list['page_count']);

    $sort_flag  = sort_flag($list['filter']);
    $smarty->assign($sort_flag['tag'], $sort_flag['img']);

    assign_query_info();
    $smarty->display('comment_list.htm');
}


//-- 翻页、搜索、排序

if ($_REQUEST['act'] == 'query')
{
    $list = get_comment_list();

    $smarty->assign('comment_list', $list['item']);
    $smarty->assign('filter',       $list['filter']);
    $smarty->assign('record_count', $list['record_count']);
    $smarty->assign('page_count',   $list['page_count']);

    $sort_flag  = sort_flag($list['filter']);
    $smarty->assign($sort_flag['tag'], $sort_flag['img']);

    make_json_result($smarty->fetch('comment_list.htm'), '',
        array('filter' => $list['filter'], 'page_count' => $list['page_count']));
}

一般都有一个获取数据的方法,这里是get_comment_list()
这个里面我们讲讲 page_and_size这个方法

    $filter['record_count'] = $GLOBALS['db']->getOne($sql);
   
    $filter = page_and_size($filter);

通过这个方法获取:page_size,page,page_count,start
其中,page就是当前第几页,start是用于查询语句里面limit限制的 limit start page_size(示范代码)

我就是主要讲讲,filter,我们称之为过滤器,这个其实就是模板页面下面js显示的,如下:

listTable.filter.keywords = '0';
listTable.filter.sort_by = 'add_time';
listTable.filter.sort_order = 'DESC';
listTable.filter.record_count = '19732';
listTable.filter.page_size = '15';
listTable.filter.page = '1';
listTable.filter.page_count = '1316';
listTable.filter.start = '0';

这些会在listtable.js里面listTable.compileFilter方法作用下,生成如:keywords=0&sort_by=add_time这样的形式,通过POST方法发送给if ($_REQUEST[‘act’] == ‘query’)所以,我们可以用$_REQUEST[‘keywords’]来获得
……………………………………………………………………………………..
模板是comment_list.htm
要说的是js
{insert_scripts files=”../js/utils.js,listtable.js”}
listTable就是实现翻页的脚本

  listTable.recordCount = {$record_count};
  listTable.pageCount = {$page_count};
 
  {foreach from=$filter item=item key=key}
  listTable.filter.{$key} = '{$item}';
  {/foreach}

绿色虚线框里面是必须写的,现在之后就是上面蓝色框里面的内容

模板里面还要主要的就是{if $full_page},不要忘写了,参考comment_list.htm

Ecshop后台分页规则 Ecshop后台分页原理 Ecshop后台分页代码详解 Ecshop后台分页原理详解
Ecshop后台分页原理详细解释

[转载]destoon开启邮件发送功能详解_安妮的仙境_新浪博客

mikel阅读(920)

[转载]destoon开启邮件发送功能详解_安妮的仙境_新浪博客.

当没有开启邮件发送功能时在后台的网站设置–》邮件发送下开启。

1.使用126、163、QQ等第三方电子邮箱

8dc13ec5x79cce8582a5a&690

2.其中

163的smtp服务器为 smtp.163.com
126的smtp服务器为 smtp.126.com
QQ的smtp服务器为 smtp.qq.com

测试收件人那里可以填写一个可以用的邮箱测试能否发送成功!

2、通过Linux的mail函数发送

请先咨询服务器管理员,确定sendmail已经配置成功。
发送方式选择 通过PHP mail 函数发送(通常为Unix/Linux 主机)

3、Winwebmail

发送方式选择 通过SMTP SOCKET 连接 SMTP 服务器发送(支持ESMTP验证)
SMTP服务器是否验证 选择否(需要在Winwebmail的SMTP发信设置里添加服务器IP为信任IP)

4.Gmail发送邮件配置方法

目前大部分新申请的免费邮箱不支持smtp发信,对于没有独立服务或者没有企业邮局的用户,可以尝试使用Gmail发信。

首先,PHP配置需要支持OpenSSL,可以在后台起始页 服务器信息->详细信息里查看

如果可以看到 OpenSSL support  enabled,说明支持ssl连接

进入网站设置 邮件设置

发送方式 选择 通过SMTP SOCKET 连接 SMTP 服务器发送(支持ESMTP验证)
邮件头的分隔符 选择 使用 CRLF 作为分隔符(通常为Windows主机)
SMTP服务器 填写 ssl://smtp.gmail.com
SMTP端口 填写 465
SMTP服务器是否验证 选择 是
邮箱帐号 填写 您的gmail地址(xxx@gmail.com)
邮箱密码 填写 您的gmail密码
发件人邮箱 填写 您的gmail地址

测试是否发送成功。

当然如果用QQ邮箱测试时候一定要在QQ邮箱里开启SMTP服务的。

在设置–》账户—》POP3/IMAP/SMTP/Exchange服务这里开启。

8dc13ec5xc20131e79ce7&690

如果设置失败可能是一下原因:

– 发送方式选择错误
– SMTP服务器地址或端口填写错误
– 邮件帐号或密码填写错误
– 服务器上防火墙或杀毒软件阻止了邮件发送

-服务器不支持邮件发送(这就需要联系空间商)