2015年3月31日星期二

Re: ®`©È¤p¤T­°-Á{¶Ü?©ÊÃÄ`«~±Ï©p

oqqduqgg

 

 

讓你隨心所-欲.的勃起24小時

 

MM吃了春`藥居然-變這款

 

【踩坑经历】一次Asp.NET小网站部署踩坑和解决经历 - asxinyu

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
【踩坑经历】一次Asp.NET小网站部署踩坑和解决经历 - asxinyu  阅读原文»

  2013年给1个大学的小客户部署过一个小型的Asp.NET网站,非常小,用的sqlite数据库,今年人家说要换台服务器,要重新部署一下,好吧,虽然早就过了服务时间,但无奈谁叫人家是客户了,二话不说,上,源代码和以前的文件都有,部署还不是分分钟的事情,打开IIS挂上去就行了。谁知道,这个部署将近花了2天的时间。看看踩坑过程和解决方法。

本文原文地址:http://www.cnblogs.com/asxinyu/p/4380380.html

1.居然拿XP系统做服务器

  第一个坑其实和我没关系,客户以前用的服务器是Windows Server 2003,对于小网站来说足够了。这次换了服务器,不知道哪根筋抽住了,直接安装了一个XP系统,我远程进去一看,当时看到XP,莫名的冲动,居然IIS都没有,好吧,赶紧叫他们换。虽然XP也能安装IIS,对这个客户来说,无所谓,但拿XP来,的确是让我震惊。

2..NET4.0的项目出现找不到2.0版的“System.Web”

  IIS简单的设置后,启动,一直提示对象为Null,打开日志一看,一大堆的这个错误:

22:36:36.015 1 W - System.IO.FileNotFoundException: Could not load file or assembly 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. 系统找不到指定的文件。
File name: 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.ReflectionOnlyLoad(String assemblyString)

  本来项目就是.NET 4.0的,以前的服务器也运行好好的,根本没改过,同样的代码,出现这个错误。找不到2.0版本的System.Web,我虽然不懂,但这也太诡异了,我是无法解释的。那就先 经过搜索引擎 看看啥情况,经过一番360和百毒,在这个页面找到点有用的信息:

http://www.cnblogs.com/yelaiju/p/3375168.html

然后按照文章的方法,下载补丁。。。可惜本来网速就不快,开远程,卡得要死,我就打开QQ想把文件传过去。。。狗日的腾讯,打开个QQ,弹出个页面,悲剧了,直接卡死。。好吧,啥都干不了了。。。

最后只能叫客户下载好,安装上去。。。但是问题依旧。。。后来群里有个朋友叫我在配置文件加上下面一段:

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>

加上去,重启了一下,经过一番折腾,好像好了一段时间,但是又报错,Sqlite数据库只读,这个问题还是比较简单,把数据库所在文件夹打开,给user用户权限就搞定了。

  但是还是报上面哪个System.Web的错误,。。。。好吧,已经很晚了,本来想安装一个.net 2.0的环境看看是否有效,但无奈网速太坑爹,远程都进不去。。。。我放弃了,第二天再说把,

3.一招见效,安装.NET 2.0

  早上起来,速度快了一点,果断下载一个.net 2.0的环境安装上去,然后重启了一下,就好了。

  搞不懂啥原因,其实早就想到安装一个2.0的环境,但一直以为很容易就能解决,再加上坑爹的网速和企鹅的弹窗,死了好几回。。。

  留个脚印把,搞不懂原理,请高手赐教。


本文链接:【踩坑经历】一次Asp.NET小网站部署踩坑和解决经历,转载请注明。

项目用到了lua的哪些部分 - 万事屋madao  阅读原文»

昨天有位同事跟我说,我们的手游客户端(cocos2d-x lua binding)代码没有看到lua的特殊技巧,用起来跟其他语言差不多。《Programming in lua》毕竟有将近400多页,他想知道lua的语言特性都用在哪了。当其时回答不上来,现在来思考一下。

要解答他的疑问首先要解答的却是另外两个问题:

1.为什么我们的项目选用了lua?

lua官网是这样介绍lua的:fast, portable, embeddable, powerful(but simple), small, free。这些是选择lua的一部分原因,特别是fast和small,而另一个重要的原因是游戏版本迭代快,lua脚本更新方便。我想这也是cocos2dx官方提供了lua绑定的原因。

而结合到项目组本身的情况,由于客户端的同事之前都是页游出身,使用as3多,接触c++少,都是新学的话,lua的学习成本比c++低。

2.lua有什么语言特性?

自动gc,使用动态类型,function作为first-class value,闭包,万能的table,协程,和c/c++简洁的交互接口。暂时想到这么多,其中前四个比较常见,一般的动态语言都会有,这里的“特性”是相对于c++之类的静态语言而言。

结合项目逐个来看:

自动gc自然是无条件用上了,要考虑的是gc的时机,默认情况下lua是分步gc,而我们选择了在每一帧执行一次完整的gc流程。为什么这样做我倒是没有去问主程,可能是对手机来说内存比较珍贵,例如iphone过了200M就立马kill进程。

动态类型同样也是无条件用上,功效最明显的就是声明变量不需要写冗长的类型了,但有些时候你会发现,写的时候很爽,但看的时候就坑了,所以我的lua代码注释比c/c++多得多。

function作为第一类值,实际上lua的funcion就是没有绑定upvalue的闭包,所以其实是闭包作为第一类值。设置闭包作为回调很是简单明了:

btn.onClick(function () textField.setText(txt))

而c++大概会写出这样的东西:

void SetText(UITextField *text_field, std::string &txt) {
text_field
->setText(txt);
}
btn
->onClick(std::bind(SetText, text_field, txt))

而且这是c++11的写法,更不用说那繁琐的函数类了。

万能的table。lua的table的实现是一个哈希表,可以用除了nil之外的任何值作key,以及用任何值作value。由此可以模拟c/c++的struct,实际上table就是lua自定义数据结构的机制。另外table具有数组部分和散列表两部分,所以通常无需自己去实现数组。

table自然是大量在项目中使用,但的确metatable以及弱表少有用到。

协程是一样好东西,但项目没有用到过。

c/c++简洁的交互接口,最明显的例子就是协议包的打包及发送,都是调用c模块。cocos2dx使用了tolua++,但显然tolua++用的也是lua.h里的接口。

总的来说,作为应用层的开发者,的确不需要用到lua里太过高深的东西,但这实际上就是lua的优势,也达到了项目组原先的目标——让初学者能快速工作。另一方便,如果想看高深的东西,直接去看底层啊,看一看lua源码的实现,看一看lua层设置的回调c++是怎么保持的。

反正,一个程序员的能力并不体现在使用复杂的语言。


本文链接:项目用到了lua的哪些部分,转载请注明。

阅读更多内容

写一个关于监控的psutil模块

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
写一个关于监控的psutil模块  阅读原文»

用户名:小罗ge11 文章数:62 评论数:28
访问量:13570:1281:756:4 注册日期:2014-07-09

写一个关于监控的psutil模块

前几天看到朋友郑彦生分享的psutil模块的使用方法,感觉对于监控又多了一层想法,因为前期主要是通过saltstack,收集数据,但是有时候比较麻烦,在小型规模做监控的时候还是建议用psutil模块,方便快捷:首先介绍psutil模块的一些基本用法:

1、监控cpu:

>>>importpsutil
>>>psutil.cpu_count()#查看线程
>>>psutil.cpu_percent()#查看cpu负载

2、查看内存相关信息:

内存可以查看总共多少内存,使用了多少,还剩多少:

>>> mem = psutil.virtual_memory()

#统计所有的信息

svmem(total=67502866432L,available=61983199232L,percent=8.1999999999999993,used=7092293632L,free=60410572800L,active=5551243264,inactive=410374144,buffers=335728640L,cached=1236897792)
>>>mem.total#内存总数
>>>mem.used#使用了多少内存
>>>mem.free#剩余内存

3、硬盘的IO和使用情况:

>>>psutil.disk_partitions()
[sdiskpart(device='/dev/mapper/VolGroup-lv_root',mountpoint='/',fstype='ext4',opts='rw'),sdiskpart(device='/dev/sda3',mountpoint='/boot',fstype='ext4',opts='rw'),sdiskpart(device='/dev/mapper/VolGroup-lv_home',mountpoint='/home',fstype='ext4',opts='rw')]
>>>psutil.disk_partitions('/')
[sdiskpart(device='/dev/mapper/VolGroup-lv_root',mountpoint='/',fstype='ext4',opts='rw'),sdiskpart(device='proc',mountpoint='/proc',fstype='proc',opts='rw'),sdiskpart(device='sysfs',mountpoint='/sys',fstype='sysfs',opts='rw'),sdiskpart(device='devpts',mountpoint='/dev/pts',fstype='devpts',opts='rw,gid=5,mode=620'),sdiskpart(device='tmpfs',mountpoint='/dev/shm',fstype='tmpfs',opts='rw'),sdiskpart(device='/dev/sda3',mountpoint='/boot',fstype='ext4',opts='rw'),sdiskpart(device='/dev/mapper/VolGroup-lv_home',mountpoint='/home',fstype='ext4',opts='rw'),sdiskpart(device='',mountpoint='/proc/sys/fs/binfmt_misc',fstype='binfmt_misc',opts='rw')]
>>>psutil.disk_io_counters()
sdiskio(read_count=107158,write_count=20666736,read_bytes=1792485376,write_bytes=133169932288,read_time=130421,write_time=337076882)
>>>psutil.net_io_counters()
snetio(bytes_sent=984192973,bytes_recv=1274031495,packets_sent=3924134,packets_recv=6024010,errin=0,errout=0,dropin=0,dropout=0)
{'lo':snetio(bytes_sent=349343820,bytes_recv=349343820,packets_sent=1583789,packets_recv=1583789,errin=0,errout=0,dropin=0,dropout=0),'em1':snetio(bytes_sent=634794145,bytes_recv=823789288,packets_sent=2339457,packets_recv=3623086,errin=0,errout=0,dropin=0,dropout=0),'em4':snetio(bytes_sent=0,bytes_recv=0,packets_sent=0,packets_recv=0,errin<
某中介无线组网及VPN接入应用案例  阅读原文»

某中介无线组网及VPN接入应用案例

某中介无线组网及VPN接入应用案例

今天碰到一个案例,该单位是一个新开的房产中介门店,需要使用VPN方式连接总公司的内网,情况及需求如下:

(1)这家新开的门店在一个新的小区中,小区没有宽带接入。为了访问Internet及总公司的VPN,购买了一个电信的3G无线上网卡及3G无线路由器。

(2)该单位一共有7、8台计算机,没有布线,计算机都配置了无线网卡,想使用无线网络组网,不准备使用传统的网线连接。

(3)该门店需要使用VPN的方式,连接到总公司的房产管理系统。总公司的房产管理系统,安装在一台服务器中,托管在电信机房。

为了实现此功能,我设计了以下方案,可以达到需求,现在分别介绍一下。

图1-1 采用RRAS做NAT

在图1-1中,3G无线路由器自己拨号到Internet,一台Windows Server 2008 R2使用"无线网卡"连接到该3G路由器,以实现到Internet的连接。在这台计算机中,配置"路由和远程访问服务(RRAS)",配置NAT及"请求拨号路由",来实现到Internet及VPN的共享接入。

这台Windows Server 2008 R2的有线网卡,使用一条RJ45网线连接到另外一个普通的无线宽带路由器的LAN端口。该门店的其他计算机,使用无线网卡连接到这个普通的无线宽带路由器,再通过Windows Server 2008 R2的"RRAS(路由和远程访问服务)"的NAT及请求拨号路由功能,连接到Internet及总部内部网络。在这里,这台普通的"无线宽带路由器"只起了一个类似"无线交换机"的功能,在该路由器中配置了DHCP,但指定的网关地址是Windows Server 2008 R2的有线网卡的地址。这样,所有的工作站,在使用DHCP获得IP地址的时候,也指定了正确的网关地址"配置了RRAS"的Windows Server 2008 R2的地址。

在这个方案中,有两个关键地方,其一是用做RRAS的Windows Server 2008 R2的配置,另一个是无线宽带配置。首先介绍用做服务器的Windows Server 2008 R2的配置,我们一一介绍。

1.1 安装路由和远程访问服务

首先要在Windows Server 2008 R2服务器上安装路由和远程访问服务,并启用NAT及请求拨号路由功能。

(1)将用做服务器的Windows Server 2008 R2,无线网卡连接到"3G无线上网卡",该网卡用于连接Internet,我们可以将该无线网卡命名为"WAN"。将另一个网卡(有线网卡)命名为"LAN",设置IP地址为192.168.2.10,子网掩码为255.255.255.0,不设置网关地址。如图1-2所示。

图1-2 重命名网卡

(2)打开"服务器管理器",添加角色。在"选择服务器角色"对话框,选择"网络策略和访问服务",如图1-3所示。

图1-3 网络策略和访问服务

(3)在"网络策略和访问服务"对话框,显示了网络策略和访问服务简介,查看之后单击"下一步"按钮,如图1-4所示。

图1-4 网络策略和访问服务

(4)在"选择角色服务"对话框,选中"路由和远程访问服务",并选中"远程访问服务"和"路由"组件,如图1-5所示。

图1-5 选择角色服务

(5)在"确认安装选择"对话框,单击"安装"按钮,如图1-6所示。

图1-6 安装

(6)在"安装结果"对话框,单击"关闭"按钮,完成安装。如图1-7所示。

图1-7 安装完成

在安装完成后,从"管理工具"中运行"路由和远程访问"服务,配置该服务,主要步骤如下。

(1)在"路由和远程访问"控制台中,右击计算机名称,在弹出的快捷菜单中选择"配置并启用路由和远程访问",如图1-8所示。

图1-8 配置并启用路由和远程访问

(2)在"欢迎使用路由和远程访问服务器安装向导"对话框,单击"下一步"按钮,如图1-9所示。

图1-9 安装向导

(3)在"配置"对话框,选择"网络地址转换(NAT)",如图1-10所示。

图1-10 配置

(4)在"NAT Internet连接"对话框,选择连接到Internet的网卡,在此选择名为"WAN"的网卡,如图1-11所示。

图1-11 选择连接Internet的网卡

(5)在"正在完成路由和远程访问服务安装向导"对话框,单击"完成"按钮,如图1-12所示。

图1-12 完成路由和远程服务安装

(6)返回到"路由和远程访问"控制台后,右击计算机名称,在弹出的快捷菜单中选择"属性",如图1-13所示。

图1-13 配置路由和远程访问属性

(7)在"常规"选项卡中,选择"局域网和请求拨号路由",如图1-14所示。

图1-14 选择局域网和请求拨号路由

(8)在弹出的"路由和远程访问"警告对话框中,单击"是"按钮,重新启动路由器,如图1-15所示。

图1-15 重新启动路由器

1.2 创建请求拨号路由

在安装路由和远程访问服务之后,要创建一个VPN的请求拨号路由,连接到VPN服务器,主要步骤如下。

(1)返回到"路由和远程访问"控制台后,右击"网络接口",在弹出的快捷菜单中选择"新建请求拨号接口",如图1-16所示。

图1-16 新建请求拨号接口

(2)在"欢迎使用请求拨号接口向导"对话框,单击"下一步"按钮,如图1-17所示。

图1-17 请求拨号路由向导

(3)在"接口名称"对话框中,为请求拨号路由设置一个名称,此名称可以随意设置,但为了后期管理,可以设置一个比较记忆、有意义的名称。在此命名为VPN,如图1-18所示。

图1-18 设置接口名称

(4)在"连接类型"对话框,选择要创建的请求拨号接口的类型,因为我们要创建的是VPN拨号,故在此选择"使用虚拟专用网络连接(VPN)",如图1-19所示。

阅读更多内容

9sonba¶Ê±¡-ÃÄÅý§Ú¨C¤Ñ²n±o«s«s.¥s

 

 

9sonba讓你-沉睡的老二甦'醒

 

性藥品.讓妳在床上不再-羞羞臉

 

dkbtafksuuzhsy

Âà±H: ¤Ñ°óheavenÅý§Ú.¼4¤Ñ3©]³£-¤£©È

 

 

春藥讓我跟我-男朋.友不用分手啦

 

9sonba讓-你沒有搞不定的.妹

 

kboabgeuf

Fw: Åý§AÀH¤ß©Ò-±ý.ªº«k°_24¤p®É

todpkwxx

 

 

春.藥再high一次早-上起床繼續high

 

性.藥品情-趣用品給你最high體驗

 

¥þ²y³Ì¦³®Ä³Ì-ª¾¦W§§¶§ÃÄ.¤¤²Ä¤@«~µP

bwtqees

 

 

上網買性'藥品不在讓我臉-紅紅

 

謝謝9sonba讓-我馬子變這麼.浪

 

Fw: ¦Û±q-¦Y¤F¤Ñ°ó°¨¤l³£»¡¤£`­n¦A·F§Ú°Õ

 

 

