ESXi 5.0需要多大的硬盘空间?

最近我的ESXi上的硬盘突然出现不稳定的情况,于是赶快将数据备份出来,扔到自己Ubuntu做的NAS上面。

在VMWare官网上面看到很多人都说ESXi上的虚拟机不应该安装到本地,虽然速度快,但是不容易管理,不容易备份。

所以把ESXi安装到一个U盘里面其实就可以,然后用千兆太,或者万兆太连接NAS或者SATA外置硬盘盒。

那这里就有一个问题了,这个U盘要多大?

我们知道… 通过对将死的硬盘的解剖,里面一共有6个分区,4个FAT,2个VMFS,4个FAT里面是一些系统文件,总共不要1GB

那1GB的U盘是不是够了呢?

通过对文档的阅读,答案是:

5.2GB,包含一个类似Swap分区的东西是4GB

参考文档如下:

http://pubs.vmware.com/vsphere-50/topic/com.vmware.ICbase/PDF/vsphere-esxi-vcenter-server-50-installation-setup-guide.pdf

简单的PHP应用,拼接Picasa和Youtube

现代人还是很幸福的啊… 从3岁小孩到百岁老人都有电脑玩… 我的一个老年人朋友最近就有一个需求,就是给Picasa的Photo Slideshow配乐。其实是很简单的事情,但是如果全盘都让老先生写iframe的代码,是不是有些残酷了呢… 所以我就做了一个小php应用给他。

程序的目标:

通过输入Picasa的slideshow地址,和youtube的地址,来自动生成一个用iframe组合好的,可以自动播放音乐的网页

程序内容文件:

1. index.html

2. save.php

3. show.php

数据库结构

CREATE TABLE IF NOT EXISTS `main` (
  `idx` INT(11) NOT NULL AUTO_INCREMENT,
  `picasa` text NOT NULL,
  `youtube` text NOT NULL,
  PRIMARY KEY (`idx`)
)

index.html文件结构:

<form action="save.php" method="post">
Picasa address :
<input name="picasa" type="text" />
Youtube address:
<input name="youtube" type="text" />
<input type="submit" value="Submit" />
</form>

非常简单的结构,两个输入框,一个提交按钮,使用post,到php

save.php文件结构:

//数据库连接信息
$username="zetadba";
$password="qwe123123";
$database="zeta";
 
//连接数据库服务器
mysql_connect("localhost",$username,$password);
 
//选择数据库
mysql_select_db($database);
 
//写一个SQL查询语句, 保存从index.html POST过来的数据到数据库
$query = "INSERT INTO main (picasa,youtube) VALUES('".$_POST["picasa"]."','".$_POST["youtube"]."')";
 
//执行SQL语句
mysql_query($query);
 
//debug mysql的错误,之前很多错误... sql那些东西都快忘光了...
echo mysql_error();
 
//查询刚刚存进去的条目的主键数值,用来给show.php来用
$query2 = "SELECT * FROM main ORDER BY idx DESC LIMIT 1";
 
//得到数值sql结果
$result2 = mysql_query($query2);
 
//得到我们想要的主键idx的值
$videoidx = mysql_result($result2, 0, "idx");
 
//关闭... sql
mysql_close();
 
将这个页面自动跳给show.php,这样我的老年朋友就可以直接拷贝走这个URL了
header('Refresh: 3; url=show.php?vv='.$videoidx);

show.php文件结构

 
//不解释了...
$username="zetadba";
$password="qwe123123";
$database="zeta";
 
mysql_connect("localhost",$username,$password);
 
mysql_select_db($database);
 
//这里是直接用的URL数值传递,所以我们GET这个vv值
$query = "SELECT * FROM main WHERE idx='".$_GET["vv"]."'";
 
$result = mysql_query($query);
 
//没写html文件头,所以写个这个当title...
echo "Picasa+Youtube";
 
$picasa = mysql_result($result, 0, "picasa");
$youtube = mysql_result($result, 0, "youtube");
 
//我们需要解析得到的youtube后面的url结构,得到video id
//比如http://www.youtube.com/watch?v=puSkP3uym5k&#038;list=FLV8tlMnzjrbiS7YLh8FAtPQ&#038;index=10&#038;feature=plpp_video
//中的puSkP3uym5k
$parsedurl = parse_url($youtube);
 
$videourlquery = $parsedurl['query'];
 
parse_str($videourlquery);
 
//经过以上的各种解析,我们最后得到了其中的v的值
$videoid = $parsedurlquery['v'];
 
//输出html结构
echo "<iframe width='99%' height='99%' border=0 src="".$picasa."" mce_src="&quot;.$picasa.&quot;"-->";
echo '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="10" height="10" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/'.$v.'?version=3&amp;hl=zh_CN&amp;autoplay=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="10" height="10" src="http://www.youtube.com/v/'.$v.'?version=3&amp;hl=zh_CN&amp;autoplay=1" allowfullscreen="true"></embed></object>';
 
