c++笔记:vector转数组

二种转换方式,一种是直接获得vector首地址的指针,别一种再copy一份

	vector<char*> vecChar;
	char* p1 = "p12113";
	vecChar.push_back(p1);
	char* p2 = "fdsafdsa";
	vecChar.push_back(p2);
	char* p3 = "sasssssss";
	vecChar.push_back(p3);
	char** a1 = &vecChar[0];
	for (int z = 0; z < vecChar.size(); z++) {
		cout << "pointer: " << *(a1 + z) << " "<< z << " " << vecChar[z] << endl;
	}
	char* arr[vecChar.size()];
	std::copy(vecChar.begin(), vecChar.end(), arr);
	for (int z = 0; z < vecChar.size(); z++) {
		cout << "copy: " << arr[z] << " "<< z << " " << vecChar[z] << endl;
	}

 

c++笔记:动态内存管理

内存主要有四块,栈,堆,全局和静态,常量。

栈,堆和java一样,开发主要是集中在堆里,能过new,malloc来操作,其它内存都是系统申请释放的。

关于常量如果用指针修改会报段错误:

	char* charP1 = "test const";
	*(charP1+1) = 'c';
	cout << charP1 << endl;

 

堆操作:

#include <iostream>
#include<stdlib.h>

using namespace std;

void test(string &str);
void test(char* charP);
void getPos();

int main() {
	// stack
	string str = "abcdefghijk";
	test(str);
	// error: type 'struct std::string' argument given to 'delete', expected pointer
	// str没有用new分配的是heap空间,数据在stack中,超出作用域自动释放,手动删除会报错
	// 看错误提示,delete后需要跟指针,所以只能delete new返回的
	//delete str;
	cout << str << endl;

	// heap
	string* str1 = new string();
	*str1 = "abcdefghijk";
	test(*str1);
	cout << *str1 << " str1 address:" << (void*)str1 << endl;
	// new分配的heap空间,不删除会内存泄露
	// 删除后可以看到&pos = str1;
	delete str1;
	str1 = NULL;
	getPos();

	int mallSize = 10;
	char* str2 = (char*)malloc(mallSize * sizeof(char));
	memset(str2, 0x00, mallSize);
	strcpy(str2, "abcdef");
	test(str2);
	cout << str2 << endl;
	free(str2);
	return 0;
}
void test(string &str) {
	int size = str.size();
	cout << size << endl;
	char* charP = new char[str.size() + 1];
	memset(charP, 0x00, str.size() + 1);
	for (int i = 0; i < str.size(); i++) {
		*(charP + str.size() - i - 1) = *(str.c_str() + i);
	}
	//memcpy(charP, str.c_str(), str.size());
	//string &r = str;
	//cout << (void*) charP << endl;
	//r = charP;
	str = charP;
	delete[] charP;
	charP = NULL;
	cout << "return: " << (void*) charP << endl;
}
void test(char* charP) {
	char* tmpP = new char[strlen(charP)];
	strcpy(tmpP, charP);
	for (int i = 0; i < strlen(charP); i++) {
		*(charP + strlen(charP) - i - 1) = *(tmpP + i);
	}
	delete[] tmpP;
}

void getPos() {
	char* pos = new char[1];
	*pos = 0;
	cout << "pos address:" << (void*)pos << endl;
}

 

java中char,unicode

    char c = '张';
    byte b[] = new byte[3];
    b[0] = (byte) ((c & 0xFF0000) >> 16);  
    b[1] = (byte) ((c & 0x00FF00) >> 8); 
    b[2] = (byte) (c & 0x0000FF);
    System.out.println(Arrays.toString(b));
    System.out.println(Arrays.toString(new Character(c).toString().getBytes("UNICODE")));

输出:

[0, 95, 32]
[-2, -1, 95, 32]

“张”的code point:U+5F20,可以看出java内部char使用的是双字节来存储unicode,这样的话,除了BPM,其它其它辅助平面里面的字符是没有办法直接使用,只能当成byte来处理。但是,当我显式获得字符的unicode的时候却是4个字节,看情况应该是ucs4,但是高16位却是-2,-1而不是0,我试了一下其它的字也都是这样。记一下这个问题。

文档:

http://zh.wikipedia.org/wiki/Unicode%E5%AD%97%E7%AC%A6%E5%88%97%E8%A1%A8#Unicode_.E7.BC.96.E7.A0.81.E8.A1.A8

 


update: 显式也是双字节,输出的4个字,其中前两个字节-2, -1就是oxFEFF,是个BOM头。。。

System.out.println(Arrays.toString(new String("张张").getBytes("UNICODE")));

[-2, -1, 95, 32, 95, 32]  只输出了一次BOM头

BOM:http://baike.baidu.com/view/126558.htm#sub5073178

使用phpunit