用.過vivid你也-可以像AV男星這麼久

 

性藥品改善我-跟老公感情.真好

 

azbkylwddaqz

¤Ñ°óheavenÅý§Ú.¼4¤Ñ3©]³£-¤£©È

 

 

讓你隨心所-欲.的勃起24小時

 

激爽感謝支持-性藥品全.面瘋狂贈送

 

llcxysynshzwmzfd

­ì¨ÓAV¨k¬P³o-»ò±j.¬O¾avivid£¬

uyacgmjzypdivshlltu

 

 

2013今年9sonba.極樂bliss-來了

Re: ¦nÀI¦³9sonbaÅý§Ú-¶R¶Ê±¡'ÃĦn¤è«K³á

vsiyixkjvgkd

 

 

就是-這家性藥專賣店讓我馬子'哀哀叫

 

害怕小三降-臨嗎?性藥`品救妳

 

·PÁÂ9sonbaÅý§Ú-¦Ñ±CÅܳo»ò.ÄÌ

bfrbdndiertnkdblfhkq

 

 

讓你隨心所-欲.的勃起24小時

 

全球`最知名的-催情藥RUSH

 

¸ó¦~¤F.¤d¸U¤£­n-§Ñ¤F©ÊÃÄ«~¸Ñ±Ï§A