echo mysql_error();
 
mysql_close();

以上!大功告成,一个小小的给老人的礼物,让他们做出这个东西,然后送给朋友,当一个小礼物!

NSString的内存管理 v.2011/12

之前写过一个NSString的内存管理

不过好像由于之前的理解不深刻,所以写的时候也没有说明太清楚。

CS193P的笔记上有如下实例:

aString = @"I am a string that 2 years old, man!";

这种情况下,字符串储存和管理由系统做,我们不用操心。

aString = [NSString stringWithFormat:@"I am a string that %d years old, man!",2];

第二种情况下,我们需要去retain和release这个字符串,系统不管。

这是之前写的内容。

为什么第一种我们不管这个产生的NSString的retain值呢?是因为其实由于我们建立了一个常量,无论我们retain还是release,对于这个对象都是没有意义的,大家可以尝试

NSString *foo = @"ssff";
[foo release];
[foo release];

会发现,这样的代码并不会让程序崩溃,而且无论你再release几次都是一样的。

第二种其实就是利用NSString 方法来生成一个NSString对象,这个时候我们要招呼到这个对象的retain值,否则就是内存溢出了。而我当时说的并不是一定要releaes或者retain这个stringWithFormat便捷方法产生的对象… 我语文不好,哈哈。便捷方法产生的都是autorelease的对象,谢谢大家的留言!

低质量的电源可能造成iPhone/iPad在PC上工作不良

之前在一个朋友家里面帮忙弄他的iPhone和iPad,但是常常发现这台电脑上的USB接口很不好使,iPhone和iPad接上去不认或者要很久才能识别。不仅仅是i设备,很多高功耗的设备都有这个问题。但是像手写板,U盘,这种设备却没有任何问题。

过了一段时间,朋友说自己的电脑会自己关机,而且是突然灭掉那种。

我过去检查了一下,说来奇怪,我用的时候,这个电脑还是非常听话的,没有出现任何不良的问题,甚至用Stress Prime 2004也是正常工作,让我一头雾水。但是回头用主板BIOS的PC Health检测,发现电压有严重不足和不稳定的情况。

于是乎立刻拆开了朋友的电脑,发现是一个RaidMax的垃圾电源… 450W的功率,但是却轻的要命…

换上一个ThermalTake的T2系列电源后,一切问题立即消失…

Android版《我的佛典》发布

https://market.android.com/details?id=name.gzl.MyFodian

这个版本的 我的佛典 可以说是非常的不成熟,但是我却花了很多的功夫在里面

这个版本的重点不是之前的多功能,而目只有一个功能,就是经文,是全部经文,是整部大正藏

非常感谢CBETA在电子经文上的努力,如果没有他们的XML文件,我的程序也就是不可能的了

我制作这个软件也算是一种还愿了,虽然佛陀和菩萨并没有真的全帮上我,但是我言出必行

我只希望大家能够通过我的程序,多读经文,多读佛陀的话语,而不是后人的揣测。

我在美国学到关于宗教最重要的,就是要读真正的,原始的,真实的经文。我在基督教浸信会中学习了两年,那个时候虽然他们很不情愿我这个佛教徒在那里参合,但是我却学到了很多在佛教圈子学不到的东西。

他们只尊重圣经原文,任何的后人解释,都不重要,都不是神的话语。我想佛教徒也应该学习他们的这种精神。也许古代佛经有很多真的太不容易读懂了,但是当我们读懂的时候,能从里面学到的,是真正的般若智慧。不会是后人的揣测,甚至是邪魔的臆造。

希望大家多看经文。在制作这个程序之前,我都不知道原来大正藏一共有3613本经,其中正藏就有一半,这些佛陀的教诲,大家又真的学会了多少呢?有多少人只是在背诵那短的不能再短的心经,而甚至都不知其意?大正藏的HTML文件大约有2.5GB大,而一部心经我猜也就1-2kb。佛学是广大的,希望大家能读原经。



佛典: 佛经html的基本javascript,css文件目录设计(v0.61)

记录一下佛经根目录辅助文件结构:

./

default.js

iphoneapp.css

safariiphone.css

safariipad.css

safariiphone4.css

mobiledefault.css

webdefault.css

基于Air的日期计算器

