游戏中的感悟

前一阵和朋友谈起打牌,中间聊到麻将,就想起10年前一件事。 当时和一个朋友在一个小村子里,那个朋友和当地人晚上打麻将,居然赢了几千,相当的意气风发。 听说我不会打麻将,很是为我惋惜,说了一大通。别的都没记住,就记住一句:“打麻将能让人明白很多人生道理的”。

到现在也没学打麻将,不过这句话让我想到,其实很多游戏都给自己不少的感悟, 明白一些人生的道理,这里和大家分享一下。

中国象棋的感悟

  1. 不要光看着当前怎么走,而要想到几步以后
  2. 太容易得到的好处很有可能是陷阱

 

围棋的感悟:

  1. 含而不露的棋往往是力量很大的,那种咄咄逼人的反倒有可能是纸老虎。
  2. 要懂得放弃

 

足球的感悟:

  1. 人不是放在一起就叫团队的,要经过训练磨合。
  2. 配合好的团队迸发的力量很惊人

 

长跑的感悟:

  1. 找到适合自己的节奏很重要,跟着别人的节奏很有可能会被拖垮,哪怕这个人比你慢。

 

登山的感悟:

  1. 你可以爬的很慢很慢,中间也可以休息,但不要无计划的长时间停下来,俗话说的:“不怕慢,就怕站”,“远山怕慢牛”。 如果要休息,一定要有计划的休息。人生中的很多目标也是如此。
  2. 不要以登顶为唯一目标,要学会享受攀登的过程。

 

红警的感悟:

  1. 刚开始玩红警时,我总想着建设好了再打别人,可往往这时候别人也建设好了。 明白了不要想着什么都准备好了再去找机会。

 

实况足球的感悟:

  1. 不用去尝试很多阵型,你只用把一种阵型练到极致

 

文明给我的感悟:

  1. 这是个合作的世界
  2. 要让和你合作的人得到好处,甚至让对方占大头,这样人家才会乐意和你长期合作。

Toastmaster

机缘巧合,1个月前开始参加珠海Toastmaster最早的俱乐部TMC的活动,观察了半个月后正式加入。 感觉Toastmaster很不一般,很值得做企业或做公益组织的去研究学习。 Toastmaster是个全球性NGO组织,从1924年在美国发起,现在有几十万会员,只有全球主席一人拿薪水,其他都是志愿者。 而全球主席和各分区主席都是选举产生,每半年轮换。 这个组织还在不断壮大中,光是珠海就有4个俱乐部。

曾听一个企业家说, 最好的管理是用制度管理人。而Toastmaster把这一点发挥到了近乎极致。 所有的人,包括管理人员,都在不停变动,而这个组织则稳步发展壮大, 靠的就是他设计的非常巧妙的制度机制。 我还在详细捉摸中,越捉摸越感觉整套机制的设计充满了智慧。等彻底想明白了和大家分享,今天太晚先睡了 :)。

第一次做Ah Counter

在珠海TMC今晚的meeting中,第一次做了Ah Counter。 记录的比较详细,但上去做介绍和报告还是很紧张,断断续续的。 下次可以放松点,最后报告更有条理些。

和大家分享两个做Ah Counter的两个经验。

  1. 可以从http://www.fourseasonstoastmasters.com/docs/Ah-CounterTallySheet.xls 下载Ah Counter Sheet, 并打印出来。 在meeting开始前根据Agenda将人名填好,记起来方便很多
  2. 还发现一个用特别适合Ah Counter的计数器,在https://itunes.apple.com/us/app/counter-+/id478557426?mt=8 。 可以把第一屏设置为临时计数器,第二个设置为记录TM, 第三个用来记录Table Topic Master

有些背景信息,大家可参看下列资料

  1. What is Toastmaster?
  2. What is Ah Counter?

Selenium WebDriver学习笔记一

Selenium是web自动化测试框架,从2.0版本后加入了webdriver功能, 可以用java,python等主流语言完全操控浏览器进行自动化测试,功能非常强大。