在快速开发,频繁上线的项目中,代码很容易出现问题,这时候做好单元测试就非常的重要。

1. 安装

项目地址:https://github.com/sebastianbergmann/phpunit/

手动安装很麻烦,推荐使用pear直接安装

yum install php-pear.noarch

pear install phpunit/PHPUnit
pear install phpunit/PHP_Invoker
pear install phpunit/PHPUnit_Selenium
pear install phpunit/PHPUnit_Story

2. 使用

'Car',
	);

	/**
	 * 不是test开头的测试方法使用@test
	 * 
	 * @test 注解么?
	 */
	public function noTest()
	{
		$this->assertEquals(1, 1);
		$this->assertEquals(1, 1);
		return false;
	}

	/**
	 * 依赖于noTest noTest返回值是这个参数值,noTest不过,这个检查跳过
	 * 
	 * @depends noTest
	 */
	public function testCreate($return)
	{
		$this->assertFalse($return, 'failed');
	}
	
	/**
	 * 使用数据源验验证测试
	 * 
	 * @dataProvider testProvider
	 */
	public function testArry($arr)
	{
		$this->assertArrayHasKey("return", $arr);
	}
	
	public function testProvider()
	{
		return array(
			array(array('return' => 'ss')),
			array(array('return' => 'ss')),
			array(array('return' => 'ss')),
		);
	}
	
	
	public function testException()
	{
		// 期待的异常
		$this->setExpectedException('Exception');
		// 抛出异常,测试通过
		throw new Exception('test');
	}

	/**
	 * 错误异常
	 * 
	 * @expectedException PHPUnit_Framework_Error
	 */
	public function testError()
	{
		// $this->fail('test');
		// PHP错误会抛出框架内置的异常 PHPUnit_Framework_Error
		include 'nofileffa.php';
	}
	
	public function setUp()
	{
		fwrite(STDOUT, 'set up');
		$this->queue = array(1, 2, 3);
	}
	
	public function tearDown()
	{
		fwrite(STDOUT, 'tear down');
		$this->queue = null;
	}
	
	public function testFixture()
	{
		$this->assertEquals(array(1, 2, ), $this->queue);
	}
	
	public function onNotSuccessfulTest(Exception $e)
	{
		fwrite(STDOUT, 'not success');
		parent::onNotSuccessfulTest($e);
	}
}

3. 部分资料

断言:http://www.phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.assertions

fixtures:http://www.phpunit.de/manual/current/en/fixtures.html

注解:http://www.phpunit.de/manual/current/en/appendixes.annotations.html

yii test:http://www.yiiframework.com/doc/guide/1.1/zh_cn/test.overview   PHPUnit 3.7的authload换成了匿名函数,需要改一下,不然yii加载会有问题.

 

yii绑定onEndRequest事件的bug

yii在CListIterator中使用引用,导致迭代在特殊情况下会出现BUG

public function actionIndex()
{
    $data = array('a', 'b', 'c');
    $a = new CList($data);
    foreach ($a as $k => $v) {
        if ($k == 0) {
            unset($a[0]);
        }
        echo $v;
    }
}

如果预先不知道这个情况,很容易出现问题,框架中也有这个问题,看一段代码:

public function setGlobalState($key,$value,$defaultValue=null)
{
    // ...

    if($this->_stateChanged!==$changed)
        $this->attachEventHandler('onEndRequest',array($this,'saveGlobalState'));
}

// ...

/**
* Saves the global state data into persistent storage.
* @see getStatePersister
* @throws CException if the state persister is not available
*/
public function saveGlobalState()
{
    if($this->_stateChanged)
    {
        $this->_stateChanged=false;
        $this->detachEventHandler('onEndRequest',array($this,'saveGlobalState'));
        $this->getStatePersister()->save($this->_globalState);
    }
}

public function raiseEvent($name,$event)
{
    $name=strtolower($name);
    if(isset($this->_e[$name]))
    {
        foreach($this->_e[$name] as $handler)
        {
            // ...
        }
    }
    // ...
}

当runtime目录被清空时,onEndRequest事件触发saveGlobalState动作,在操作的过程中却又解除了saveGlobalState动作的绑定。这会导致raiseEvent事件的时候,原来N个动作变成N-1个动作,但是计算器还是N个,就会下标越界。

向官方提交了这个BUG,想修正的话可以先注释掉这行:

    $this->detachEventHandler('onEndRequest',array($this,'saveGlobalState'));

zf增加.html的后缀,即可以实现静态化的插件

之前是.php后缀的页面,如何只需把后缀改成.html,像:http://www.gudalu.com/index.php,访问:http://www.gudalu.com/index.html 就会自成生成静态文件呢?

前段时间古大陆的cpu有点高,处理txt章节不给,决定搞成这种自动静态,zend framework很方便,三步搞定

1.创建一个ZendEx_Plugin_Html的插件,用来处理写html