很简单的一个程序,计算从某天到某天一共经历了多少年,多少月,多少日,多少周. 或从某天在某年,某月,某周,某日之后是哪天

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
					   xmlns:s="library://ns.adobe.com/flex/spark" 
					   xmlns:mx="library://ns.adobe.com/flex/mx" width="882" height="372"
					    title="DateCounter by Zac@GoldG.net(Zhengliang Guo)">
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
 
	<fx:Script>
		<![CDATA[
			private function ftChanged():void
			{
				if(fromDate.selectedDate && toDate.selectedDate){
					var gapTime:Number;
					gapTime = (toDate.selectedDate.getTime() - fromDate.selectedDate.getTime()) / 1000 / 3600 / 24;
					dd.text = (gapTime).toString();
					ww.text = (gapTime/7.0).toString();
					yy.text = (gapTime/365.0).toString();
					mm.text = (int(gapTime/365) *12 + (toDate.selectedDate.getMonth() - fromDate.selectedDate.getMonth())).toString();
				}
			}
			private function midChanged(str:String):void
			{
				dstY.text = (startDate.selectedDate.getFullYear()).toString();
				dstM.text = (startDate.selectedDate.getMonth()+1).toString();
				dstD.text = (startDate.selectedDate.getDate()).toString();
 
 
				if(startDate.selectedDate)
				{
					var midTime:Number;
 
					if(str == 'y')
					{
						midTime = Number(midY.text);
						resetField2();
						midY.text = midTime.toString();
						dstY.text = (startDate.selectedDate.getFullYear() + midTime).toString();
					}
					else if(str == 'm')
					{
						midTime = Number(midM.text);
						resetField2();
						midM.text = midTime.toString();
						if(((startDate.selectedDate.getMonth() + 1 + midTime))>12)
							{
								dstY.text = (Number(dstY.text) + int((startDate.selectedDate.getMonth() + 1 + midTime)/12)).toString();
								dstM.text = ((startDate.selectedDate.getMonth() + 1 + midTime) % 12).toString();
							}
						else{
							dstM.text = (startDate.selectedDate.getMonth() + 1 + midTime).toString();
						}
					}
					else if(str == 'w')
					{
						midTime = Number(midW.text);
						resetField2();
						midW.text = midTime.toString();
 
						var tarDate:Date = new Date();
						tarDate.setTime(startDate.selectedDate.getTime() + (midTime * 7 * 24 * 3600 * 1000));
 
						dstY.text = (tarDate.getFullYear()).toString();
						dstM.text = (tarDate.getMonth() + 1).toString();
						dstD.text = (tarDate.getDate()).toString();
					}
					else if(str == 'd')
					{
						midTime = Number(midD.text);
						resetField2();
						midD.text = midTime.toString();
 
						var tarDate:Date = new Date();
						tarDate.setTime( startDate.selectedDate.getTime() + (midTime * 24 * 3600 * 1000));
 
						dstY.text = (tarDate.getFullYear()).toString();
						dstM.text = (tarDate.getMonth() + 1).toString();
						dstD.text = (tarDate.getDate()).toString();
 
					}
					else if(str == 'c')
					{
						resetField2();
					}
 				}
			}
			private function resetField2():void
			{
				midY.text = "0";
				midM.text = "0";
				midW.text = "0";
				midD.text = "0";
			}
		]]>
	</fx:Script>
 
	<mx:DateChooser id="fromDate" x="27" y="66" change="ftChanged()" showToday="false" />
	<mx:DateChooser id="toDate" x="211" y="66" change="ftChanged()" showToday="false" />
	<s:Label x="87" y="20" text="From" fontSize="25"/>
	<s:Label x="276" y="19" text="To" fontSize="25"/>
	<s:Label x="22" y="280" text="Days" fontSize="20"/>
	<s:Label x="22" y="319" text="Weeks" fontSize="20"/>
	<s:Label x="206" y="281" text="Month" fontSize="20"/>
	<s:Label x="206" y="316" text="Year" fontSize="20"/>
	<s:Label id="dd" x="96" y="281" text="d"/>
	<s:Label id="ww" x="96" y="320" text="w"/>
	<s:Label id="mm" x="272" y="285" text="m"/>
	<s:Label id="yy" x="272" y="320" text="y"/>
	<s:Panel x="433" y="10" width="433" height="328" title="Date To Time">
		<s:TextInput x="277" y="23" text="0" id="midY" change="midChanged('y')"/>
		<s:TextInput x="277" y="53" text="0" id="midM" change="midChanged('m')"/>
		<s:TextInput x="277" y="84" text="0" id="midW" change="midChanged('w')"/>
		<s:TextInput x="277" y="114" text="0" id="midD" change="midChanged('d')"/>
		<s:Label id="myy" x="225" y="28" text="Years"/>
		<s:Label id="mmm" x="225" y="59" text="Month"/>
		<s:Label id="mww" x="225" y="90" text="Weeks"/>
		<s:Label id="mdd" x="225" y="119" text="Days"/>
		<mx:DateChooser id="startDate" x="10" y="10" change="midChanged('c')" showToday="false"/>
		<s:Label x="47" y="236" text="0000" fontSize="35" id="dstY"/>
		<s:Label x="158" y="236" text="00" fontSize="35" id="dstM"/>
		<s:Label x="225" y="236" text="00" fontSize="35" id="dstD"/>
	</s:Panel>