下面演示一个很简单的例子,就是通过webdriver打开一个浏览器,然后访问google,搜索一个字符串,再显示结果页面的title。例子都是从selenium文档里抄的,语言为java。

  1. 安装jdkmaven(记得设置JAVA_HOME, M2_HOME宏)
  2. 在firefox安装selenium的插件
  3. 新建工程目录,创建pom.xml,内容如下
    
    
            4.0.0
            MySel20Proj
            MySel20Proj
            1.0
            
                UTF-8
            
            
                
                    org.seleniumhq.selenium
                    selenium-java
                    2.37.0
                
                
                    com.opera
                    operadriver
                
            
            
                
                    
                        com.opera
                        operadriver
                        1.5
                        
                            
                                org.seleniumhq.selenium
                                selenium-remote-driver
                            
                        
                    
                
            
    
    
    
  4. 在目录里执行: mvn clean install
  5. 在Idea里import新生成的maven project
  6. 创建子目录 src\main\java\org.openqa.selenium
  7. 在子目录下创建文件Selenium2Example.java, 内容如下
    package org.openqa.selenium.example;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.support.ui.ExpectedCondition;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    public class Selenium2Example  {
        static WebDriver driver ;
    
        public static void main(String[] args) {
            // Create a new instance of the Firefox driver
            // Notice that the remainder of the code relies on the interface,
            // not the implementation.
            driver = new FirefoxDriver();
    
            // And now use this to visit Google
            driver.get("http://www.google.com");
            // Alternatively the same thing can be done like this
            // driver.navigate().to("http://www.google.com");
    
            // Find the text input element by its name
            WebElement element = driver.findElement(By.name("q"));
    
            // Enter something to search for
            element.sendKeys("Cheese!");
    
            // Now submit the form. WebDriver will find the form for us from the element
            element.submit();
    
            // Check the title of the page
            System.out.println("Page title is: " + driver.getTitle());
    
            // Google's search is rendered dynamically with JavaScript.
            // Wait for the page to load, timeout after 10 seconds
            (new WebDriverWait(driver, 10)).until(new ExpectedCondition() {
                public Boolean apply(WebDriver d) {
                    return d.getTitle().toLowerCase().startsWith("cheese!");
                }
            });
    
            // Should see: "cheese! - Google Search"
            System.out.println("Page title is: " + driver.getTitle());
    
            //Close the browser
            driver.quit();
        }
    }
  8. 在项目目录执行如下命令:
    mvn compile
    mvn exec:java -Dexec.mainClass=”org.openqa.selenium.example.Selenium2Example”

    运行后就能看到一个firefox窗口被创建出来,自动访问google并搜索, 在console窗口中会看到title的输出

 

 

查找读写指定文件的进程

今天遇到一个问题,需要知道读写某个特定文件的进程是哪个。开始找到inotify,发现它确实能监控文件的读写等一系列事件,但它只能告知制造这些事件的用户id,而没有进程id。这时候想到lsof, 它能列出当前所有被打开的文件及打开进程的信息。那么在收到inotify事件通知后,执行lsof不就能知道进程信息了,抱着这个想法写了个python脚本,结果发现屁用没有。因为大多数修改文件的过程,都是修改完后立刻关闭文件的,收到inotify事件通知再去执行lsof几乎得不到任何有用信息。

正在陷入困境之际,网上找到了答案。只要执行如下命令:

/sbin/auditctl -w 文件路径 -p war

等到文件改变后,执行:
/sbin/ausearch -f 文件路径

就能知道到底是哪个进程修改了这个文件。ausearch的输出信息很多,可以用more或倒到一个文件里慢慢看。
看完后执行
/sbin/auditctl -D

以删除所有监控规则。

在CENTOS 6.4 测试通过。

 

14年前做的一个NURBS Demo

最近整理文件,发现14年前的NURBS Demo居然在Win 7下还能很好运行,速度比当年快了很多。

