讓你隨心所-欲.的勃起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:
>>> import psutil >>>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< |