讓你隨心所-欲.的勃起24小時
MM吃了春`藥居然-變這款
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,打开日志一看,一大堆的这个错误:
本来项目就是.NET 4.0的,以前的服务器也运行好好的,根本没改过,同样的代码,出现这个错误。找不到2.0版本的System.Web,我虽然不懂,但这也太诡异了,我是无法解释的。那就先 经过搜索引擎 看看啥情况,经过一番360和百毒,在这个页面找到点有用的信息:
http://www.cnblogs.com/yelaiju/p/3375168.html
然后按照文章的方法,下载补丁。。。可惜本来网速就不快,开远程,卡得要死,我就打开QQ想把文件传过去。。。狗日的腾讯,打开个QQ,弹出个页面,悲剧了,直接卡死。。好吧,啥都干不了了。。。
最后只能叫客户下载好,安装上去。。。但是问题依旧。。。后来群里有个朋友叫我在配置文件加上下面一段:
加上去,重启了一下,经过一番折腾,好像好了一段时间,但是又报错,Sqlite数据库只读,这个问题还是比较简单,把数据库所在文件夹打开,给user用户权限就搞定了。
但是还是报上面哪个System.Web的错误,。。。。好吧,已经很晚了,本来想安装一个.net 2.0的环境看看是否有效,但无奈网速太坑爹,远程都进不去。。。。我放弃了,第二天再说把,
3.一招见效,安装.NET 2.0
早上起来,速度快了一点,果断下载一个.net 2.0的环境安装上去,然后重启了一下,就好了。
搞不懂啥原因,其实早就想到安装一个2.0的环境,但一直以为很容易就能解决,再加上坑爹的网速和企鹅的弹窗,死了好几回。。。
留个脚印把,搞不懂原理,请高手赐教。
本文链接:【踩坑经历】一次Asp.NET小网站部署踩坑和解决经历,转载请注明。
昨天有位同事跟我说,我们的手游客户端(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的闭包,所以其实是闭包作为第一类值。设置闭包作为回调很是简单明了:
而c++大概会写出这样的东西:
而且这是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的哪些部分,转载请注明。
用户名:小罗ge11 文章数:62 评论数:28
访问量:13570:1281:756:4 注册日期:2014-07-09
前几天看到朋友郑彦生分享的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< |