</s:WindowedApplication>

很麻烦… 真有人需要的花, 自己看看吧, 不知道能不能帮上….

南无阿弥陀佛 南无本师释迦牟尼佛 南无药师琉璃光如来

iPhone:针对不同设备,使用不同CSS

上个文章聊了一下怎么检测iPhone/iPod/iPad, 接下来我们就需要实施CSS了

if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))){ 
    document.write('<link href="iphone.css" rel="stylesheet" type="text/css">'); 
} 
if((navigator.userAgent.match(/iPad/i))){ 
    document.write('<link href="ipadwoflash.css" rel="stylesheet" type="text/css">'); 
}

以上的javascript在检测到是iphone和ipod touch的时候就会写入iphone的css, 在检测到ipad的时候就会使用一个为ipad准备的没有flash的css结构~

南无阿弥陀佛 南无本师释迦牟尼佛 南无药师琉璃光如来

iPhone:Javascript/PHP检测iPhone/iPod/iPad

PHP的比较简单可爱:

	if (strpos($_SERVER['HTTP_USER_AGENT'],"iPhone"))  
	{ 
		echo '在用户代理信息里面如果有iPhone, 执行您的代码'; 
		//别忘了给iPod和iPad也加上去当条件阿~~
	}

javascript的也不错,不过我一直不喜欢浪费太多的iPhone资源,不过这回佛典的html文件还是需要使用javascript,因为所有的xml文件都是简单的转换成html,如果再将php搀和进来就很麻烦了

	if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))) 
	{ 
		document.write(navigator.userAgent);
	}
	else
	{
		document.write(navigator.userAgent);
	}

我们可以看一下上面代码的输出:
如果是一台Mac:
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.86 Safari/533.4

如果是一台iPhone:
Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9(KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7

其实就是找到agent中的典型信息,iPhone这个关键字了.

南无阿弥陀佛 南无本师释迦牟尼佛 南无药师琉璃光如来

Mac: 基于事件的XML解析器(NSXMLParser)

XML用处很大… 用得很广… 最简单的来说用PHP和Javascript, JQuery都可以简单解析一个整齐的树结构XML文件

但是我们可爱的佛典网XML为复杂结构, 于是乎xslt帮不上什么忙了……我希望在新版的佛典中能包含所有的佛经, 于是简单并且高效的使用所有中华佛典网上的XML就是我的目标了.

于是,基于事件的XML解析器(Event-Driven XML Parser) NSXMLParser 就是我必须用到的了

继续前面的两篇Mac平台程序设计
Mac:打开一个目录
Mac:得到一个目录内的内容


1, 更改界面, 添加一个”解析一个目录里面的第一个的文件”的按钮

2, 构建XML解析部分

//1, 构建解析方法
-(void)parseXMLFile:(NSURL *)XMLURL //XMLURL为第一个文件的URL
{
	NSXMLParser *eventParser = [[NSXMLParser alloc] initWithContentsOfURL:XMLURL];
	[eventParser setDelegate:self];  //设置代理为本地
	[eventParser parse];  //开始解析
 
	NSLog(@"end Of parseXMLFile");
}
//2, 解析开始后,所有XML的内容由NSXMLParserDelegate处理
//  所以一定要注意在本地添加<NSXMLParserDelegate>到文件头
//在NSXMLParser读到<p>的时候重写一个<p>标签,原来的是XML中的,无法直接使用
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
	namespaceURI:(NSString *)namespaceURI 
	qualifiedName:(NSString *)qName 
	attributes:(NSDictionary *)attributeDict
{
	if ([elementName isEqualToString:@"p"]) {
		[htmlDataString appendFormat:@"<p>"];
		needOrNot = YES;  //我们需要<p>和</p>中间的内容,其余的在end中设置NO
		return;
	}
}
 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
	if(needOrNot)
	{
		[htmlDataString appendString:string]; //如上,将需要的字段添加到得到的html结构String中
	}
}
 
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
	namespaceURI:(NSString *)namespaceURI 
	qualifiedName:(NSString *)qName
{
	if ([elementName isEqualToString:@"p"]) {
		[htmlDataString appendFormat:@"</p>"];
		needOrNot = NO;  //不需要的内容不允许上面的delegate去读取到htmlDataString中
		return;
	}
}
 
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
	NSLog(htmlDataString); //在结束后输出得到的html数据结构.
}

这样我就可以对佛典网的复杂结构xml开始分析了, 之后会放出更多对该xml处理的细节