yntwuiyjabfhcsgw

 

 

天阿終於找.到-頂級春藥網

 

自從上9sonba買春藥跟老婆`-感情變真好

 

2015年3月30日星期一

Âà±H: ©ÊÃÄ«~Åý.§Ú-¸ò§Ú¨kªB¤Í¤£¥Î¤À¤â°Õ

rnnzgldsio

 

 

春.藥再high一次早-上起床繼續high

 

我的天天-天兒春藥嚇嚇.叫

 

§Ú°¨`¤l³£³Q§Ú·Fªº«s«s¥s'³£¬O¾a¤Ñ°ó

owecoseibub

 

 

哇老婆自.從吃性藥居然浪-成這樣

9sonba©ÊÃÄ«~Åý§Ú-¨C¤Ñ²n`±o«s«s¥s

 

 

嗚終於找-到市價.最便宜的性藥

 

小陳吃.了heaven他馬子-居然笑成那樣

 

bgqmxqjvjomrgsmnrfsw

ªü­ì¨Ó.©ÊÃÄ«~¤]¥i¥H-³o»ò«K©y

 

 

春藥壯陽藥品-應有.盡有上百種

 

老公.吃了性藥品-變好強喔

 

ksqwglt

Re: ¼K¼K.¦Û±q¶R¤F©ÊÃÄ`¦Ñ¤½Á`¬O¤@§À¬¡Às

 

 

找了好-久終於.找到GAY專用性藥

 

如何讓老`公回信轉-意看妳來吧

 

szsixbe

§ïµ½¤k©Ê-©Ê§N²H¿Ó½Õ`±¡«Q©Ê·R¥Í¬¡

 

 

性藥品讓你跨年-新春第一.炮爽歪歪

 

我馬子都被我幹-的哀哀叫都是靠`極樂

 

nderbbolxivhugcjlj

¦Ñ¤½¤£¥i¾a-¾a©ÊÃÄ«~.µ¹§Úhigh

ydhevxhjc

 

 

性藥品讓.我-跟我男朋友不用分手啦

 

好險-有9sonba讓.我挽回老公的心

 

2015年3月29日星期日

Re: ¦nÀI¦³9sonbaÅý§Ú-¶R¶Ê±¡'ÃĦn¤è«K³á

qevmifof

 

 

VIVID性藥-品讓你知道`為什麼av男星如此猛

Re: ¶Ê±¡ÃĤj¤ý-Åý§Ú­Ì.¤Ò©dhigh¨ì©³

kqnhpcxfs

 

 

到9sonba買性藥`保證搶救回你-的婚姻

 

阿原來春藥也可以這.麼-便宜

 

Fw: 9sonba§§¶§ÃÄ-Åý§Ú¨C¤Ñ²n`±o«s«s¥s

 

 

買了性藥品-後跟.老公感情變好

 

來看一下`這裡性.藥不一樣

 

tpnhomducloltfdam

Fw: ¤£·|§a.¥þ²yºÆ-¨g¶Ê±¡©Ê«~RUSH¨S¬Ý¹L?

rryvmujrtrsf

 

 

買了性藥品-後跟.老公感情變好

 

找到全台-最低價的性.藥網讚

 

­ì¨ÓAV¨k¬P³o-»ò±j.¬O¾avivid£¬

