android插入大批量数据缓慢的问题

在公司负责的android项目,初始化从服务端同步数据时,需要向sqlite中插入大约8000条数据,导致应用启动过慢,大约需要10-20分钟时间。

android使用的是sqlite数据库,sqlite是比较轻量级的数据库,性能不及mssql、oracle等,在Google了之后发现,sqlite事务处理的问题,在sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。我的应用初始8000条记录也就是要8000次读写磁盘操作。

解决方法:

添加事务处理,把8000条插入作为一个事务

aspx最小化html 压缩html 去空字符

对网站的代码、资源的压缩,可以提高网站打开速度,减少请求次数,节省流量,提高用户体验等,好处肯定多了 最重要的是不用花一分钱。

我一直觉得一个优秀的站长,一定不能是开发者。我个人就是身有所处,开发者总希望把自己的程序优化到极致,无止尽的折腾,不断的最求完美。虽然说是细节可以决定成败,其实更多时候任何优化都不是关键,时机才是最重要的。说了这么多,又跑题了。。。

压缩包括web服务器的压缩,比如iis6,7就有动态压缩 静态压缩gzip,其实那些都是web服务器和解析的浏览器之间的压缩方式,如果你是个coder,当然还可以进一步的压缩。

之前应该介绍过使用AjaxMin,YUICompressor.NET等工具压缩css和js等文件(不记得是否真写过了)。至于html的压缩,在C#方向的资源比较少见,大家可以看ikanman.com,右键查看源代码,里面的html代码是没有任何空字符比如换行、空格和注释文字的,其实源码里面当然有 不然怎么看得懂呢。

原来我是用的是用正则的方式来去除空字符,代码如下:

如果希望压缩aspx自动输出的html代码,可以覆盖Render方法来实现,代码如下:

注意#if !DEBUG的功能是在web.config里的debug=false的时候才去空格,这样可以在开发环境看到正常的代码。

但是处理的页面多了以后发现正则不那么好处理,因为html中代码注释的情况很多有的如下

这些格式的代码也会被错误的过滤掉。于是发现了google code上有一个叫htmlcompressor开源项目,非常好用项目地址:https://code.google.com/p/htmlcompressor/,遗憾的是没有c#版本,只支持php和java,只好自己改了一个。用法如下:

是不是很方便呀,还有很多高级选项可以设定呢。详细用法请在官网查看吧!

SqlServer2012新函数TRY_CONVERT不存在的问题解决

今天开发中在select列中使用convert把字符串转换成日期格式,有些字符串转换会报错,造成翻页翻着翻着就会500错误,由于需要生日字符串转换年龄还要排序,所以又无法在c#李转换.

我想c#里有tryparse,sql里搞不好也有。好在发现了有TRY_CONVERT 函数的存在,运行语句测试报错:

问题描述.
我们在SQL Server Management Studio中对数据库在SQL Server2012实例,试图运行下面的SELECT语句时:

SELECT TRY_CONVERT(date, ‘birthday’)

接收到服务端报错:(我是英文数据库服务器,中文可能是该函数没有定义)

Msg 195, Level 15, State 10, Line 1
‘TRY_CONVERT’ is not a recognized built-in function name.

 

造成原因.

这个sql语句不能够运行在 SQL Server 2005 (90)或SQL Server 2008 (100)的兼容级别.

 

解决办法.

数据库上右键, 选择属性, 然后切换到选项页, 修改数据库的兼容级别为sql2012( 110).

修改兼容级别到110后, 查询就可以成功了.

 

另外,如果没有权限进入数据库属性设置页的话,也可以通过sql命令修改:

htc one/m7 最新固件Firmware 3.57.401.500修改版(开机无红字)

htc one/m7开发者版发布了sense5.5,   ARHD 30就是基于这个RUU,为了配合这个RUU稳定使用,强烈建议把固件刷到3.57.401.500版。

最新HBOOT修改版固件 ( 3.57.401.500 没有红色警告文字 )

https://www.dropbox.com/sh/6y7ax3jru…b/firmware.zip

需要注意的是,modelid和cidnum必须对应你的机器,我的modelid是:PN0711000也就是大家常说的台版,如果你需要刷的机器不同请在固件包中android-info.txt文件修改这两个值.

不同的牛丸版本所对应的modelid和cidnum可以在以下链接中找

http://forum.xda-developers.com/showthread.php?t=2182823

刷固件必须: S-OFF

去掉了开机时如下的红字警告

