Trade Off

supercalifragilisticexpialidocious

MM2011我还没准备好

真没想到MM2011(2011年的数学建模)的时间改在了9月9日~12日,直接覆盖了中秋节,不知道组委会那帮人是不是有问题只顾自己过中秋,当然9月12日才是中秋,而且那天上午8点就结束了,但假期可是提前开始的。

本想在家看那本刚刚买来的书,但还有好多别的事情要做,就暂且搁置了看这本书的念头,而且每次看书都发现很简单,于是就不想继续看下去了。谁知难的东西都在后面,而且买的书是讲美国数学建模的,我们这个神奇的国家并不会太按照套路出牌,所以从这本书上找什么帮助看来渺茫了。

报名前打算用Python代替Matlab来出些数据呢,现在也是渺茫了吧?!不是专门做这个的突然插足进来参赛都是这下场。索性也抛弃掉指导老师,这最后的救命稻草也没了(当然,我们一直就没找到)。

MM2011,我还没准备好。

centos5上ppp、pptpd配置VPN

安装ppp:

1
yum install ppp

下载pptpd:

1
wget -c http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.3.4-1.rhel5.1.x86_64.rpm

安装pptpd:

1
rpm -ivh pptpd-1.3.4-1.rhel5.1.x86_64.rpm

修改参数:

1
vi /etc/ppp/options.pptpd

ms-dns 8.8.8.8和ms-dns 8.8.4.4(这里用了Google的dns,你可以用别的)

加入分配IP等信息:

1
vi /etc/pptpd.conf

localip 192.168.0.1

remoteip 192.168.0.2-30(意思是连接上分配一个2~30的地址)

加入账号密码:

1
vi /etc/ppp/chap-secrets

用空格分开:USERNAME pptpd PASSWORD *   (最后的这个星号意思是不指定IP,自动分给你一个,pptpd是在配置文件中写的一个服务名称,默认就是这个,不用再修改了,你需要更改的就是大写的两组值)

修改转发参数:

1
vi /etc/sysctl.conf

把net.ipv4.ip_forward = 0改正1保存退出

1
2
/sbin/sysctl -p
使刚才配置的转发参数生效,你能够看到系统打印出的参数列表,应该能够看到ip_forward = 1了

启动pptpd:

1
/sbin/services pptpd start

配置iptables内容:

1
2
3
4
/sbin/iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 47 -j ACCEPT
/sbin/iptables -A INPUT -p gre -j ACCEPT
/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

解释一下,前两行是开启1723和47端口,第三行是允许GRE协议,最后一行是设置转发到eth0轮询。至于这个轮询的概念我就不太清楚了。转发到eth0也就是说把请求发送到了网卡eth0,这个可以在/sbin/ifconfig看到网卡的名字。

保存iptables规则,重启iptables:

1
2
3
/etc/init.d/iptables save
/etc/init.d/iptables restart
如果原有iptables内容可能会和现有的冲突,所以发现问题后先检查一下这里,毕竟iptables是控制连接的所有出口

下面这两条根据需要执行吧:

1
2
/sbin/chkconfig pptpd on
/sbin/chkconfig iptables on

分别是让pptpd和iptables机器再次重启后也能运行。

工作都完成了,连接上试试吧,用pptp方式连接哦,别的方式没用过,应该是不行的。有时候连接上不能访问网页建议断开几次再连接上试试,我曾更改了mtu,发现没什么作用,应该不出问题默认的都能用,服务器一般建立的ppp0、1、2……这些的mtu都是1496,本机对应的是1444,具体算法不想深究。

Python批量处理文件

从某网站上下载了几个压缩包,里面全是目录,每个目录下都有一个doc文件,但可恶的是这些doc文件被换了扩展名,原本是xxx.doc现在变成xxx.doc.resx,我得用python批量处理一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#! /usr/bin/python
# -*- coding:utf-8 -*-
# 遍历所有目录,把resx文件扩展名删掉

import os

current_path = os.getcwd()
allsubdir = os.listdir(current_path)

