前两天在VS2008下做个项目,用到了excel组件没有问题,但当把该项目在IIS下配置后,用浏览器浏览结果则不正确,网上说用dcom组件配置下,可是我按照要求配了,结果还是不对。 后来找到一个方法好用了。 Web.config中加了一句话:“<identity impersonate="true" userName="操作系统用户" password="用户密码"/>”,浏览…,结果正确,后来我就在网上查了下这句话的作用,MSDN是这样说的: 1、模拟 IIS 验证的帐户或用户 若要在收到 ASP.NET 应用程序中每个页的每个请求时模拟 Microsoft Internet 信息服务 (IIS) 身份验证用户,必须在此应用程序的 Web.config 文件中包含 <identity> 标记,并将 impersonate 属性设置为 true 2、为 ASP.NET 应用程序的所有请求模拟特定用户 若要为 ASP.NET 应用程序的所有页面上的所有请求模拟特定用户,可以在该应用程序的 Web.config 文件的 <identity> 标记中指定 userName 和 password 属性。例如: <identity impersonate="true" userName="accountname" password="password" /> from:http://blog.csdn.net/lazyleland/article/details/7726528
View Details1. 全部 Activity 可继承自 BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效。 2. 数据库表段字段常量和 SQL 逻辑分离,更清晰,建议使用 Lite 系列框架 LiteOrm 库,超级清晰且重心可以放在业务上不用关心数据库细节。 3. 全局变量放全局类中,模块私有放自己的管理类中,让常量清晰且集中. 4. 不要相信庞大的管理类的东西会带来什么好处,可能是一场灾难,而要时刻注意单一职责原则,一个类专心做好一件事情更为清晰。 5. 如果数据没有必要加载,数据请务必延迟初始化,谨记为用户节省内存,总不会有坏处。 6. 异常抛出,在合适的位置处理或者集中处理,不要搞的到处是 catch,混乱且性能低,尽量不要在循环体中捕获异常,以提升性能。 7. 地址引用链长时(3 个以上指向)小心内存泄漏,和警惕堆栈地址指向,典型的易发事件是:数据更新了,ListView 视图却没有刷新,这时 Adapter 很可能指向并的并不是你更新的数据容器地址(一般为 List)。 8. 信息同步:不管是数据库还是网网络操作,新插入的数据注意返回 ID(如果没有赋予唯一 ID),否则相当于没有同步。 9. 多线程操作数据库时,db 关闭了会报错,也很可能出现互锁的问题,推荐使用事务,推荐使用自动化的 LiteOrm 库操作。 10. 做之前先考虑那些可以公用,资源,layout,类,做一个结构、架构分析以加快开发,提升代码可复用度。 11. 有序队列操作 add、delete 操作时注意保持排序,否则你会比较难堪喔。 12. 数据库删除数据时,要注意级联操作避免出现永远删不掉的脏数据喔。 13. 关于形参实参:调用函数时参数为基本类型传的是值,即传值;参数为对象传递的是引用,即传址。 14. listview 在数据未满一屏时,setSelection 函数不起作用;ListView 批量操作时各子项和视图正确对应,可见即所选。 15 控制 Activity 的代码量,保持主要逻辑清晰。其他类遵守 SRP(单一职能),ISP(接口隔离)原则。 16. arraylist 执行 remove 时注意移除 int 和 Integer 的区别。你懂得。 17. Log 请打上 Tag,调试打印一定要做标记,能定位打印位置,否则尴尬是:不知道是哪里在打印。 18. 码块/常量/资源可以集中公用的一定共用,即使共用逻辑稍复杂一点也会值得,修改起来很轻松,修改一种,到处有效。 19. setSelection 不起作用,尝试 smoothScrollToPosition。ListView 的 LastVisiblePosition(最后一个可见子项)会随着 getView 方法执行位置不同变动而变。 20. 与 Activity 通讯使用 Handler 更方便; 如果你的框架回调链变长,考虑监听者模式简化回调。 […]
View Details初涉移动端设计和开发的同学们,基本都会在尺寸问题上纠结好一阵子才能摸到头绪。我也花了很长时间才弄明白,感觉有必要写一篇足够通俗易懂的教程来帮助大家。从原理说起,理清关于尺寸的所有细节。由于是写给初学者的,所以不要嫌我啰嗦。 现象 首先说现象,大家都知道移动端设备屏幕尺寸非常多,碎片化严重。尤其是Android,你会听到很多种分辨率:480×800, 480×854, 540×960, 720×1280, 1080×1920,而且还有传说中的2K屏。近年来iPhone的碎片化也加剧了:640×960, 640×1136, 750×1334, 1242×2208。 不要被这些尺寸吓倒。实际上大部分的app和移动端网页,在各种尺寸的屏幕上都能正常显示。说明尺寸的问题一定有解决方法,而且有规律可循。 像素密度 要知道,屏幕是由很多像素点组成的。之前提到那么多种分辨率,都是手机屏幕的实际像素尺寸。比如480×800的屏幕,就是由800行、480列的像素点组成的。每个点发出不同颜色的光,构成我们所看到的画面。而手机屏幕的物理尺寸,和像素尺寸是不成比例的。最典型的例子,iPhone 3gs的屏幕像素是320×480,iPhone 4s的屏幕像素是640×960。刚好两倍,然而两款手机都是3.5英寸的。 所以,我们要引入最重要的一个概念:像素密度,也就是PPI(pixels per inch)。这项指标是连接数字世界与物理世界的桥梁。 Pixels per inch,准确的说是每英寸的长度上排列的像素点数量。1英寸是一个固定长度,等于2.54厘米,大约是食指最末端那根指节的长度。像素密度越高,代表屏幕显示效果越精细。Retina屏比普通屏清晰很多,就是因为它的像素密度翻了一倍。 倍率与逻辑像素 再用iPhone 3gs和4s来举例。假设有个邮件列表界面,我们不妨按照PC端网页设计的思维来想象。3gs上大概只能显示4-5行,4s就能显示9-10行,而且每行会变得特别宽。但两款手机其实是一样大的。如果照这种方式显示,3gs上刚刚好的效果,在4s上就会小到根本看不清字。 在现实中,这两者效果却是一样的。这是因为Retina屏幕把2×2个像素当1个像素使用。比如原本44像素高的顶部导航栏,在Retina屏上用了88个像素的高度来显示。导致界面元素都变成2倍大小,反而和3gs效果一样了。画质却更清晰。 在以前,iOS应用的资源图片中,同一张图通常有两个尺寸。你会看到文件名有的带@2x字样,有的不带。其中不带@2x的用在普通屏上,带@2x的用在Retina屏上。只要图片准备好,iOS会自己判断用哪张,Android道理也一样。 由此可以看出,苹果以普通屏为基准,给Retina屏定义了一个2倍的倍率(iPhone 6plus除外,它达到了3倍)。实际像素除以倍率,就得到逻辑像素尺寸。只要两个屏幕逻辑像素相同,它们的显示效果就是相同的。 Android的解决方法类似,但更复杂一些。因为Android屏幕尺寸实在太多,分辨率高低跨度非常大,不像苹果只有那么几款固定设备、固定尺寸。所以Android把各种设备的像素密度划成了好几个范围区间,给不同范围的设备定义了不同的倍率,来保证显示效果相近。像素密度概念虽然重要,但用不着我们自己算,iOS与Android都帮我们算好了。 如图所示,像素密度在120左右的屏幕归为ldpi,160左右的归为mdpi,以此类推。这样,所有的Android屏幕都找到了自己的位置,并赋予了相应的倍率: ldpi [0.75倍] mdpi [1倍] hdpi [1.5倍] xhdpi [2倍] xxhdpi [3倍] xxxhdpi [4倍] 各型号iPhone的倍率比较简单,我们后面会讲到。那么Android手机那么多,具体怎么分?哪些手机是几倍的倍率呢?我们先看一张表,这是友盟2014年10月到2015年03月的数据: 就目前市场状况而言,各种手机的分辨率可以这样粗略判断。虽然不全面,但至少在1年内都还有一定的参考意义: ldpi 如今已绝迹,不用考虑 mdpi [320×480](市场份额不足5%,新手机不会有这种倍率,屏幕通常都特别小) hdpi [480×800、480×854、540×960](早年的低端机,屏幕在3.5英寸档位;如今的低端机,屏幕在4.7-5.0英寸档位) xhdpi [720×1280](早年的中端机,屏幕在4.7-5.0英寸档位;如今的中低端机,屏幕在5.0-5.5英寸档位) xxhdpi [1080×1920](早年的高端机,如今的中高端机,屏幕通常都在5.0英寸以上) xxxhdpi [1440×2560](极少数2K屏手机,比如Google Nexus 6) 自然地,以1倍的mdpi作为基准。像素密度更高或者更低的设备,只需乘以相应的倍率,就能得到与基准倍率近似的显示效果。 不过需要注意的是,Android设备的逻辑像素尺寸并不统一。比如两种常见的屏幕480×800和1080×1920,它们分别属于hdpi和xxhdpi。除以各自倍率1.5倍和3倍,得到逻辑像素为320×533和360×640。很显然,后者更宽更高,能显示更多内容。所以,即使有倍率的存在,各种Android设备的显示效果仍然无法做到完全一致。 单位 不难发现,真正决定显示效果的,是逻辑像素尺寸。为此,iOS和Android平台都定义了各自的逻辑像素单位。iOS的尺寸单位为pt,Android的尺寸单位为dp。说实话,两者其实是一回事。 单位之间的换算关系随倍率变化: 1倍:1pt=1dp=1px(mdpi、iPhone 3gs) 1.5倍:1pt=1dp=1.5px(hdpi) 2倍:1pt=1dp=2px(xhdpi、iPhone 4s/5/6) 3倍:1pt=1dp=3px(xxhdpi、iPhone 6) 4倍:1pt=1dp=4px(xxxhdpi) 单位决定了我们的思考方式。在设计和开发过程中,应该尽量使用逻辑像素尺寸来思考界面。设计Android应用时,有的设计师喜欢把画布设为1080×1920,有的喜欢设成720×1280。给出的界面元素尺寸就不统一了。Android的最小点击区域尺寸是48x48dp,这就意味着在xhdpi的设备上,按钮尺寸至少是96x96px。而在xxhdpi设备上,则是144x144px。 无论画布设成多大,我们设计的是基准倍率的界面样式,而且开发人员需要的单位都是逻辑像素。所以为了保证准确高效的沟通,双方都需要以逻辑像素尺寸来描述和理解界面,无论是在标注图还是在日常沟通中。不要再说“底部标签栏的高度是96像素,我是按照xhdpi做的”这样的话了。 Web怎么办 移动端页面的绝对单位仍然是px,至少代码里这么写,但它的道理也和app一样。由于像素密度是设备本身的固有属性,它会影响到设备中的所有应用,包括浏览器。前端技术可以善加利用设备的像素密度,只需一行代码,浏览器便会使用app的显示方式来渲染页面。根据像素密度,按相应倍率缩放。 可以通过这个测试页面 http:/m/test.html 来看看你的移动设备屏幕宽度,这是逻辑像素宽度。 以iPhone 5s为例,屏幕的分辨率是640×1136,倍率是2。浏览器会认为屏幕的分辨率是320×568,仍然是基准倍率的尺寸。所以在制作页面时,只需要按照基准倍率来就行了。无论什么样的屏幕,倍率是多少,都按逻辑像素尺寸来设计和开发页面。只不过在准备资源图的时候,需要准备2倍大小的图,通过代码把它缩成1倍大小显示,才能保证清晰。 实际应用 大家最关心的还是实际运用,画布该怎么设置。我们就iOS、Android、Web三个平台来分别梳理一下。不过在这之前,我要为使用PS进行设计的朋友介绍一个小技巧。 之前我说过,我们要以逻辑像素尺寸来思考界面。体现到设计过程中,就是要把单位设置成逻辑像素。打开PS的首选项——单位与标尺界面,把尺寸和文字单位都改成点(Point)。这里的点也就是pt,无论设计iOS、Android还是Web应用,单位都用它。当然,各平台单位名称还是要记住的。这里我们用的只是它的原理,不用在意名称。 要调节倍率,则通过图像大小里的DPI来控制。这个DPI,其实就是PPI,像素密度。有个常识大家都知道,屏幕上的设计DPI设成72,印刷品设计DPI设成300。为什么是这两个数字? 首先说300,这和人眼的分辨能力有关。由于1英寸是固定长度,每1英寸有多少个像素点决定了画质清晰程度。之前说过,这就是像素密度,也就是DPI。DPI达到300以上,其细腻程度就会给人真实感,像真实世界中的物件。相反,DPI只有10的话,在你一个食指指节大小的长度内只有10个像素,这明显就是马赛克了。所以印刷品要设成300,才能保证清晰。 再说72,这有一定的历史原因。最早的图形设计是在mac电脑上进行的,mac本身的显示器分辨率就是72。PS中把图像DPI也设成72,就能保证屏幕上显示的尺寸和打印尺寸相同,便于设计。72的PC显示器分辨率逐渐成为一种默认的行业标准,这套规则就这么沿用下来。 现在回到正题,我们怎么通过DPI来调节倍率?既然屏幕本身的分辨率是72,DPI设成72刚好是1倍尺寸,那设成72的两倍就是倍率为2的屏幕了,就这么简单。 下面来看看3个平台各自的画布设置: […]
View Details开门见山,本篇将总结一下MobileWeb的适配方法,即我们常说的H5页面、手机页面、WAP页、webview页面等等。 本篇讨论的页面指专门针对手机设备设计的页面,并非兼容全设备的响应式布局。 文中提到的 device-width 指 viewport meta 标签中 width 的值,即由浏览器指定的值,常用机型对应值可参照Screen Sizes。 适配达到的效果是什么? 在不同尺寸的手机设备上,页面“相对性的达到合理的展示(自适应)”或者“保持统一效果的等比缩放(看起来差不多)”。 适配应关注哪些要素? 一般来说,我们需要关注的是:字体、高宽间距、图像(图标、图片)。 其中,图像相对要复杂一些,针对流量、清晰度等问题网上也有比较成熟的解决方案,比如:矢量化、字体化、image-set 等等,在此不做深入。在满足快速开发的需求下,我们使用较为偷懒的方式:利用 css 将图像限定在元素内( img 图片使用 [max-]width: 100% ,背景图像使用 background-size ),布局只针对元素进行。 另外要考虑到,设计师设计视觉稿时使用什么样的宽度,才能既满足设计自身的需求又能让前端开发方便的切图适配。 举个例子 围绕这三要素,我们用一个小例子来说明接下来要介绍的三种方案的实现方式,按 640px 标准需实现的效果如图: app.jpg 固定高度,宽度自适应 这是目前最通用的一种做法,属于自适应布局,viewport width 设置为 device-width,以较小宽度(如 320px)的视觉稿作为参照进行布局。垂直方向的高度和间距使用定值,水平方向混合使用定值和百分比或者利用弹性布局,最终达到“当手机屏幕变化时,横向拉伸或者填充空白的效果”。图像元素根据容器情况,使用定值或者 background-size 缩放。 粗略浏览了下一些大厂的首页,像百度、腾讯、Facebook、Twitter 都是采用的这种方案。 要点: 以小宽度作为参照是因为如果布局满足了小宽度的摆放,当屏幕变宽时,简单的填充空白就可以了;而如果反过来就可能造成“挤坏了”,考虑 header 区域,左测 logo 右测横向 nav 的情况。 需要小宽度的布局,又需要大宽度的图像,这是一个矛盾点。 320px 过于窄小,不利于页面的设计;只能设计横向拉伸的元素布局,存在很多局限性。 兼容性较好。 实现比较简单,样式中的尺寸都按照视觉稿二分之一大小设置,查看效果和代码。 固定宽度,viewport 缩放 视觉稿、页面宽度、viewport width 使用统一宽度,利用浏览器自身缩放完成适配。页面样式(包括图像元素)完全按照视觉稿的尺寸,使用定值单位 (px、em)即可完成。 优点: 开发简单:缩放交给浏览器,完全按视觉稿切图。 还原精准:绝对等比例缩放,可以精准还原视觉稿(不考虑清晰度的情况下)。 测试方便:在PC端即可完成大部分测试,手机端只需酌情调整一些细节(比如图标、字体混合排列时,因为字体不同造成的对齐问题)。 存在的问题: 像素丢失:对于一些分辨率较低的手机,可能设备像素还未达到指定的 viewport 宽度,此时屏幕的渲染可能就不准确了。比较常见的是边框“消失”了,不过随着手机硬件的更新,这个问题会越来越少的。 缩放失效:某些安卓机不能正常的根据 meta 标签中 width 的值来缩放 viewport,需要配合 initial-scale 。 文本折行:存在于缩放失效的机型中,某些手机为了便于文本的阅读,在文本到达 viewport 边缘(非元素容器的边缘)时即进行折行,而当 viewport 宽度被修正后,浏览器并没有正确的重绘,所以就发现文本没有占满整行。一些常用的段落性文本标签会存在该问题。 缩放失效问题需通过 js 动态设定 initial-scale
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
<ol class="dp-j" style="margin-left:55px;color:#5C5C5C;background:#F7F7F7;"> <li class="alt" style="color:inherit;background:url(""> <span style="color:black;background-color:inherit;">var fixScreen = function() { </span> </li> <li style="background:url(""> <span style="color:black;background-color:inherit;">var metaEl = doc.querySelector(<span class="string" style="color:blue;background-color:inherit;">'meta[name="viewport"]'</span><span style="background-color:inherit;">), </span></span> </li> <li class="alt" style="color:inherit;background:url(""> <span style="color:black;background-color:inherit;">metaCtt = metaEl ? metaEl.content : <span class="string" style="color:blue;background-color:inherit;">''</span><span style="background-color:inherit;">, </span></span> </li> <li style="background:url(""> <span style="color:black;background-color:inherit;">matchScale = metaCtt.match(/initial\-scale=([\d\.]+)/), </span> </li> <li class="alt" style="color:inherit;background:url(""> <span style="color:black;background-color:inherit;">matchWidth = metaCtt.match(/width=([^,\s]+)/); </span> </li> <li style="background:url(""> <span style="color:black;background-color:inherit;"><span class="keyword" style="color:#006699;font-weight:bold;background-color:inherit;">if</span><span style="background-color:inherit;"> ( metaEl && !matchScale && ( matchWidth && matchWidth[</span><span class="number" style="color:#C00000;background-color:inherit;">1</span><span style="background-color:inherit;">] != </span><span class="string" style="color:blue;background-color:inherit;">'device-width'</span><span style="background-color:inherit;">) ) { </span></span> </li> <li class="alt" style="color:inherit;background:url(""> <span style="color:black;background-color:inherit;">var width = parseInt(matchWidth[<span class="number" style="color:#C00000;background-color:inherit;">1</span><span style="background-color:inherit;">]), </span></span> </li> <li style="background:url(""> <span style="color:black;background-color:inherit;">iw = win.innerWidth || width, </span> </li> <li class="alt" style="color:inherit;background:url(""> <span style="color:black;background-color:inherit;">ow = win.outerWidth || iw, </span> </li> <li style="background:url(""> <span style="color:black;background-color:inherit;">sw = win.screen.width || iw, </span> </li> <li class="alt" style="color:inherit;background:url(""> <span style="color:black;background-color:inherit;">saw = win.screen.availWidth || iw, </span> </li> <li style="background:url(""> <span style="color:black;background-color:inherit;">ih = win.innerHeight || width, </span> </li> <li class="alt" style="color:inherit;background:url(""> <span style="color:black;background-color:inherit;">oh = win.outerHeight || ih, </span> </li> <li style="background:url(""> <span style="color:black;background-color:inherit;">ish = win.screen.height || ih, </span> </li> <li class="alt" style="color:inherit;background:url(""> <span style="color:black;background-color:inherit;">sah = win.screen.availHeight || ih, </span> </li> <li style="background:url(""> <span style="color:black;background-color:inherit;">w = Math.min(iw,ow,sw,saw,ih,oh,ish,sah), </span> </li> <li class="alt" style="color:inherit;background:url(""> <span style="color:black;background-color:inherit;">scale = w / width; </span> </li> <li style="background:url(""> <span style="color:black;background-color:inherit;"><span class="keyword" style="color:#006699;font-weight:bold;background-color:inherit;">if</span><span style="background-color:inherit;"> ( ratio < </span><span class="number" style="color:#C00000;background-color:inherit;">1</span><span style="background-color:inherit;">) { </span></span> </li> <li class="alt" style="color:inherit;background:url(""> <span style="color:black;background-color:inherit;">metaEl.content += <span class="string" style="color:blue;background-color:inherit;">',initial-scale='</span><span style="background-color:inherit;"> + ratio + </span><span class="string" style="color:blue;background-color:inherit;">',maximum-scale='</span><span style="background-color:inherit;"> + ratio + </span><span class="string" style="color:blue;background-color:inherit;">', minimum-scale='</span><span style="background-color:inherit;"> + scale + </span><span class="string" style="color:blue;background-color:inherit;">',user-scalable=no'</span><span style="background-color:inherit;">; </span></span> </li> <li style="background:url(""> <span style="color:black;background-color:inherit;">} </span> </li> <li class="alt" style="color:inherit;background:url(""> <span style="color:black;background-color:inherit;">} </span> </li> <li style="background:url(""> <span style="color:black;background-color:inherit;">} </span> </li> </ol> |
文本折行问题可以通过 […]
View Details
1 |
在注册表中也搜不到相关wgatray.exe的项,但在仔细地搜索了注册表后,还是找到了这个的可恶东西。HKEY_LOCAL_MACHINE\SOFTWARE\microsoft\Windows NT\ CurrentVersion\Winlogon\Notify\WgaLogon,删除它,重新启动(一定要重起要不然删不了C盘的文件), wgatray.exe就不会自动启动了,再把C:\windows\system 32中的wgatray.exe删除,再搜索一下,在另外的文件夹下还有,统统删除,重起.然后再进HKEY_LOCAL_MACHINE\ SOFTWARE\microsoft\Windows NT\ CurrentVersion\Winlogon\Notify\WgaLogon,删除它终于OK了。 |
http://crm2.qq.com/page/portalpage/wpa.php?uin=4009991259&f=1&ty=1&aty=0&a=&from=6
View Details
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
#region 排序方法 #region 冒泡排序法 /// <summary> /// 冒泡排序法 /// </summary> /// <param name="list">数据列表</param> /// <param name="SortType">排序类型,选择是升序还是降序</param> public static void BubbleSort(int[] list, string SortType) { int j, temp; j = 1; while ((j < list.Length)) { for (int i = 0; i < list.Length - j; i++) { bool Bl; if (SortType == "asc") { Bl = list[i] > list[i + 1]; } else if (SortType == "desc") { Bl = list[i] < list[i + 1]; } else { Bl = false; } if (Bl) { temp = list[i]; list[i] = list[i + 1]; list[i + 1] = temp; } } j++; } } #endregion 冒泡排序法 #region 选择排序法 /// <summary> /// 选择排序法 /// </summary> /// <param name="list">数据列表</param> public static void ChoiceSort(int[] list) { int min; for (int i = 0; i < list.Length - 1; i++) { min = i; for (int j = i + 1; j < list.Length; j++) { if (list[j] < list[min]) min = j; } int t = list[min]; list[min] = list[i]; list[i] = t; } } #endregion 选择排序法 #region 插入排序法 /// <summary> /// 插入排序法 /// </summary> /// <param name="list">数据列表</param> public static void InsertSort(int[] list) { for (int i = 1; i < list.Length; i++) { int t = list[i]; int j = i; while ((j > 0) && (list[j - 1] < t)) { list[j] = list[j - 1]; --j; } list[j] = t; } } #endregion 插入排序法 #region 希尔排序法 /// <summary> /// 希尔排序法 /// </summary> /// <param name="list">数据列表</param> public static void ShellSort(int[] list) { int inc; for (inc = 1; inc <= list.Length / 9; inc = 3 * inc + 1) ; for (; inc > 0; inc /= 3) { for (int i = inc + 1; i <= list.Length; i += inc) { int t = list[i - 1]; int j = i; while ((j > inc) && (list[j - inc - 1] > t)) { list[j - 1] = list[j - inc - 1]; j -= inc; } list[j - 1] = t; } } } #endregion 希尔排序法 #endregion 排序方法 |
狐狸报恩 唐山大地震中的生命传奇(图片来源:资料图) 一位老者给我讲了一个他和动物之间的故事,说是他自己的亲身经历。 老人告诉我,在1976年以前,他是唐山某水库的管理员,经常一个人驻守在水库边的配电室里。因常常闲来无事,喜欢上了垂钓,随着垂钓技术的不断提高,他钓的鱼常常吃不了,就存养在一口大缸里。这口大缸则放在简易搭建的厨房里。 1976年初夏的某个晚上,他还没睡,就听到厨房里有动静,他抄起家伙去看个究竟。原来是一只前来偷吃鱼的野狐不小心掉进了缸里,怎么也爬不上来了。想到前几次不明就里地鱼就少了,就想弄死这只讨厌而倒霉的狐狸。当他用手电照着狐狸正欲动手时,他看到狐狸的眼里满是惊恐,甚至还有眼泪,他的心又软了……最终还是放了这只野狐。 后来,他的鱼就再没少过。他就感念狐狸这生灵通人性、有良心。更令他意想不到、感慨万端的是,大地震骤来时,这只野狐居然挽救了他的命。 1976年7月28日凌晨3时左右,熟睡中的他,被一种急促的抓挠声音和呱呱鸣叫吵醒,他听出来是那只狐狸,就起身下床打开房门——那只野狐焦躁不安地仰脸望着他,并一次次地就地兜圈子,像一个有急事的满腹话语的哑巴。他就想,可能狐狸没找到猎物,饿急了,来求援了。可是,就在他想回屋里取吃的东西给它救济时,那只狐狸忽然咬住了他的凉鞋襻,狠命地往外拉。他忽然有一种什么预感。于是,随狐狸来到院子里。就在这时,举世皆惊的7.8级的大地震轰然降临,他居住的配电室瞬间即被震塌…… 直到现在,年迈的老人还念念不忘那只被他放生、又来救他的狐狸,感慨万端地说:“地球就是个大家庭,动物与人类息息相关,它们尽管不会言语,却也有着同样的思维、灵性和良心……” 它们不是为人类提供衣服的,人类没有理由屠戮它们(图片来源:资料图) from:http://fo.ifeng.com/a/20160304/41558505_0.shtml
View Details以前写padding都要从宽高里送去相应的值,今天看京东手机版网页,发现了box-sizing:border-box;,加上之后就不用再减去相应的值了,因为填充已经到边框里面了。 定义和用法 box-sizing 属性允许您以特定的方式定义匹配某个区域的特定元素。 例如,假如您需要并排放置两个带边框的框,可通过将 box-sizing 设置为 "border-box"。这可令浏览器呈现出带有指定宽度和高度的框,并把边框和内边距放入框中。 默认值: content-box 继承性: no 版本: CSS3 JavaScript 语法: object.style.boxSizing="border-box"
View Details移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道。为了让数据交互更安全,我们需要对数据进行加密传输。今天研究了一下,把几种语言的加密都实践了一遍,实现了.NET,java(android),iOS都同一套的加密算法,下面就分享给大家。 AES加密有多种算法模式,下面提供两套模式的可用源码。 加密方式: 先将文本AES加密 返回Base64转码 解密方式: 将数据进行Base64解码 进行AES解密 一、CBC(Cipher Block Chaining,加密块链)模式 是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度. 密钥 密钥偏移量 java/adroid加密AESOperator类:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
package com.bci.wx.base.util; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * AES 是一种可逆加密算法,对用户的敏感信息加密处理 对原始数据进行AES加密后,在进行Base64编码转化; */ public class AESOperator { /* * 加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式,key需要为16位。 */ private String sKey = "smkldospdosldaaa";//key,可自行修改 private String ivParameter = "0392039203920300";//偏移量,可自行修改 private static AESOperator instance = null; private AESOperator() { } public static AESOperator getInstance() { if (instance == null) instance = new AESOperator(); return instance; } public static String Encrypt(String encData ,String secretKey,String vector) throws Exception { if(secretKey == null) { return null; } if(secretKey.length() != 16) { return null; } Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); byte[] raw = secretKey.getBytes(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); IvParameterSpec iv = new IvParameterSpec(vector.getBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度 cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte[] encrypted = cipher.doFinal(encData.getBytes("utf-8")); return new BASE64Encoder().encode(encrypted);// 此处使用BASE64做转码。 } // 加密 public String encrypt(String sSrc) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); byte[] raw = sKey.getBytes(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度 cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8")); return new BASE64Encoder().encode(encrypted);// 此处使用BASE64做转码。 } // 解密 public String decrypt(String sSrc) throws Exception { try { byte[] raw = sKey.getBytes("ASCII"); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes()); cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);// 先用base64解密 byte[] original = cipher.doFinal(encrypted1); String originalString = new String(original, "utf-8"); return originalString; } catch (Exception ex) { return null; } } public String decrypt(String sSrc,String key,String ivs) throws Exception { try { byte[] raw = key.getBytes("ASCII"); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec iv = new IvParameterSpec(ivs.getBytes()); cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);// 先用base64解密 byte[] original = cipher.doFinal(encrypted1); String originalString = new String(original, "utf-8"); return originalString; } catch (Exception ex) { return null; } } public static String encodeBytes(byte[] bytes) { StringBuffer strBuf = new StringBuffer(); for (int i = 0; i < bytes.length; i++) { strBuf.append((char) (((bytes[i] >> 4) & 0xF) + ((int) 'a'))); strBuf.append((char) (((bytes[i]) & 0xF) + ((int) 'a'))); } return strBuf.toString(); } public static void main(String[] args) throws Exception { // 需要加密的字串 String cSrc = "[{\"request_no\":\"1001\",\"service_code\":\"FS0001\",\"contract_id\":\"100002\",\"order_id\":\"0\",\"phone_id\":\"13913996922\",\"plat_offer_id\":\"100094\",\"channel_id\":\"1\",\"activity_id\":\"100045\"}]"; // 加密 long lStart = System.currentTimeMillis(); String enString = AESOperator.getInstance().encrypt(cSrc); System.out.println("加密后的字串是:" + enString); long lUseTime = System.currentTimeMillis() - lStart; System.out.println("加密耗时:" + lUseTime + "毫秒"); // 解密 lStart = System.currentTimeMillis(); String DeString = AESOperator.getInstance().decrypt(enString); System.out.println("解密后的字串是:" + DeString); lUseTime = System.currentTimeMillis() - lStart; System.out.println("解密耗时:" + lUseTime + "毫秒"); } } |
.NET AES加密解密:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
using System; using System.Security.Cryptography; using System.Text; namespace AESDome { class Program { private static string key = "smkldospdosldaaa"; //key,可自行修改 private static string iv = "0392039203920300"; //偏移量,可自行修改 static void Main(string[] args) { string encrytpData = Encrypt("abc", key, iv); Console.WriteLine(encrytpData); string decryptData = Decrypt("5z9WEequVr7qtd+WoxV+Kw==", key, iv); Console.WriteLine(decryptData); Console.ReadLine(); } public static string Encrypt(string toEncrypt, string key, string iv) { byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key); byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv); byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt); RijndaelManaged rDel = new RijndaelManaged(); rDel.BlockSize = 128; rDel.KeySize = 256; rDel.FeedbackSize = 128; rDel.Padding = PaddingMode.PKCS7; rDel.Key = keyArray; rDel.IV = ivArray; rDel.Mode = CipherMode.CBC; ICryptoTransform cTransform = rDel.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Convert.ToBase64String(resultArray, 0, resultArray.Length); } public static string Decrypt(string toDecrypt, string key, string iv) { byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key); byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv); byte[] toEncryptArray = Convert.FromBase64String(toDecrypt); // 这里的模式,请保持和上面加密的一样。但源代码里,这个地方并没有修正,虽然也能正确解密。看到博客的朋友,请自行修改。 // 这是个人疏忽的地址,感谢@jojoka 的提醒。 RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.IV = ivArray; rDel.Mode = CipherMode.CBC; rDel.Padding = PaddingMode.Zeros; rDel.BlockSize = 128; rDel.KeySize = 256; rDel.FeedbackSize = 128; rDel.Padding = PaddingMode.PKCS7; rDel.Key = keyArray; rDel.IV = ivArray; rDel.Mode = CipherMode.CBC; ICryptoTransform cTransform = rDel.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return UTF8Encoding.UTF8.GetString(resultArray); } } } |
iOS源码,请下载源码,源码里有包含。 java,.net,iOS,android通用AES加密解密源码:AES_CBC_ECB_android_java_ios_net通用模式 二、ECB(Electronic Code Book,电子密码本)模式 是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。 只需要提供密码即可。 iOS,android,java已调通源码:AES_CBC_ECB_android_java_ios_net通用模式 AES在线加解密验证工具: http://www.seacha.com/tools/aes.html from:http://www.cnblogs.com/jys509/p/4768120.html
View Details