_filePath = $filePath;
	}
	public function dispatchLoopShutdown()
    {
		$htmlContent = $this->_response->__toString();
		$pathinfo = pathinfo($this->_filePath);
		!is_dir($pathinfo['dirname']) && mkdir($pathinfo['dirname'], 0777, true);
		file_put_contents($filePath, $htmlContent);
	}
}

1. 在入口把所有.html的请求全部转发到HtmlController中~

	$router = $front->getRouter();
	$htmlRoute = new Zend_Controller_Router_Route_Regex(
		'[\d\w\/]+\.html',
		array(
			'module' => 'default',
			'controller' => 'html',
			'action'     => 'handle'
		)
	);

 

2.HtmlController注册ZendEx_Plugin_Html插件,这里可以对uri进行处理

_request->getRequestUri();
		$requestUri = parse_url($requestUri);
		$requestPath = $requestUri['path'];
		// --- 通过条件定位对应的参数来静态化数据
		$module = 'default';
		$controller = $action = '';
		$params = array();
		if (preg_match('/^\/index.html$/', $requestPath, $rs)) {
			$controller = 'index';
			$action = 'index';
		}
		// --- 文章页
		if (preg_match('/^\/file\/([\d]+)\/index\.html$/', $requestPath, $rs)) {
			$id = $rs[1];
			$controller = 'file';
			$action = 'view';
			$params = array('id' => $id);
		}
		if (empty($controller) || empty($action)) {
			//$this->_showError('无法解析地址');
			$this->_closeView();
			$this->_response->setHeader('Status', '404 Not Found', true);
			return;
		}
		
		$this->_forward($action, $controller, $module, $params);
		$this->_closeView();
		$filePath = str_replace('_app', '_www', APP_PATH) . $requestPath;
		// --- 给更低的运行级别,在render之后运行
		$helperHtml = new ZendEx_Plugin_Html();
		$helperHtml->setFilePath($filePath);
		$helperHtml->setRequest($this->_request)->setResponse($this->_response);
		$this->getFrontController()->registerPlugin($helperHtml);
	}
}

 

linode的东京机房太给力了

昨天刚更换完,速度很给力,电信100以下,基本上可以媲美国内的服务器了。

换机房也很简单,提个ticket工作人员立马响应,二个小时左右换完,以后用联通的线路再也不用天天掉线了。鼓舞…

FastDFS

fastdfs是一个分布式的文件存储系统,

项目主页:http://code.google.com/p/fastdfs/

支持论坛:http://bbs.chinaunix.net/forum-240-1.html

测试了一下,发现很好用,优点:

1,简单:tracker做负载均衡,storage存储数据。

2,良好的横行和纵向扩展:增加group即可实现容量扩充,增加group内的storage即可实现性能扩充

3,节省成本:数据不分块存储,前端无须再加一层缓存,直接将storage当做web server来使用

4,良好的灾备:不需要raid,group内的storage存储相同的数据

5,持续的的更新,作者很用心

配置文件:http://bbs.chinaunix.net/thread-1941456-1-1.html

回望2010

1. 今天的年终总结是坚持,明年的计划仍然是坚持。
2. 从去年11.4开始跑步,这一年一直在跑,今早上秤81.7kg。
3. 三年又三年,这是第二个三年的结束,也是第三个三年的开始。上次我给自己画了一个大饼,结果变成了一烧饼,这次不画饼了,改成给自己吹个泡泡。

2010年再见,2011年你好。分享一首05年超级女生,就是李宇春那一届,有个叫赵静怡的选手唱了一首歌。

 我的左手旁边是你的右手

旧的记事本

收拾衣服的时候,翻出了一本日记,从05年6月12号,一直写到07年1月20号,断断续续写了一年多。
随手翻翻,看着深浅不一的笔迹,依稀能回忆起当时的心境。

06/23/2005 正在看让我痴迷不已的诛仙,写了二页感想,这要是发到网上,那就是长评。
07/27/2005 非常想家
09/30/2005 连续好几篇都在写做游戏帮派论坛,做金山游戏推广员,怎么在学校里帖小广告,以及如何是被坑的悲惨故事。
12/05/2005 反思了自己的一些想法,以及看了《乱世铜炉》的感想。现在的我和5年前的我在一些价值观上仍然一致。
12/09/2005 第一次用java写程序的兴奋。
12/24/2005 平安夜让我回忆起了昔日的网友。
12/31/2005 年终的我发现又混过了一年
05/26/2006 确定电脑是我的饭碗
01/20/2007 年终总结:害怕

之后就开始工作了,刚工作时睡眠严重不足,就没有时间扯蛋了,整个日记也就断了。不写日记,我发现脑子里记的全是事,关于个人的感受已经模糊不清。现在又开始续写这本日记,不过留了一页空白,代表已逝去近四载的时光。