当时研究在3D游戏中,采用NURBS建模的模型。根据相机与物体的位置,实时演算生成模型的三角形。 离相机远的部分,三角形就少,节省渲染时间,离相机近的就三角形多,细节更丰富些。说起来很理想,但实现起来有好几个难点:

  1. NURBS Trim的问题
    NURBS曲面中挖洞的方法是用NURBS曲线去描述这个洞,如何快速在游戏中实现是个难点。这是我当时主要攻关的问题。当时找出两个方法,一个是根据相机距离远近,及曲线不同段的曲率,不断调整切分Nurbs Trim曲线的不同段的粒度。一个是另辟蹊径,给3DS MAX开发了一个插件,能在编辑NURBS曲面时,同时生成一个合并了原有材质且带Alpha通道的高精度材质图片, 在Nurbs Trim 曲线以内的alpha通道都是透明的。
  2. NURBS编辑工具的问题
    当时公司用的NURBS编辑工具主要是3DS MAX,虽然是有较强的NURBS曲面编辑功能,但实际生成的NURBS曲面问题很多,远不如同期的Rhino,可Rhino当时对插件之类的二次开发支持又很不好。
  3. NURBS曲面在随着相机距离而调整模型的过程中,物体的边缘,会在屏幕上产生抖动感。
    这个问题相当难以克服,一直没能解决。

当时有宣传用NURBS的游戏,例如Quake3,其实它只是在建模中使用了NURBS,并没有做到实时的生成模型。当时整个游戏界对NURBS抱有很高的期望,有显卡公司想从硬件层面给予解决,但后来都没了消息,再后来也就没再关注这方面的进展,不知现在怎样。不过现在的显卡能力已经超强,不用NURBS技术,就靠堆三角形已经能实现近乎真实的画面效果了。

下面是Demo的两个截图,大家可以看到这个鸭子的三角形数量在两个图里是不同的。在同一个图中,鸭子不同部位切分的细节程度也是不同的, 整个鸭子上的三角形都是每帧都重新实时生成的。

当时为了搞这个,读了很多SIGRAPH,MSR,及各大学关于NURBS的论文,对自己提高帮助很大。

11-2

 

这个demo的下载链接是 http://www.nihuo.com/downloads/nv.zip

下载下来demo后解压,选择File ->Open, 打开NRB_DUCK.oo就能看到鸭子, 按下F键就能看到三角形的线框,按鼠标右键能旋转模型, 按<, >能调整模型切分的系数。更详细的可参看readme。屏幕左上角的tri是整个模型的三角形数量。因为主要是为了演示NURBS一些关键算法的效果,其他方面都很粗糙,还请见谅。

Nginx模块开发教程

做Nginx模块开发的时候,发现这方面的文档很少, 磕磕绊绊走了不少弯路。 过了两年,发现有点改善,但不算大。 昨天有人问能不能教他简单的Nginx开发入门,本想在网上给他找个教程的,结果没找到太合适的,于是干脆自己写了个简单的教程。主要是入门代码和一些资料的索引。有两个例子, 一个是Hello World, 就是访问URL显示Hellow World, 一个是Hello World Text, 就是可以通过配置文件来定义显示的欢迎信息。 教程地址是 https://github.com/nihuo/Nginx-Module-Development-Tutorial。 看完这个教程应该就会知道如何开始写Nginx模块,如何解析参数,如何输出。

这个教程是给Nginx模块开发的初学者的。其实我自己也是个初学者,之前正式开发过的模块只有两个,是抱着和大家一起学习的态度写这个教程的。 尝试分享给别人其实也是自己整理旧知识学习新知识的很好过程, 发现了不少自己以前认识错误的地方,狂汗。 当然,现在写的例子,估计问题还是不少,算是抛砖引玉,欢迎大家多多批评指教。

以后有空的时候还会再添加例子,也欢迎大家来编辑添加。 Nginx不只是个Web Server,其实是个很好的高性能服务器二次开发平台, 希望能通过这个教程让更多人认识Nginx巨大的二次开发潜力。

整个教程是用英文写得,为了锻炼自己的英文,可能会让英语大牛们贻笑大方,笑过后,不妨耐心指正,将不胜感激。

 

IE10的奇怪问题

今晚遇到个IE10的问题,折腾了很长时间。就是在Win7下面的IE10中Ajax选择Post模式, 用HTTP Watch看到所有信息都正常,但在服务器端就是拿不到POST的数据。设置IE10为IE9模式就没有这个问题。折腾了好久,后来发现关闭HTTP WATCH就没有这个问题了,真是吐血。