植臻

谦虚、热情、简单、极致

Haskell(二)

| Comments

在haskell(一)中学习了haskell的基本语法。在输入ghci之后能够进入haskell终端, 在终端里可以执行运算,写一些简单的函数,接下来要在文件中写代码,并编译,执行
创建hello.hs文件

Haskell(一)

| Comments

Haskell是一门纯函数式语言。它因为monads以及其类型系统而出名,初窥haskell,倒是觉得 其中的列表跟erlang特别像。
下面是基础语法:

Lua代码加密

| Comments

开发者为了防止代码泄漏,在发布前一般会对脚本进行加密,加密方式有多种, 比如常见的AES, XXTEA .. 等等,在cocos2dx加载加密后的lua文件后,解密之后再 执行.

INIT18 BOOT FAILURE

| Comments

问题描述

在安装gentoo的时候,一切都安装完,在执行reboot这一步之后,无法正常启动grub


问题原因

相信你在执行reboot的时候,关机信息中看到了,系统无法umount cdrom


解决办法

改reboot为shutdown -h now,然后手工将安装光驱从virtualbox中删掉,再重新启动gentoo

One Billion Customers 部分摘录

| Comments

是开端亦是转折

一只脚尚驻在过去,一只脚已踏入未来,中国是全世界最盛大的开端,也是最伟大的转折。


1989年TM是一场悲剧,但也是一次转折点。它是由党内的保守分子和改革人士之间的巨大 裂痕所导致的。保守分子赢得了这场战役,但是却输掉了整场战争。作为TM事件的后果, 党加速了私有化和市场改革的进程,因为党的威信已经被打破,只能通过快速提高人民 生活水平来重建。

Nginx中的try_files

| Comments

在nginx的配置项里有try_files这一项,查了一下,是nginx0.6.36后增加的功能, 用于搜索指定目录下的N文件,如果找不到fileN,则调用fallback中指定的位置来 处理请求。利用它可以代替部分复杂的nginx rewrite语法


try_files file1 [file2...fileN] fallback

默认值:无 作用域:location

php5.3引入的延迟静态绑定

| Comments

先看这段代码:

<?php
class A{
    public static funciton create(){
        return new static();
    }
    public static function createself(){
        return new self();
    }
}

class B extends A{

}

class C extends A{

}
var_dump( B::create() );
var_dump( C::createself() );
?>

得到结果如下

object(B)#1 (0) { } 
object(A)#1 (0) { } 

原因是self关键词的执行环境是定义self的类,而不是调用它的对象, static与self的区别就是它的执行环境是调用它的对象。

Cocos2dx之修改vs2010下丑陋的hellolua模板

| Comments

一直想抽时间把cocos2dx入门这自己的经历写一下,终于周末啦!
首先说明,本人win7用户,IDE是vs2010,编译环境是win32,这篇文章是介绍如何在vs2010中开始你的第一个cocos2dx+lua项目的 前提是你必须安装了vs2010哈!
第一步,下载cocos2dx,下载后解压,这个放在哪个目录都没关系。
第二步,安装cocos2dx工程模板,双击解压后目录下的 install-templates-msvc.bat 这个文件,如下图

第三步,打开你的vs2010,文件-> 新建项目,这时候你会看到,已安装的模板一栏里有Cocos2d-win32 Application 这个模板,并且有cocos2dx的经典图标在那!

这时候,你需要输入名称,然后点确认.

点击下一步
Select engile
选择引擎,这里选择audio和lua引擎
然后就能看到刚刚创建的项目了:
init project
这时候如果我们点debug按钮,项目是不能运行起来的,因为它缺少一些库
第四步,运行cocos2dx目录下,也就是之前解压的目录下的build-win32.bat,等运行完后,会在当前目录下生成Debug.win32这个目录 build cocos2dx 然后找到Demo项目下的Debug.win32,如果没有这个目录的话,执行一下Demo项目的Debug就有了(尽管执行报错),但是会生成这个目录: 然后我们把cocos2dx/Debug.win32 这个目录下的这些文件拷贝到 Demo/Debug.win32 下