This build is for
development purposes only
Do not distribute outside of HTC
without HTC’s written permission.
Failure to comply may
lead to legal action.

这不是什么创新,每个人都可以自己改,只是为了方便大家!!!

刷新的步骤:

—–

-需要用到adb和fastboot命令
—–

首先将手机连接USB,在命令行下输入

—– 手机重启—

再输入:

接着再输入:


 

注意:执行此命令后手机会进入黑屏中间一个银色HTC标志,和刷新官方RUU时一样。
注意:如果这个命令执行失败死机了,只要拔下USB接口,同时按住音量减和电源直到手机重启。然后,再次重复上述步骤。

最后:

命令行执行如下:

 

上面居然“FAILED”,不要急~重复相同的命令:

 

执行结果如下:

 

注意:这时手机屏幕的绿色进度条就算没有到100%,也不用去管它…一切都OK。

最后一步:

手机成功重启进入系统,然后再重启到到bootloader模式:

检查你的固件升级是不是成功:

开启sense5.5 归属地 IP拨号 国内天气源 等等国行功能

sense5.5将系统框架定义做到了system\customize\ACC\default.xml里,大家打开这个xml;

搜索:
<item type=”integer” name=”region”>3</item>
这个地区设定即可设定rom的框架属性,是国行就为3,国际版为6、0等等其他的数字,具体还没研究,但国行肯定是3,这样国内天气源、IP拨号、通话录音等一些功能就都打开了,当然2G也能更新天气了~

<item type=”integer” name=”sku_id”>29</item>
我曾在微博上咨询过HTC技术,到了sense5以后,HTC用sku_id定义替代了原来的project定义,意味着修改这个可以转换网络模式了,比如你要打开H+等仅对中国联通开启的符号,联通的代号是1d(16进制),转换成10进制就是29;
很多人问我发的那个全是代码的微博是什么意思,就是这个意思,那是不同运营商的sku_id代码;国外的兄弟们可以根据这个自己来改网络模式

<item type=”boolean” name=”support_minor_quicksettings”>true</item>
这是打开下拉菜单顶部那个一行快速设置,会显示全部快速设置的前5个;而全项快速设置可以自己设定~~

<item type=”integer” name=”cityidinfo_support_type”>1</item>
一看就知道是归属地支持啦~~~这个设置为1就打开归属地支持了,很方便了吧,但还需要手动添加system\app\CallerLocation.apk那个归属地数据库,国际版的rom里是没有这个数据库的,很多民间rom这个数据库叫googlelocation.apk,因为我最早做出归属地时为了防止用户误删这个apk就改成了google开头的文件,结果很多来搬运归属地的romer直接就搬运过去了,导致后来这个名字也快普及了~~

还有,如果你按照我上面的修改后,会发现国行的一些特点,如E下面的小对勾,左上角的apn状态信息(小箭头)也都出来了,没办法,国行就这样子,需要单独修改apk进行关闭,相信有一定基础的人应该知道怎么关闭了,原理和之前发的教程一样,但具体修改可能有所变化~~~

很遗憾短信归属地不再这里控制,需要手动打开,从代码中看到短信归属地只对电信版rom打开,这应该是老代码一贯的设定,到了sense5.5并没对短信归属地进行修改就延留下来了,短信归属地的修改可参考我的rom里apk的修改。。。相信简单对比就明白了。。不难~~~

转至机锋版主:机锋★大款小总

 

 

Oracle中存储过程传入按逗号分割的数值参数时报错的问题

前两天写存储过程,需要用到多参数传入,传入的参数是给一个select语句的where条件使用的。
但是写的时候遇到一个麻烦的问题,这个where条件的参数必须是number型的,而且使用的是in,也就是多个参数,比如select * from table_name_1 where id in (1,2,3,4,5),其中的1,2,3,4,5即是通过存储过程的参数传入的。
这里有个问题,如果在sql中,where id in (1,2,3,4,5)这条语句会认为1,2,3,4,5是五个单独的number型,而不会将其作为一个字符串。但是如果在存储过程中作为一个整体的参数进行传入时,即会将1,2,3,4,5判定为‘1,2,3,4,5’,而’1,2,3,4,5’是一个字符串,这时候sql执行的实际上是select * from table_name_1 where id in (‘1,2,3,4,5’),而id是一个number型的,这时候就会报错。
原存储过程大致如下:

如上述的存储过程,由于传入的参数an_id是一个number型的,如果是一个单独的数字,过程执行没有问题,但如果是一个字符串,如’1,2,3,4,5’,这样就会报错,因为’1,2,3,4,5’是一个varchar。
如果将传入的参数an_id 改为varchar型的,如create or replace procedure test_prc(an_id in varchar),这时候虽然在传入的时候类型一致了,但是在执行select语句时——where id in (an_id),由于表table_name_1的id列是number型的, 传入的实际上是’1,2,3,4,5’,这时候,也会报错。
这种情况据我所知可以有两种方法来解决,第一种是使用动态sql;第二种是使用instr函数来解决。有的朋友使用的是动态sql,我没使用这种方法,第一是自己不太会写,第二是觉得太繁琐。这里重点说的是使用instr函数。以后可能也会尝试使用动态sql来试试看,到时候再来更新吧。
其实使用instr函数也没有什么多说的,仔细看懂了理解了就行了,先贴出结果吧。

INSTR函数是个字符串搜索函数,默认情况下有两个参数:instr(string,set),用于在string中寻找set的位置,如果找到,返回set子串的第一个字符的位置,如果没有找到,则返回0。
之所以在开始和结束都加上’,’,是为去掉当查询11的时候,会将1和11都取出来。
至此,问题解决。

HTC one m7 android4.3本地化刷机包

一直以为目前为止牛丸的4.3都是android原生界面的版本。今天逛xda时发现mike1986大侠发布了[ROM] Android Revolution HD 22.1 ,原来的官方4.2.2的下载链接都去掉了,仔细看了看他的帖子,原来这个22.1版是基于牛丸开发者版sense4.3定制而来的,既然是官方推出的果断升级,毕竟ARHD系列非常的稳定,几乎从来不会拿非官方的版本改。

刷了之后觉得速度明显快了,唯一美中不足的是拨号归属地没有了。于是乎跟往常一样去机锋找,找了半天没有找到本地化的包,只有rom,xiaolu大侠也没有发布4.3的本地化包:)

只好找了个rom提取他的拨号归属地apk自己签名打包,需要的拿走。

适用于htc one m7 android4.3显示来去电归属,ip拨号,拨号面板去网格等等

m7 4.3归属地刷机包

 

感谢这个rom的作者【10.8-N-team-溜达ROM】HTC-One Android4.3 ARHD22本地化 带工具箱LD15

谈谈C#验证码识别的方法集合

前段一直没有时间维护博客,还是因为太懒了只当它是一个wordpress的文具,其实工作生活记录一下没有什么不好。

个人项目中需要验证码识别,所以研究了一阵子,图像识别是c#的弱项。到互联网飞速发展的今天,验证码识别已经没当初那么简单了。

使用c#有以下几种识别方式:

tesseract-ocr

这是一个开源项目,项目地址:https://code.google.com/p/tesseract-ocr/。现在已经被google接手。当前最新的是3.02版,支持多个平台。需要注意的是安装了之后还需要下载与版本对应的语言包放到安装目录,默认设置下的识别能力一般,但是可以通过学习训练来得到最优的配置,具体设置方法请参阅wiki

windows平台下面可以通过cmd调用

执行识别图像的命令格式为:
tesseract .exe [-l lang]
Imagename: 需要识别的图片文件名
outputname: 输出结果txt文件名,用来存放识别出来的文字结果
lang: 使用的文字字库,根据要识别的文字类型来选择。
例如:输入命令:tesseract.exe 6.jpg 6 –l chi_sim

遗憾的是web用户调用cmd需要特殊权限,对于安全性是不好的

2 Asprise OCR

最新的是Asprise OCR v4.0 for C# [C Sharp] .NET,官网在http://asprise.com/product/ocr/index.php?lang=csharp。这不是一个开源项目,好在伟大的天朝到处都是破解版可以下载。没有繁琐的学习和训练,dll是由c++编译的,c#调用方便。如果是web项目甚至可以不用把dll放在项目里面。数字和字母的识别率挺高的。

调用方式:

需要注意的是代码里虽然只调用了一个AspriseOCR.dll,但是同一目录下还需要放另外2dll个哦。我在win7+vs2012+iisexpress环境测试成功,server上失败,也许是dll版本和系统不匹配

3 Tessnet2

Tessnet2 a .NET 2.0 Open Source OCR assembly using Tesseract engine 项目地址:http://www.pixel-technology.com/freeware/tessnet2/ 。其实就是前面说的tesseract-ocr 旧版本2.0的。net版。可以直接集成到framework2.0的web项目,同样需要下载语言包,语言包也在tesseract-ocr地址里下载,但是版本号一定要对应,也就是说只能使用tesseract-ocr 2的语言包。