for subdir in allsubdir:
   subdir_path = './' + subdir
   if os.path.isdir(subdir_path):
       files = os.listdir(subdir_path)
       for _file in files:
           basename = os.path.basename(_file)
           allname = os.path.splitext(basename)
           if '.resx' in allname:
               print 'resx file %s' % basename
               without_resx = allname[0]
               os.rename(subdir_path+'/'+_file,without_resx)
           else:
               print 'not resx file'
               continue

还用了一个删除空目录的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#! /usr/bin/python
# -*- coding:utf-8 -*-
#删除空目录

import os

alldir = os.listdir(os.getcwd())
for _dir in alldir:
   if os.path.isdir('./'+_dir):
       print 'dir: %s' % _dir
       if os.listdir('./'+_dir):
           print 'have something %s' % os.listdir('./'+_dir)
       else:
           os.rmdir('./'+_dir)
   else:
       print 'file or others'

用python,很快乐!

安装MySQLdb出现HAVE_WCSCOLL重定义问题的解决方法

问题就是这样了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@wodeyitian MySQL-python-1.2.3]# python setup.py install
running install
running bdist_egg
running egg_info
writing MySQL_python.egg-info/PKG-INFO
writing top-level names to MySQL_python.egg-info/top_level.txt
writing dependency_links to MySQL_python.egg-info/dependency_links.txt
reading manifest file 'MySQL_python.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching 'MANIFEST'
warning: no files found matching 'ChangeLog'
warning: no files found matching 'GPL'
writing manifest file 'MySQL_python.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-x86_64/egg
running install_lib
running build_py
copying MySQLdb/release.py -> build/lib.linux-x86_64-2.7/MySQLdb
running build_ext
building '_mysql' extension
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Dversion_info=(1,2,3,'final',0) -D__version__=1.2.3 -I/usr/include/mysql -I/usr/local/include/python2.7 -c _mysql.c -o build/temp.linux-x86_64-2.7/_mysql.o -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing -fwrapv
在包含自 _mysql.c:36 的文件中:
/usr/include/mysql/my_config.h:1062:1: 警告:“HAVE_WCSCOLL”重定义
在包含自 /usr/local/include/python2.7/Python.h:8 的文件中,
                从 pymemcompat.h:10,
                从 _mysql.c:29:
/usr/local/include/python2.7/pyconfig.h:887:1: 警告:这是先前定义的位置
gcc -pthread -shared build/temp.linux-x86_64-2.7/_mysql.o -L/usr/lib64/mysql -L/usr/lib64 -lmysqlclient_r -lz -lpthread -lcrypt -lnsl -lm -lpthread -lssl -lcrypto -o build/lib.linux-x86_64-2.7/_mysql.so
/usr/bin/ld: cannot find -lmysqlclient_r
collect2: ld 返回 1
error: command 'gcc' failed with exit status 1

也不算什么解决方法吧,就是缺失一些组件,安装了mysql-devel就好了:

1
yum install mysql-devel.x86_64

基本配置好了python+nginx

没想到配置过程有这么复杂,不过在按照Linode官方的指导做过之后发现一切又是那么简单,果然还是Linode的服务一流,同样的操作肯在所有发行版上都做一次教程,很少有VPS provider能够做到这些吧?看来贵还是有道理的。

