<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>pangwa&#039;s Blog &#187; Tech</title>
	<atom:link href="http://blog.pangwa.com/tag/tech/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.pangwa.com</link>
	<description>Always be pangwa</description>
	<lastBuildDate>Sat, 06 Aug 2011 15:21:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
	<atom:link rel='hub' href='http://blog.pangwa.com/?pushpress=hub'/>
		<item>
		<title>我的黑苹果</title>
		<link>http://blog.pangwa.com/2010/08/29/my-hacktonish/</link>
		<comments>http://blog.pangwa.com/2010/08/29/my-hacktonish/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 12:43:43 +0000</pubDate>
		<dc:creator>pangwa</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blog.pangwa.com/2010/08/29/my-hacktonish/</guid>
		<description><![CDATA[我的这个yy半年之久的黑苹果计划终于在这个月初实现了. 基本配置如下: 主板:  GA-P55A-UD3R x1 CPU:  Intel i5 760 显卡:  铭瑄HD5770 1G   x1 内存:  金士顿DDR3 1600 2G x1 硬盘:  希捷7200转 500G  x1 无线网卡: TP-Link TL-WN851N (在10.6.4下不工作!) x1 显示器:  Dell U2311H x1 机箱电源就不说了. 现在这个配置下在Snow Leopard 10.6.4下面已经可以全部正常运行. 其中需要注意的是 显卡使用的一个有点问题的驱动, 只能工作在32位模式下并需要同时接两条dvi线到显示器上才能正常显示(貌似运行warcraft有点问题, 运行台湾版WOW正常), 板载网卡刚刚使用了tonymacx86.com刚发布的驱动(内测版), 另外无线网卡不工作(非常杯剧, 当时还特地查了一下, 看到网上很多人说能工作, 但貌似是工作在SL之前的系统上&#8230;.). 另外显示器的显示效果也很赞的说. 另外由于暂时还离不开Win, 所以搞了在硬盘上同时安装了Win7+OSX, 引导使用的EasyBCD (win7 多引导的管理工具), 另外在osx的分区上装了变色龙(Chameleon). 安装过程参考了以下文章: BIOS设置: http://lnx2mac.blogspot.com/2010/06/updating-gigabyte-bios.html 论坛: [...]]]></description>
			<content:encoded><![CDATA[<p>我的这个yy半年之久的黑苹果计划终于在这个月初实现了.<br />
基本配置如下:<br />
主板:  GA-P55A-UD3R x1<br />
CPU:  Intel i5 760<br />
显卡:  铭瑄HD5770 1G   x1<br />
内存:  金士顿DDR3 1600 2G x1<br />
硬盘:  希捷7200转 500G  x1<br />
<span style="color: #ff0000;"> 无线网卡: TP-Link TL-WN851N (在10.6.4下不工作!)</span> x1<br />
显示器:  Dell U2311H x1</p>
<p>机箱电源就不说了.</p>
<p>现在这个配置下在Snow Leopard 10.6.4下面已经可以全部正常运行. 其中需要注意的是 显卡使用的一个有点问题的驱动, 只能工作在32位模式下并需要同时接两条dvi线到显示器上才能正常显示(貌似运行warcraft有点问题, 运行台湾版WOW正常), 板载网卡刚刚使用了tonymacx86.com刚发布的驱动(内测版), 另外无线网卡不工作(非常杯剧, 当时还特地查了一下, 看到网上很多人说能工作, 但貌似是工作在SL之前的系统上&#8230;.). 另外显示器的显示效果也很赞的说.</p>
<p>另外由于暂时还离不开Win, 所以搞了在硬盘上同时安装了Win7+OSX, 引导使用的EasyBCD (win7 多引导的管理工具), 另外在osx的分区上装了变色龙(<a href="http://chameleon.osx86.hu/" target="_blank">Chameleon</a>).<br />
安装过程参考了以下文章:<br />
BIOS设置: <a href="http://lnx2mac.blogspot.com/2010/06/updating-gigabyte-bios.html" target="_blank">http://lnx2mac.blogspot.com/2010/06/updating-gigabyte-bios.html</a><br />
论坛: <a href="http://www.tonymacx86.com/" target="_blank">http://www.tonymacx86.com/</a><br />
<a href="http://www.insanelymac.com/" target="_blank">http://www.insanelymac.com/</a><br />
安装过程我使用的稍微和上面的有所不同, 因为为了节省预算机器上没有配光驱, 不过还好之前已经有一个能运行的osx, 所以很多准备工作都是在已有的OSX上进行的并且使用usb引导安装.<br />
另外在使用usb引导安装的时候如果遇到waiting for device的错误不妨试试 改一下启动的参数指定root device编号(磁盘编号可能会因为你使用了USB-HDD引导而和你在启动界面里看到的不一样.).</p>
<p>另外用新电脑的感觉倍爽, 特别是在看到解压大文件仅有10%不到的CPU占用率时:)</p>
<p>再另外, 由于为了节省预算内存少了点, 过段时间考虑加条一样的内存, 这样也算能有双通道了&#8230;</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fblog.pangwa.com%2F2010%2F08%2F29%2Fmy-hacktonish%2F&amp;title=%E6%88%91%E7%9A%84%E9%BB%91%E8%8B%B9%E6%9E%9C" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.pangwa.com%2F2010%2F08%2F29%2Fmy-hacktonish%2F&amp;title=%E6%88%91%E7%9A%84%E9%BB%91%E8%8B%B9%E6%9E%9C" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.pangwa.com%2F2010%2F08%2F29%2Fmy-hacktonish%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fblog.pangwa.com%2F2010%2F08%2F29%2Fmy-hacktonish%2F&amp;title=%E6%88%91%E7%9A%84%E9%BB%91%E8%8B%B9%E6%9E%9C" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2010%2F08%2F29%2Fmy-hacktonish%2F&amp;title=%E6%88%91%E7%9A%84%E9%BB%91%E8%8B%B9%E6%9E%9C" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2010%2F08%2F29%2Fmy-hacktonish%2F&amp;title=%E6%88%91%E7%9A%84%E9%BB%91%E8%8B%B9%E6%9E%9C" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fblog.pangwa.com%2F2010%2F08%2F29%2Fmy-hacktonish%2F&amp;t=%E6%88%91%E7%9A%84%E9%BB%91%E8%8B%B9%E6%9E%9C" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://blog.pangwa.com/2010/08/29/my-hacktonish/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>猥琐病毒的解决方案</title>
		<link>http://blog.pangwa.com/2010/04/14/fix-drive/</link>
		<comments>http://blog.pangwa.com/2010/04/14/fix-drive/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 07:35:54 +0000</pubDate>
		<dc:creator>pangwa</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blog.pangwa.com/2010/04/14/fix-drive/</guid>
		<description><![CDATA[这两天朋友电脑出现了一奇怪了症状: C盘空间貌似在不断减少, 疑似U盘有毒, 于是拿来看了下. 然后就发现了这个猥琐的病毒, 它的工作原理貌似很简单: 把自身的图标设置成与文件夹图标一模一样, 所以如果你没注意你是看不出来它是程序还是一个文件夹的, 另外它把U盘根目录下所有的文件夹隐藏(设置系统+隐藏属性, 所以即使你打开显示隐藏的文件与目录也看不到这些被隐藏的文件夹), 同时它创建一个与该文件夹同名的.exe文件.  而当毫不知情的用户点击运行这个病毒的时候它会打开与之对应的文件夹, 同时创建一个名为update.exe进程. 然后便向用户主目录下appdata(Win7下)的某个目录里狂写东西. 至于其他的坏事暂时还没发现. 鉴于这个病毒相对简单, 所以自己写了一个批处理来干掉它, 方法也很简单就是枚举磁盘根目录下所有的文件夹, 看是不是有同名的.exe存在, 如果有则删除并去除此文件夹的系统和隐藏属性. (在Win7下试用通过) Bookmark to:]]></description>
			<content:encoded><![CDATA[<p>这两天朋友电脑出现了一奇怪了症状: C盘空间貌似在不断减少, 疑似U盘有毒, 于是拿来看了下.</p>
<p>然后就发现了这个猥琐的病毒, 它的工作原理貌似很简单: 把自身的图标设置成与文件夹图标一模一样, 所以如果你没注意你是看不出来它是程序还是一个文件夹的, 另外它把U盘根目录下所有的文件夹隐藏(设置系统+隐藏属性, 所以即使你打开显示隐藏的文件与目录也看不到这些被隐藏的文件夹), 同时它创建一个与该文件夹同名的.exe文件.  而当毫不知情的用户点击运行这个病毒的时候它会打开与之对应的文件夹, 同时创建一个名为update.exe进程. 然后便向用户主目录下appdata(Win7下)的某个目录里狂写东西. 至于其他的坏事暂时还没发现.</p>
<p>鉴于这个病毒相对简单, 所以自己写了一个批处理来干掉它, 方法也很简单就是枚举磁盘根目录下所有的文件夹, 看是不是有同名的.exe存在, 如果有则删除并去除此文件夹的系统和隐藏属性. (在Win7下试用通过)</p>
<pre class="brush: bash; title: ; notranslate">@echo off
setlocal 

:BEGIN
set ROOT=
set /P ROOT=输入要清除的盘符(输入0退出): %=%
if %ROOT%==0 goto END

echo 正在清除驱动器 %ROOT%:
rem kill the update.exe process
taskkill /IM update.exe 2&gt;NUL
for /F &quot;usebackq delims==&quot; %%i in (`dir /AD /B %ROOT%:`) do if exist &quot;%ROOT%:\%%i.exe&quot; if not exist &quot;%ROOT%:\%%i.exe\NUL&quot; (
echo 删除 %ROOT%:\%%i.exe 并去除目录%ROOT%:\%%i的系统与隐藏属性
del &quot;%ROOT%:\%%i.exe&quot;
attrib -H -S &quot;%ROOT%:\%%i&quot;
)

goto BEGIN

:END
</pre>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fblog.pangwa.com%2F2010%2F04%2F14%2Ffix-drive%2F&amp;title=%E7%8C%A5%E7%90%90%E7%97%85%E6%AF%92%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.pangwa.com%2F2010%2F04%2F14%2Ffix-drive%2F&amp;title=%E7%8C%A5%E7%90%90%E7%97%85%E6%AF%92%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.pangwa.com%2F2010%2F04%2F14%2Ffix-drive%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fblog.pangwa.com%2F2010%2F04%2F14%2Ffix-drive%2F&amp;title=%E7%8C%A5%E7%90%90%E7%97%85%E6%AF%92%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2010%2F04%2F14%2Ffix-drive%2F&amp;title=%E7%8C%A5%E7%90%90%E7%97%85%E6%AF%92%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2010%2F04%2F14%2Ffix-drive%2F&amp;title=%E7%8C%A5%E7%90%90%E7%97%85%E6%AF%92%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fblog.pangwa.com%2F2010%2F04%2F14%2Ffix-drive%2F&amp;t=%E7%8C%A5%E7%90%90%E7%97%85%E6%AF%92%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://blog.pangwa.com/2010/04/14/fix-drive/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>progress on login</title>
		<link>http://blog.pangwa.com/2009/11/24/progress-on-login/</link>
		<comments>http://blog.pangwa.com/2009/11/24/progress-on-login/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 13:37:15 +0000</pubDate>
		<dc:creator>pangwa</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.pangwa.com/?p=527</guid>
		<description><![CDATA[这里是指在linux下, 在我们的环境中由于在登录系统的时候需要比较久的时候(5-15秒), 在那里看着不动的屏幕总归会有些不爽, 于是便写了一个小小的进度条来. 首先呢, 我们先完成一个画一个转圈的直线的程序来(其实就是轮流打印&#8221;-\&#124;-/&#8221;这几个字符, 它每转完一圈后会打印一个加号.) &#8212; 当然每次打印要有一个间隔, 不然会很快, 这个时间间隔我们能过程序参数来传递. 在上面我们使用了echo 的两个参数, -n 是让它不打印一个多余的换行, -e让它解释转义字符, 而\b则是退格符. 好的, 下面就保存这个脚本并让它可执行(chmod +x ), 这里我把它命名为~/bin/timedot, 能过执行 ./timedot 0.2 来看一下效果吧. (请确定你的sleep程序可以接受小数形式的参数). 嗯, 看上去不错, 好的, 让我们把它加入到启动脚本里, 基本思路是把它作为一个后台程序运行. 好了, 试一下, 嗯, 似乎工作的还不错. 不过似乎有一个问题: 在每次启动的时候你都会看到一个类似下面的消息: [1234]-  Terminated                 ~/bin/timedot 0.2&#38; 之所以会有这行消息是因为你在后台运行一个程序的时候, bash会关注所有属于它的后台进程的状态, 并在后台进程结束后通知前台程序某个程序已经死掉啦(或者是已经完成了), 不过毫无疑问我们不希望看到关于timedot的通知消息(太丑陋了), 于是我们可以通过disown 命令来让bash放弃对timedot的管理. 好, 在这里似乎一切都很完美了, 不过假如你在一次登录的时候, 实在忍受不了长时间的等待了, 于是你按下了ctrl+c来中止当前的初始化脚本, 然后你就会发现了另外一个问题&#8230; 你会发现在你打字的时候总是会有&#8221;&#124;/&#124;-+&#8221;这几个字符蹦出来 [...]]]></description>
			<content:encoded><![CDATA[<p>这里是指在linux下, 在我们的环境中由于在登录系统的时候需要比较久的时候(5-15秒), 在那里看着不动的屏幕总归会有些不爽, 于是便写了一个小小的进度条来.<br />
首先呢, 我们先完成一个画一个转圈的直线的程序来(其实就是轮流打印&#8221;-\|-/&#8221;这几个字符, 它每转完一圈后会打印一个加号.) &#8212; 当然每次打印要有一个间隔, 不然会很快, 这个时间间隔我们能过程序参数来传递.</p>
<pre class="brush: bash; title: ; notranslate">#! /bin/bash
count=0
#c is the array for the characters we'll print
c[0]='-\b'
c[1]='\\\b'
c[2]='|\b'
c[3]='/\b'
c[4]='-\b'
c[5]='+'

while true
do
     let &quot;count = $count %6&quot;
     echo -n -e &quot;${c[$count]}&quot;
     sleep $1  #sleep sometime to continue....
     let &quot;count = $count + 1&quot;
done</pre>
<p>在上面我们使用了echo 的两个参数, -n 是让它不打印一个多余的换行, -e让它解释转义字符, 而\b则是退格符.<br />
好的, 下面就保存这个脚本并让它可执行(chmod +x ), 这里我把它命名为~/bin/timedot, 能过执行 ./timedot 0.2 来看一下效果吧. (请确定你的sleep程序可以接受小数形式的参数).</p>
<p>嗯, 看上去不错, 好的, 让我们把它加入到启动脚本里, 基本思路是把它作为一个后台程序运行.</p>
<pre class="brush: bash; title: ; notranslate">~/bin/timedot 0.2&amp;
timedotPID=$! #$! 是bash的内置变量, 它保存最后一个后台进行的pid.
...... #把你的很慢的代码放在这里.

kill $timedotPID  #杀掉打印进度条的进程.
</pre>
<p>好了, 试一下, 嗯, 似乎工作的还不错. 不过似乎有一个问题: 在每次启动的时候你都会看到一个类似下面的消息:</p>
<blockquote><p>[1234]-  Terminated                 ~/bin/timedot 0.2&amp;</p></blockquote>
<p>之所以会有这行消息是因为你在后台运行一个程序的时候, bash会关注所有属于它的后台进程的状态, 并在后台进程结束后通知前台程序某个程序已经死掉啦(或者是已经完成了), 不过毫无疑问我们不希望看到关于timedot的通知消息(太丑陋了), 于是我们可以通过<a href="http://linux.about.com/library/cmd/blcmdl1_disown.htm" target="_blank">disown</a> 命令来让bash放弃对timedot的管理.</p>
<p>好, 在这里似乎一切都很完美了, 不过假如你在一次登录的时候, 实在忍受不了长时间的等待了, 于是你按下了ctrl+c来中止当前的初始化脚本, 然后你就会发现了另外一个问题&#8230; 你会发现在你打字的时候总是会有&#8221;|/|-+&#8221;这几个字符蹦出来 &#8212;- 而这是因为你的ctrl+c虽然中止了你的初始化脚本, 但它却没有中此我们的这个后台进行的进度条进程. 好吧, 让我们修好它:</p>
<pre class="brush: bash; title: ; notranslate">~/bin/timedot 0.2&amp;
timedotPID=$! #$! 是bash的内置变量, 它保存最后一个后台进行的pid.
my_control_c()
{
     kill $timedotPID #杀死后台进程&lt;br /&gt;
     trap SIGINT  #重置SIGINT,
}
trap my_control_c SIGINT   #我们设置一个control+c的钩子, 当用户按下control+c的时候会调用我们的my_control_c函数
...... #把你的很慢的代码放在这里.

kill $timedotPID  #杀掉打印进度条的进程.
trap SIGINT #重置SIGINT为默认值.
</pre>
<p>这里使用了trap命令来设置ctrl+c的钩子, 这样每次要中止初始化脚本的时候就会调用我们自己的函数, 而它会杀掉后台进度条进程, 当然不要忘记重置钩子, 我们不需要再以后用到它了.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F11%2F24%2Fprogress-on-login%2F&amp;title=progress+on+login" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F11%2F24%2Fprogress-on-login%2F&amp;title=progress+on+login" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F11%2F24%2Fprogress-on-login%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fblog.pangwa.com%2F2009%2F11%2F24%2Fprogress-on-login%2F&amp;title=progress+on+login" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F11%2F24%2Fprogress-on-login%2F&amp;title=progress+on+login" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F11%2F24%2Fprogress-on-login%2F&amp;title=progress+on+login" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F11%2F24%2Fprogress-on-login%2F&amp;t=progress+on+login" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://blog.pangwa.com/2009/11/24/progress-on-login/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>黑莓往短信中插入联系人的实现</title>
		<link>http://blog.pangwa.com/2009/08/15/blackberry-insert-contact-to-sms-implementation/</link>
		<comments>http://blog.pangwa.com/2009/08/15/blackberry-insert-contact-to-sms-implementation/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 17:08:18 +0000</pubDate>
		<dc:creator>pangwa</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blog.pangwa.com/2009/08/15/blackberry-insert-contact-to-sms-implementation/</guid>
		<description><![CDATA[刚搞了个黑莓玩, 在写短信时发现缺少了一个在用wm时常用的功能: 往短信中插入联系人. 这个有啥用呢, 想一想当有朋友问题你要另外一个人的号码时, 你就会知道它的用处了, 简单的通过一个菜单就可以插入联系人的手机号, 邮箱…… 而在黑莓里是没有这个功能的, 只能先切换到桌面然后打开联系人界面然后再找到你要的联系人, 然后再把电话复制出来, 再然后就是切换到短信程序并粘贴电话号码, 这显然是一个比较烦琐的步骤. 再假如你想要同时插入邮件/手机号, 则还要来回复制两遍. 所以我们就会看到一些常用的扩展来辅助插入手机号. 于是闲来无事自己研究了一下具体实现 (已经看到了一些具体的实现, 只是好奇, 所以研究了一下) 让我们分析一下这个问题, 要实现这个功能, 应该可以把功能划分为以下三个步骤: 往编辑短信的菜单中添加一个菜单项 当用户点击这个菜单的时候显示一个选择联系人的界面 当用户选择联系人之后把联系人的电话插入到短信中去. 下面我们分别看这三个步骤的实现, 步骤一很简单, BB提供了相关的api, 在它的文档中就可以找到, 具体请看这里. 首先我们需要实现一个派生自MenuItem类, 上面就是一个简单的程序菜单项, 它在初始化的时候通过调用父类的构造函数来调整它在菜单项中的顺序(这个没有试过, 具体不知道工作不工作…), toString方法返回的字符串决定了它显示在菜单中的文字, 至于run方法则会在点击菜单项时会调用到, 它接受一个context参数, 系统会传入一个上下文相关的对像. 有了Menu类之后就可以把它注册到短信编辑界面里去了: 上面的逻辑很简单, 首先取得系统ApplicationMenuItemRepository的实例, 并向注册InsertContactMenuItem到SMS_EDIT中去, 好了, 到了这里, 第一步基本完成了. 完成这一步, 你就可以在模拟器里看到相应的菜单项了, 如下图: 下面开始第二步, 这里需要在用户点击菜单之后弹出一个选择联系人的界面, 这个可以通过BlackBerryContactList.choose()方法实现: 这里首取得系统PIM的实例, 然后联系人列表并调用它的choose ()方法, [...]]]></description>
			<content:encoded><![CDATA[<p>刚搞了个黑莓玩, 在写短信时发现缺少了一个在用wm时常用的功能: 往短信中插入联系人. 这个有啥用呢, 想一想当有朋友问题你要另外一个人的号码时, 你就会知道它的用处了, 简单的通过一个菜单就可以插入联系人的手机号, 邮箱…… 而在黑莓里是没有这个功能的, 只能先切换到桌面然后打开联系人界面然后再找到你要的联系人, 然后再把电话复制出来, 再然后就是切换到短信程序并粘贴电话号码, 这显然是一个比较烦琐的步骤. 再假如你想要同时插入邮件/手机号, 则还要来回复制两遍. 所以我们就会看到一些常用的扩展来辅助插入手机号. 于是闲来无事自己研究了一下具体实现 (已经看到了一些具体的实现, 只是好奇, 所以研究了一下)</p>
<p>让我们分析一下这个问题, 要实现这个功能, 应该可以把功能划分为以下三个步骤:</p>
<ol>
<li>往编辑短信的菜单中添加一个菜单项</li>
<li>当用户点击这个菜单的时候显示一个选择联系人的界面</li>
<li>当用户选择联系人之后把联系人的电话插入到短信中去.</li>
</ol>
<p>下面我们分别看这三个步骤的实现, 步骤一很简单, BB提供了相关的api, 在它的文档中就可以找到, 具体请看<a href="http://www.blackberry.com/developers/docs/4.5.0api/net/rim/blackberry/api/menuitem/ApplicationMenuItemRepository.html" target="_blank">这里</a>. 首先我们需要实现一个派生自MenuItem类,</p>
<pre class="brush: java; title: ; notranslate">class InsertContactMenuItem extends ApplicationMenuItem {
   InsertContactMenuItem() {
                     super(2000000);  // This sets the item just before the &quot;Add To:&quot; menuitem          }

   public String toString() {             return &quot;Insert Contact&quot;;
   }

  public Object run(Object context) {              ....

  }</pre>
<blockquote><p>上面就是一个简单的程序菜单项, 它在初始化的时候通过调用父类的构造函数来调整它在菜单项中的顺序(这个没有试过, 具体不知道工作不工作…), toString方法返回的字符串决定了它显示在菜单中的文字, 至于run方法则会在点击菜单项时会调用到, 它接受一个context参数, 系统会传入一个上下文相关的对像.</p></blockquote>
<p>有了Menu类之后就可以把它注册到短信编辑界面里去了:</p>
<pre class="brush: java; title: ; notranslate">   private static void registerMenuItem() {
        System.out.println(&quot;*** Registering Insert contact menuitem&quot;);
        InsertContactMenuItem menuItem = new InsertContactMenuItem();
        ApplicationMenuItemRepository amir = ApplicationMenuItemRepository.getInstance();
        amir.addMenuItem(ApplicationMenuItemRepository.MENUITEM_SMS_EDIT, menuItem);
        }</pre>
<blockquote><p>上面的逻辑很简单, 首先取得系统ApplicationMenuItemRepository的实例, 并向注册InsertContactMenuItem到SMS_EDIT中去, 好了, 到了这里, 第一步基本完成了. 完成这一步, 你就可以在模拟器里看到相应的菜单项了, 如下图:</p></blockquote>
<p><a href="http://blog.pangwa.com/wp-content/uploads/2009/08/menu.png" rel="lightbox[496]"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="menu" src="http://blog.pangwa.com/wp-content/uploads/2009/08/menu_thumb.png" border="0" alt="menu" width="219" height="244" /></a></p>
<p>下面开始第二步, 这里需要在用户点击菜单之后弹出一个选择联系人的界面, 这个可以通过BlackBerryContactList.choose()方法实现:</p>
<pre class="brush: java; title: ; notranslate">  PIM pim = PIM.getInstance();
  BlackBerryContactList list = (BlackBerryContactList) pim.openPIMList(PIM.CONTACT_LIST, PIM.READ_ONLY);
  PIMItem pimItem = list.choose ();
  String phoneNum = pimItem.getString  (Contact.TEL, 0);</pre>
<blockquote><p>这里首取得系统PIM的实例, 然后联系人列表并调用它的choose ()方法, 运行的结果应该如下图所示, 出现一个选择联系人的窗口:</p></blockquote>
<p><a href="http://blog.pangwa.com/wp-content/uploads/2009/08/choosecontact.png" rel="lightbox[496]"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="choosecontact" src="http://blog.pangwa.com/wp-content/uploads/2009/08/choosecontact_thumb.png" border="0" alt="choosecontact" width="244" height="228" /></a> 到了这里, 最后一步就是要把联系人信息插入到短信输入窗口里了, 在这里我走了一段弯路:</p>
<p>在前面提到在系统调用run (Object context)方法时会传入一个上下文相关的对象, 在看4.5.0os的文档里提到这里会传入一个TextMessage对象, 具体参见<a href="http://www.blackberry.com/developers/docs/4.5.0api/net/rim/blackberry/api/menuitem/ApplicationMenuItemRepository.html" target="_blank">这里</a>, 当时我是想尝试直接通过修改这个对象来往消息里插入文本, 不过可惜的是行不能: 因为在这里传入的TextMessage对象是只读的, 尝试调用它的set方法会引发一个异常. 而且在老版本的系统里根本就没有传入一个对象(8800 4.2.0模拟器里显示传入的对象为空). 所以在经历了若干次失败后只好转求它法.</p>
<p>在阅读<a href="http://blackberrytools.cvs.sourceforge.net/viewvc/blackberrytools/bbreply/src/org/bbreply/BBReply.java?revision=1.1.1.1&amp;view=markup" target="_blank">相关的代码</a>的时候, 终于发现了一个UiApplication类, 通过它可以得到当前在最前面的屏幕, 并且我们可以遍历这个屏幕上的所有元素, 貌似有点希望! 让我们尝试遍历一当前屏幕并打印出这些元素, 看看它们有些什么!</p>
<pre class="brush: java; title: ; notranslate">  Screen screen = UiApplication.getUiApplication().getActiveScreen();
  for (int i = 0; i &lt; screen.getFieldCount(); i++)
   {
        Field field = screen.getField(i);
        printFields (field);
   }
      void printFields (Field field)
         {
             try
             {
                    System.out.println(&quot;*** Field class: &quot; + field.getClass().getName());

                         if (field instanceof  TextField) {
                             TextField textField = (TextField) field;
                             System.out.println(&quot;*** Found a text field&quot;);
                             System.out.println(&quot;*** text field label: &quot;
                                     + textField.getLabel());

                                 System.out.println(&quot;*** Found text field&quot;);
                                 System.out.println (&quot;** value: &quot; + textField.getText ());
                         }
                         else if (field instanceof  Manager)
                         {
                             Manager mgrField = ( Manager) field;
                               System.out.println (&quot;** Subfields..&quot;);
                                for (int i = 0; i &lt; mgrField.getFieldCount(); i++) {
                                        Field subFields = mgrField.getField(i);
                                        printFields (subFields);
                        }
                    }
                }
                catch (Exception e)
                {
                    System.out.println (&quot;printFields excetion:&quot; + e.getMessage ());
                }
        }</pre>
<blockquote><p>对于这段代码, 前几行是得到当前活动的屏幕,  然后调用函数printFields函数, 在这个函数里我们基本是把一个field相关信息打印了出来: 它的标签的文字, 它的文字. 由于在screen里可以嵌套包含一些屏幕元素的管理对象, 所以我们需要一个递归来打印. 下面是得到的结果, 请注意使用蓝颜色标记的文字,</p>
<p>BB 8800 4.2.1.74的Debug输出</p>
<p>JVM: bklt @8044: timer</p>
<p>JVM: bklt @8044: idle 0</p>
<p>JVM: bklt @8044: setTimer 22</p>
<p>*** Field class: net.rim.device.api.ui.container.VerticalFieldManager</p>
<p>** Subfields..</p>
<p>*** Field class: net.rim.device.apps.internal.phone.model.ReadOnlyPhoneNumberField</p>
<p>** Subfields..</p>
<p>*** Field class: net.rim.device.apps.internal.phone.model.SmartPhoneNumberLabelField</p>
<p>*** Field class: net.rim.device.api.ui.component.SeparatorField</p>
<p><span style="color: #0000a0;">*** Field class: net.rim.device.apps.internal.sms.ui.SMSEditField</span></p>
<p>*** Found a text field</p>
<p><span style="color: #0000a0;">*** text field label: null</span></p>
<p>*** Found Using field</p>
<p><span style="color: #0000a0;">** value: Afdsf</span></p>
<p>BB  9500 的Debug输出:</p>
<p>FRIDG: could not find background_popup__Landscape.png</p>
<p>*** Field class: net.rim.device.api.ui.container.VerticalFieldManager</p>
<p>** Subfields..</p>
<p>*** Field class: net.rim.device.apps.api.ui.LeftRightFieldManager</p>
<p>** Subfields..</p>
<p>*** Field class: net.rim.device.api.ui.container.HorizontalFieldManager</p>
<p>** Subfields..</p>
<p>*** Field class: net.rim.device.api.ui.component.LabelField</p>
<p>*** Field class: net.rim.device.apps.internal.sms.ui.MessageComposeComboField</p>
<p>** Subfields..</p>
<p>*** Field class: net.rim.device.apps.api.addressbook.AddressBookComboField$EmailComposeEditable</p>
<p>*** Found a text field</p>
<p>*** text field label: To:</p>
<p>*** Found text field</p>
<p>** value: 12313</p>
<p>*** Field class: net.rim.device.apps.api.ui.LeftRightFieldManager</p>
<p>** Subfields..</p>
<p>*** Field class: net.rim.device.api.ui.container.HorizontalFieldManager</p>
<p>** Subfields..</p>
<p>*** Field class: net.rim.device.api.ui.component.LabelField</p>
<p>*** Field class: net.rim.device.apps.internal.sms.ui.MessageComposeComboField</p>
<p>** Subfields..</p>
<p>*** Field class: net.rim.device.apps.api.addressbook.AddressBookComboField$EmailComposeEditable</p>
<p>*** Found a text field</p>
<p>*** text field label: To:</p>
<p>*** Found text field</p>
<p>** value:</p>
<p>*** Field class: <span style="color: #0000a0;"><span style="color: #000000;">net.rim.device.apps.internal.smscompose.message.SMSEditorScreen$BodyVerticalFieldManager</span></span></p>
<p>** Subfields..</p>
<p><span style="color: #0000a0;">*** Field class: net.rim.device.apps.internal.smscompose.ui.SMSEditField </span></p>
<p><span style="color: #0000a0;">*** Found a text field </span></p>
<p><span style="color: #0000a0;">*** text field label: null </span></p>
<p><span style="color: #0000a0;">*** Found text field</span></p>
<p>** value: Wet</p></blockquote>
<p>我们可以看到实际在这两个系统里的短信编辑输入框实际都是一个net.rim.device.apps.internal.smscompose.ui.SMSEditField 类, 看上去似乎我们可以通过判断一个Field对象是不是一个此类的实例来找到短信的实际输入框了, 十分遗憾的是请注意前面的那一连串类名里的一个.internal.: 对不起, 这是一个内部类, 外界开发人员是不能使用这个类的.不过我们还是可以利用这一点的, 在这里直接判断它的类名里是不是包含SMSEditField就可以达到预定效果.</p>
<pre class="brush: java; title: ; notranslate">      Screen screen = UiApplication.getUiApplication().getActiveScreen();
                    for (int i = 0; i &lt; screen.getFieldCount(); i++)
                    {
                        Field field = screen.getField(i);
                        printFields (field, phoneNum);
                    }

      void printFields (Field field, String str)
         {
             try
             {
                           System.out.println(&quot;*** Field class: &quot;
                                 + field.getClass().getName());

                         if (field instanceof  TextField) {
                             TextField textField = (TextField) field;
                             System.out.println(&quot;*** Found a text field&quot;);
                             System.out.println(&quot;*** text field label: &quot;
                                     + textField.getLabel());

                                 System.out.println(&quot;*** Found text field&quot;);
                                 System.out.println (&quot;** value: &quot; + textField.getText ());
                                 if (textField.getClass ().getName ().endsWith(&quot;.SMSEditField&quot;)
                                 {
                                     System.out.println (&quot;insertting text to...&quot;);
                                    textField.insert (str);
                                }

                         }
                         else if (field instanceof  Manager)
                         {
                             Manager mgrField = ( Manager) field;
                               System.out.println (&quot;** Subfields..&quot;);
                                for (int i = 0; i &lt; mgrField.getFieldCount(); i++) {
                                        Field subFields = mgrField.getField(i);
                                        printFields (subFields, str);
                        }
                    }
                }
                catch (Exception e)
                {
                    System.out.println (&quot;printFields excetion:&quot; + e.getMessage ());
                }
        }
        }</pre>
<p>修改完代码后, 编译, 运行, 启动程序, 然后打开短信输入窗口, 按照前面的步骤选择联系人, 确认! 电话被成功的插入到短信编辑窗口里了!:)</p>
<p><a href="http://blog.pangwa.com/wp-content/uploads/2009/08/resultsms.png" rel="lightbox[496]"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="resultsms" src="http://blog.pangwa.com/wp-content/uploads/2009/08/resultsms_thumb.png" border="0" alt="resultsms" width="244" height="229" /></a></p>
<p>很好, 这里我们基本大功告成了! 不过其实还有很事情要做: <span style="color: #0000a0;">怎么把程序弄成开机启动的, 然后应该在选择联系人之后我们应该弹出一个对话框让用户选择需要插入的项(移动电话, 家庭电话, email 等).</span> 不过做为一个自己瞎折腾型的项目, 到这里咱们就告一段落了:)</p>
<p>最后再告诉你一个不幸的消息, 即便你有了这个程序你也不能把它安装到你的手机里的, 这是因为黑莓开发的api中有一些是需要官方的验证的, 而这个验证在当前是需要钱滴(20刀). 不过即使没有申请官方的验证也是可以在模拟器里支持你的程序的, 这就是我写这篇文章的环境:)</p>
<p>具体的代码在这里:<a href="http://blog.pangwa.com/wp-content/uploads/2009/08/InsertContact.java">InsertContact.java</a></p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F08%2F15%2Fblackberry-insert-contact-to-sms-implementation%2F&amp;title=%E9%BB%91%E8%8E%93%E5%BE%80%E7%9F%AD%E4%BF%A1%E4%B8%AD%E6%8F%92%E5%85%A5%E8%81%94%E7%B3%BB%E4%BA%BA%E7%9A%84%E5%AE%9E%E7%8E%B0" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F08%2F15%2Fblackberry-insert-contact-to-sms-implementation%2F&amp;title=%E9%BB%91%E8%8E%93%E5%BE%80%E7%9F%AD%E4%BF%A1%E4%B8%AD%E6%8F%92%E5%85%A5%E8%81%94%E7%B3%BB%E4%BA%BA%E7%9A%84%E5%AE%9E%E7%8E%B0" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F08%2F15%2Fblackberry-insert-contact-to-sms-implementation%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fblog.pangwa.com%2F2009%2F08%2F15%2Fblackberry-insert-contact-to-sms-implementation%2F&amp;title=%E9%BB%91%E8%8E%93%E5%BE%80%E7%9F%AD%E4%BF%A1%E4%B8%AD%E6%8F%92%E5%85%A5%E8%81%94%E7%B3%BB%E4%BA%BA%E7%9A%84%E5%AE%9E%E7%8E%B0" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F08%2F15%2Fblackberry-insert-contact-to-sms-implementation%2F&amp;title=%E9%BB%91%E8%8E%93%E5%BE%80%E7%9F%AD%E4%BF%A1%E4%B8%AD%E6%8F%92%E5%85%A5%E8%81%94%E7%B3%BB%E4%BA%BA%E7%9A%84%E5%AE%9E%E7%8E%B0" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F08%2F15%2Fblackberry-insert-contact-to-sms-implementation%2F&amp;title=%E9%BB%91%E8%8E%93%E5%BE%80%E7%9F%AD%E4%BF%A1%E4%B8%AD%E6%8F%92%E5%85%A5%E8%81%94%E7%B3%BB%E4%BA%BA%E7%9A%84%E5%AE%9E%E7%8E%B0" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F08%2F15%2Fblackberry-insert-contact-to-sms-implementation%2F&amp;t=%E9%BB%91%E8%8E%93%E5%BE%80%E7%9F%AD%E4%BF%A1%E4%B8%AD%E6%8F%92%E5%85%A5%E8%81%94%E7%B3%BB%E4%BA%BA%E7%9A%84%E5%AE%9E%E7%8E%B0" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://blog.pangwa.com/2009/08/15/blackberry-insert-contact-to-sms-implementation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>IE的怨念</title>
		<link>http://blog.pangwa.com/2009/06/09/complain-on-ie/</link>
		<comments>http://blog.pangwa.com/2009/06/09/complain-on-ie/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 13:23:10 +0000</pubDate>
		<dc:creator>pangwa</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://blog.pangwa.com/2009/06/09/complain-on-ie/</guid>
		<description><![CDATA[&#8211; 因为写网页发现很多不兼容的郁闷的地方…… 1. 数组声明 var a = {a: 1, b:2, c:3, } 注意最后一个”,”, 这样写在ie里是会报语法错误的…… 2. 上面的例子, 如果没有初始化列表的最后一个逗号在ie中是可以的, 但是下面的呢? var params = {class : “main”, a : 1}; 在网页里写下这样的代码, 然后拿到ie里运行, 貌似没看出啥问题(我用的IE7), 可是你会发现你的代码为啥总没执行呢? 于是一行一行的删除代码, 最后n长时间过后总算发现是这行代码的问题, 可是为啥呢? 仔细看看, 貌似这里特别的地方就是在初始化列表里的class是一个关键字 &#8212; 是的, 就是它了, 对于有这种关键字的初始化列表是要加上双引号的, var paramrs = {“class” : “main”,&#160; a : 1};, 这个问题很恼人 &#8212; 你支持{a : 1};为啥就不支持{class : [...]]]></description>
			<content:encoded><![CDATA[<p>&#8211; 因为写网页发现很多不兼容的郁闷的地方……</p>
<p>1. 数组声明 </p>
<blockquote><p>var a = {a: 1, b:2, c:3, }</p>
</blockquote>
<p>注意最后一个”,”, 这样写在ie里是会报语法错误的……</p>
<p>2. 上面的例子, 如果没有初始化列表的最后一个逗号在ie中是可以的, 但是下面的呢? </p>
<blockquote><p>var params = {class : “main”, a : 1}; </p>
</blockquote>
<p>在网页里写下这样的代码, 然后拿到ie里运行, 貌似没看出啥问题(我用的IE7), 可是你会发现你的代码为啥总没执行呢? 于是一行一行的删除代码, 最后n长时间过后总算发现是这行代码的问题, 可是为啥呢? 仔细看看, 貌似这里特别的地方就是在初始化列表里的class是一个关键字 &#8212; 是的, 就是它了, 对于有这种关键字的初始化列表是要加上双引号的, var paramrs = {“class” : “main”,&#160; a : 1};, 这个问题很恼人 &#8212; 你支持{a : 1};为啥就不支持{class : 1};总感觉这里的实现像是半个残废. </p>
<p>3. css兼容性的问题, 太多了…… 导致看到好好的东西到了ie下就是不中啊, display:table-cell 在ie8之前的版本里不支持, 我哭.</p>
<p>4. 再另外像inject &lt;tr&gt; 到&lt;table&gt;里不工作, 必须得先把&lt;tr&gt; inject&lt;tbody&gt;里才行, 用的是mootools, 但估计也是IE的问题导致的, 反正是有了怨念, 就把这个也算到它的头上吧.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F06%2F09%2Fcomplain-on-ie%2F&amp;title=IE%E7%9A%84%E6%80%A8%E5%BF%B5" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F06%2F09%2Fcomplain-on-ie%2F&amp;title=IE%E7%9A%84%E6%80%A8%E5%BF%B5" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F06%2F09%2Fcomplain-on-ie%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fblog.pangwa.com%2F2009%2F06%2F09%2Fcomplain-on-ie%2F&amp;title=IE%E7%9A%84%E6%80%A8%E5%BF%B5" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F06%2F09%2Fcomplain-on-ie%2F&amp;title=IE%E7%9A%84%E6%80%A8%E5%BF%B5" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F06%2F09%2Fcomplain-on-ie%2F&amp;title=IE%E7%9A%84%E6%80%A8%E5%BF%B5" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F06%2F09%2Fcomplain-on-ie%2F&amp;t=IE%E7%9A%84%E6%80%A8%E5%BF%B5" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://blog.pangwa.com/2009/06/09/complain-on-ie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>native javascript applicatoin development</title>
		<link>http://blog.pangwa.com/2009/06/09/native-javascript-applicatoin-development/</link>
		<comments>http://blog.pangwa.com/2009/06/09/native-javascript-applicatoin-development/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 13:00:28 +0000</pubDate>
		<dc:creator>pangwa</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.pangwa.com/2009/06/09/native-javascript-applicatoin-development/</guid>
		<description><![CDATA[用javascript写程序, 想不到使用的感觉不错, 对js萌生出不少好感来, 有了好感后便是想着能在所有的地方用它, 于是便yy能在写本地程序的时候也用上js &#8212; 如果写本地程序可以用像写网页的方式写下来, 那该多完美哪 (当时yy的是一个程序可以以native/网页的形式运行的东西~~~). 记得当时找了一些, 貌似没有太多收获, 今天偶然又google了一把, 居然找到了一篇有趣的blog介绍gtk Seed, 果然有点意思. Seed是个什么东西, 它的主页上有了介绍, 它是一个库, 解释器以及可以在运行时和webkit javascript核心引擎协作的东西.一句话它提供了你创建本地javascript程序的能力. 这个项目比较新的, 2008年11月8号才发布第一个版本. 这里有篇blog给了一些用它实现的小程序, 看上去还不错, 它封装的本地gtk api应该基本够用了, 没有仔细研究, 但至少文件/窗口消息啥的都有了. 另外貌似这里还用到了Gobject Introspection, 貌似很牛X的, 这个东西的目标之一应该是使用系统语言(像C之流)写的Gtk对象的窗口对象可以不经过任何额外的封装操作都都可以在其他语言中使用(像python/javascript) &#8212; 这样还是比较方便的. seed主页可以找到很多例子程序, 看了几个, 貌似很方便. 抽时间了搞下来折腾一下, 不知道有没有提供windows下的版本… 另外与Seed类似的还有另外一个项目:GJS, 这两个引擎的目标都很相似, 貌似都是为了提供本地化的开发能力, 区别就是Seed采用了webkit的js 核心, 而GJS则是使用的mozilla firefox的js引擎(Spidermonkey ). 使用spidermokey引擎的好处之一据说就是可以使用很多webkit中尚不支持的javascript5中引入的新语言特性. 不过看了一些文章, 似乎Seed和GJS的老大们还有过一些讨论目的是使得这两个引擎提供良好的兼容性, 其中Seed的老大似乎还同意修改Seed中Enum/import的实现以保持和GJS的一致.&#160; 不过相比较而言似乎Seed项目相对比较活跃一些, 更新比较频繁, 今年已经发而了五六个版本. 而GJS则相对比较沉闷了一些了, [...]]]></description>
			<content:encoded><![CDATA[<p>用javascript写程序, 想不到使用的感觉不错, 对js萌生出不少好感来, 有了好感后便是想着能在所有的地方用它, 于是便yy能在写本地程序的时候也用上js &#8212; 如果写本地程序可以用像写网页的方式写下来, 那该多完美哪 (当时yy的是一个程序可以以native/网页的形式运行的东西~~~). 记得当时找了一些, 貌似没有太多收获, 今天偶然又google了一把, 居然找到了一篇有趣的<a href="http://arstechnica.com/open-source/news/2009/01/javascript-gtk-bindings.ars">blog</a>介绍gtk <a href="http://live.gnome.org/Seed">Seed</a>, 果然有点意思.</p>
<p>Seed是个什么东西, 它的主页上有了介绍, 它是一个库, 解释器以及可以在运行时和webkit javascript核心引擎协作的东西.一句话它提供了你创建本地javascript程序的能力. 这个项目比较新的, 2008年11月8号才发布第一个版本. 这里有篇<a href="http://www.hortont.com/blog/2008/11/seed-in-screenshots/">blog</a>给了一些用它实现的小程序, 看上去还不错, 它封装的本地gtk api应该基本够用了, 没有仔细研究, 但至少文件/窗口消息啥的都有了. 另外貌似这里还用到了Gobject Introspection, 貌似很牛X的, 这个东西的目标之一应该是使用系统语言(像C之流)写的Gtk对象的窗口对象可以不经过任何额外的封装操作都都可以在其他语言中使用(像python/javascript) &#8212; 这样还是比较方便的. seed主页可以找到很多例子程序, 看了几个, 貌似很方便. 抽时间了搞下来折腾一下, 不知道有没有提供windows下的版本… </p>
<p>另外与Seed类似的还有另外一个项目:<a href="http://live.gnome.org/Gjs">GJS</a>, 这两个引擎的目标都很相似, 貌似都是为了提供本地化的开发能力, 区别就是Seed采用了webkit的js 核心, 而GJS则是使用的mozilla firefox的js引擎(Spidermonkey ). 使用spidermokey引擎的好处之一据说就是可以使用很多webkit中尚不支持的javascript5中引入的新语言特性. 不过看了一些文章, 似乎Seed和GJS的老大们还有过一些讨论目的是使得这两个引擎提供良好的兼容性, 其中Seed的老大似乎还同意修改Seed中Enum/import的实现以保持和GJS的一致.&#160; 不过相比较而言似乎Seed项目相对比较活跃一些, 更新比较频繁, 今年已经发而了五六个版本. 而GJS则相对比较沉闷了一些了, 似乎这半年没啥动静, 有点怀疑是不是要黄了…… </p>
<p>另外既然讲到本地化的javascript开发, 就不得不提到adobe 的<a href="http://www.adobe.com/products/air/">AIR</a>了, 这个应该是和我原来yy的比较相似, 它支持html+js的本地程序, 看了一些文档, 提供了一些本地化的api(文件啊, 剪贴析啊之类的), 不过相对于前两者来讲应该是对于开发的限制应该多了不少. 但是这个酷在确实做到了web+native的双向执行啊, 另外就是它的开发工具相对全一些, 但是要收费滴.再另外就是Air的linux版本是incomplete的, 所以有些功能可能还是不支持地. 当然前面的两个有没有windows/mac的版本还不知道呢:)</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F06%2F09%2Fnative-javascript-applicatoin-development%2F&amp;title=native+javascript+applicatoin+development" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F06%2F09%2Fnative-javascript-applicatoin-development%2F&amp;title=native+javascript+applicatoin+development" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F06%2F09%2Fnative-javascript-applicatoin-development%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fblog.pangwa.com%2F2009%2F06%2F09%2Fnative-javascript-applicatoin-development%2F&amp;title=native+javascript+applicatoin+development" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F06%2F09%2Fnative-javascript-applicatoin-development%2F&amp;title=native+javascript+applicatoin+development" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F06%2F09%2Fnative-javascript-applicatoin-development%2F&amp;title=native+javascript+applicatoin+development" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F06%2F09%2Fnative-javascript-applicatoin-development%2F&amp;t=native+javascript+applicatoin+development" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://blog.pangwa.com/2009/06/09/native-javascript-applicatoin-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ie css selector issue</title>
		<link>http://blog.pangwa.com/2009/05/15/ie-css-selector-issue/</link>
		<comments>http://blog.pangwa.com/2009/05/15/ie-css-selector-issue/#comments</comments>
		<pubDate>Fri, 15 May 2009 15:09:05 +0000</pubDate>
		<dc:creator>pangwa</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://blog.pangwa.com/2009/05/15/ie-css-selector-issue/</guid>
		<description><![CDATA[最近写了一些html, 遇到一个很郁闷的问题, 大致是下面的, 我写了一些链接, 大致如下: &#60;a class=&#34;actionlink&#34; onclick=’myfunction(this);'&#62;mylink&#60;/a&#62; 为它写了一个css, 如下: a.actionlink { &#160;&#160;&#160; display:block; &#160;&#160;&#160; text-decoration: none; &#160;&#160;&#160; color:&#160; #62C2CC; &#160;&#160;&#160; outline: none; &#160;&#160;&#160; } a.actionlink:hover { &#160;&#160;&#160; display:block; &#160;&#160;&#160; color: blue; &#160;&#160;&#160; text-decoration: underline; &#160;&#160;&#160; } a.actionlink:visited { &#160;&#160;&#160; display:block; &#160;&#160;&#160; color:&#160; $62c2cc; &#160;&#160;&#160; } a.actionlink:active { &#160;&#160;&#160; display:block; &#160;&#160;&#160; color:&#160; red; &#160;&#160;&#160; } [...]]]></description>
			<content:encoded><![CDATA[<p>最近写了一些html, 遇到一个很郁闷的问题, 大致是下面的, 我写了一些链接, 大致如下:</p>
<blockquote><pre>&lt;a class=&quot;actionlink&quot; onclick=’myfunction(this);'&gt;mylink&lt;/a&gt;</pre>
</blockquote>
<p>为它写了一个css, 如下:</p>
<blockquote>
<p> a.actionlink {<br />
    <br />&#160;&#160;&#160; display:block; </p>
<p>&#160;&#160;&#160; text-decoration: none;</p>
<p>&#160;&#160;&#160; color:&#160; #62C2CC;</p>
<p>&#160;&#160;&#160; outline: none;</p>
<p>&#160;&#160;&#160; } </p>
<p>a.actionlink:hover {<br />
    <br />&#160;&#160;&#160; display:block; </p>
<p>&#160;&#160;&#160; color: blue;</p>
<p>&#160;&#160;&#160; text-decoration: underline;</p>
<p>&#160;&#160;&#160; } </p>
<p>a.actionlink:visited {<br />
    <br />&#160;&#160;&#160; display:block; </p>
<p>&#160;&#160;&#160; color:&#160; $62c2cc;</p>
<p>&#160;&#160;&#160; } </p>
<p>a.actionlink:active {<br />
    <br />&#160;&#160;&#160; display:block; </p>
<p>&#160;&#160;&#160; color:&#160; red;</p>
<p>&#160;&#160;&#160; }</p>
</blockquote>
<p><font style="background-color: #ffffff">链接在firefox下面显示的完全正常, 可是在ie7/8下却死活无法正常显示在鼠标移上去时的颜色, 网上找了很久, 看到一些相关的ie8的bug, 像css selector的问题, <a href="http://idreamincode.co.uk/ie8-bugs" target="_blank">这里</a>有一个列表, 本来以为其中的一个css子对象选择符的bug是这个有关, 但是我已经把它改成了直接的类, 所以应该不是那个问题. </font></p>
<p>两天郁闷的尝试都没有成功, 今天再看相关的<a href="http://www.w3.org/TR/CSS2/selector.html#link-pseudo-classes" target="_blank">文档</a>, 在看到选择符的时候, 偶然看到这么一句:</p>
<blockquote>
<p>The document language determines which elements are hyperlink source anchors. For example, in HTML4, the link pseudo-classes apply to<font color="#ff0000"> A elements with an &quot;href&quot; attribute</font>. Thus, the following two CSS 2.1 declarations have similar effect:</p>
<pre>a:link { color: red }
:link  { color: red }</pre>
</blockquote>
<pre>这回忽然注意到其中红色的部分, 难道真和这个有关? 于是试着加上href=&quot;#&quot;, 之后, 果然一切都好了!……</pre>
<blockquote>
<pre>&lt;a href=”#” class=&quot;actionlink&quot; onclick=’myfunction(this);'&gt;mylink&lt;/a&gt;</pre>
</blockquote>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F05%2F15%2Fie-css-selector-issue%2F&amp;title=ie+css+selector+issue" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F05%2F15%2Fie-css-selector-issue%2F&amp;title=ie+css+selector+issue" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F05%2F15%2Fie-css-selector-issue%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fblog.pangwa.com%2F2009%2F05%2F15%2Fie-css-selector-issue%2F&amp;title=ie+css+selector+issue" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F05%2F15%2Fie-css-selector-issue%2F&amp;title=ie+css+selector+issue" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F05%2F15%2Fie-css-selector-issue%2F&amp;title=ie+css+selector+issue" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F05%2F15%2Fie-css-selector-issue%2F&amp;t=ie+css+selector+issue" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://blog.pangwa.com/2009/05/15/ie-css-selector-issue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>闪屏问题</title>
		<link>http://blog.pangwa.com/2009/04/22/flashing-bomb/</link>
		<comments>http://blog.pangwa.com/2009/04/22/flashing-bomb/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 13:09:20 +0000</pubDate>
		<dc:creator>pangwa</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[MFC]]></category>

		<guid isPermaLink="false">http://blog.pangwa.com/2009/04/22/flashing-bomb/</guid>
		<description><![CDATA[今天又接到了一个问题:-&#124; 最近的问题有点多哈! 问题是这样的, 朋友的一个程序(VC++编写)它会在上面显示一个背景图片和自己绘制的一个计时的时间显示表, 程序在开发的阶段运行一切正常, 但是客户反映讲此程序运行的相当不稳定, 总是在过了一段时间后会出现背景变灰, 并且窗口界面开始不停的闪烁. 朋友经过测试也发现有类似的状况, 在朋友的机器上程序大概运行三分钟后就会出现客户说的情况, 据朋友描述说有时也两分钟左右就会出现闪烁的情况, 只是这种情况比较少, 但三分钟是一个比较保险的使问题重现的时间. 刚听到这个问题, 比较没有头绪, 找不到问题, 于是让朋友把相关的代码发过来, 看了代码心中大概有了一个概念: 界面完全是由自己的代码绘制的, 为了显示计时器的时间, 在代码里加了一个计时器, 并在onTimer ()时重新绘制整个窗口 绘制时钟是通过装载对应的位图绘制数字的 看到这里, 心里大概能猜测到了一个可能的原因: 句柄泄漏, 一想到这一点, 所有的问题都可以解释了: 极有可能是在窗口绘制的代码里出现了句柄泄漏的情况, 在刚开始的时候没有问题, 但由于每秒钟都会定时绘制一下界面, 所以随着时间的推移, 泄漏的句柄数越来越多 &#8212; 这样当所有可用的句柄都泄漏完之后, 当再次尝试申请句柄资源以创建相关的位图对象的时候就会失败, 这样就会导致画不出相关的图片来, 于是整个界面就会是灰/白色了, 至于闪烁的问题, 应该是由于每次刷新失败导致的问题. 这么一讲还真可以讲的通. 再仔细看一下代码吧:) 下面是一段类似于朋友ontimer函数的代码: void CMyDlg::OnTimer(UINT nIDEvent) { if (nIDEvent == MY_TIMER_EVENT) { // // [...]]]></description>
			<content:encoded><![CDATA[<p>今天又接到了一个问题:-| 最近的问题有点多哈! </p>
<p>问题是这样的, 朋友的一个程序(VC++编写)它会在上面显示一个背景图片和自己绘制的一个计时的时间显示表, 程序在开发的阶段运行一切正常, 但是客户反映讲此程序运行的相当不稳定, 总是在过了一段时间后会出现背景变灰, 并且窗口界面开始不停的闪烁. 朋友经过测试也发现有类似的状况, 在朋友的机器上程序大概运行三分钟后就会出现客户说的情况, 据朋友描述说有时也两分钟左右就会出现闪烁的情况, 只是这种情况比较少, 但三分钟是一个比较保险的使问题重现的时间. </p>
<p>刚听到这个问题, 比较没有头绪, 找不到问题, 于是让朋友把相关的代码发过来, 看了代码心中大概有了一个概念:</p>
<ol>
<li>界面完全是由自己的代码绘制的, </li>
<li>为了显示计时器的时间, 在代码里加了一个计时器, 并在onTimer ()时重新绘制整个窗口 </li>
<li>绘制时钟是通过装载对应的位图绘制数字的 </li>
</ol>
<p>看到这里, 心里大概能猜测到了一个可能的原因: 句柄泄漏, 一想到这一点, 所有的问题都可以解释了: 极有可能是在窗口绘制的代码里出现了句柄泄漏的情况, 在刚开始的时候没有问题, 但由于每秒钟都会定时绘制一下界面, 所以随着时间的推移, 泄漏的句柄数越来越多 &#8212; 这样当所有可用的句柄都泄漏完之后, 当再次尝试申请句柄资源以创建相关的位图对象的时候就会失败, 这样就会导致画不出相关的图片来, 于是整个界面就会是灰/白色了, 至于闪烁的问题, 应该是由于每次刷新失败导致的问题. 这么一讲还真可以讲的通. 再仔细看一下代码吧:) 下面是一段类似于朋友ontimer函数的代码:</p>
<pre lang="cpp">
void CMyDlg::OnTimer(UINT nIDEvent)
{
    if (nIDEvent == MY_TIMER_EVENT)
    {
        //
        // draw the clock
        //
         CDC *pDC = GetDC();
        CDC CompatibleDC;
        CompatibleDC.CreateCompatibleDC(pDC);
        CBitmap bmp;
        bmp.LoadBitmap(IDB_DIGITS);
        BITMAP bitmap;
        bmp.GetBitmap(&amp;bitmap);
        CompatibleDC.SelectObject(&amp;bmp);
        //
        // draw minutes/seconds, using hte digits in the bitmap...
        //
        pDC-&gt;StretchBlt(200,565,87,135, &amp;CompatibleDC,(bitmap.bmWidth/12) * minute,
                0, bitmap.bmWidth/12,bitmap.bmHeight,SRCCOPY);

        ReleaseDC(pDC);
    }
}</pre>
<p>初看貌似没有什么问题, dc对象被正常释放了, 不过再仔细看一下! 注意这里的CBitmap以及selectObject, 这里是有泄漏的,或许你会说CBitmap的析构函数会释放它使用的gdi 对象, 在msdn里的LoadBitmap的方法说明里也是这么讲的:</p>
<blockquote>
<p>The loaded bitmap is attached to the CBitmap object. </p>
<p>If the bitmap identified by lpszResourceName does not exist or if there is insufficient memory to load the bitmap, the function returns 0. </p>
<p>You can use the CGdiObject::DeleteObject function to delete bitmap loaded by the LoadBitmap function, or the CBitmap destructor will delete the object for you. </p>
</blockquote>
<p>但是请注意下面的一行!</p>
<blockquote>
<p><font color="#ff0000">Caution:<br />
      <br />Before you delete the object, make sure it is not selected into a device context. </font></p>
</blockquote>
<p>这里提到请注意在删除一个对象之前请确认它没还没当前的设备上下文选中! 如果删除一个当前被使用的对象会有什么后果? 虽然没有找到文档, 但照猜测的话那就是删除失败! 所以毫无疑问每次都会导致一个CBitmap的gdi对象的泄漏! 所以修好这个问题应该是在使用完这个bitmap对象后再使用selectObject把选择原来的gdi 对象, 原来的gdi对象可以通过CompatibleDC.SelectObject(&amp;bmp);的返回值得到. 所以修改后的代码应该是这样:</p>
<pre lang="cpp">        CBitmap* oldObject = CompatibleDC.SelectObject(&amp;bmp);

        //
        // draw minutes/seconds, using hte digits in the bitmap...
        //
        pDC-&gt;StretchBlt(200,565,87,135, &amp;CompatibleDC,(bitmap.bmWidth/12) * minute,
                0, bitmap.bmWidth/12,bitmap.bmHeight,SRCCOPY);
        pDc-&gt;SelectObject (oldObject);  //select the old object.!
        ....</pre>
<p>这样应该就可把这个问题修好啦! (没有机会测试, 但应该没有问题…).</p>
<p>再另外, 朋友告诉我他们找了一个人修了一下, 他们的方法是把那个CBitmap对象变成一个全局对象, 这样只要load一次, 所以也不会出现严重的泄漏情况(顶多一个gdi 对象, 另外效率相对每次都要load要好一些), 所以也可以算一个方法:)</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F22%2Fflashing-bomb%2F&amp;title=%E9%97%AA%E5%B1%8F%E9%97%AE%E9%A2%98" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F22%2Fflashing-bomb%2F&amp;title=%E9%97%AA%E5%B1%8F%E9%97%AE%E9%A2%98" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F22%2Fflashing-bomb%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F22%2Fflashing-bomb%2F&amp;title=%E9%97%AA%E5%B1%8F%E9%97%AE%E9%A2%98" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F22%2Fflashing-bomb%2F&amp;title=%E9%97%AA%E5%B1%8F%E9%97%AE%E9%A2%98" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F22%2Fflashing-bomb%2F&amp;title=%E9%97%AA%E5%B1%8F%E9%97%AE%E9%A2%98" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F22%2Fflashing-bomb%2F&amp;t=%E9%97%AA%E5%B1%8F%E9%97%AE%E9%A2%98" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://blog.pangwa.com/2009/04/22/flashing-bomb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个简单的php/mysql优化&#8230;</title>
		<link>http://blog.pangwa.com/2009/04/21/a-simple-optimization-for-phpmysql/</link>
		<comments>http://blog.pangwa.com/2009/04/21/a-simple-optimization-for-phpmysql/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 03:40:19 +0000</pubDate>
		<dc:creator>pangwa</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.pangwa.com/2009/04/21/a-simple-optimization-for-phpmysql/</guid>
		<description><![CDATA[近日一个朋友发过来一个页面, 说是上面有一段代码执行慢, 想看看能不能用一些方法让这个等待过程不要这么久, 看了一下代码, 朋友所指的代码大概像下面一段: 另外的信息是, 数据库的记录大概是三十多万条, 由于这个查询语句要在一个循环语句里执行多次, 当循环十次的时候速度会很明显的很慢. 据俺已有的知识和对mysql的理解, 对于十万量级的记录, 数据库的效率应该没有问题, 首先想到的便是从优化数据库开始, 第一条当然是建立索引了, 于是建议他用age + score做一个索引, 但朋友讲做过索引后没有太大影响(我怀疑他是单独为age 和 score做了索引, 我的意思是为age/score做一个综合索引, 但后面这个就没机会尝试了). 于是再尝试一些新的方法, 回过头去分析这段代码, 可以发现, 这里只是用到了返回结果集的第一条记录(或者原来的作者只期望得到一条记录), 毫无疑问, 把所有的记录查询下来是很破费时间/内存的, 于是从这里入手, 我们把查询改成只查一条记录. 于是修改后的查询语句就是 $query = “select id, name from demoTable where age &#62;= “ . $age . “ and score &#62;= “. $score . “&#160; LIMIT 1“; [...]]]></description>
			<content:encoded><![CDATA[<p>近日一个朋友发过来一个页面, 说是上面有一段代码执行慢, 想看看能不能用一些方法让这个等待过程不要这么久, 看了一下代码, 朋友所指的代码大概像下面一段:    </p>
<pre class="brush: php; title: ; notranslate">if (cond)

{

$query = “select id, name from demoTable where age &gt;= “ . $age . “ and score &gt;= “. $score . “ “;

$result = mysql_query($query);
list( $id,$name) = mysql_fetch_row($result);
print &amp;quot;&lt;td class=&quot;text&quot;&gt;&amp;quot;.$id.&amp;quot;&lt;/td&gt;
print &amp;quot;&lt;td class=&quot;text&quot;&gt;;&amp;quot;.$name.&amp;quot;&lt;/td&gt;;

}</pre>
<p>另外的信息是, 数据库的记录大概是三十多万条, 由于这个查询语句要在一个循环语句里执行多次, 当循环十次的时候速度会很明显的很慢.</p>
<p>据俺已有的知识和对mysql的理解, 对于十万量级的记录, 数据库的效率应该没有问题, 首先想到的便是从优化数据库开始, 第一条当然是建立索引了, 于是建议他用age + score做一个索引, 但朋友讲做过索引后没有太大影响(我怀疑他是单独为age 和 score做了索引, 我的意思是为age/score做一个综合索引, 但后面这个就没机会尝试了). 于是再尝试一些新的方法, 回过头去分析这段代码, 可以发现, 这里只是用到了返回结果集的第一条记录(或者原来的作者只期望得到一条记录), 毫无疑问, 把所有的记录查询下来是很破费时间/内存的, 于是从这里入手, 我们把查询改成只查一条记录.</p>
<p>于是修改后的查询语句就是</p>
<pre lang="php">$query = “select id, name from demoTable where age &gt;= “ . $age . “ and score &gt;= “. $score . “&#160; LIMIT 1“;</pre>
<p>让朋友尝试新的代码, 果然速度提升了很多, 基本不用再做其他的优化了. 那我们分析一下加上LIMIT 1之后相对能优化了多少次的查询, 这里我们假设每条记录被查询到的机率相同(不然还要再具体分析就太麻烦了…)</p>
<p>1. 假设没有索引, 那么对于原始查询, 基本是遍历整个表, 时间复杂度为O(n), 而对于优化后的查询来讲, 它会找到第一条匹配的记录后返回, 平均时间复杂度为(1 + n) / 2, 相当于优化了一半的时间.</p>
<p>2. 假设分别建立了age和score的索引, 对于原始的查询, 平均时间复杂度(二分法)应该大致在log2(n) + (log2(n/2) 左右, 这个需要根据具体的查询来分析, 不过这个值应该也算差不多, 而对于优化后的查询时间复杂度大致为 log2(n) + log2(n/2) = 2 log2(n) – 1, 貌似并没有优化掉多少时间 (是不是这里错了???? )…….</p>
<p>至于空间复杂度, 如果对于每次查询只可能有一条记录满足条件, 则都为O(1), 如果是有可能有多匹配记录, 当然对于优化后的查询会好很多.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F21%2Fa-simple-optimization-for-phpmysql%2F&amp;title=%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84php%2Fmysql%E4%BC%98%E5%8C%96%26hellip%3B" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F21%2Fa-simple-optimization-for-phpmysql%2F&amp;title=%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84php%2Fmysql%E4%BC%98%E5%8C%96%26hellip%3B" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F21%2Fa-simple-optimization-for-phpmysql%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F21%2Fa-simple-optimization-for-phpmysql%2F&amp;title=%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84php%2Fmysql%E4%BC%98%E5%8C%96%26hellip%3B" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F21%2Fa-simple-optimization-for-phpmysql%2F&amp;title=%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84php%2Fmysql%E4%BC%98%E5%8C%96%26hellip%3B" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F21%2Fa-simple-optimization-for-phpmysql%2F&amp;title=%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84php%2Fmysql%E4%BC%98%E5%8C%96%26hellip%3B" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F21%2Fa-simple-optimization-for-phpmysql%2F&amp;t=%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84php%2Fmysql%E4%BC%98%E5%8C%96%26hellip%3B" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://blog.pangwa.com/2009/04/21/a-simple-optimization-for-phpmysql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>my shell tips</title>
		<link>http://blog.pangwa.com/2009/04/14/my-shell-tips/</link>
		<comments>http://blog.pangwa.com/2009/04/14/my-shell-tips/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 10:54:54 +0000</pubDate>
		<dc:creator>pangwa</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blog.pangwa.com/?p=444</guid>
		<description><![CDATA[最近无聊的时候记下来的两个小tip:) 1. login的时候随即打印一个ASCII的图案。 这个比较无聊，基本原理就是把一些预先准备好的ASCII图案分别写成一个文件，在登陆的时候就是随机选取一个文件然后cat就可以啦. Sample code: 上面的代码就是把所有的ASCII图案放在~/.logo下面，然后再登陆的时候首先使用cd进入~/.logo目录，然后用set *来默认匹配所有文件名， shift $(($RANDOM % $#)) 则是随即一个整数然后和文件数取模并选择对应的文件名， echo -e &#8216;\e[0;32m&#8217; 这一句是用来是后面的字符为绿色(因为白色的图案不好看啊…) echo -e &#8220;\e[0m&#8221; 中止前面的改变字体颜色的效果，这样就不会影响后面的打印结果。 当然， 要记得去找一些ascii 图片放到你的.logo目录里啊:) 2. 动态更新putty的窗口标题 使用putty的ssh的同学们都会想putty可以向其他的终端模拟器一样根据当前目录啥的动态更新标题栏，其实这个也可以再putty里实现，这里需要注意两点： a. 确保没有打开putty的禁止远程改变窗口标题的选项，这个选项可以在Terminal==&#62;Features 里找到。 b. 在你的登陆脚本里export 一个名为PROMPT_COMMAND的变量，顾名思义它需要是一个命令，下面是我的配置(注意开始的和末尾的数字都是必须的): 打印的格式为：hostname: /home/pangwa/src &#8211; pangwa 重新登陆或者source一下你的初始化脚本就可以了:) Bookmark to:]]></description>
			<content:encoded><![CDATA[<p>最近无聊的时候记下来的两个小tip:)</p>
<p><strong>1. login的时候随即打印一个ASCII的图案。</strong></p>
<p>这个比较无聊，基本原理就是把一些预先准备好的ASCII图案分别写成一个文件，在登陆的时候就是随机选取一个文件然后cat就可以啦.</p>
<p>Sample code:</p>
<pre class="brush: bash; title: ; notranslate">#print out a logo to the screen...
logoDir=&quot;~/.logo&quot;
if [ -d $logoDir ] ; then
cd $logoDir
# '*' is a filename wildcard to match all files in the current directory
set *
# Use the syntax for arithmetic expressions.  &quot;%&quot; is the modulo operator
# Shift arguments by a random number between 0 and the number of files
shift $(($RANDOM % $#))
echo -e '\e[0;32m'
cat &quot;${logoDir}/$1&quot;
echo -e &quot;\e[0m&quot;
fi</pre>
<p>上面的代码就是把所有的ASCII图案放在~/.logo下面，然后再登陆的时候首先使用cd进入~/.logo目录，然后用set *来默认匹配所有文件名，<br />
shift $(($RANDOM % $#)) 则是随即一个整数然后和文件数取模并选择对应的文件名，<br />
echo -e '\e[0;32m' 这一句是用来是后面的字符为绿色(因为白色的图案不好看啊…)<br />
echo -e "\e[0m" 中止前面的改变字体颜色的效果，这样就不会影响后面的打印结果。</p>
<p>当然， 要记得去找一些ascii 图片放到你的.logo目录里啊:)</p>
<p><strong>2. 动态更新putty的窗口标题</strong></p>
<p>使用putty的ssh的同学们都会想putty可以向其他的终端模拟器一样根据当前目录啥的动态更新标题栏，其实这个也可以再putty里实现，这里需要注意两点：</p>
<p>a. 确保没有打开putty的禁止远程改变窗口标题的选项，这个选项可以在Terminal==&gt;Features 里找到。</p>
<p><img class="aligncenter size-full wp-image-457" title="putty" src="http://blog.pangwa.com/wp-content/uploads/2009/04/putty.png" alt="putty" width="466" height="448" /></p>
<p>b. 在你的登陆脚本里export 一个名为PROMPT_COMMAND的变量，顾名思义它需要是一个命令，下面是我的配置(注意开始的和末尾的数字都是必须的):</p>
<pre class="brush: bash; title: ; notranslate">PROMPT_COMMAND='echo -ne &quot;\033]0;${HOSTNAME}: ${PWD} -$USER\007&quot;';export PROMPT_COMMAND</pre>
<p>打印的格式为：hostname: /home/pangwa/src &#8211; pangwa</p>
<p>重新登陆或者source一下你的初始化脚本就可以了:)</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F14%2Fmy-shell-tips%2F&amp;title=my+shell+tips" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F14%2Fmy-shell-tips%2F&amp;title=my+shell+tips" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F14%2Fmy-shell-tips%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F14%2Fmy-shell-tips%2F&amp;title=my+shell+tips" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F14%2Fmy-shell-tips%2F&amp;title=my+shell+tips" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F14%2Fmy-shell-tips%2F&amp;title=my+shell+tips" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fblog.pangwa.com%2F2009%2F04%2F14%2Fmy-shell-tips%2F&amp;t=my+shell+tips" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://blog.pangwa.com/2009/04/14/my-shell-tips/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

