C & C++

十步精通新语言

C++博客首页 - Sun, 08/22/2010 - 10:20

标题党一下.....
昨天做了一个特殊抓取的爬虫,不到50行python代码,痛痛快快的给我抓取了2000个flashgame和玩法说明.除了感叹会写程序实在太好了之外,还想到了如何快速学习一门新语言的事情.
严格来说,应该是学习命令式语言,和其他类型的语言可能一点交集都没有.
一门语言的本质只是简单的语法和基本IO,只要稍微认知了这些内容就能开始写程序了,要精通则是一个不断进行实际应用和调试的过程.

  1. hello world
    • 认识主函数或者入口函数,看看语言的基本风格.
  2. 变量
    • 变量定义,变量类型,变量赋值.
    • 数值,字符串,bool类型是最基础类型.
    • 区别全局变量,局部变量.
    • 结构体的使用.
  3. 标准输入输出
    • 从终端给变量赋值,在终端打印变量的值.这是学习新语言时最需要的调用.
  4. 函数
    • 函数定义语法,参数的格式,返回值的格式.
  5. 分支,循环
    • 判断表达式的语法.
  6. 字符串操作
    • format操作,字符串连接符.
    • 搜索和提取子串.
    • 字符集编码规定和接口.
    • 再高级一点,正则表达式.
  7. 容器
    • list和dict,类似的东西,他们的使用方式.
  8. 文件读写
    • 打开,关闭文件.文件数据的读取和写入.
    • 读取一行数据.
  9. runtime
    • 语言自身的特殊概念.这里通常才是这门语言区别其他语言的精髓所在.
    • 交互式控制台.
    • 编译程序,或者由解释器执行程序.
    • 运行环境,程序启动方式.
  10. 模块
    • 导入模块,使用模块.
    • 多文件,分模块,编写自己的模块.

语言说到底只是工具,拥有语言之外的良好的基础能力和领域能力才是最难的地方啊.

ol > li { font-weight: bold; }

LOGOS 2010-08-22 10:20 发表评论
Categories: C & C++

检测lua内存泄漏

C++博客首页 - Sat, 08/14/2010 - 15:41
引子

最近用机器人做NPC的压力测试,突然发现一台机器能支持的机器人数量剧减,而且运行一段时间后整台机器直接内存耗光死机.经过观察,发现1个机器人在运行一段时间之后内存能占用到120M之多,而且还在不断增加,同时内存无法手动回收.
以前1个机器人大概消耗10M-20M的内存,这次的消耗明显异常了,所以初步判断逻辑上存在lua对象泄漏:在某些没有注意到的地方长期引用着不再使用的lua对象,导致这些对象无法被gc.
为了解决这个问题,google到一篇相似问题的文章,lua内存泄漏查证.文章的大概思路就是:

  1. 资源跟踪,定位哪些资源泄漏
  2. 引用检索,查找泄漏的资源被哪个模块引用

资源跟踪

定义:将应用中分配的lua对象添加到一个弱表中.执行完整的gc后,还能从弱表中索引到的对象表示它还在别的地方被引用着,可能是正常的引用,也可能是一处内存泄漏.
我使用了一个弱键表,该表以要跟踪的lua对象为键,该对象的描述信息为值.其中的描述信息包含了对象描述和对象创建时间两项.对象描述用于区别不同的跟踪对象;创建时间则用来在打印弱表的时候判断对象的存活时间是否合理.
我定义的接口是:function TraceMem(obj, description);

虽然机器人可以动态的加载无尽的模块,但是几乎所有的资源都是由几个基础模块开始分配的,所以添加对象跟踪相对比较简单.经过修改,运行,测试,从弱表中打印出来的数据发现,机器人中有大量的移动包和移动相关的计时器对象没有被gc掉,这些对象多数都已经存活了100秒以上.场景中NPC都是僵尸,每个移动的时间应该在5秒以下,所以可判定这些移动对象是泄漏.
问题的范围缩小了,但还是看不出哪段代码造成了泄漏?泄漏的对象在哪一个模块中被引用?

引用检索

定义:从某个节点开始搜索所有该节点引用的对象以及递归搜索子节点,找到要搜索的对象,打印出引用路径.
最常见的可以从_G开始搜索.搜索到的每个table,取其key和value递归搜索;搜索到的每个函数,取其upvalue递归搜索.至于是否需要搜索对象的环境表和metatable,以及全局registry表,则取决于具体需求.我因为用不上,就没有搜索这一部分.
搜索的时候注意标记已经搜索过的节点,避免重复搜索.最好能缩小搜索范围,而不是从_G开始搜索,另外应该能每次只搜索指定的部分引用而非全部,可以极大的缩短等待时间.搜索所有的引用其实相当耗时.
我定义的搜索接口是:function Search_r(obj, node, mark, result);

经过引用检索处理后,我看到了计时器模块引用了那些泄漏的移动包和移动计时器对象,这些对象的创建时间和引用他们的激活时间居然是相同的,这导致了这些计时器对象不会再激活,同时也失去了激活后释放的机会,造成了内存泄漏.而根本原因,则是移动处理模块在使用计时器的时候传入了0超时参数,因为僵尸走得太慢了.
到此,问题就算全部解决了.

PS:发现用html编辑blog非常不错啊,比cppblog自带的所见即所得编辑器好用多了,还可以用CSS和插入一些有趣的js.

click me h4 { text-align:center; } $(function() { $("#mybutton").click(function(){ $("#my_ps_panel").toggle('slow'); }) } )

LOGOS 2010-08-14 15:41 发表评论
Categories: C & C++

linux下如何提取mp3

C++博客首页 - Mon, 07/19/2010 - 08:02

事情的起因大概是,女流在某个游戏视频里哼哼了几句,想到用来做信息铃声可能会挺赞的,于是就动手了.

首先是将视频down下来,用的是firefox上的某个插件,格式是flv.下载后首先要做的就是格式转换到mp3,网上搜索了3种方法,只有最后一种成功了....

  1. 用mplayer的转换,可耻的失败鸟
  2. 用ffmpeg转换,可耻的失败鸟
  3. 用mencoder转换,总算成功了

接下来,开始提取音乐的片段.因为女流就哼哼了大概7,8秒吧,要从整个文件里提取这7,8秒,其他什么凤姐啊著姐啊专家啊的最讨厌了.提取的软件用的是audacity,所见所得,随便尝试了几下就提取出来了.过程大概是:

  1. 在音轨上选中要导出的区域,反复试听,满意为止.可以通过数值输入微调
  2. 在菜单上选中export selection,导出

导出后立即装入手机享受一下,结果声音太大,感觉糟糕.要降低音量才行,搜索出可以用mp3gain降低音量,默认是89db,降音后感觉很棒,声音刚刚好,柔柔的.



LOGOS 2010-07-19 08:02 发表评论
Categories: C & C++

month-flow [6]

C++博客首页 - Sun, 06/27/2010 - 21:56
     摘要: 6月碎碎念  阅读全文

LOGOS 2010-06-27 21:56 发表评论
Categories: C & C++

python code snippet

C++博客首页 - Mon, 05/24/2010 - 20:05
class LuaTable:
-- def __init__(self, **argss):
---- self.__dict__ = dict(argss)
player = LuaTable(name = 'p1', hp = 10) print player.name print player.hp dog = LuaTable(name='dog', type='dog') print dog.name dog.food = 'bone' I hate python dict, so make something like lua table.

LOGOS 2010-05-24 20:05 发表评论
Categories: C & C++
Syndicate content