bambi supervisory loggerhead transfusion mellon lime croquet connector biennium
helmsman pavlov percentile cartography abstinent jitterbugger libretto antagonist doom glamour
lad [4

2013¤µ-¦~9sonba±j¥´¬P.·¥¼Öbliss

 

 

就是-它讓我們感.情回到熱戀期

 

AV男星為什-麼這`麼有凍逃

 

nzryxgkpjifqqskjti

9sonba¦³¦n.¦h¦P§Ó©Ê-ÃÄ£¬

 

 

性藥品`讓我跨年-夜變成傳奇人物

 

性藥品藥.效快速玉女-都無法擋

 

hdzwhmfcwqpzpp

¼K¼K¦Û'±q¶R¤F§§¶§ÃĦѱCÁ`-¬O¯º«}«}

 

 

年輕氣盛的激情-藥品.讓夫妻倆夜夜high

 

全球最有效最-知名壯陽藥.中第一品牌

 

cpyjzsiacng

Âà±H: 9sonba¥u`½æ-³Ì³»¯Åªº¬KÃÄ

ndkkworszpjhss

 

 

春藥讓我`跟我-老婆不用離婚啦

 

我馬子都被我幹-的哀哀叫都是靠`極樂

 

2015年3月28日星期六

Java开发者常犯的十个错误 - liushaobo

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Java开发者常犯的十个错误 - liushaobo  阅读原文»

翻译自:Top 10 Mistakes Java Developers Make

文章列出了Java开发者最常犯的是个错误。

1.将数组转换为ArrayList

为了将数组转换为ArrayList,开发者经常会这样做:

List<String> list = Arrays.asList(arr);

Arrays.asList()会返回一个ArrayList,但这个ArrayListArrays的私有静态类,不是java.util.ArrayListjava.util.Arrays.ArrayListset(), get(), contains()方法,但没有任何能增加元素的方法,所以它的大小是确定的。
为了创建一个真正的ArrayList,应该这样做:

ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));

ArrayList的构造函数能够接收一个Collection类型,而它也是java.util.Arrays.ArrayList的一个祖先类。

2.检查一个数组是否包含某个值

开发者经常这样做:

Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);

这个的代码可以工作,但没必要首先把数组转换为集合,把数组转换为集合需要额外的时间。可以这样做:

Arrays.asList(arr).contains(targetValue);

或者

for(String s: arr){
if(s.equals(targetValue))
return true;
}
return false;

第一个比第二个的可读性更好。

3.在循环里边删除列表的元素

思考下面的代码,该代码在循环里边删除元素

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
for (int i = 0; i < list.size(); i++) {
list.remove(i);
}
System.out.println(list);

输出如下:


上面的方法有一个严重的问题。当一个元素被移除后,列表的大小减小了,索引也就变了。所以希望利用索引在一个循环里边删除多个元素是做不到的。
你可能知道利用迭代器在一个循环里边删除元素是正确的方法,并且知道Java的foreach循环很像一个迭代器,但事实上不是。思考下面的代码:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));

for (String s : list) {
if (s.equals("a"))
list.remove(s);
}

它将会抛出异常ConcurrentModificationException
下面的代码是可以的:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
String s = iter.next();

if (s.equals("a")) {
iter.remove();
}
}

.next()方法必须在调用.remove()方法之前调用。在foreach循环里边,编译器会先调用.remove(),再调用.next(),从而导致异常ConcurrentModificationException。你可能想知道ArrayList.iterator()的源代码。

4.HashTable vs HashMap

根据算法的约定,HashTable是这个数据结构的名字,但在Java里边,HashMap是这个数据结构的名字。Hashtable和 HashMap的一个关键性的不同是,HashTable是同步的,而HashMap不是。所以通常不需要HashTable,HashMap用的更多。
HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap
Top 9 questions about Java Maps

5.使用原始集合类型

在Java里边,原始类型和无界通配符类型很容易混合在一起。以Set为例,Set是一个原始类型,而Set< ? >是一个无界通配符类型。
考虑下面使用原始类型List作为参数的代码:

public static void add(List list, Object o){
list.add(o);
}
public static void main(String[] args){
List<String> list = new ArrayList<String>();
add(list, 10);
String s = list.get(0);
}

上面的代码将会抛出异常:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at ...

使用原始集合类型是很危险的,因为原始集合类型跳过了泛型类型检查,是不安全的。SetSet< ? >Set< Object >之间有很大差别。请参考Raw type vs. Unbounded wildcardType Erasure

6.访问级别

开发者经常使用Public作为类的修饰符,这样可以很简单的通过直接引用得到值,但这是一个非常糟糕的设计。根据经验,分配给成员的访问级别应尽可能的低。
public, default, protected, and private

7.ArrayList vs LinkedList

当开发者不知道ArrayList和LinkedList的区别的时候,通常会使用ArrayList,因为它看起来更熟悉。然而,两者之间有很大的性能差异。简单地说,当有大量的插入/删除操作并且没有太多的随机访问操作的时候,应该使用LinkedList。如果对此不太了解,可参考ArrayList vs. LinkedList

8.可变与不可变

不可变对象有许多的优点,比如简单,安全等等。但是对于每一个不同的值都要有一个独立的对象,过多的对象导致垃圾回收的高消耗。当选择可变与不可变时应该有一个权衡。
通常情况下,可变对象可以用来避免产生过多的中间对象。一个经典的实例就是连接大量的字符串,如果使用不可变的字符串,将会产生大量的需要进行垃圾回收的对象。这会浪费CPU大量的时间,使用可变对象才是正确的方案(比如StringBuilder)。

String result="";
for(String s: arr){
result = result + s;
}

在其它的一些情况下也是需要使用可变对象的,比如将可变对象作为参数传入方法可以使你不需要使用很多语句便可以得到多个结果。另外一个例子是排序和 过滤:当然,你可以写一个方法来接收原始的集合,并且返回一个排好序的集合,但是那样对于大的集合就太浪费了。(来自StackOverFlow的dasblinkenlight的答案)。
Why String is Immutable?

9.父类和子类的构造函数


因为没有定义父类的默认构造函数,在编译的时候会产生错误。在Java里边,如果一个类没有定义构造函数,编译器将会插入一个无参数的默认构造函数。如果在父类里边定义了一个构造函数,在此例中即Super(String s),编译器将不会插入默认的无参数构造函数。这就是上面示例中父类的情形。
子类的构造函数,不管是没有参数还有有参数,都会调用父类的无参构造函数。因为编译器试图把super()插入到子类的两个构造函数中。但是父类默认的构造函数未定义,编译器就会报出这个错误信息。
要修复这个问题,可以简单的通过1)在父类中添加一个Super()构造方法,就像这样:

public Super(){
System.out.println("Super");
}

或者2)移除自定义的父类构造函数,或者3)在子类的构造函数中调用父类的super(value)。
Constructor of Super and Sub

10.”“还是构造函数?

有两种方式构造字符串:

//1. 利用双引号
String x = "abc";
//2. 利用构造函数
String y = new String("abc");

区别在哪?
下面的例子可以给出一个快速的答案:

String a = "ab
Core Data Stack学习笔记 - 超man  阅读原文»

Entity Entities 实体->数据表
一个实体可以表示一个数据模型

1>通过图形化界面可以建立一个模型关系图,可以指定一对多,多对一,多对多的数据关系

-在数据库开发中,少用多对多关系

2>通过工具能够自动生成对应的模型文件

3>数据保存


NSManagedObject 被管理的对象
-开发中设计的实体,本身都是被管理对象的子类

使用CoreData的一个注意事项:如果开发时,修改过数据模型,最好将沙盒中的数据库文件删除!


使用CoreData开发的步骤

1. 首先创建一个Model,利用图形化界面创建各个实体模型
-创建完成之后,通过工具可以自动生成模型文件
-如果修改模型后,可以再次生成模型文件,会覆盖掉之前生成的文件
-自动生成的模型文件,一般不要进去改!


2. 代码
-实例化模型
-使用模型实例化持久化存储调度器
-指定存储调度器保存数据的类型以及路径
-实例化被管理对象的上下文,指定调度器

以上四步代码,在Xcode6已经封装好,可以直接使用,一般不需要程序员编写!

已经使用单例封装,可以直接调用,代码如下:

单例的.h文件

1 #import <Foundation/Foundation.h>
2 #import <CoreData/CoreData.h>
3
4 @interface CZCoreDataTools : NSObject
5
6 + (instancetype)sharedCoreDataTools;
7
8 /**
9 * 使用模型名称&数据库名称初始化Core Data Stack
10 */
11 - (void)setupCoreDataWithModelName:(NSString *)modelName dbName:(NSString *)dbName;
12
13 /**
14 * 被管理对象的上下文
15 */
16 @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
17
18 /**
19 * 保存上下文
20 */
21 - (void)saveContext;
22
23 @end

单例的.m文件

1 #import "CZCoreDataTools.h"
2
3 @implementation CZCoreDataTools
4
5 + (instancetype)sharedCoreDataTools {
6 static CZCoreDataTools *instance;
7
8 static dispatch_once_t onceToken;
9 dispatch_once(&onceToken, ^{
10 instance = [[self alloc] init];
11 });
12 return instance;
13 }
14
15 // 问题:单例我们希望被广泛使用,不能确定模型的名称,同时数据库的文件名也不确定
16 - (void)setupCoreDataWithModelName:(NSString *)modelName dbName:(NSString *)dbName {
17
18 // 1. 实例化数据模型
19 NSURL *modelURL = [[NSBundle mainBundle] URLForResource:modelName withExtension:@"momd"];
20 NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
21
22 // 2. 实例化持久化存储调度器
23 NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
24
25 // 3. 指定保存的数据库文件,以及类型
26 // 数据库保存的URL
27 NSString *dbPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
28 dbPath = [dbPath stringByAppendingPathComponent:dbName];
29 NSURL *dbURL = [NSURL fileURLWithPath:dbPath];
30
31 [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:dbURL options:nil error:NULL];
32
33 // 4. 被管理对象的上下文
34 _managedObjectContext = [[NSManagedObjectContext alloc] init];
35 // 指定上下文的持久化调度
36 [_managedObjectContext setPersistentStoreCoordinator:psc];
37 }
38
39 - (void)saveContext {
40 [self.managedObjectContext save:NULL];
41 }
42
43
44 @end

// 程序启动时 初始化Core Data Stack

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 初始化数据库
[[CZCoreDataTools sharedCoreDataTools] setupCoreDataWithModelName:@"Model" dbName:@"my.db"];

return YES;
}

3. NSEntityDescription实体描述对象,用来描述一个实体
使用方法,如果要新建一条记录,需要使用实体描述对象

// 表示要插入一条记录
// 插入Person实体描述的记录
// 插入之后,实体信息在context中维护
// 返回一个指定实体名称对应数据模型
[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.appDelegate.managedObjectContext];

// 设置模型属性

// 通知持久化数据调度器,保存数据
[self.managedObjectContext save:NULL];

提示:如果有多个实体关系,可以直接通过属性设置,就能够实现底层数据表的多表级联
程序员不需要关心底层数据库的任何实现细节

4. 在Core Data中查询数据

所有的查询是由 NSFetchedResultsController 来控制的

-首先指定”要查询的实体”以及排序的属性名称
-指定查询控制器的代理
-实现监?p>阅读更多内容

Fw: ¿E²n¦³¦n.¦h¦P§Ó©Ê-ÃÄ£¬

ifmdwbzpmlrplmb

 

 

激爽性藥品-讓妳成`為犀利人妻

 

獨家引.進全-球催情大帝RUSH

 

©ÊÃÄ«~§ïµ½-§Ú¸ò¦Ñ±C·P±¡`¯u¶}¤ß

fmsaqplbyqnhkyy

 

 

性藥品改-變我一生命運.真爽

 

老婆吃了-性藥品變.好騷喔

 

¤p«}³Ìªñ¯º«}«}-­ì¨Ó¦Y¤F¬K.ÃÄ

rdkirac

 

 

好險有激爽讓我-買催情'藥好方便喔

 

阿娘威性藥居.然買越多-送越多

 

³o»ò©È¤p¤T´N¶R-©Ê.ÃÄ«~§ïÅܦۤw

 

 

同志最-愛的性藥都在.這裡啦

 

耶這家性藥-網怎麼這.麼便宜

 

sqityyasio

¦nÀI¦³¿E²nÅý§Ú-¶R¶Ê±¡'ÃĦn¤è«K³á

tgvhbcguhdbh

 

 

春`藥快來-小三退散

 

¦Ñ±C¦Y¤F©ÊÃÄ«~.ÅÜ-¦nÄ̳á

oohkpjvlowflkrigyx

 

 

3秒內立-刻激`發男人的血脈噴張

 

激爽只賣-最頂級的`性藥品

 

¬ü'¬Ü¦Y¤F¿³ÃÄ«~©~µM-Åܳo´Ú

 

 

天阿終於找.到-頂級春藥網

 

kmcffgrrtwoyyolhxxq

Re: ­ì¨Ó¨Ä¨Ä-¤k¦Y³o`ºØÃĤ~ÅÜ¿º°ü

sprzdaqw

 

 

這-有同志葛葛.最愛的性藥ㄝ

 

你要.的春藥-都在9sonba

 

RUSH 15¬í-Åý§Ahigh¨ì`Åq®p

sijdlqwtdpz

 

 

就是極樂bliss!!!讓.我馬子笑咪咪

 

老公吃了性藥品-變好.強喔

 

Âà±H: ¦P§Ó³Ì-·Rªº©ÊÃij£¦b.³o¸Ì°Õ

jbozzuiuube

 

 

原來老婆要吃了-催情藥才會這麼浪

 

小傑又在笑了-原來是偷偷到'這買壯陽藥

 

¤Wºô.¶R§§¶§ÃĤ£¦b-Åý§ÚÁy¬õ¬õ

 

 

這麼怕-小三就買`春藥改變自已

 

jyzcgpqthoghgveegyd

³Ì±j§§`¶§ÃÄ·R-¯«¨Ó¸Ñ±Ï§A¤F

gkpqglw

 

 

讓你隨心所-欲.的勃起24小時

 

9sonba讓你-沉睡的老二甦'醒

 

2015年3月26日星期四

CRL之解析lambda实现group - hubro

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
CRL之解析lambda实现group - hubro  阅读原文»

先看一个简单的group语句

select BarCode,ProductName,COUNT(BarCode) as total from ProductData where id>0 group by BarCode,ProductName
order by COUNT(BarCode) desc

  结果

BarCode ProductName total
------------------------------ ------------------------------ -----------
1212122 product2 4
21312313 product3 2

  group语法分解为

  • 查询哪些字段 BarCode,ProductName,COUNT(BarCode) as total
  • 按哪些字段进行分组 group by BarCode,ProductName
  • 按什么排序 order by COUNT(BarCode) desc

linq to sql 表示为

from p in ProductData
group p.BarCode by p.ProductName into g
select new
{g.BarCode,
g.ProductName,
total=g.Count()}

linq to sql很容易表达,用lambda该如何表达呢 

跟普通SQL查询不同,查询字段和排序可用聚合函数count,sum,抛开这,用lambda,同样的查询可表示为

这里用匿名对象来作选择器

query.Select(b=>new{b.BarCode,b.ProductName})

.Where(b=>b.Id>0)

.GroupBy(b=>new{b.BarCode,b.ProductName})

.OrderBy(b=>b.BarCode,true);
query.Select(b=>new{b.BarCode,b.ProductName}) 能表示 select BarCode,ProductName 但匿名对象可没Count(b.ProductName)这样的语法,所以没法生成select count(BarCode)这样的语法
没有直接的方法,但是有间接的方法,扩展方法
扩展方法真是个好东西,解决了很多问题
定义一个扩展方法,名称定义为大写,为避免冲突
public static int COUNT(this object origin)
{
return 0;
}

  所有object对象将会有COUNT()方法

将上面语法进行改进为

query.Select(b=>new{b.BarCode,b.ProductName,total=b.BarCode.COUNT()})

  以这样形式进行表示,这样在语法上是编译通过的,并且lambda支持这样的解析

完整表示为

query.Select(b=>new{b.BarCode,b.ProductName,total=b.BarCode.COUNT()})

.Where(b=>b.Id>0)

.GroupBy(b=>new{b.BarCode,b.ProductName})

.OrderBy(b=>b.BarCode.COUNT(),true);

  这样,完整的group表示语法就完成了,致少在逻辑上,是能实现SQL的group语法了,剩下就需要进行解析了

lambda解析比较麻烦,这里就简单演示,回头再写篇详细讲讲

//此方法解析方法调用表达式的属性名和方法名
string GetPropertyMethod(Expression item,out string methodName)
{
        //转换为方法表达式
var method = item as MethodCallExpression;
MemberExpression memberExpression;
//获取访问属性表达式
if (method.Arguments[0] is UnaryExpression)
{
memberExpression = (method.Arguments[0] as UnaryExpression).Operand as MemberExpression;
}
else
{
memberExpression = method.Arguments[0] as MemberExpression;
}
methodName = method.Method.Name;//调用的方法名
return memberExpression.Member.Name;//返回访问的属性名
}
解析Select

public LambdaQuery<T> Select<TResult>(Expression<Func<T, TResult>> resultSelector)
{
      string QueryFullName;
var newExpression=resultSelector.Body as NewExpression;//转换为匿名对象表达式
        int i=0;
foreach (var item in newExpression.Arguments)//遍历所有参数
{
var memberName = newExpression.Members.Name;//获取构造的属性名
if (item is MethodCallExpression)//如果是方法
{
string methodName;
string propertyName = GetPropertyMethod(item,out methodName);//获取方法名和属性名
QueryFullName = string.Format("{0}({1}) as {2}", methodName, propertyName , memberName);
}
else//直接属性
{
var memberExpression = item as MemberExpression;//转换为属性访问表达式
QueryFullName = memberExpression.Member.Name;//返回属性名
}
        i+=1;
}
return this;
}

 QueryFullName即为查询字段语法

 解析OrderBy,过程和上面差不多

public LambdaQuery<T> OrderBy<TKey>(Expression<Func<T, TKey>> expression, bool desc = true)
{
       string QueryOrderBy;
string name;
if (expression.Body is MethodCallExpression)//如果是方法
{
string methodName;
string propertyName = GetPropertyMethod(expression.Body, out methodName);
name = string.Format("{1}({0})", propertyName, methodName);
QueryOrderBy += string.Format(" {0} {1}", name, desc ? "desc" : "asc");
}
else
{
MemberExpression mExp = (MemberExpression)expression.Body;
if (!string.IsNullOrEmpty(QueryOrderBy))
{
QueryOrderBy += ",";
}
name = mExp.Member.Name;
QueryOrderBy += string.Format(" {0} {1}", name, desc ? "desc" : "asc");
}
return this;
}

  QueryOrderBy即为排序语法

经过若干处理,此处省略1万字

最终结果为

//using CRL以获取扩展方法
var query = Code.ProductDataManage.Instance.GetLamadaQuery();
query.Page(15, 1);
query.Where(b => b.Id > 0);
int count;
//选择GROUP字段
query.Select(b => new
{
b.BarCode,
b.ProductName,
total = b.BarCode.COUNT(),//等效为count(BarCode) as total
sum1 = b.Number.SUM()//等效为sum(Number) as sum1
});
//GROUP条件
query.GroupBy(b => new { b.BarCode, b.ProductName });
//设置排序
query.OrderBy(b => b.BarCode.Count(), true);//等效为 order by count(BarCode) desc
var list = Code.ProductDataManage.Instance.AutoSpGroupPage(query, out count);

foreach (dynamic item in list)
{
var str = string.Format("{0}______{1} {2} {3}<br>", item.BarCode, item.ProductName, item.total, item.sum1);//动态对象
Response.Write(str);
}

当然也可以加上HAVING语法,这个比较麻烦,在解析二元运算时还得按这样解析扩展方法,稍后实现


本文链接:CRL之解析lambda实现group,转载请注明。

net-force.nl/Programming writeup - KAlO2  阅读原文»

  从 wechall.netnet-force.nl 网站,发现网站的内容不错,里面也有不同类型的挑战题目:Javascript / Java Applets / Cryptography / Exploits / Cracking / Programming / Internet / Steganography,有的还有一定的难度。注册了帐号做题,我也从中学到了不少知识。对网络攻防有兴趣的同学可以尝试下。

level 601: Keep walking...
/*
This is a challenge to test your basic programming skills.

Pseudo code:
Set X = 1
Set Y = 1
Set previous answer = 1

answer = X * Y + previous answer + 3

After that => X + 1 and Y + 1 ('answer' becomes 'previous answer') and repeat this till you have X = 525.

The final answer is the value of 'answer' when X = 525. Fill it in below to check if it's the correct answer. If it is, you will get the password for the challenge page.
*/
第一题是热身题,直接按照题目所说的写代码就行了。

#include <stdio.h>

int main()
{
int answer = 1;
for(int x = 1, y = 1; x<=525; ++x, ++y)
answer
+= (x*y + 3);
printf(
"answer: %d\n", answer);

return 0;
}

level 602: Are you fast enough?
/*
This challenge is a simple calculation.
When you click on the link below you will get a number.
The calculation is: answer = (number * 3 + 2) - 250

Example with number 1500:
4252 = (1500 * 3 + 2) - 250

In this example 4252 is the answer...answer like this: prog2.php?solution=4252
You must do this within 2 seconds. If the answer is correct, you will get the password.
Get a number.
https://net-force.nl/challenge/level602/prog2.php
*/
限时2秒,手动计算再发送肯定是来不及的。不变的信息先构造好,添加动态信息马上发出去。
春节回家需要网上买火车票,比别人晚半秒钟下手可能就没票了,所以那些车次,时间,身份证等信息需要事先填写好再刷票。
javascript 是浏览器用的语言,于是在 Chrome 浏览器的控制台(按 F12 键或 Ctrl + Shift + J 唤出)粘贴以下代码运行。
javascript 直接用 XMLHttpRequest 构造 HTTP 请求。

var url = 'https://net-force.nl/challenge/level602/prog2.php';
var req = new XMLHttpRequest();
req.open(
'GET', url, false/*asynchronous*/);
// req.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
//
req.send(message);
req.send(null);
if(req.status == 200)
{
var text = req.responseText;
var number = parseInt(text.split("'", 2)[1]);
answer
= (number * 3 + 2) - 250;

var url_answer = url + '?solution=' + answer;
req.open(
'GET', url_answer, false/*asynchronous*/);
req.send(
null);
console.log(req.responseText);
}

上面的 url 写错了,比如多加了 www. 或者写成了 http 协议,服务器可能会返回以下错误。
XMLHttpRequest cannot load https://www.net-force.nl/challenge/level602/prog2.php. Origin https://net-force.nl is not allowed by Access-Control-Allow-Origin.
这个是 Javascript 的同源策略(Same Origin Policy),是由 Netscape 公司提出的一个安全策略。

请求返回的内容如下,除了数字很可能不同。
<p>You will need this number '8616'.</p>
<i>Answer like this: prog2.php?solution=12345</i><br>
我们可以用'作为分割符,得到我们要的数字,找到第二个就不用接着找下去了。代码为:text.split("'", 2)[1]
这种做法我在读 sqlmap 的代码 sqlmap/lib/utils/versioncheck.py 的时候看到过,它用空格作为分隔符获取 Python 的版本字符串。

level 603: Wanna play?!?!

/*

You have 5 balls that you have to divide (put the balls in the cups) between a number of cups in all possible ways.

1 cup:
---
|5|
---
1 possibility

Total: 1 possibility

2 cups:
-----
|1|4|
-----
|2|3|
-----
|3|2|
-----
|4|1|
-----
|5|0|
-----
|0|5|
-----
6 possibilities

Total: 7 possibilities

3 cups:
21 possibilities
Total: 28 possibilities

Continue until you have 500 cups. The total of possibilities from 1 to 500 is the answer.

*/

排列组合问题
5个球放N个杯子的放法有多少中,转换成数学语言描述:
x1+x2+...+xn = 5, x1~xn 均为0或正整数。求方程解的个数。
(x1+1)+(x2+1)+...+(xn+1) = 5 + n
于是等价于
x1+x2+...+xn = n+5, x1~xn 均为正整数,方程解的个数。
x1与x2互换属于不同的解,所以是排列问题而非组合问题。
n+5个杯子排成一列,中间用n-1个栏板隔开,所以答案是 C(n+5, n-1)
因为 C(m, n) = C(m, m-n),所以 C(n+5, n-1) = C(n+5, 6)
我们验证一下,
1个杯子: C(6,6)=1
2个杯子: C(7,6)=C(7,1)=7
3个杯子: C(8,6)=C(8,2)=(8*7)/(1*2)=28
与例子保持吻合,以此类推
500个杯子就是 C(505,6)=505*504*503*502*501*500/6!

#include <stdio.h>
#include
<inttypes.h>

int main()
{
int64_t cups
= 500;
int64_t answer
= cups*(cups+1)*(cups+2)*(cups+3)*(cups+4)*(cups+5)/(阅读更多内容

·PÁ¿E²n·m±Ï§Úªº±B«Ã.©ÊÃÄ«~¤§-¯«

zobpfkfpfdlsndlhzzwy

 

 

AV男星為什-麼這`麼有凍逃

 

©ÊÃÄ«~¥þ²y-³Ì¦³®Ä³Ìª¾¦W¬ü°ê.¸t«~

 

 

好-險有9sonba讓我買壯陽藥好方.便喔

 

就是-它讓我們感.情回到熱戀期

 

xqptgrbzeehqzgzfy

2014¤µ-¦~¿E²n±j¥´¬P.·¥¼Öbliss

lsoxhtisqufu

 

 

激爽催情王-國讓你.性福

 

讓你享受更多-種性藥品都`在激爽

 

·¥¼Öbliss`Åý-§A¥Î¹L¤£¦b¥Î«Âº¸­è

 

 

打破市場價格-讓你享受最價`廉春藥

 

看啥?男友都-要被搶了還傻傻.的

 

yiwifrcuwqdk

Âà±H: ¦Ñ±C¦Y¤F©ÊÃÄ-«~¤@.µo¤£¥i¦¬¬B°Õ

 

 

嘿嘿自'從買了壯陽藥老婆總-是笑咪咪

 

ouzcylii

MM¦Y¤F¬K`ÃÄ©~µM-Åܳo´Ú

tizehmtwitiyatblpi

 

 

如何讓老`公回信轉-意看妳來吧

 

Âà±H: «z-¶R¶Ê±¡ÃÄÁÙ°e±¡½ì¥Î«~¤]'¤Ó²n¤F

vrctpqmei

 

 

春`藥快來-小三退散

 

激爽有好.多同志性-藥ㄛ

 

¼K¶R¦hÁÙ°e©Ê`ÃÄ«~-§ä¤£¨ì¤F

zjzxasikqviw

 

 

9sonba性藥網`挽救-我跟老公感情

 

嗚終於找-到市價.最便宜的性藥

 

Âà±H: Åý§AÀH¤ß©Ò-±ý.ªº«k°_24¤p®É

qsgcuickdxttz

 

 

讓你的.寶貝持久-耐戰的最佳性藥品

 

這有同志.葛葛-最愛的春藥ㄝ

 

Fw: §O³Q¯º¤F©~µM.¨Sª±-¹L¶Ê±¡Ãd¨àRUSH

 

 

生人就是要.買性藥品-才過癮阿

 

hoyxupl

¬KÃÄ.¤j«Ò¿E²nª¾¦W©Ê-Ãij£¦b³o

ympedbrpk

 

 

老公不可靠-靠春藥.給我high

 

¬ÝÔ£?¨k¤Í³£-­n³Q·m¤FÁٶ̶Ì.ªº

bnyozhebuqnvuqk

 

 

謝謝9sonba讓-我馬子變這麼.浪

 

老公吃這-藥後居然性.慾大開

 

¥þ¥x-³Ì±j9sonba©Ê.Ãĺô¨Ó¤F

decommission [4

2015年3月25日星期三

WCF服务编程——数据契约快速入门 - Charlie Jin

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
WCF服务编程――数据契约快速入门 - Charlie Jin  阅读原文»

WCF序列化流程

操作调用期间的序列化与反序列化

序列化

默认用户自定义类型(类和结构)并不支持序列化,因为.NET无法判断对象状态是否需要反射到流。 用户自定义类的实例支持序列化 需要添加[Serialazable]。若要允许可序列化类型包含非序列化的成员变量可使用[NonSerializad]

.Net格式器

BinaryFormatter 序列化为二进制格式
SoapFormatter 使用.NET 特定的SOAP XMl格式
两者格式器都实现IFormatter接口

两种格式器都要将类型的程序集及版本控制器信息持久化到流中,以保证序列化的对象能够被反序列化为正确的类型。

WCF格式器

使用[DataContract]进行标记类,使用[DataMember]标记成员
DataContractSerializer格式器继承XmlObjectSerializer。
在未曾标记DataContract特性,WCF就会自动推断,认为DataContract特性被应用到该类型上,且它的所有仅有成员(字段或属性)均被应用了DataMember特性。
组合数据契约:定义数据契约,对那些本身就是数据契约的成员也可以使用DataMember特性。-数据契约具有递归性质
数据契约事件 serializing发生成在序列化之前,serialized事件发生在序列化后,desrializing发生在反序列化之前,desreialized发生在反序列化之后

每个序列化事件处理方法都必须遵循如下的方法签名 void <Method Name>(StreamingContext context)
序列化 反序列化
WCF在反序列化前必须创建一个对象,但是,WCF不会调用数据契约类的默认构造函数。

数据契约层级

WCF要求类层级的每一级数据契约都必须标记DataContract特性,该特性不可继承。WCF可以在类层级混合使用Serializable和DataContract特性
WCF不能接收子类型数据,只能使用[KnownType(typeof(subclass))] 或[ServiceKnownType(typeof(SubClass))]

配置文件方法

<add type="Contact,MyClassLibrary">
<knownType type="Customer,MyOtherClassLibrary"/>
</add>

使用配置文件主要解决的问题是:当添加一个新的子类时必须修改代码、重新编译和重新部署。

序列化顺序

在类型内部,默认的序列化顺序是按照字母的排序的,至于整个类层级的顺序,则是自上而下的。在序列化顺序不匹配的情况下,成员则以它们的值进行初始化。 自定义顺序可以使用[DataMember]的Order属性值进行调整,该属性的默认值为-1,也就是它默认WCF顺序

成员的Order属性设置了相同的值,WCF会按照成员的字母顺序排序

版本控制

  • 新增成员;
    任何一端添加新的成员,然后将新的契约发送到旧的客户端或服务。在反序列化这样的数据契约类型时,DataContractSerializer会忽略新增成员。
  • 缺失成员;
    客户端是针对旧的数据契约定义编写的,而与之交互的服务则是根据定义了新成员的契约定义编写的。当接收端的DataContractSerializer在消息中无法找到所需信息去反序列化的这些成员时,会根据成员的值进行反序列化。也就是说,将引用类型设置为null,将值类型设置为0。
  • 双向传递,即新的数据契约与旧版本的数据契约之间相互传递,它同时需要向后与向前的兼容性。
    版本的双向传递可能会影响整体的交互

    枚举

    枚举类型总是支持序列化的。不必应用DataContract特性,如果要将确定的枚举值排除于数据契约之外,就需要在枚举类型标记DataContract特性,并在枚举值明确标记为[EnumMember]特性,没有标记EnumMember毛发的枚举值不属于该枚举的数据契约。同时可以使用该特性的Value属性对枚举值设置别名。

    泛型

    不能定义包含了泛型类型参数的数据契约。便可以在数据契约中使用限定的泛型数据,只要在服务契约中指定了类型参数。
    数据契约被重命名的格式为:<原有名>Of<类型参数><散列值>
    同时也可以使用[DataContract(Name=”ClassNameOf{0}{1}”)]表示。标识符中的数字就是类型参数的序数,可以用{#}表示为散列值

    集合

    在使用集合接口IEnumberable,IList和ICollection,它他的传输型表示形式都使用了数组

    如果契约中的集合为具体集合类型,而且属于可序列化集合(标记为Serializable特性而不是DataContract特性),那么,只要提供的集合包含Add()方法,WCF就能够自动地将集合规范为数组类型。

    CollectionDataContract特性:该特性会检验Add()方法及检查IEumerable或IEnumerable接口是否存在。如果不存在,就会导致InvlidDataContractException异常。注:DataContract不能和CollectionDataContract一起使用

SQL Server 深入解析索引存储(下) - pursuer.chen  阅读原文»

标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引

概述

非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点:

  • 基础表的数据行不按非聚集键的顺序排序和存储。

  • 非聚集索引的叶层是由索引页而不是由数据页组成。

既可以使用聚集索引来为表或视图定义非聚集索引,也可以根据堆来定义非聚集索引。非聚集索引中的每个索引行都包含非聚集键值和行定位符。此定位符指向聚集索引或堆中包含该键值的数据行。

非聚集索引行中的行定位器或是指向行的指针,或是行的聚集索引键,如下所述:

  • 如果表是堆(意味着该表没有聚集索引),则行定位器是指向行的指针。该指针由文件标识符 (ID)、页码和页上的行数生成。整个指针称为行 ID (RID)。

  • 如果表有聚集索引或索引视图上有聚集索引,则行定位器是行的聚集索引键。如果聚集索引不是唯一的索引,SQL Server 将添加在内部生成的值(称为唯一值)以使所有重复键唯一。此四字节的值对于用户不可见。仅当需要使聚集键唯一以用于非聚集索引中时,才添加该值。SQL Server 通过使用存储在非聚集索引的叶行内的聚集索引键搜索聚集索引来检索数据行。

对于索引使用的每个分区,非聚集索引在 index_id >0 的 sys.partitions 中都有对应的一行。默认情况下,一个非聚集索引有单个分区。如果一个非聚集索引有多个分区,则每个分区都有一个包含该特定分区的索引行的 B 树结构。例如,如果一个非聚集索引有四个分区,那么就有四个 B 树结构,每个分区中一个。

根据非聚集索引中数据类型的不同,每个非聚集索引结构会有一个或多个分配单元,在其中存储和管理特定分区的数据。每个非聚集索引至少有一个针对每个分区的 IN_ROW_DATA 分配单元(存储索引 B 树页)。如果非聚集索引包含大型对象 (LOB) 列,则还有一个针对每个分区的 LOB_DATA 分配单元。此外,如果非聚集索引包含的可变长度列超过 8,060 字节行大小限制,则还有一个针对每个分区的 ROW_OVERFLOW_DATA 分配单元。有关分配单元的详细信息,请参阅表组织和索引组织。B 树的页集合由 sys.system_internals_allocation_units 系统视图中的 root_page 指针定位。

要很好的理解这篇文章的内容之前需要先阅读我前面写的上中部分的两篇文章:

SQL Server 深入解析索引存储(中)

SQL Server 深入解析索引存储(上)

正文

非聚集索引结构

生成测试数据

CREATE TABLE Torder
(ID
INT IDENTITY(1,1) NOT NULL,
NAME
CHAR(100) NOT NULL,
pro
VARCHAR(8000) NULL,
Statu
INT NOT NULL,
IDATE
DATETIME DEFAULT(GETDATE())
)
GO
---插入1000条测试数据
DECLARE @ID INT=1
WHILE(@ID<=1000)
BEGIN
INSERT INTO Torder(NAME,pro,Statu)VALUES('商品'+CONVERT(CHAR(20),@ID),REPLICATE(1,8000),LEFT(@ID,1))
SET @ID=@ID+1
END
GO
---创建非聚集索引
CREATE INDEX IX_Torder ON Torder
(NAME,Statu
)
INCLUDE(IDATE)


SELECT DISTINCT so.name, so.object_id,sp.index_id,internals.type_desc,internals.total_pages, internals.used_pages, internals.data_pages,first_iam_page, first_page, root_page
FROM sys.objects so
INNER JOIN sys.partitions sp ON so.object_id = sp.object_id
INNER JOIN sys.allocation_units sa ON sa.container_id = sp.hobt_id
INNER JOIN sys.system_internals_allocation_units internals ON internals.container_id = sa.container_id
WHERE so.object_id = object_id('Torder')

由于创建的表只有非聚集索引,所以整个表的页存储中有三部分数据:堆页面、溢出页面、索引页面;

堆中共有20个数据页和一个IAM页;

溢出单元有1001个页面包括一个IAM页;

索引中共有20个页其中18个数据页一个ROOT页和一个IAM页.

一个堆页对应多个溢出页,因为Pro有8000个字节所以一行占一页,而表的其它字段只有116个字节一个堆页可以存50条记录,所以并不是一个溢出页就唯一对应一个堆页

分析页的存储信息

---开启跟踪标志
DBCC TRACEON(3604,2588)
--DBCC TRACEOFF(3604,2588)
--
-获取对象的数据页,结构:数据库、对象、显示
DBCC IND(Ixdata,Torder,-1)

上一章中已经讲过了堆页面和溢出页面,所以现在就讲非聚集索引页

看过前面的文章应该一眼就能看出1281页是ROOT页,现在就分析1281页

分析非聚集索引根页