4 自己写代码处理验证码图像,这个不详细讲了,通用性不高。也可以把图片简单处理后采用前面的方式来识别,提高成功率。


 

总结:不管使用什么识别工具,都存在一个识别率的问题,一句话没有百分之百的识别。还是要具体情况具体分析:

如果你想做一个qq空间游戏外挂,个人建议还是把验证码request下来给用户输吧,我相信没有人会为了少输一个验证码而容忍连续失败10次的登录(这个可是经常会有);

如果你想做的是自动化暴力的http post,比如自动注册机,不在乎失败反正挂在那循环。。。你应该采用验证码识别技术。

分享经验只为节省大家的时间:)

php网站搬家引起的”syntax error unexpected $end”解决办法

由于美国服务器访问速度太慢,今天把wordpress程序迁移到韩国的win服务器,在iis7下报错。于是在wp-config.php中打开调试发现如下错误:

Parse error: syntax error, unexpected $end in ……

出错的位置在文件的最后一行,”?>”,网上查说是php语言使用不规范引起的,有的地方开头使用”<?php”,有的地方用”<?”,造成匹配问题。

后来在iis7的php manager插件中编辑php配置就解决了,原因可能是php.ini的默认配置不支持一些wordpress的插件吧!可以在图形界面下修改,也可以找到该文件手动修改。

网上查到相同的问题,并附上原因,摘抄如下:

报错的原因是:集成安装环境包默认的情况下不支持 PHP 短标签
解决办法:打开 php.ini ,找到 short_open_tag = Off 这一行,将 Off 修改为 On,保存退出,重启 Apache 就可以了。

详细的错误分析:

In PHP 5, the following error may appears as an error entry in Apache error log or simply displays on PHP web page, even if calling to php scripts with php_info() works perfectly and successfully returns information on PHP configurations:
Parse Error: syntax error, unexpected $end in ….. scripts.php on line …
The error may caused by a missing curly bracket in PHP script coding. Beside, it may also caused by error in PHP coding in class definition, as in PHP, a class definition cannot be broke up and distributed into multiple files, or into multiple PHP blocks, unless the break is within a method declaration.
But more commonly, the error is often caused by the use of Short Open tags in PHP, To use short open tags, it must be enabled in PHP.INI. Search for short_open_tag in PHP.INI, and change the value to On. The line should look line:
short_open_tag = On

web.config SessionState配置详解

2个.net应用部署在windows 2003 server服务器iis下面的9005端口下.使用各自独立的application pool,其<sessionState/>配置节配置为相同的

,windows 2003 server的asp.net state service服务已启动,运行稳定.
1.如果发生”Unable to serialize the session state. In ‘StateServer’ and ‘SQLServer’ mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in ‘Custom’ mode(无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。)”异常,请检查Session中存储的自定义对象是否都已进行[Serializable]标识;
2.如果发生”[0]Session中UserInfo为空”异常,请检查<sessionState/>配置节是否已在web.config中启用;
3.如果发生SessionState冲突异常,请检查2个应用的<sessionState/>配置节是否都配置为mode=”InProc”;
.NET Framework 常规参考
<sessionState> 元素
为当前应用程序配置会话状态设置。

必选属性
属性 选项 说明
mode 指定在哪里存储会话状态。
Off 指示会话状态未启用。
InProc 指示在本地存储会话状态。
StateServer 指示在远程计算机上存储会话状态。
SQLServer 指示在 SQL Server 上存储会话状态。
可选属性
属性 选项 说明
cookieless 指定不具有 Cookie 的会话是否应用于标识客户端会话。
true 指示应使用不具有 Cookie 的会话。
false 指示不应使用没有 Cookie 的会话。默认值为 false。
timeout 指定在放弃一个会话前该会话可以处于空闲状态的分钟数。默认值为 20。
stateConnectionString 指定远程存储会话状态的服务器名称和端口。例如“tcpip=127.0.0.1:42424”。当 mode 为 StateServer 时该属性是必需的。
sqlConnectionString 为 SQL Server 指定连接字符串。例如“data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind”。当 mode 为 SQLServer 时该属性是必需的。
stateNetworkTimeout 在使用 StateServer 模式存储会话状态时,指定在放弃会话之前 Web 服务器和状态服务器之间的 TCP/IP 网络连接空闲的时间(以秒为单位)。默认值为 10。