glew32.lib
libcocos2d.lib
libCocosDenshion.lib
liblua.lib
lua51.lib
pthreadVCE2.lib

glew32.dll
libcocos2d.dll
libCocosDenshion.dll
libtiff.dll
lua51.dll
pthreadVCE2.dll
zlib1.dll

有点多,需要一个一个拷贝过去,如果缺了其中一个的话,会报错
libs
第五步,在Demo/Demo目录下创建Libs目录,把cocos2dx目录下的cocos2dx;CocosDenshion;extensions;以及cocos2dx/scripting 目录下的lua 都拷贝到新建的Libs中来。
copylibs
第六步,配置包含路径,项目上点右键 –> 属性 –> C/C++ –> 常规-> 附加包含目录 ,删除它原来的那些,将下面这些加入
fujiamulu
再打开链接器的输入,加入lua51.lib lianjieqi 设置完后点击应用,然后就可以运行了,结果如下,瞧!一个小农场游戏: Demo

当然,还没完,因为我们不仅仅是要运行第一个cocos2dx + lua项目,我们是要改它生成的不美观的目录结构: 首先,删掉Demo目录下的proj.win32文件夹,因为里面什么东西都没有!
然后在项目的资源管理器面板中,在Demo.rc;Demo.ico;Demo.png这三个文件上点击右键-> 移除-> 删除; 再删除Demo/Demo/proj.win32下的res文件夹.
将main.h;main.cpp这两个文件移动到Demo/Demo/Classes 文件夹中.退出vs2010.
将Demo.win32.vcxproj;Demo.win32.vcxproj.filters;Demo.win32.vcxproj.user 三个文件移动到Demo目录下;删除Demo/Demo/proj.win32这个文件夹
将Demo/Demo下的Classes;Libs;Resources三个文件夹移动到Demo目录下;并删除Demo/Demo这个目录.
修改完之后,整个项目目录结构是这样子的:
然而这时候是无法打开项目的,打开Demo.sln文件编辑,并删掉这一部分:
删除Demo.win32.vcxproj.filters这个文件,让我们来重新设置filters过滤器,删除之后打开Demo.sln。移除项目中的所有文件: 然后依次按照我们项目中Classes;Libs;Resources这样的目录重新设置filters,分别用点击右键 –> 添加筛选器;右键 –> 添加现有项, 将我们的文件导入:
由于采用的是相对路径,所以附加目录这里得改一下啦:
还有这里,我习惯把中间目录跟Debug目录放到一块儿去
这时候改完之后发现跑不动了,因为找不到Resources目录
看到没,在这里设置的
好了,修改完之后,又能够看到我们的农场游戏了:
这时候的项目组织方式,已经按照我自己的想法完全改了:
按照这些方法,你完全可以以你自己的方式去组织项目结构

Linux C (三) Gdb

| Comments

ubuntu上面是默认装了gdb的,输入

gdb -v

查看gdb的版本信息

zhang@note:~/test_make$ gdb -v
GNU gdb (Ubuntu/Linaro 7.4-2012.02-0ubuntu2) 7.4-2012.02
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>.

上一篇介绍了Makefile,在上一篇的例子里,我们在Makefile中加入-g编译选项,使Makefile文件如下:

CFLAGS = -g
main:main.o test1.o test2.o
    gcc -o $@ $^
..c.o:
    gcc $(CFLAGS) -c $< 

然后先删了老的main.o文件

zhang@note:~/test_make$ rm main
zhang@note:~/test_make$ rm *.o

好了,重新编译

zhang@note:~/test_make$ make
cc -g   -c -o main.o main.c
cc -g   -c -o test1.o test1.c
cc -g   -c -o test2.o test2.c
gcc -o main main.o test1.o test2.o
zhang@note:~/test_make$

编译完后运行gdb

zhang@note:~/test_make$ gdb ./main
GNU gdb (Ubuntu/Linaro 7.4-2012.02-0ubuntu2) 7.4-2012.02
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/zhang/test_make/main...done.
(gdb)