不多赘述了,centos5的教程可以看这里(其他版本的在这里找:http://library.linode.com/web-servers/nginx/python-uwsgi

http://library.linode.com/web-servers/nginx/python-uwsgi/centos-5

Iphone模拟器和设备的差异

昨天1ST告诉我代码到了设备上有些地方不正常,我一直没用设备调试过,只是用模拟器,这次就用设备试试,没想到果然有些问题。

1.模拟器编译没有任何问题,但编译到设备就出现了8个错误,是因为继承后访问不到某些属性的问题。由于我在基类中用了property,在子类中直接引用,这样看来不行,于是在子类中但凡是从基类中继承过来的成员,都使用了self来引用。

2.在Organzer的设备console中查看输出的时候,发现有个地方应该输出东西了反而不输出,最终能够确认这个操作已经执行了,但就是不输出内容。也不知道怎么回事,我把原先的printf输出改成了nslog,竟然好了。由于使用的一个类是用c++写的,就没有使用nslog,这竟然在后来调试变成了大问题。

哎,以后有什么调试工作还是连接设备进行吧,虽然启动比模拟器慢一点,但能够暴露出问题啊!

VertexHelper的使用

最近在用Box2d开发小游戏,不可避免用到多边形物体,当然有的形状还好描述,但大多数是那种难以描述的物体,所以这个VertexHelper就是不可或缺的武器了,它能够让你把需要的物体边界描出来,自动生成Box2d需要的边界代码。

没想到作者把软件放到app store上卖,但还提供源代码,不知道他们之间是什么不一样……

从GitHub那里得到源代码,打开xcode编译一下就能用了。

有一点需要说明,得到的源代码中Project的Base SDK是10.5,在我编译的时候提示了一个警告,现在找不到了。只需要把Target中VertexHelper的BaseSDK改为10.7就可以了,当然如果你没有10.7就只能用10.6了。可能是因为我没有10.5SDK才出现的错误吧。

UITableViewCell的对齐方式

如果你用了Subtitle的Style,那么设置textAlignment为center就没用了,当然设置textAlignment目前只能针对textLabel来设置,听说在3.0以后的版本对于cell的textAlignment的设置方法废弃了。

刚刚我把cell的style改成了default,然后再设置这些alignment,就能用了,真奇怪用subtitle的方式即使重建了cell,都不能设置alignment到center。但原因是这样的,我引用下官方reference:

UITableViewCellStyleSubtitle A style for a cell with a left-aligned label across the top and a left-aligned label below it in smaller gray text. The iPod application uses cells in this style.

很明确了吧,subtitle就是left-aligned的label,再改也没用。当然还有个value1和value2的style,似乎是专门left-aligned和right-aligned的,不过在他们各自的反方向还有另外的label,最好看官方的说明和多多实践。

关于UITableView中的cell配置

都是关于cell的,不知道值得写出来么:

1。在定义cell样式的时候,如果你用UITableViewCellStyleSubtitle来初始化cell,那么设置cell的detailTextLabel的text属性就能看到详细的内容,在textLable的下一行显示着。

2。设定cell:[cell setAccessoryType: UITableViewCellAccessoryDisclosureIndicator];这样在每个cell右侧会有小箭头提示,很漂亮。

UINavigationController和UITabBarController的搭配

经过近1天的实践才摸清了这两个控件的搭配使用方法,网上介绍的不算多,我就把自己的经验说说:

首先这两个的搭配是这样的,基础是UITabBarController,你完全可以在Xcode中选一个以Tabbar为基础的工程,用Tabbar来划分程序的大功能,每个功能中再用Navigation来做导航。我想大家应该都会这样做,当然如果反过来也不是不行,就是感觉有点别扭。

在AppDelegate的初始化过程中用几个UINavigationController包裹UIViewController或者其子类(比如UITableViewController)放入UITabBarController中,这样的设置应该都会。我一开始这样写后,到了每个功能中,需要用到Navigation了,又自己写了一个UINavigationController,但不管用。然后我猜想是不是要自己模拟类似的功能,就自己加上了UINavigationBar,样子是对了,可惜这个bar不带popViewController的功能,完全让navigation成了摆设。无意中看到apple官方的例子中在UIViewController中用到了self.navigationController,我这才意识到UIViewController自己就带着UINavigationController。代码又改回以前的,几个UInavigationController包裹UIViewController初始化,然后在每个功能中大胆用self的navigationController来导航,达到了效果。

还有,如果要做TableView,最好在UIViewController的子类中加入一个UITableView而不是UITableViewController,前者是一个控件,而后者是一套处理(当然还包括控件)。我一开始想在某个功能中用表格,加了一个表格的controller,总是看到表格开头多了一大块灰色的区域,硬生生地把一个表格给隔开了,具体问题在网上没有搜索到相关结果。但后来用了UITableView就好了。

啰嗦了这么多,其实写的是我的探索过程,并不是直接给出的结果。