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就没有这个问题了,真是吐血。

《致老去的我》

这几天循环一首歌,邵夷贝的《致老去的我》,在http://www.songtaste.com/song/3256656/能听到。

 

《致老去的我》

亲爱的老去的我
此刻你坐在窗前
向过去回望
做过哪些选择
获得怎样的生活
他可否如你想象

是否生活在这样的国
即使不靠近海岸和山河
也四处可见绽放的花朵
人们扯下万千口罩
放肆笑着

过最接近生活的生活
安全的饭菜和牢固的屋舍
不警惕危险 不担心病患
没有人被允许经历孤单

孩子们看得到 彩虹和蜻蜓
老师教他自由 车辆为他缓行
夜晚宁静安眠 白天喜悦清醒
家永远在原地 他从不迁移

陌生的人儿啊
全部都充满善意
分享而不夸耀
不关心背景
不关心什么身份
相遇仿佛遇见太阳

在任何情况下 从不慌张
不热衷比较 内心很坦荡
爱好多样 有坚定的信仰
人们撕下万千面具
尽情歌唱

过最接近生活的生活
安全的饭菜和牢固的屋舍
不警惕危险 不担心病患
没有人被允许经历孤单

梦想是天生的 必有得愿望
是身份的证明 不会被谁影响
就像每一个人 都终会死去一样
每个人也终究会实现梦想

做过哪些选择 获得怎样的生活
它是否如你想象
做过哪些选择 获得怎样的生活
它是否如你想象

词曲:邵夷贝

 

 

Tags:

categories 生活

Page 5 of 53« First...34567...102030...Last »