输入命令

(gdb) list
1   #include "test1.h"
2   #include "test2.h"
3   
4   void main(int argc, char **argv)
5   {
6       test1_print("Hello ");
7       test2_print("World !");
8   }
(gdb) 
Line number 9 out of range; main.c has 8 lines.
(gdb)

注意,这里我试过,如果Makefile里面的-g参数不写,或者写得不正确,list的时候会报:

(gdb) list
No symbol table is loaded.  Use the "file" command.
(gdb)

如果只想列出2-9行之间的代码

(gdb) list 2,9
2   #include "test2.h"
3   
4   void main(int argc, char **argv)
5   {
6       test1_print("Hello ");
7       test2_print("World !");
8   }

如果只想列出某个函数

(gdb) list test1_print 
1   #include "stdio.h"
2   #include "test1.h"
3   
4   void test1_print(char *print_str)
5   {
6       printf("This is test1 print %s \n", print_str);
7   }
(gdb)

为了能够下断点查看变量值,我们改下main函数

void main(int argc, char **argv)
   {
       char msg1[128] = "Hello ";
       char msg2[128] = "World !";
       test1_print(msg1);
       test2_print(msg2);
   }

然后

zhang@note:~/test_make$ make        #编译
cc -g   -c -o main.o main.c
cc -g   -c -o test1.o test1.c
cc -g   -c -o test2.o test2.c
gcc -o main main.o test1.o test2.o
zhang@note:~/test_make$ gdb ./main
GNU gdb (Ubuntu/Linaro 7.4-2012.02-0ubuntu2) 7.4-2012.02
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/zhang/test_make/main...done.
(gdb) list                          #列出代码
1   #include "test1.h"
2   #include "test2.h"
3   
4   void main(int argc, char **argv)
5   {
6       char msg1[128] = "Hello ";
7       char msg2[128] = "World !";
8       test1_print(msg1);
9       test2_print(msg2);
10  }
(gdb) break 7                       #在第7行的位置下断点
Breakpoint 1 at 0x804847c: file main.c, line 7.
(gdb) run main                      #执行调试
Starting program: /home/zhang/test_make/main main

Breakpoint 1, main (argc=2, argv=0xbffff2c4) at main.c:7
7       char msg2[128] = "World !";
(gdb) print msg1                    #查看断点处变量msg1的值
$1 = "Hello ", '\000' <repeats 121 times>
(gdb) continue                      #继续往下执行
Continuing.
This is test1 print Hello  
This is test2 print World ! 
[Inferior 1 (process 3270) exited normally]
(gdb)

看吧,这就是用gdb调试一个程序的完整过程,简单吧?:–) 附上常用命令:

小结:常用的gdb命令
backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)
breakpoint 在程序中设置一个断点
cd 改变当前工作目录
clear 删除刚才停止处的断点
commands 命中断点时,列出将要执行的命令
continue 从断点开始继续执行
delete 删除一个断点或监测点;也可与其他命令一起使用
display 程序停止时显示变量和表达时
down 下移栈帧,使得另一个函数成为当前函数
frame 选择下一条continue命令的帧
info 显示与该程序有关的各种信息
jump 在源程序中的另一点开始运行
kill 异常终止在gdb 控制下运行的程序
list 列出相应于正在执行的程序的原文件内容
next 执行下一个源程序行,从而执行其整体中的一个函数
print 显示变量或表达式的值
pwd 显示当前工作目录
pype 显示一个数据结构(如一个结构或C++类)的内容
quit 退出gdb
reverse-search 在源文件中反向搜索正规表达式
run 执行该程序
search 在源文件中搜索正规表达式
set variable 给变量赋值
signal 将一个信号发送到正在运行的进程
step 执行下一个源程序行,必要时进入下一个函数
undisplay display命令的反命令,不要显示表达式
until 结束当前循环
up 上移栈帧,使另一函数成为当前函数
watch 在程序中设置一个监测点(即数据断点)
whatis 显示变量或函数类型