﻿<?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>广陵散 `s 博客 lizhenglin.com</title>
	<atom:link href="http://www.lizhenglin.com/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.lizhenglin.com/blog</link>
	<description></description>
	<lastBuildDate>Sat, 21 Aug 2010 07:08:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>（转）免翻墙oauth验证的奶瓶推</title>
		<link>http://www.lizhenglin.com/blog/?p=865</link>
		<comments>http://www.lizhenglin.com/blog/?p=865#comments</comments>
		<pubDate>Sat, 21 Aug 2010 07:02:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[技术荟萃]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[奶瓶推]]></category>
		<category><![CDATA[格吕佩]]></category>

		<guid isPermaLink="false">http://www.lizhenglin.com/blog/?p=865</guid>
		<description><![CDATA[TWITTER官方在今年6月宣布将于8月16日起逐渐取消终止对Basic Authorization验证方式的支持，全面启用OAuth的认证方式。 8月16日–8月31日: 对Basic-oauth (不需要到Twitter官方网站认证) 的第三方和API的支持减为每小时10次 8月31日后：取消对Basic-oauth 的支持，只接受经过Twitter官方认证的OAUTH第三方和API。 随着日期的临近，鸭梨很大。我虽说有个用TWIP+OAUTH搭建的API，不过一般是用于桌面环境或着给除WM的设备上推的时候才用。（奈何WM这个残废，对VPN支持极差，那个自X门WM版又不顶用） 较之传统的Basic-OAuth验证。使用OAuth，Twitter应用无需知道用户的Twitter口令，只需要得到Twitter和用户双方的授权信息（即Token）即可。这样，Twitter应用开发者就不知道用户的Twitter口令，仅能对授权信息（Token）做有限的操作，无法修改用户的Twitter口令，也无法删除用户的Twitter账号。这在通信的安全性上有了很大保障。 Token 的取得需要访问Twitter官网，对于某些国家的普通民众来说，相比Basic Auth是一个不方便的地方。一定程度上也制约了一些人的上推积极性。 如果GFW管的不严，我倒不介意把API共享出来的，但是先前域名和IP已经被封过一次，所以还是不干这样的事吧，还是把搭建方法写出来。授人以鱼不，如授人以渔…. 这次打算加上oauth验证的页面客户端是-“奶瓶推”。这个是我用来给我的残废WM机上推用的。之前虽说有软件客户端可以用，但是登录太慢，而且所占内存也比较大。内置的API稳定性及安全性得不到保障。尽管能有办法通过特定软件修改内置API，但是对API的位数有限制，我买的这域名改起来太麻烦了。WM又没办法在使用GPRS的情况下通过VPN直接连官网进行OAuth验证。所以我放弃了VPN和穿墙版Twitter软件。最后就我就把目光放在“奶瓶推”。对于奶瓶推，如果不知道请在搜索引擎中找下。 奶瓶推的本身的安装是很简单的，网上有诸多教程。我今天打算写的就是如果让奶瓶推在不翻墙的情况下进行OAuth登录。 以下以奶瓶推最新的NetPutweets_2009_Final_SP2版（其实也不新了）为基础，配合glype 1.1的一些修改， OAuth登录过程无需翻墙。 1. 首先要对奶瓶推进行修改 为了实现当奶瓶推获取oauth登录地址后，把登录地址交给glype在线代理处理（这里假设glype的安装目录为https://fanqiang.com/p/），我们需要进行一定的修改 在function theme_login() 这段代码结束峙之后的代码，作用是在登录页面上加入了另一个使用代理进行OAuth的入口，以及加入即将移除旧的登录方式的提示。 在安装文件夹中找到common 文件夹，对user.php进行修改。完整代码如下： &#60;?php menu_register(array( &#8216;oauth&#8217; =&#62; array( &#8216;callback&#8217; =&#62; &#8216;user_oauth&#8217;, &#8216;hidden&#8217; =&#62; &#8216;true&#8217;, ), &#8216;reg&#8217; =&#62; array( &#8216;callback&#8217; =&#62; &#8216;user_reg&#8217;, &#8216;hidden&#8217; =&#62; &#8216;true&#8217;, ), &#8216;image&#8217; =&#62; array( &#8216;callback&#8217; =&#62; &#8216;user_image&#8217;,]]></description>
			<content:encoded><![CDATA[<p>TWITTER官方在今年6月宣布将于8月16日起逐渐取消终止对Basic Authorization验证方式的支持，全面启用OAuth的认证方式。</p>
<p>8月16日–8月31日: 对Basic-oauth (不需要到Twitter官方网站认证) 的第三方和API的支持减为每小时10次</p>
<p>8月31日后：取消对Basic-oauth 的支持，只接受经过Twitter官方认证的OAUTH第三方和API。</p>
<p>随着日期的临近，鸭梨很大。我虽说有个用TWIP+OAUTH搭建的API，不过一般是用于桌面环境或着给除WM的设备上推的时候才用。（奈何WM这个残废，对VPN支持极差，那个自X门WM版又不顶用）</p>
<p><span id="more-865"></span></p>
<p>较之传统的Basic-OAuth验证。使用OAuth，Twitter应用无需知道用户的Twitter口令，只需要得到Twitter和用户双方的授权信息（即Token）即可。这样，Twitter应用开发者就不知道用户的Twitter口令，仅能对授权信息（Token）做有限的操作，无法修改用户的Twitter口令，也无法删除用户的Twitter账号。这在通信的安全性上有了很大保障。</p>
<p>Token 的取得需要访问Twitter官网，对于某些国家的普通民众来说，相比Basic Auth是一个不方便的地方。一定程度上也制约了一些人的上推积极性。</p>
<p>如果GFW管的不严，我倒不介意把API共享出来的，但是先前域名和IP已经被封过一次，所以还是不干这样的事吧，还是把搭建方法写出来。授人以鱼不，如授人以渔….</p>
<p>这次打算加上oauth验证的页面客户端是-“奶瓶推”。这个是我用来给我的残废WM机上推用的。之前虽说有软件客户端可以用，但是登录太慢，而且所占内存也比较大。内置的API稳定性及安全性得不到保障。尽管能有办法通过特定软件修改内置API，但是对API的位数有限制，我买的这域名改起来太麻烦了。WM又没办法在使用GPRS的情况下通过VPN直接连官网进行OAuth验证。所以我放弃了VPN和穿墙版Twitter软件。最后就我就把目光放在“奶瓶推”。对于奶瓶推，如果不知道请在搜索引擎中找下。</p>
<p>奶瓶推的本身的安装是很简单的，网上有诸多教程。我今天打算写的就是如果让奶瓶推在不翻墙的情况下进行OAuth登录。</p>
<p>以下以奶瓶推最新的NetPutweets_2009_Final_SP2版（其实也不新了）为基础，配合glype 1.1的一些修改， OAuth登录过程无需翻墙。</p>
<p>1. 首先要对奶瓶推进行修改</p>
<p>为了实现当奶瓶推获取oauth登录地址后，把登录地址交给glype在线代理处理（这里假设glype的安装目录为https://fanqiang.com/p/），我们需要进行一定的修改</p>
<p>在function theme_login() 这段代码结束峙之后的代码，作用是在登录页面上加入了另一个使用代理进行OAuth的入口，以及加入即将移除旧的登录方式的提示。</p>
<p>在安装文件夹中找到common 文件夹，对user.php进行修改。完整代码如下：</p>
<blockquote><p>&lt;?php</p>
<p>menu_register(array(<br />
&#8216;oauth&#8217; =&gt; array(<br />
&#8216;callback&#8217; =&gt; &#8216;user_oauth&#8217;,<br />
&#8216;hidden&#8217; =&gt; &#8216;true&#8217;,<br />
),<br />
&#8216;reg&#8217; =&gt; array(<br />
&#8216;callback&#8217; =&gt; &#8216;user_reg&#8217;,<br />
&#8216;hidden&#8217; =&gt; &#8216;true&#8217;,<br />
),<br />
&#8216;image&#8217; =&gt; array(<br />
&#8216;callback&#8217; =&gt; &#8216;user_image&#8217;,<br />
&#8216;hidden&#8217; =&gt; &#8216;true&#8217;,<br />
),<br />
&#8216;rookie&#8217; =&gt; array(<br />
&#8216;callback&#8217; =&gt; &#8216;user_rookie&#8217;,<br />
&#8216;hidden&#8217; =&gt; &#8216;true&#8217;,<br />
),<br />
));</p>
<p>function user_image() {<br />
require_once &#8216;reg.php&#8217;;<br />
header(&#8216;Content-Type: image/jpeg&#8217;);<br />
echo req(&#8216;https://api-secure.recaptcha.net/image?c=&#8217;.$_GET['c']);<br />
}</p>
<p>function user_reg() {<br />
require_once &#8216;reg.php&#8217;;<br />
if ($_SERVER['REQUEST_METHOD'] == &#8216;GET&#8217;) {<br />
if (user_is_authenticated()) {<br />
header(&#8216;Location: &#8216;. BASE_URL);<br />
}<br />
theme(&#8216;page&#8217;, __(&#8216;Registration&#8217;), get_reg_content());<br />
} else if ($_SERVER['REQUEST_METHOD'] == &#8216;POST&#8217;) {<br />
$error_msg = false;<br />
$fields = array( &#8216;name&#8217;, &#8216;screen_name&#8217;, &#8216;user_password&#8217;, &#8216;email&#8217; );<br />
foreach ($fields as $field) {<br />
if (!strcmp($_POST['user'][$field], &#8221;)) {<br />
$error_msg = &#8216;所有选项均为必填。&#8217;;<br />
break;<br />
}<br />
}<br />
if (!$error_msg &amp;&amp; strlen($_POST['user']['user_password']) &lt; 6) {<br />
$error_msg = &#8216;密码长度不够。&#8217;;<br />
}</p>
<p>if (!$error_msg) {<br />
$r = req(&#8216;https://twitter.com/account/create&#8217;, @file_get_contents(&#8216;php://input&#8217;), false);<br />
$err_msg = array(<br />
&#8216;You can\&#8217;t do that right now.&#8217; =&gt; &#8216;出现未知错误。&#8217;,<br />
&#8216;Please try to match the 2 words shown above&#8217; =&gt; &#8216;验证码输入错误。&#8217;,<br />
&#8216;has already been taken&#8217; =&gt; &#8216;用户名或邮箱已有人使用。&#8217;,<br />
&#8216;is not a valid email address&#8217; =&gt; &#8216;邮箱格式不正确。&#8217;<br />
);<br />
foreach ($err_msg as $k =&gt; $v) {<br />
if (strpos($r, $k) !== false) {<br />
$error_msg = $v;<br />
break;<br />
}<br />
}<br />
}<br />
if (!$error_msg) {<br />
$GLOBALS['user']['username'] = trim($_POST['user']['screen_name']);<br />
$GLOBALS['user']['password'] = $_POST['user']['user_password'];<br />
$GLOBALS['user']['type'] = &#8216;normal&#8217;;<br />
_user_save_cookie(true);<br />
header(&#8216;Location: &#8216;.BASE_URL.&#8217;rookie&#8217;);<br />
exit();<br />
} else {<br />
$content = &#8216;&lt;p&gt;&#8217;.$error_msg.&#8217;&lt;/p&gt;&lt;p&gt;请返回&lt;a href=&#8221;&#8216;.BASE_URL.&#8217;reg&#8221;&gt;注册页面&lt;/a&gt;重试。&#8217;;<br />
theme(&#8216;page&#8217;, __(&#8216;Registration&#8217;), $content);<br />
}<br />
}<br />
}</p>
<p>function user_rookie() {<br />
$content = &#8216;&lt;p&gt;恭喜你，你的帐号已经注册成功！在正式开始使用之前，有一些内容你应该了解：&lt;/p&gt;<br />
&lt;ul&gt;&lt;li&gt;奶瓶腿是一个安全的、个性的中文 Twitter 手机客户端，基于 &lt;a href=&#8221;http://dabr.co.uk/&#8221;&gt;Dabr&lt;/a&gt; ，由奶瓶 &lt;a href=&#8221;&#8216;.BASE_URL.&#8217;user/netputer&#8221;&gt;@NetPuter&lt;/a&gt; 修改/架设，更多介绍请围观 &lt;a href=&#8221;&#8216;.BASE_URL.&#8217;about&#8221;&gt;&#8217;.__(&#8220;About&#8221;).&#8217;&lt;/a&gt; 页面。&lt;/li&gt;<br />
&lt;li&gt;想修改资料？在个人页面中点击 &lt;strong&gt;&lt;a href=&#8221;&#8216;.BASE_URL.&#8217;profile&#8221;&gt;&#8217;.__(&#8220;Update Profile&#8221;).&#8217;&lt;/a&gt;&lt;/strong&gt; 即可完成。&lt;/li&gt;<br />
&lt;li&gt;推荐关注 &lt;strong&gt;&lt;a href=&#8221;&#8216;.BASE_URL.&#8217;user/rtmeme&#8221;&gt;@rtmeme&lt;/a&gt;&lt;/strong&gt; &#8211; 一个优秀的机器人，捕捉中文 Twitter 圈最热消息。&lt;/li&gt;<br />
&lt;li&gt;推荐关注 &lt;strong&gt;&lt;a href=&#8221;&#8216;.BASE_URL.&#8217;user/tuite_tips&#8221;&gt;@tuite_tips&lt;/a&gt;&lt;/strong&gt; &#8211; 中文推特技巧，包括使用技巧，观点评论，各平台客户端介绍， Web 应用介绍，美化，周边商品和线下聚会等。&lt;/li&gt;<br />
&lt;li&gt;推荐关注 &lt;strong&gt;&lt;a href=&#8221;&#8216;.BASE_URL.&#8217;user/tui3rd&#8221;&gt;@tui3rd&lt;/a&gt;&lt;/strong&gt; &#8211; 推特第三方，关注推友自行开发/修改/维护的第三方 Twitter 客户端。&lt;/li&gt;<br />
&lt;li&gt;推荐使用 &lt;strong&gt;&lt;a href=&#8221;https://zdx.in/&#8221;&gt;Rabr&lt;/a&gt;&lt;/strong&gt; ，基于 Twitese 推特中文圈修改、优化、美化，适合在电脑上使用。&lt;/li&gt;<br />
&lt;li&gt;……&lt;/li&gt;<br />
&lt;/ul&gt;&lt;p /&gt;我知道了，现在就&lt;a href=&#8221;&#8216;.BASE_URL.&#8217;&#8221;&gt;开始 Twitter 之旅&lt;/a&gt;吧！&#8217;;<br />
theme(&#8216;page&#8217;, __(&#8216;To Rookies&#8217;), $content);<br />
}</p>
<p>function user_oauth() {<br />
require_once &#8216;OAuth.php&#8217;;<br />
// Session used to keep track of secret token during authorisation step<br />
session_start();<br />
// Flag forces twitter_process() to use OAuth signing<br />
$GLOBALS['user']['type'] = &#8216;oauth&#8217;;<br />
if ($oauth_token = $_GET['oauth_token']) {<br />
// Generate ACCESS token request<br />
$params = array(&#8216;oauth_verifier&#8217; =&gt; $_GET['oauth_verifier']);<br />
$response = twitter_process(&#8216;https://twitter.com/oauth/access_token&#8217;, $params);<br />
parse_str($response, $token);<br />
// Store ACCESS tokens in COOKIE<br />
$GLOBALS['user']['password'] = $token['oauth_token'] .&#8217;|&#8217;.$token['oauth_token_secret'];<br />
// Fetch the user&#8217;s screen name with a quick API call<br />
unset($_SESSION['oauth_request_token_secret']);<br />
$user = twitter_process(&#8216;https://twitter.com/account/verify_credentials.json&#8217;);<br />
$GLOBALS['user']['username'] = $user-&gt;screen_name;<br />
_user_save_cookie(1);<br />
header(&#8216;Location: &#8216;. BASE_URL);<br />
exit();<br />
} else {<br />
// Generate AUTH token request<br />
$params = array(&#8216;oauth_callback&#8217; =&gt; BASE_URL.&#8217;oauth&#8217;);<br />
$response = twitter_process(&#8216;https://twitter.com/oauth/request_token&#8217;, $params);<br />
parse_str($response, $token);<br />
// Save secret token to session to validate the result that comes back from Twitter<br />
$_SESSION['oauth_request_token_secret'] = $token['oauth_token_secret'];<br />
// redirect user to authorisation URL<br />
$authorise_url = &#8216;https://twitter.com/oauth/authorize?oauth_token=&#8217;.$token['oauth_token'];<br />
if ( $_GET['proxy'] == true) {<br />
$authorise_url = &#8216;http://notnaive.info/prs/browse.php?u=&#8217;.$authorise_url;<br />
}<br />
header(&#8220;Location: $authorise_url&#8221;);<br />
}<br />
}</p>
<p>/*<br />
function theme_login() {<br />
return &#8216;<br />
&lt;p&gt;&lt;a href=&#8221;oauth?proxy=true&#8221;&gt;&lt;img src=&#8221;images/twitter_button_2_lo.gif&#8221; alt=&#8221;Sign in with Twitter/OAuth&#8221; width=&#8221;165&#8243; height=&#8221;28&#8243; /&gt;&lt;/a&gt; (via proxy; accessible in Mainland China).&lt;/p&gt;<br />
&lt;p&gt;Or:&lt;/p&gt;<br />
&lt;p&gt;&lt;a href=&#8221;oauth&#8221;&gt;&lt;img src=&#8221;images/twitter_button_2_lo.gif&#8221; alt=&#8221;Sign in with Twitter/OAuth&#8221; width=&#8221;165&#8243; height=&#8221;28&#8243; /&gt;&lt;/a&gt; (direct access; with this option, you should across the GFW first).&lt;/p&gt;<br />
&lt;p&gt;Or enter your Twitter username and password below:&lt;/p&gt;<br />
&lt;p&gt;&lt;span style=&#8221;background-color:#ffff00;&#8221;&gt;&lt;strong&gt;IMPORTANT: Basic authentication removal is going to occur in June 2010.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;<br />
&lt;form method=&#8221;post&#8221; action=&#8221;&#8216;.$_GET['q'].&#8217;&#8221;&gt;<br />
&lt;p&gt;Username &lt;input name=&#8221;username&#8221; size=&#8221;15&#8243; /&gt;<br />
&lt;br /&gt;Password &lt;input name=&#8221;password&#8221; type=&#8221;password&#8221; size=&#8221;15&#8243; /&gt;<br />
&lt;br /&gt;&lt;label&gt;&lt;input type=&#8221;checkbox&#8221; value=&#8221;yes&#8221; name=&#8221;stay-logged-in&#8221; /&gt; Stay logged in? &lt;/label&gt;<br />
&lt;br /&gt;&lt;input type=&#8221;submit&#8221; value=&#8221;Sign In&#8221; /&gt;&lt;/p&gt;<br />
&lt;/form&gt;<br />
&#8216;;<br />
}<br />
*/</p>
<p>function theme_login() {<br />
$content = &#8216;<br />
&lt;p&gt;&lt;b&gt;[1] &lt;a href=&#8221;&#8216;.BASE_URL.&#8217;oauth&#8221;&gt;&#8217;.__(&#8220;Sign In with Twitter/OAuth&#8221;).&#8217;&lt;/a&gt;&lt;/b&gt; (from 奶瓶腿)&lt;/p&gt;<br />
&lt;p&gt;&lt;b&gt;[2] &lt;a href=&#8221;&#8216;.BASE_URL.&#8217;oauth?proxy=true&#8221;&gt;&#8217;.__(&#8220;Sign In with Twitter/OAuth via Proxy&#8221;).&#8217;&lt;/a&gt;&lt;/b&gt; (from 奶瓶腿)&lt;/p&gt;<br />
&lt;p&gt;&lt;b&gt;[3] &#8216;.__(&#8220;Enter your Twitter Username and Password below&#8221;).&#8217;&lt;/b&gt; (from Dabr)<br />
&lt;form method=&#8221;post&#8221; action=&#8221;&#8216;.$_GET['q'].&#8217;&#8221;&gt;&#8217;.__(&#8220;Username&#8221;).&#8217; &lt;input name=&#8221;username&#8221; size=&#8221;15&#8243;&gt;&lt;br /&gt;<br />
&#8216;.__(&#8220;Password&#8221;).&#8217; &lt;input name=&#8221;password&#8221; type=&#8221;password&#8221; size=&#8221;15&#8243;&gt;&lt;br /&gt;<br />
&lt;input type=&#8221;submit&#8221; value=&#8221;&#8216;.__(&#8220;Sign In&#8221;).&#8217;&#8221;&gt;&lt;label&gt;&lt;input type=&#8221;checkbox&#8221; value=&#8221;yes&#8221; checked=&#8221;check&#8221; name=&#8221;stay-logged-in&#8221;&gt; &#8216;.__(&#8220;Remember Me?&#8221;).&#8217; &lt;/label&gt;<br />
&lt;/form&gt;<br />
&lt;/p&gt;&#8217;;<br />
if (REG == 1) $content .= &#8216;&lt;p&gt;&lt;b&gt;[3] &lt;a href=&#8221;&#8216;.BASE_URL.&#8217;reg&#8221;&gt;&#8217;.__(&#8220;Sign Up Now&#8221;).&#8217;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&#8217;;<br />
return $content;<br />
}</p>
<p>function user_oauth_sign(&amp;$url, &amp;$args = false) {<br />
require_once &#8216;OAuth.php&#8217;;<br />
$method = $args !== false ? &#8216;POST&#8217; : &#8216;GET&#8217;;<br />
// Move GET parameters out of $url and into $args<br />
if (preg_match_all(&#8216;#[?&amp;]([^=]+)=([^&amp;]+)#&#8217;, $url, $matches, PREG_SET_ORDER)) {<br />
foreach ($matches as $match) {<br />
$args[$match[1]] = $match[2];<br />
}<br />
$url = substr($url, 0, strpos($url, &#8216;?&#8217;));<br />
}<br />
$sig_method = new OAuthSignatureMethod_HMAC_SHA1();<br />
$consumer = new OAuthConsumer(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET);<br />
$token = NULL;<br />
if (($oauth_token = $_GET['oauth_token']) &amp;&amp; $_SESSION['oauth_request_token_secret']) {<br />
$oauth_token_secret = $_SESSION['oauth_request_token_secret'];<br />
} else {<br />
list($oauth_token, $oauth_token_secret) = explode(&#8216;|&#8217;, $GLOBALS['user']['password']);<br />
}<br />
if ($oauth_token &amp;&amp; $oauth_token_secret) {<br />
$token = new OAuthConsumer($oauth_token, $oauth_token_secret);<br />
}<br />
$request = OAuthRequest::from_consumer_and_token($consumer, $token, $method, $url, $args);<br />
$request-&gt;sign_request($sig_method, $consumer, $token);<br />
switch ($method) {<br />
case &#8216;GET&#8217;:<br />
$url = $request-&gt;to_url();<br />
$args = false;<br />
return;<br />
case &#8216;POST&#8217;:<br />
$url = $request-&gt;get_normalized_http_url();<br />
$args = $request-&gt;to_postdata();<br />
return;<br />
}<br />
}</p>
<p>function user_ensure_authenticated() {<br />
if (!user_is_authenticated()) {<br />
$content = theme(&#8216;login&#8217;);<br />
theme(&#8216;page&#8217;, __(&#8220;Login&#8221;), $content);<br />
}<br />
}</p>
<p>function user_logout() {<br />
unset($GLOBALS['user']);<br />
setcookie(&#8216;USER_AUTH&#8217;, &#8221;, time() &#8211; 3600, &#8216;/&#8217;);<br />
}</p>
<p>function user_is_authenticated() {<br />
if (!isset($GLOBALS['user'])) {<br />
if(array_key_exists(&#8216;USER_AUTH&#8217;, $_COOKIE)) {<br />
_user_decrypt_cookie($_COOKIE['USER_AUTH']);<br />
} else {<br />
$GLOBALS['user'] = array();<br />
}<br />
}</p>
<p>if (!$GLOBALS['user']['username']) {<br />
if ($_POST['username'] &amp;&amp; $_POST['password']) {<br />
$GLOBALS['user']['username'] = trim($_POST['username']);<br />
$GLOBALS['user']['password'] = $_POST['password'];<br />
$GLOBALS['user']['type'] = &#8216;normal&#8217;;<br />
_user_save_cookie($_POST['stay-logged-in'] == &#8216;yes&#8217;);<br />
header(&#8216;Location: &#8216;. BASE_URL);<br />
exit();<br />
} else {<br />
return false;<br />
}<br />
}<br />
return true;<br />
}</p>
<p>function user_current_username() {<br />
return $GLOBALS['user']['username'];<br />
}</p>
<p>function user_is_current_user($username) {<br />
return (strcasecmp($username, user_current_username()) == 0);<br />
}</p>
<p>function user_type() {<br />
return $GLOBALS['user']['type'];<br />
}</p>
<p>function _user_save_cookie($stay_logged_in = 0) {<br />
$cookie = _user_encrypt_cookie();<br />
$duration = 0;<br />
if ($stay_logged_in) {<br />
$duration = time() + (3600 * 24 * 365);<br />
}<br />
setcookie(&#8216;USER_AUTH&#8217;, $cookie, $duration, &#8216;/&#8217;);<br />
}</p>
<p>function _user_encryption_key() {<br />
return ENCRYPTION_KEY;<br />
}</p>
<p>function _user_encrypt_cookie() {<br />
$plain_text = $GLOBALS['user']['username'] . &#8216;:&#8217; . $GLOBALS['user']['password'] . &#8216;:&#8217; . $GLOBALS['user']['type'];<br />
if (function_exists(&#8216;mcrypt_module_open&#8217;)) {<br />
$td = mcrypt_module_open(&#8216;blowfish&#8217;, &#8221;, &#8216;cfb&#8217;, &#8221;);<br />
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);<br />
mcrypt_generic_init($td, _user_encryption_key(), $iv);<br />
$crypt_text = mcrypt_generic($td, $plain_text);<br />
mcrypt_generic_deinit($td);<br />
return base64_encode($iv.$crypt_text);<br />
} else {<br />
$crypt_text = xxtea_encrypt($plain_text,_user_encryption_key());<br />
return base64_encode($crypt_text);<br />
}<br />
}</p>
<p>function _user_decrypt_cookie($crypt_text) {<br />
$crypt_text = base64_decode($crypt_text);<br />
if(function_exists(&#8216;mcrypt_module_open&#8217;)) {<br />
$td = mcrypt_module_open(&#8216;blowfish&#8217;, &#8221;, &#8216;cfb&#8217;, &#8221;);<br />
$ivsize = mcrypt_enc_get_iv_size($td);<br />
$iv = substr($crypt_text, 0, $ivsize);<br />
$crypt_text = substr($crypt_text, $ivsize);<br />
mcrypt_generic_init($td, _user_encryption_key(), $iv);<br />
$plain_text = mdecrypt_generic($td, $crypt_text);<br />
mcrypt_generic_deinit($td);<br />
} else {<br />
$plain_text = xxtea_decrypt($crypt_text,_user_encryption_key());<br />
}<br />
list($GLOBALS['user']['username'], $GLOBALS['user']['password'], $GLOBALS['user']['type']) = explode(&#8216;:&#8217;, $plain_text);<br />
}</p>
<p>function theme_logged_out() {<br />
return &#8216;&lt;p&gt;&#8217;.__(&#8220;Logged out&#8221;).&#8217;. &lt;a href=&#8221;&#8216;.BASE_URL.&#8217;&#8221;&gt;&#8217;.__(&#8220;Login again&#8221;).&#8217;?&lt;/a&gt;&lt;/p&gt;&#8217;;<br />
}</p>
<p>?&gt;</p></blockquote>
<p>至此，对于奶瓶推的修改就已经完成了，我的个人建议就是，在奶瓶推安装以后再进行修改，方便调试，瓦咔咔。<br />
<a href="http://www.lizhenglin.com/blog/wp-content/uploads/2010/08/NP.jpg"><img class="alignnone size-medium wp-image-866" title="NP" src="http://www.lizhenglin.com/blog/wp-content/uploads/2010/08/NP-300x221.jpg" alt="" width="300" height="221" /></a><br />
2. glype的设置： 接下来，我们所需要做的事情是，在OAuth界面输入完用户名和密码后，正常跳转回奶瓶推。glype的插件系统十分方便，假设dabr所在路径为 https://fanqiang.com/t/，我们首先在glype的plugins目录下创建名为fanqiang.php（你的域名.php）的文件并上传。代码如下：</p>
<blockquote><p>&lt;?php<br />
$redirect = $URL['href'];<br />
header(&#8220;Location: $redirect&#8221;);<br />
exit;</p></blockquote>
<p>代码功能：当使用glype访问域名为hellogfw.com的内容时，自动跳转回hellogfw.com而不进行代理，如果需要细致一些的话，可以考虑加入对$URL['href']的判断，仅当从验证界面返回时触发跳转。</p>
<p>为了避免发生一些奇怪的问题发生，还需要对glype进行进一步设置，访问admin.php（需另行上传，admin.php文件在glype安装包的extras目录中，上传至安装文件夹目录）进行如下设置：</p>
<p>URL Encoding Options</p>
<p>Use path info: Yes</p>
<p>Hotlinking</p>
<p>Prevent hotlinking: No （或者可以考虑设置成Yes但将fanqiang.com加入例外）</p>
<p>User Configurable Options</p>
<p>Encode URL: Default: on | Force: Yes</p>
<p>好了，所有的修改已经完成，免翻墙OAuth的奶瓶推就这样完成了。</p>
<p>____________________________________________________________________________________</p>
<p>PS:还有一个很重要的一点，为了避免glype网页代理被人用于翻墙浏览，有必要做安全设置。</p>
<p>将自己的站点域名与twitter.com 加入glype的whitelist 即白名单中去，这样的话，glype除了能代理浏览自身站点及twitter外，其他站点都会提示错误，可以有效保障奶瓶推及主机的安全。</p>
<p><a href="http://www.lizhenglin.com/blog/wp-content/uploads/2010/08/1-e1281711684135.jpg"><img class="alignnone size-medium wp-image-867" title="1-e1281711684135" src="http://www.lizhenglin.com/blog/wp-content/uploads/2010/08/1-e1281711684135-300x173.jpg" alt="" width="300" height="173" /></a></p>
<p>此文要感谢@chocli,在搭建过程中，给我提供了许多帮助。现在这篇教程参考了他之前所写的《使用Glype PHP在线代理帮助dabr实现Twitter OAuth登录》 一文</p>
<p>转至：http://www.notnaive.info/2010/08/13/oauthtwitter/
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.lizhenglin.com/blog/">广陵散 `s 博客 lizhenglin.com</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.lizhenglin.com/blog/?p=865">（转）免翻墙oauth验证的奶瓶推</a></p>
</div>
<p style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">文章的脚注信息由WordPress的<a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl插件</a>自动生成</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lizhenglin.com/blog/?feed=rss2&amp;p=865</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress BLOG全部转移国外免费空间测试了下OK</title>
		<link>http://www.lizhenglin.com/blog/?p=739</link>
		<comments>http://www.lizhenglin.com/blog/?p=739#comments</comments>
		<pubDate>Fri, 09 Apr 2010 13:41:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[生活日记]]></category>

		<guid isPermaLink="false">http://www.lizhenglin.com/blog/?p=739</guid>
		<description><![CDATA[已经把国内空间 http://www.lizhenglin.com/blog/ 上所有数据转 移到了 http://lizhenglin.com/blog 管理后台是http://lizhenglin.com:2082 SSL的后台是http://lizhenglin.com:2083 一般用这个 安全。 免费空间使用的是http://www.hostingforfree.us 250 MB空间 月流量10000 MB 支持域名A记录到共享的 IP 地址，是个不错的用来做备份或者镜像站点的免费空间. 内存限制32MB，WordPress 安装了缓存插件会因内存不够出错，空间支持自定义PHP.INI，设置成64MB就OK了。 解决方案： 1. 在public_html 目录创建文件 php.ini ， 里面添加分割线的内容如下： —————————- memory_limit = 64M —————————- 其它域名下的也是只要从 /home/hugegeor/public_html/复制 php.ini 文件即可 2. 添加下面分割线内容在 .htaccess 文件。 ——————————————— suPHP_ConfigPath /home/username/public_html/ ——————————————— 提示: 用你所在的域名的用户名替换掉 username。 ============ 我的转移过程 原BLOG安装WordPress Database Backup插件备份WP的数据库，下载备份sqlsqldatabasename_wp_20091120_815.sql.gz。 /blog 全部打包成blogbackup.zip 备份下载blogbackup.zip 去免费空间的cPanel的的管理后台，用文件管理器上传blogbackup.zip]]></description>
			<content:encoded><![CDATA[<p>已经把国内空间 http://www.lizhenglin.com/blog/ 上所有数据转</p>
<p>移到了 http://lizhenglin.com/blog</p>
<p>管理后台是http://lizhenglin.com:2082</p>
<p>SSL的后台是http://lizhenglin.com:2083 一般用这个 安全。</p>
<p>免费空间使用的是http://www.hostingforfree.us 250 MB空间 月流量10000 MB</p>
<p>支持域名A记录到共享的 IP 地址，是个不错的用来做备份或者镜像站点的免费空间.</p>
<p>内存限制32MB，<a href="http://wordpress.org/">WordPress</a> 安装了缓存插件会因内存不够出错，空间支持自定义PHP.INI，设置成64MB就OK了。</p>
<p><img title="更多..." src="http://www.lizhenglin.com/blog/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<p>解决方案：</p>
<p>1.  在public_html 目录创建文件 php.ini ， 里面添加分割线的内容如下：</p>
<p>—————————-<br />
memory_limit = 64M<br />
—————————-</p>
<p>其它域名下的也是只要从 /home/hugegeor/public_html/复制 php.ini 文件即可</p>
<p>2. 添加下面分割线内容在 .htaccess 文件。</p>
<p>———————————————<br />
suPHP_ConfigPath /home/username/public_html/<br />
———————————————</p>
<p>提示: 用你所在的域名的用户名替换掉 username。</p>
<p>============</p>
<p><span id="more-739"></span></p>
<p>我的转移过程</p>
<p>原BLOG安装<strong>WordPress Database Backup插件备份WP的数据库，下载备份</strong>sqlsqldatabasename_wp_20091120_815.sql.gz<strong>。</strong></p>
<p><strong>/blog 全部打包</strong>成blogbackup.zip<strong> 备份下载</strong>blogbackup.zip</p>
<p><strong>去免费空间的cPanel的的管理后台，用文件管理器上传</strong>blogbackup.zip</p>
<p>然后在线解压。</p>
<p>在<strong>cPanel的的管理后台新建数据库，导入先前备份的数据库</strong>sqlsqldatabasename_wp_20091120_815.sql.gz<strong>。</strong></p>
<p><strong>由于域名不同，需要修改下，运行以下SQL命令。</strong></p>
<p>UPDATE wp_options SET option_value = replace( option_value,  &#8216;http://waley.web172.zgasp.com/blog&#8217;, &#8216;http://lizhenglin.com/blog&#8217; )  WHERE option_name = &#8216;home&#8217; OR option_name = &#8216;siteurl&#8217;;<br />
UPDATE wp_posts SET post_content = replace( post_content,  &#8216;http://waley.web172.zgasp.com/blog&#8217;, &#8216;http://lizhenglin.com/blog&#8217; ) ;<br />
UPDATE wp_posts SET guid = replace( guid,  &#8216;http://waley.web172.zgasp.com/blog&#8217;, &#8216;http://lizhenglin/blog&#8217; ) ;</p>
<p><strong>把网址由</strong>http://waley.web172.zgasp.com/blog<strong>改成</strong>http://lizhenglin.com/blog</p>
<p>BLOG全部转移国外免费空间搞定。就当备份了个本BLOG了。</p>
<p>这个免费空间比较小，有大的15G空间的，但是不支持A记录解析，只支持DNS解析。我还不想把我这个域名下的BLOG全部转移到那上面。</p>
<p>提供大家几十个提供免费SSH账号的免费空间：</p>
<p>http://www.freewebspace.net/free/AdvSearchR/1/343</p>
<p>转移BLOG产考资料：WordPress 和cPanel 的见 http://www.gegehost.com/tutorial/</p>
<p><strong>博客在此转移，有些资料无法直接恢复，直接再次发了下。</strong></p>
<p><strong>，重新找了个服务器，开始恢复更新了。<br />
</strong>
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.lizhenglin.com/blog/">广陵散 `s 博客 lizhenglin.com</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.lizhenglin.com/blog/?p=739">WordPress BLOG全部转移国外免费空间测试了下OK</a></p>
</div>
<p style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">文章的脚注信息由WordPress的<a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl插件</a>自动生成</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lizhenglin.com/blog/?feed=rss2&amp;p=739</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Chrome OS 终于露出真容，我们有了答案了吗？</title>
		<link>http://www.lizhenglin.com/blog/?p=737</link>
		<comments>http://www.lizhenglin.com/blog/?p=737#comments</comments>
		<pubDate>Fri, 09 Apr 2010 13:39:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[业内资讯]]></category>

		<guid isPermaLink="false">http://www.lizhenglin.com/blog/?p=737</guid>
		<description><![CDATA[长达一个半小时的Chrome OS展示活动结束了，如果你和谷奥一样从头到尾收看了此次直播，我想你一定也会和我们一样的激动。不过我们还是需要冷静下来，仔细想一想我们是否得到了昨天问题的答案。 1，Chrome OS到底是个什么玩意？ 就今天的演示和我极为贫乏的知识看来，Chrome OS像是一个整合入Linux内核的Chrome，浏览器和内核浑然一体。今天的活动中Google反复强调，Chrome OS只支持web应用。 什么？你说你可以进入console，然后下载源代码自己编译你想要的程序？想都不要想，因为Chrome OS的整个root（/）文件系统是只读的，即使对做惯了Administrator的电脑拥有者来说，也是一样的。 所有的web应用都可以是Chrome的应用程序，但是又有一些不同，比如说那些panel。虽然我们不难看出演示中的panel其 实也是基于web的，但是起码这些应用为chrome os写了特别的代码——你用Firefox打开同一个Google Music Onebox是肯定看不到那个音乐播放器panel的。 Chrome OS界面方面，和我们之前报道过的泄漏版Chrome OS基本一致。那个看起来像Picasa的图标是一个应用入 口，你可以将其想象成Windows上的Start按钮。今天我们看到的Chrome OS还有若干个Application Tab应用标签，可以理解为Quick Launch Bar吧。 2，开发者如何参与？ 我们都知道，Chrome OS是完全开源并且免费的。在今天的活动开始前，Chrome OS的源代码就已经出现在了网上。如果你是一名Linux开发者的话，你可以非 常容易的向Chrome OS贡献你的代码。而对于应用程序开发者来说，如果你的产品是一个web应用，那么你已经在为Chrome OS开发了—— 当然，也许你还要加上操作系统的判断，发现客户正在使用Chrome OS的话，你可以扔出一个漂亮的panel。 3，Chrome OS需要什么样的硬件？ 这个问题的答案是一个杯具——我们想要简单的下载一个iso，并用之启动电脑安装使用Chrome OS的愿望已经落空。Google告诉我们原 则上（编译好的）Chrome OS是不会单独提供下载的，想轻松用上Chrome OS的办法只有等到明年圣诞节假期时买上一台预装Chrome OS的上网本。当然如果你足够Geeky的话，你完全可以从源代码下手，尝试让Chrome OS在自己的电脑上跑起来。但是我想，这应该会需要相当多的工作，最起码我自己是基本没抱这个希望。 和杯具同时到来的还有洗具，和谷奥昨天猜测的一样，Chrome OS果然直接从SD卡启动。而更为离谱的是，Chrome OS完全放弃了对硬盘的支持，这完全颠覆了我们传统上主机三大件的概念，硬盘厂家在今夜泪流满面！ 没有硬盘，文件存在哪里？Google告诉你，存在天上的云中。Chrome OS中完全没有本地文件的概念，除了只读的root分区外，SD卡上还有一小块区域用来存储加密后的用户账户信息。其实用户帐户信息也是实时和云保持同步 的，本地的这份数据只不过是一份cache而已。 去掉硬盘，会给上网本带来什么影响？成本降低，重量减轻，速度更快（SD卡完全可以视为SSD），电池续航时间更长，抗冲击能力大大增强。 当然，在外围设备支持上，Chrome OS还是尽力了。演示过程中我们看到Chrome OS可以直接打开移动存储设备（一台Droid手机）中的图片，还有，演示人员也向我们承诺了：Chrome OS是支持打印功能的…… 4，Google Wave和微软 很遗憾，整个活动中我们没看到wave的影子，但是从为Chrome OS优化过的Google]]></description>
			<content:encoded><![CDATA[<p>长达一个半小时的Chrome  OS展示活动结束了，如果你和谷奥一样从头到尾收看了此次直播，我想你一定也会和我们一样的激动。不过我们还是需要冷静下来，仔细想一想我们是否得到了<a href="http://google.org.cn/posts/what-are-we-expecting-of-chrome-os-event.html" target="_blank">昨天问题</a>的答案。</p>
<p><strong>1，Chrome OS到底是个什么玩意？</strong></p>
<p>就今天的演示和我极为贫乏的知识看来，Chrome  OS像是一个整合入Linux内核的Chrome，浏览器和内核浑然一体。今天的活动中Google反复强调，<strong>Chrome OS只支持web应用</strong>。 什么？你说你可以进入console，然后下载源代码自己编译你想要的程序？想都不要想，因为<strong>Chrome  OS的整个root（/）文件系统是只读的</strong>，即使对做惯了Administrator的电脑拥有者来说，也是一样的。</p>
<p><strong>所有的web应用都可以是Chrome的应用程序，但是又有一些不同，比如说那些panel</strong>。虽然我们不难看出演示中的panel其 实也是基于web的，但是起码这些应用为chrome os写了特别的代码——你用Firefox打开同一个Google Music  Onebox是肯定看不到那个音乐播放器panel的。</p>
<p><img title="更多..." src="http://www.lizhenglin.com/blog/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<p>Chrome OS界面方面，<strong>和我们之前报道过的</strong><a href="http://google.org.cn/posts/chrome-screenshots-and-more.html" target="_blank"><strong>泄漏版Chrome OS</strong></a><strong>基本一致</strong>。那个看起来像Picasa的图标是一个应用入 口，你可以将其想象成Windows上的Start按钮。今天我们看到的Chrome OS还有若干个Application  Tab应用标签，可以理解为Quick Launch Bar吧。</p>
<p><strong>2，开发者如何参与？</strong></p>
<p><strong><span id="more-737"></span><br />
</strong></p>
<p>我们都知道，Chrome OS是完全开源并且免费的。在今天的活动开始前，<a href="http://google.org.cn/posts/hello-chrome-os-source-download.html" target="_blank"><strong>Chrome OS的源代码就已经出现在了网上</strong></a>。如果你是一名Linux开发者的话，你可以非 常容易的向Chrome OS贡献你的代码。而对于应用程序开发者来说，<strong>如果你的产品是一个web应用，那么你已经在为Chrome OS开发了</strong>—— 当然，也许你还要加上操作系统的判断，发现客户正在使用Chrome OS的话，你可以扔出一个漂亮的panel。</p>
<p><strong>3，Chrome OS需要什么样的硬件？</strong></p>
<p>这个问题的答案是一个杯具——我们想要简单的下载一个iso，并用之启动电脑安装使用Chrome OS的愿望已经落空。Google告诉我们<strong>原 则上（编译好的）Chrome OS是不会单独提供下载的，想轻松用上Chrome OS的办法只有等到明年圣诞节假期时买上一台预装Chrome  OS的上网本</strong>。当然如果你足够Geeky的话，你完全可以从源代码下手，尝试让Chrome  OS在自己的电脑上跑起来。但是我想，这应该会需要相当多的工作，最起码我自己是基本没抱这个希望。</p>
<p>和杯具同时到来的还有洗具，和谷奥昨天猜测的一样，<strong>Chrome OS果然直接从SD卡启动</strong>。而更为离谱的是，<strong>Chrome  OS完全放弃了对硬盘的支持</strong>，这完全颠覆了我们传统上主机三大件的概念，硬盘厂家在今夜泪流满面！</p>
<p>没有硬盘，文件存在哪里？Google告诉你，存在天上的云中。Chrome  OS中完全没有本地文件的概念，除了只读的root分区外，SD卡上还有一小块区域用来存储加密后的用户账户信息。其实用户帐户信息也是实时和云保持同步  的，本地的这份数据只不过是一份cache而已。</p>
<p><strong>去掉硬盘，会给上网本带来什么影响？成本降低，重量减轻，速度更快（SD卡完全可以视为SSD），电池续航时间更长，抗冲击能力大大增强。</strong></p>
<p>当然，在外围设备支持上，Chrome OS还是尽力了。演示过程中我们看到Chrome  OS可以直接打开移动存储设备（一台Droid手机）中的图片，还有，演示人员也向我们承诺了：Chrome OS是支持打印功能的……</p>
<p><strong>4，Google Wave和微软</strong></p>
<p>很遗憾，整个活动中我们没看到wave的影子，但是从为Chrome OS优化过的Google Search等不难看出，Chrome  OS中的wave一定会和现在我们使用的wave有所区别，最起码堆在页面中那一大坨小窗应该会以panel的形式出现吧。</p>
<p>至于微软，Google在今晚很有洗具效果的将其变成了一个Chrome OS应用开发商——<strong>演示过程中当演示人员点击一个excel文件 时，Chrome OS打开了Live Office App</strong>，不知道比尔大叔看到这里会是什么感想？</p>
<p>Chrome  OS给上网本提供了完全不同的思路，之前的上网本绝大部分预装Ubuntu等Linux系统，这些系统在快捷键等各个方面模仿Windows，并且为每个   不同的任务提供不同的应用程序，让人们在上网本上做尽可能多的事情。但是，上网本毕竟不是工作用的主力，越来越复杂的程序拖慢整个系统的速度只会让用户心  生烦躁。其实对于绝大多数上网本用户来说，Chrome OS提供的功能已经足够用了，更何况Chrome  OS运行起来是那么的流畅。但是如果你是一名金融分析师需要在电脑上进行大量的运算，或者是一名狂热的3D游戏爱好者的话，Chrome  OS并不适合你，或者可以说上网本不适合你，你需要的是一台配置强大的全尺寸笔记本电脑。</p>
<p><strong>5，真正吸引我们的是什么？</strong></p>
<p>看来Google并没有骗我们，<strong>Chrome  OS启动速度确实非常快：从开机到进入Login界面用了7秒，而从Login界面到进入工作状态用了3秒</strong>。登录进系统后，Chrome  OS允许你在云端收发email，和好友聊天，欣赏音乐/视频，或者写写文档，做做表格。如果你是一个马大哈不小心把你的Chrome  OS上网本丢在了地铁里的话，你只需要省吃俭用重新购买一台新的上网本，<strong>而当你打开这台全新的上网本并用你自己的帐号登录后，你会发现你的一切都回 来了——因为所有的数据都储存在云上，而不是你本地的磁盘</strong>。</p>
<p>此外，<strong>Chrome OS还具有自我升级与自我修复功能</strong>，所有的Chrome  OS组件将在不需要人为干预的情况下自动更新。而在启动过程中，一旦Chrome  OS发现由系统文件遭到破坏导致的签名错误后，则会马上自动重新启动并下载正确而干净的系统文件，整个故障恢复过程也完全是自动的。</p>
<p>Chrome OS是安全的，<strong>因为每个tab都是相对独立的运行在一个沙盒中</strong>，一个标签的崩溃不会影响其他标签的使用。同时整个浏览 器和系统文件也是完全隔离的，所以你完全不用担心恶意网站对你的系统进行破坏。</p>
<p><strong>6，Chromium OS？这是什么东西？</strong></p>
<p>这是今天的一个新名词，其实熟悉Chrome的读者肯定能猜出来，Chromium OS就是Chrome  OS的社区开源版本。他们的关系就像Chromium和Chrome。</p>
<p><strong>7，总结？</strong></p>
<p>如果你随时随地都可以高速上网的话，Chrome  OS将是你的下一台上网本的完美选择。当然这在某些程度上也取决于你生活的地区，我想Chrome OS想要在天朝推广的话还是会有一定难度吧。</p>
<p>文章转载自：<strong>谷奥——探寻谷歌的奥秘</strong></p>
<p>原文地址：<a href="http://google.org.cn/posts/did-we-get-the-answer-of-chrome-os.html">http://google.org.cn/posts/did-we-get-the-answer-of-chrome-os.html</a>
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.lizhenglin.com/blog/">广陵散 `s 博客 lizhenglin.com</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.lizhenglin.com/blog/?p=737">Chrome OS 终于露出真容，我们有了答案了吗？</a></p>
</div>
<p style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">文章的脚注信息由WordPress的<a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl插件</a>自动生成</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lizhenglin.com/blog/?feed=rss2&amp;p=737</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用jQuery实现Google Wave样式的WordPress评论（一）</title>
		<link>http://www.lizhenglin.com/blog/?p=735</link>
		<comments>http://www.lizhenglin.com/blog/?p=735#comments</comments>
		<pubDate>Fri, 09 Apr 2010 13:38:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[技术荟萃]]></category>
		<category><![CDATA[14 comments]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Gnome]]></category>
		<category><![CDATA[Google Wave]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WP主题]]></category>
		<category><![CDATA[嵌套]]></category>
		<category><![CDATA[评论]]></category>
		<category><![CDATA[高级选择器]]></category>

		<guid isPermaLink="false">http://www.lizhenglin.com/blog/?p=735</guid>
		<description><![CDATA[转：http://doublechou.us/wordpress-google-wave-style-comment-with-jquery-part-1/ Google Wave已经内测好长时间了，＠lookon大叔的提名接力似乎也排到了七八千咯。苏有 幸在一个月前得到@Cattyhouse叔叔的邀请一枚，算是赶在 第二梯队的尾巴上体验了一把Google Wave。页面和Gnome差不多，比较Q。但是苏对它的评价并不是很高：一，帖子少；二，任何人都能改东西，总有那么一两个不自觉的； 三，无法退出一个Wave，一旦有那个不长眼的加个机器人，后果不堪设想；四，无法删除一个Wave，Trash里面全是Muted的空Wave。 其中第二三四都是Google Wave的设计理念导致的。老外和我们的想法很不同，他们一定觉得Wave作为一个协作系统和讨论平台是不应该出现”admin”这种东西的，而且作为一 个项目不能说退出就退出。他们认为Wave一旦发出，就至少有两个人，所以不应该让你删除的Wave影响其他人；一旦加入一个讨论，自己肯定不能退，无论 你是因为工作还是爱好，一旦加入就代表有责任有兴趣参与讨论，而没考虑你无辜的情况。而没有admin，也就不可能把你清出去；Wave的卖点就是大家可 以在一张纸上同时画画，所以你的东西不让改那什么都无从谈起了。总结一下就是“强买强卖”＋“一锤子买卖”。 苏觉得至少可以这么改进： 1， 公共Wave不可删除，私人的可以；2， 任何空Wave都可以删除；3，可以离场或经其他所有人投票后可以离场（用于清理不自觉的和不长眼的）；4，插入机器人要所有人投票通过，如果可以自己离 场此条作废； 修改应发送修改请求，或修改结果要经“编辑链”的“上游”通过（表达不太清楚，用jQuery的写法就是prev()而不是prevAll(); )； 5， 所有修改结果都像pastebin一样有存档，有据可查。这样Wave才能算作一个有秩序的协作系统和讨论平台，才会真正有企业对它感兴趣，其实企业最需 要的不是实时，再实时有视频会议说的清楚么？企业最需要的是秩序，现在的Wave最多算个会议的白板，不能主导会议的方式。 好吧，苏作为一个TMT分析员已经跑题了，不谈工作不谈工作。下面开始苏的“WordPress瞎搞教程“，老鸟可以扫过，但请别飘过，毕竟苏的 brandwidth不是特供你飘来飘去滴，苏希望物尽其用，你不想说话可以潜水，但别跳出来说没用的。 我的出发点和＠lookon叔叔不一样，他是在想怎么把Wave引入博 客，我是想怎么把博客变成Wave。本着中国的“大山寨”精神，我没有，还不行自个儿造么。。。 先上一张Google Wave的单个Wave截图： 这张是苏和推特美女＠sdelayang的私人ping哦，相信大家在 直勾勾滴盯着美女照片看的同时脖子扭扭屁股扭扭滴也能发现Google Wave的New Wave主要（细节苏会在以后的文章中一点一点纠结出来）有如下特征： 1，嵌套； 2，未读消息前面显示一个小绿条； 3，作者头像右下角有一个小绿点；4，每条消息之间用点线分开；5，嵌套评论有阴影。还有2个截不出来的特征： 6，鼠标放在消息下方会有一个蓝色圆框出来让你继续嵌套或者是续接这个嵌套层，如下图； 7， 鼠标左键点击消息会出现一个绿色框选中该条消息，继续单击无法取消，只能点击别的消息或者离开该Wave，效果才会消失（也就是说你要么不点，一旦开始点 就始终会有一个绿色的框框在某条消息上。）。单击过的消息前面的小绿条消失。 也就是说，你的WordPress评论只要有如下特征，就基本可以伪装成小半个Google Wave了。 下面纠结实现方法： 其中1，嵌套是WordPress 2.7以后就自带的，本身已经非常强大，不去管它； 4， 每条消息之间用点线分开，这个最简单，css的问题。以下均以WordPress 2.8.4的default主题的comments.php里面的class为例，当然default是用的&#60;?php wp_list_comments(); ?&#62;这个函数，肉眼看不到任何class，但不要忘记我们还有Firebug这个强大的debug工具 只需要 [class~=vcard] ｛padding-top: 5px; border-top: 1px]]></description>
			<content:encoded><![CDATA[<p>转：<a href="http://doublechou.us/wordpress-google-wave-style-comment-with-jquery-part-1/" target="_blank">http://doublechou.us/wordpress-google-wave-style-comment-with-jquery-part-1/</a></p>
<div>Google Wave已经内测好长时间了，<a href="http://dabr.co.uk/user/lookon">＠lookon</a>大叔的提名接力似乎也排到了七八千咯。苏有 幸在一个月前得到<a href="http://dabr.co.uk/user/Cattyhouse">@Cattyhouse</a>叔叔的邀请一枚，算是赶在 第二梯队的尾巴上体验了一把Google Wave。页面和Gnome差不多，比较Q。但是苏对它的评价并不是很高：一，帖子少；二，任何人都能改东西，总有那么一两个不自觉的；  三，无法退出一个Wave，一旦有那个不长眼的加个机器人，后果不堪设想；四，无法删除一个Wave，Trash里面全是Muted的空Wave。</p>
<p>其中第二三四都是Google  Wave的设计理念导致的。老外和我们的想法很不同，他们一定觉得Wave作为一个协作系统和讨论平台是不应该出现”admin”这种东西的，而且作为一   个项目不能说退出就退出。他们认为Wave一旦发出，就至少有两个人，所以不应该让你删除的Wave影响其他人；一旦加入一个讨论，自己肯定不能退，无论   你是因为工作还是爱好，一旦加入就代表有责任有兴趣参与讨论，而没考虑你无辜的情况。而没有admin，也就不可能把你清出去；Wave的卖点就是大家可  以在一张纸上同时画画，所以你的东西不让改那什么都无从谈起了。总结一下就是“强买强卖”＋“一锤子买卖”。</p>
<p><img title="更多..." src="http://www.lizhenglin.com/blog/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<p>苏觉得至少可以这么改进： 1， 公共Wave不可删除，私人的可以；2，  任何空Wave都可以删除；3，可以离场或经其他所有人投票后可以离场（用于清理不自觉的和不长眼的）；4，插入机器人要所有人投票通过，如果可以自己离  场此条作废；  修改应发送修改请求，或修改结果要经“编辑链”的“上游”通过（表达不太清楚，用jQuery的写法就是prev()而不是prevAll(); )；  5，  所有修改结果都像pastebin一样有存档，有据可查。这样Wave才能算作一个有秩序的协作系统和讨论平台，才会真正有企业对它感兴趣，其实企业最需  要的不是实时，再实时有视频会议说的清楚么？企业最需要的是秩序，现在的Wave最多算个会议的白板，不能主导会议的方式。</p>
<p>好吧，苏作为一个TMT分析员已经跑题了，不谈工作不谈工作。下面开始苏的“WordPress瞎搞教程“，老鸟可以扫过，但请别飘过，毕竟苏的 brandwidth不是特供你飘来飘去滴，苏希望物尽其用，你不想说话可以潜水，但别跳出来说没用的。</p>
<p>我的出发点和<a href="http://dabr.co.uk/user/lookon">＠lookon</a>叔叔不一样，他是在想怎么把Wave引入博 客，我是想怎么把博客变成Wave。本着中国的“大山寨”精神，我没有，还不行自个儿造么。。。</p>
<p>先上一张Google Wave的单个Wave截图：</p>
<p><span id="more-735"></span></p>
<p><img src="http://i1007.photobucket.com/albums/af191/doublechou/googlewave.png" alt="" /></p>
<p>这张是苏和推特美女<img src="http://a1.twimg.com/profile_images/385598058/18cuqmg2_normal.jpg" alt="" /><a href="http://dabr.co.uk/user/sdelayang">＠sdelayang</a>的私人ping哦，相信大家在 直勾勾滴盯着美女照片看的同时脖子扭扭屁股扭扭滴也能发现Google Wave的New  Wave主要（细节苏会在以后的文章中一点一点纠结出来）有如下特征：</p>
<p><strong> 1，嵌套； 2，未读消息前面显示一个小绿条；  3，作者头像右下角有一个小绿点；4，每条消息之间用点线分开；5，嵌套评论有阴影。还有2个截不出来的特征：  6，鼠标放在消息下方会有一个蓝色圆框出来让你继续嵌套或者是续接这个嵌套层，如下图； 7，  鼠标左键点击消息会出现一个绿色框选中该条消息，继续单击无法取消，只能点击别的消息或者离开该Wave，效果才会消失（也就是说你要么不点，一旦开始点  就始终会有一个绿色的框框在某条消息上。）。单击过的消息前面的小绿条消失。</strong></p>
<p>也就是说，你的WordPress评论只要有如下特征，就基本可以伪装成小半个Google Wave了。</p>
<p>下面纠结实现方法：</p>
<p>其中1，嵌套是WordPress 2.7以后就自带的，本身已经非常强大，不去管它；</p>
<p><strong>4， 每条消息之间用点线分开</strong>，这个最简单，css的问题。以下均以WordPress  2.8.4的default主题的comments.php里面的class为例，当然default是用的&lt;?php  wp_list_comments(); ?&gt;这个函数，肉眼看不到任何class，但不要忘记我们还有Firebug这个强大的debug工具 <img src="http://doublechou.us/wp-includes/images/smilies/icon_smile.gif" alt=":-)" /> 只需要</p>
<pre>[class~=vcard] ｛padding-top: 5px; border-top: 1px dotted gray; }</pre>
<p>就可以了。||注释： [class~=vcard]，css高级选择器，意思是有class=”1 2 3″这样的element都选中，  或者你也可以写div.vcard和.vcard，  也能选到，但是，俄，严谨嘛，苏用的css编辑器是KDE自带的Kwrite，会把高级选择器显示为苏最喜欢的粉色，宽恕苏的完美主义吧……</p>
<p><strong>5，嵌套评论有阴影</strong>，这个也很简单只需要用PS或者Gimp做一个阴影加上就好了（苏用Gimp)，也是CSS  问题。切图稍微有一点讲究，就是只能横着切不能竖着切，因为你不知道人家留言会留多少高度。所以切一小块阴影，repeat-y做  [class~=depth-2]的背景，把最下面的底切下来作为ul.children的背景。</p>
<p>延伸：苏的评论是嵌套了两层，因为苏不是个无聊的人呢，不会像Google  Wave上面有些人一样20多岁了玩套圈圈，一层一层又一层，但是从技术上这是要说的，因为可能有人就喜欢设置个10层。那样就不止是对  [class~=depth-2]做背景了，准确的写法应该是</p>
<pre>li[id|=comment]:not[class~=depth-1]</pre>
<p>，也就是说这个背景要给到id是comment-&lt;?php comment_ID();  ?&gt;的、除了第一层的所有li上。另外那个底部的处理也不能像苏现在这样直接截一条下来当底部咯，因为每一层的嵌套宽度都是不同的，我们至少需要2  个element来实现下面的底。首先是</p>
<pre>li: last-child</pre>
<p>， 这个好理解吧，每一层的最后一个li，可以把那个左下角截下来给它当背景。然后对第一层的最后一个li去掉这个背景，</p>
<pre>li.depth-1: last-child {background: none;}</pre>
<p>。其他的阴影可以交给ul.children。当然有像苏一样完美主义的人非要在这一条里面在实现一个右下角的圆角阴影效果也不是不可以滴，那就是</p>
<pre>li: last-child p: last-child</pre>
<p>这个element咯，把右下角效果交给它吧。</p>
<p>具体的css代码苏就不写咯，剩下的就是重复工作咯，毕竟苏已经把选择哪个元素加背景写出来了，剩下的无非就是padding,  margin的调整让它们在一条线上罢了。</p>
<p>好，到现在CSS能做的工作苏已经做好了。下面轮到标题中就已经提到、但现在还没有出现的jQuery上场咯。</p>
<p>是不是非用到jQuery不行呢，很抱歉，在这个情况下，是的。苏是CSS党，如果是一个Accordin效果苏完全可以抛弃jQuery，ie 对:hover伪类支持的不好，苏可以把代码写到一个&lt;a&gt;里面嘛 <img src="http://doublechou.us/wp-includes/images/smilies/icon_smile.gif" alt=":-)" /> 这里非jQuery不行是因为我们需要针对click做效果，css不行。</p>
<p><strong>2，未读消息前面显示一个小绿条。</strong>这句的关键在于判断什么是未读。苏对服务器端不熟悉，所以苏这里无法说你这次  click一下表示读过，关闭网页重开，我就会记住，哦，你这条读过了阿。Google有那么大的服务器，有能力，而且它的每一个用户都是肯定有帐号的，   苏即使有那么大服务器也只能针对ip地址做一个mysql表，哦，这个ip读过这条评论，但你换个地方上网，或者极端情况你坐那里没动，路由器换跟线，苏  这里就又要重新记住你一回，总不能强制访客注册吧。所以按用户“记住”未读消息是不太可能的，我做WordPress不是做Google  Reader。  苏从客户端对未读的解释就只能是你打开网页，所有的评论你都没读过。这一方面是苏的技术不够，或者说是花费的精力和所得到的效果完全不成比例，投入/产出   比不对，苏是经济学人呢～另一方面就是比如cnbeta，可能吧那种大站，一点开页面所有评论你都没读过的可能是存在的，而且是经常的，呵呵，苏已经开始  好高骛远了呢。</p>
<p>好咯，未读说完了，你可以直接写在你的模板里，comment-body后面加个class=”unread”。但是别忘记了，我们用的可是默认模 板阿，是看不到这些的，没关系，用jQuery：</p>
<pre>$(document).ready(function () { $(".comment-body").addClass("unread"); });</pre>
<p>然后再对unread class做CSS，加上一个小绿条的背景。或者直接:</p>
<pre> $(document).ready( function () { $(".comment-body").css({' background', 'url(XXXXX.png) top left repeat-y '}); });</pre>
<p>按照逻辑的配对（实际上苏也正是这么做的），接下来应该说的是<strong>7，  鼠标左键点击消息会出现一个绿色框选中该条消息，继续单击无法取消，只能点击别的消息或者离开该Wave，效果才会消失。单击过的消息前面的小绿条消失。 </strong></p>
<p>这个无论如何用css都做不了。代码比较简单，直接放代码吧：</p>
<pre>$(".comment-body").click(function() {
$(this).removeClass("unread"); ／／去掉被点击的消息的小绿条；
$("[class~=comment-body]").removeClass("selected"); ／／如果其他的消息上面有绿框则去掉它们，用来保证只有一条消息是选中的；
$(this).addClass("selected"); ／／给选中的消息加绿框。
});</pre>
<p>下面处理那个<strong>3作者评论头像右下角的小绿点。</strong>苏是用jQuery追加数据的方式实现的，代码是这样的：</p>
<pre>$("li[class~=bypostauthor]").children(".comment-body").children(".vcard").children("img").after("&lt;span class=\"postauthor\"&gt;&lt;/span&gt;");</pre>
<p>首先要选中作者评论，WP2.8自带的嵌套已经给出了两个比较特殊的class，一个就是byuser，  代表你在我的站上注册过，另外一个就是bypostauthor，文章作者。各位走过路过滴同学心里应该有所共鸣了吧，通过定义byuser的样式可以提  升访客体验。继续解释代码：选到文章作者评论的li，然后选到它的重孙img，就是Gravatar，然后在它的后面追加一个span。定义span的  css即可。为什么不追加div呢，因为会把后面的作者名字和发表时间挤到下一行去。BTW，不要用绝对定位的方式定义这个span的css,  因为绝对定位会从当前文档流中排除，很容易就覆盖了紧跟在后面的评论作者名字。可以用margin的负定位。</p>
<p>当然，对jQuery没有信心的同学完全可以用参考线量出这个圆点应该出现的准确位置，然后作为&lt;cite  class=”fn”&gt;的背景，然后对cite进行绝对定位＋z-index让它覆盖在Gravatar的上面 <img src="http://doublechou.us/wp-includes/images/smilies/icon_smile.gif" alt=":-)" /> 不过就是太麻烦咯。</p>
<p>下面是最后一个效果：<strong>6，鼠标放在消息下方会有一个蓝色圆框出来让你继续嵌套或者是续接这个嵌套层。</strong></p>
<p>其实这个简单来说针对的主要是wordpress嵌套评论的reply按钮。用那个圆角方框完全替代reply按钮，再把它隐藏起来，鼠标滑过的时 候显示，之后隐藏。很简单的一个jQuery效果吧。</p>
<p>但是它的难点在于，真正的Google  Wave是可以让你选择是开始新的嵌套还是继续当前嵌套层的，也就是说可以把你的回复贴到别人嵌套层上面，开始一个新的同级ul。这个需要ajax的支 援，苏会写在本系列文章的第二篇里面。</p>
<p>为了高度仿真Google  Wave，我们也要让它能选择开始新的嵌套或者继续当前嵌套。好吧，苏的技术有限，现在还没想到好方法。但是“在一个已经有嵌套的评论下面显示‘继续当前  嵌套’，在没有嵌套的评论下面显示‘开始新的嵌套’“，这总归是可行的，不然我写那么多玩什么呢对吧……</p>
<p>用jQuery来说就是，先判断当前评论是不是第一层（因为苏只有两层，第二层就已经不能在继续“开始新的嵌套“咯），然后再判断第一层的元素下面   有没有嵌套（这个逐渐缩小的过程能理解吧，第二层是绝对没有嵌套的，判断第一层就行了），如果有嵌套就给一个继续当前嵌套的class，如果没有就给一个  开始新的嵌套的class。这是default主题的情况。代码：</p>
<pre>$(".comment-body").mouseover(function() {
if ($(this).parent("li").hasClass("depth-1")) {           ／／判断是不是第一层
if($(this).parent("li").hasClass("parent")) {            ／／判断有没有嵌套
$(this).children(".reply").addClass("continue");
$(".continue").show();
} else {
$(this).children(".reply").addClass("insert");
$(".insert").show();
};
} else {
$(this).children(".reply").addClass("last");           ／／如果是第二层
} endif;
}).mouseout(function() {
$(".insert").hide();
$(this).children(".reply").removeClass("insert");
$(".continue").hide();
$(this).children(".reply").removeClass("continue");
});</pre>
<p>不知道大家搞懂了没，苏的JS不强，所以用的效果都很简单的，大家可以在此基础上加效果。</p>
<p>延伸： 同样是多层的情况，专门写给那些无聊的同学的。</p>
<p>由于存在的层数未知,  这时候道理就应该反过来说咯，先知道最后一层，一层一层往上推，因为只有最后一层是特殊的，就是它不能再开始新的嵌套。判断最后一层的方法是：  判断有没有下家，这时不能用parent的方法来判断，因为他可能是中间某层，只需要判断这一层有没有ul.children就可以咯。另外还要判断  prevAll和nextAll有没有ul.children，避免出现正好判断在岔路上这种悲剧。</p>
<p>而至于背景，这时候也不适合用addClass的方式了，因为每一层宽度不同，要很多很多Class。苏之前也不懂怎么做，但是今天做  comments.js的时候发现了一个方法，就是：写一个递归变量，每次都＋若干个px，然后把这个变量赋给width，这样只需要做一个最宽的没有最  左边图像的背景，再right top,然后对&lt;div  class=”reply”&gt;做背景补全那个左上角，通过width就能画出宽度不同的reply按钮咯。</p>
<p>关于递归变量可以看这句：</p>
<pre>$('#commentnum').text(parseInt(jQuery('#commentnum').html()) + 1);</pre>
<p>好啦，总算写完这篇“技术文”咯，其实就是个想法，大部分代码我没贴是吧，但关键代码我都贴了对吧。这个做法是开发大家的想象力，因为自学的菜菜阶  段的想象力其实是最丰富的，为了实现一个结果会去想好多好多种方法，但是专业的设计师就不会，因为他们脑子里早就有最好的啦，你可以从他们网站上cp过   来，效果有了，但你什么也没学到不是么。吼吼，不教育人了，其实这一方面是苏对于那些代码也是一知半懂，写能写出来但要纠结好久，干脆就贴个想法咯；另一  方面是做ajax评论时候得到的教训，就去网上下了一个php一个js，搞定了。。。可是我依然不知道什么是ajax。</p>
<p>&lt;!– 这篇文章为小女原创，小女完全明白其意思，可以转载，但是不可以歪曲事实，要么不转要么全转;  可以在此基础上继续开发，但请另起炉灶或保留原文的基础上加注释。此类无聊雷同文并不好找，如果真的有雷同，本人可能不愿起诉你，但心情不好对你发飙你也  请胳膊打折袖里藏～–&gt;</p>
</div>
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.lizhenglin.com/blog/">广陵散 `s 博客 lizhenglin.com</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.lizhenglin.com/blog/?p=735">用jQuery实现Google Wave样式的WordPress评论（一）</a></p>
</div>
<p style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">文章的脚注信息由WordPress的<a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl插件</a>自动生成</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lizhenglin.com/blog/?feed=rss2&amp;p=735</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Sidewiki 通过保存书签的形式进驻Firefox,Chrome,Chromium和Safari</title>
		<link>http://www.lizhenglin.com/blog/?p=733</link>
		<comments>http://www.lizhenglin.com/blog/?p=733#comments</comments>
		<pubDate>Fri, 09 Apr 2010 13:37:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Chromium]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[Sidewiki]]></category>
		<category><![CDATA[书签]]></category>

		<guid isPermaLink="false">http://www.lizhenglin.com/blog/?p=733</guid>
		<description><![CDATA[Google Sidewiki发布时略显尴尬，因为它只能通过Google Toolbar的形式使用，而众所周知Google自己的Chrome浏览器还没有Google Toolbar可用。尽管后来出现了一些通过Google Sidewiki API来实现浏览Google Sidewiki的方式，但功能都不完全。现在好了，Google宣布可以通过保存书签的形式，访问Google Sidewiki了，也就是说Chrome和Safari等浏览器也可以看到各个网站的Google Sidewiki页面了。 只要将这个Sidewiki的 按钮拖动到你的浏览器书签里，保存下来，以后你只要打开这个书签，来访问当前网页的Google Sidewiki页面了。 也可以安装FF插件： https://addons.mozilla.org/en-US/firefox/addon/46311 安装后默认在浏览器状态栏显示图标 现在还真有人在继续坚持玩Sidewiki的？ Google Sidewiki 发布， 允许任何人在任何网站发表评论 将允许任何用户在任何网站发表评论。用户也可以在 Sidewiki发表自己的见解，提供更多相关主题的内容以便其他用户查看参考。当然Sidewiki也提供了通过Twitter，Facebook等快 速分享评论的功能。 不同于传统的思路，Sidewiki并不是把最新的评论显示在最上方，而是通过特定算法把Google认为最有用，质量最高的评论优先显示。参考的 内容则包括其他用户对这条评论的评价以及这条评论作者以前的表现等因素。 要使用Google Sidewiki的话，用户需要安装新版的支持Sidewiki的 Google Toolbar（这意味着Chrome暂时无缘这个功能，当然Google提到了将尽快提供对Chrome等浏览器的支持）。 Google还提供了Sidewiki API的 首个版本，同时开放了@googlesidewiki这 个Twitter帐号。 原创文章，转载请注明： 转载自广陵散 `s 博客 lizhenglin.com 本文链接地址: Google Sidewiki 通过保存书签的形式进驻Firefox,Chrome,Chromium和Safari 文章的脚注信息由WordPress的wp-posturl插件自动生成]]></description>
			<content:encoded><![CDATA[<p><img title="sidewiki-bookmarklet" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/11/sidewiki-bookmarklet.gif" alt="sidewiki-bookmarklet" width="244" height="172" /><img title="Screenshot-1" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/11/Screenshot-1.png" alt="Screenshot-1" width="178" height="117" /></p>
<p>Google Sidewiki发布时略显尴尬，因为它只能通过Google  Toolbar的形式使用，而众所周知Google自己的Chrome浏览器还没有Google  Toolbar可用。尽管后来出现了一些通过Google Sidewiki API来实现浏览Google  Sidewiki的方式，但功能都不完全。现在好了，Google宣布可以通过保存书签的形式，访问Google  Sidewiki了，也就是说Chrome和Safari等浏览器也可以看到各个网站的Google Sidewiki页面了。</p>
<p>只要将这个<a href="javascript:(function(){var%20a=window,b=document;if(b.body){var%20c=a.screenLeft||a.screenX;if(c&gt;340)c-=349;else{var%20d=a.screen.availWidth,e=c+a.outerWidth;c=e&gt;d-331&amp;&amp;c&gt;d-e-9?0:e}a.open(&quot;&quot;,&quot;__SWBM__&quot;,&quot;location=1,resizable=1,menubar=0,scrollbars=1,status=0,toolbar=0,width=340,height=&quot;+((a.outerHeight||768)-58)+&quot;,top=&quot;+(a.screenTop||a.screenY)+&quot;,left=&quot;+Math.max(1,c));var%20f=b.createElement(&quot;script&quot;);f.src=&quot;http://www.google.com/sidewiki/bookmarklet.js?hl=en&quot;;b.body.appendChild(f)};})()">Sidewiki</a>的 按钮拖动到你的浏览器书签里，保存下来，以后你只要打开这个书签，来访问当前网页的Google Sidewiki页面了。</p>
<p><span id="more-733"></span></p>
<p>也可以安装FF插件： <a href="https://addons.mozilla.org/en-US/firefox/addon/46311">https://addons.mozilla.org/en-US/firefox/addon/46311</a></p>
<p>安装后默认在浏览器状态栏显示图标</p>
<p>现在还真有人在继续坚持玩Sidewiki的？</p>
<h2>Google Sidewiki 发布，</h2>
<h2>允许任何人在任何网站发表评论</h2>
<p><img title="更多..." src="http://www.lizhenglin.com/blog/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<p><img title="Screenshot" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/11/Screenshot.png" alt="Screenshot" width="538" height="425" />将允许任何用户在任何网站发表评论。用户也可以在 Sidewiki发表自己的见解，提供更多相关主题的内容以便其他用户查看参考。当然Sidewiki也提供了通过Twitter，Facebook等快 速分享评论的功能。</p>
<p>不同于传统的思路，Sidewiki并不是把最新的评论显示在最上方，而是通过特定算法把Google认为最有用，质量最高的评论优先显示。参考的 内容则包括其他用户对这条评论的评价以及这条评论作者以前的表现等因素。</p>
<p>要使用Google Sidewiki的话，用户需要安装新版的<a href="http://www.google.com/sidewiki/" target="_blank">支持Sidewiki的 Google Toolbar（</a>这意味着Chrome暂时无缘这个功能，当然Google提到了将尽快提供对Chrome等浏览器的支持）。</p>
<p>Google还提供了Sidewiki <a href="http://code.google.com/apis/sidewiki/" target="_blank">API</a>的 首个版本，同时开放了<a href="http://twitter.com/googlesidewiki" target="_blank">@googlesidewiki</a>这 个Twitter帐号。
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.lizhenglin.com/blog/">广陵散 `s 博客 lizhenglin.com</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.lizhenglin.com/blog/?p=733">Google Sidewiki 通过保存书签的形式进驻Firefox,Chrome,Chromium和Safari</a></p>
</div>
<p style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">文章的脚注信息由WordPress的<a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl插件</a>自动生成</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lizhenglin.com/blog/?feed=rss2&amp;p=733</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Wave从入门到进阶</title>
		<link>http://www.lizhenglin.com/blog/?p=731</link>
		<comments>http://www.lizhenglin.com/blog/?p=731#comments</comments>
		<pubDate>Fri, 09 Apr 2010 13:36:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[业内资讯]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Wave]]></category>
		<category><![CDATA[Wave]]></category>
		<category><![CDATA[谷波]]></category>

		<guid isPermaLink="false">http://www.lizhenglin.com/blog/?p=731</guid>
		<description><![CDATA[伴随Google Wave（本文简称：GW）内 测大门的敞开，有些读者可能已通过朋友们的提名，拥有了GW的帐号，并且切身体验过GW，但这个传说中的Wave，真的令大家都有很好很强大的感觉吗？对 于新手而言，它就像个充满英文的空架子，不知从何下手，这篇文章将详细的讲解如何合理有效的使用GW，还没拿到帐号的读者们也可以提前学习下GW的操作知 识。 Google Wave到底是什么？ 官 方简介翻译： Google Wave是一个实时交互的交流及协作在线工具，你可以用富文本格式、图片、视 频、地图和更多的元素进行交流。 每个Wave就是一段与多个参与者进行的对话。参与者指的是那些加入每个Wave讨论和参与内容协作的人，参与者在加入的Wave中，可以在任何时 间、地点回复，他们还能编辑内容，并且添加更多的参与者进来。Wave还提供了回放功能，可以看到在加入的Wave中，什么时间做了什么改动。 另外大家还可以通过阿禅的文章《Google Wave试用体验与Google的野心》，系统了解下Google Wave的全貌，本文以实用操作为主，所以不做插图展示GW的外观。 Google Wave的入门操作 1. 创建 点击界面上的New Wave按钮，创建一个新的Wave，在右上出现的联系 人窗口，添加你想邀请进来的用户，或者从左下的联系人列表，拖拽头像到Wave顶端，进行添加用户。 2. 回复 ■ 选取Wave中一个对话框后，点击Wave工具栏上的Reply按钮。 ■ 双击想要回复的文字，在出现的工具钮上选择Reply。 ■ 将鼠标移动到对话框的下边线，会看到蓝色的横线，点击即可直接在下面回复。 ■ Shift+Enter：是回复并完成输入的快捷键。 3. 阅读 点击空格键，可以按照Wave添加修改的顺序，逐个阅读Wave里每个对话框中的内容，甚至还可以穿越到下 一条有未读内容的Wave。 回 放功能中也可以用空格，逐步阅读。 4. 排版 界面上的窗口都是可以调整的，把鼠标放在边线可以拖动调整宽度、高度，点击还原、最小、最大化按钮可实现相应功能。 同 时浏览4个Wave：排版的最大好处就是扩大你的使用面积，按住Ctrl（Mac上是Command ），再点击一个新的Wave，它就会独立于正在浏览的Wave,并列展开在屏幕上，将联系人等窗口最小化，最多支持同时显示4个Wave窗口。 5. 存档和静音 Archive（存档）：将Wave移出Inbox，直到有人在里面更新内容时，它会再回到Inbox。 Mute（静音）：将Wave移出Inbox，直到有人在里面对你进行private reply（个人回复），它会再回到Inbox。 取消静音：把它拖拽回Inbox即可取消。 Google Wave的进阶使用 1.]]></description>
			<content:encoded><![CDATA[<p>伴随<a href="https://wave.google.com/wave/">Google Wave</a><strong>（本文简称：GW）</strong>内   测大门的敞开，有些读者可能已通过朋友们的提名，拥有了GW的帐号，并且切身体验过GW，但这个传说中的Wave，真的令大家都有很好很强大的感觉吗？对   于新手而言，它就像个充满英文的空架子，不知从何下手，这篇文章将详细的讲解如何合理有效的使用GW，还没拿到帐号的读者们也可以提前学习下GW的操作知  识。</p>
<p><img title="4015688511_1d02d52eec" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/11/4015688511_1d02d52eec.jpg" alt="4015688511_1d02d52eec" width="480" height="87" /></p>
<h2>Google Wave到底是什么？</h2>
<blockquote>
<h3>官 方简介翻译：</h3>
<blockquote><p>Google Wave是一个<strong>实时交互的交流及协作在线工具</strong>，你可以用富文本格式、图片、视 频、地图和更多的元素进行交流。</p>
<p>每个Wave就是一段与多个参与者进行的对话。参与者指的是那些加入每个Wave讨论和参与内容协作的人，参与者在加入的Wave中，可以在任何时  间、地点回复，他们还能编辑内容，并且添加更多的参与者进来。Wave还提供了回放功能，可以看到在加入的Wave中，什么时间做了什么改动。</p></blockquote>
<p>另外大家还可以通过阿禅的文章<a href="http://www.kenengba.com/post/1224.html">《Google  Wave试用体验与Google的野心》</a>，系统了解下Google Wave的全貌，本文以实用操作为主，所以不做插图展示GW的外观。</p>
<p><img title="更多..." src="http://www.lizhenglin.com/blog/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p></blockquote>
<h2>Google Wave的入门操作</h2>
<p><span id="more-731"></span></p>
<blockquote>
<h3>1. 创建</h3>
<blockquote><p>点击界面上的<strong>New Wave</strong>按钮，创建一个新的Wave，在右上出现的联系 人窗口，添加你想邀请进来的用户，或者从左下的联系人列表，<strong>拖拽头像到Wave顶端</strong>，进行添加用户。</p></blockquote>
<h3>2. 回复</h3>
<blockquote><p>■ 选取Wave中一个对话框后，点击Wave工具栏上的Reply按钮。</p>
<p>■ 双击想要回复的文字，在出现的工具钮上选择Reply。</p>
<p>■ 将鼠标移动到对话框的下边线，会看到蓝色的横线，点击即可直接在下面回复。</p>
<p>■ Shift+Enter：是回复并完成输入的快捷键。</p></blockquote>
<h3>3. 阅读</h3>
<blockquote><p>点击<strong>空格键</strong>，可以按照Wave添加修改的顺序，逐个阅读Wave里每个对话框中的内容，甚至还可以穿越到下 一条有未读内容的Wave。</p>
<p><strong>回 放功能中也可以用空格</strong>，逐步阅读。</p></blockquote>
<h3>4. 排版</h3>
<blockquote><p>界面上的窗口都是可以调整的，把鼠标放在边线可以拖动调整宽度、高度，点击还原、最小、最大化按钮可实现相应功能。</p>
<p><strong>同 时浏览4个Wave</strong>：排版的最大好处就是扩大你的使用面积，按住Ctrl（Mac上是Command  ），再点击一个新的Wave，它就会独立于正在浏览的Wave,并列展开在屏幕上，将联系人等窗口最小化，最多支持同时显示4个Wave窗口。</p></blockquote>
<h3><strong>5. 存档和静音</strong></h3>
<blockquote><p><strong>Archive（存档）</strong>：将Wave移出Inbox，直到有人在里面更新内容时，它会再回到Inbox。</p>
<p><strong>Mute（静音）</strong>：将Wave移出Inbox，直到有人在里面对你进行private  reply（个人回复），它会再回到Inbox。</p>
<p><strong>取消静音：</strong>把它拖拽回Inbox即可取消。</p></blockquote>
</blockquote>
<h2>Google Wave的进阶使用</h2>
<blockquote>
<h3>1. 搜索</h3>
<blockquote><p>■ <strong>公共Wave：</strong>就是世界各地创建的公开Wave，每个人都可以看到并参与进来。在搜索框中键入 <em>with:public</em> 就可以看到这些实时动态滚动的Wave。</p>
<p>■ <strong>中文公开Wave：</strong>在搜索框中键入 <em>with:public lang:zh</em> 就可以看到中文的公共Wave，其中有些条目比较多的Wave要慎入，否则可能会卡住甚至造成出错……</p>
<p>■ <strong>用Tag缩小搜索范围：</strong> 比如需要搜索以kenengba为标签的内容，可以在搜索框中键入 <em>with:public  tag:可能吧</em>，这样就可以看到公共Wave中包含可能吧标签的Wave了。</p></blockquote>
<h3>2. 创建公共Wave</h3>
<blockquote><p>也就是上面提到的那种面向全球公开的Wave，也是一种让同语种的人找到彼此的一种方式，方法很简单，添加 <em>public@a.gwave.com</em> 到联系人列表。<strong>（注意：每个字母和符号都不要错）</strong></p>
<p>虽然添加时，上面会说&#8221;The account doesn’t exist.&#8221;  但请无视这句提示，直接点击回车添加。然后再将这个机器人，添加到你想要公开的Wave中即可。添加完会出现一个黄条提示：&#8221;<strong>[not-yet-implemented-user]  gave everyone access.</strong>&#8220;，就说明这个Wave已经公开。</p></blockquote>
<h3>3. 关于公共Wave的补充</h3>
<blockquote><p>已知的一个BUG，就是<strong>上面添加那个机器人，会在重新登陆Wave后，从联系人列表中自动消失</strong>，目前只好在 需要的时候重新添加它。</p>
<p><strong>当 你将一个Wave公开后，它就不能再变为私有的Wave</strong>，所以公开之前请三思。</p>
<p>对于已经公开的Wave，所有参与者都有编辑权限，也就是说谁都可以更改里面的内容，甚至删除，虽然&#8221;Playback（回放）&#8221;可以看到是谁做的 改动，但如果被删还是很麻烦，这就需要大家的自觉了，希望大家能看看这个中国网友翻译的<strong>Wave公约</strong>(在Wave中搜索<em>with:public   title:Google Waves公约（协作翻译）讨论区</em>)，共同维护一个好的使 用环境。</p></blockquote>
<h3>4. 添加朋友</h3>
<blockquote><p>因为Wave是个新鲜东西，所以刚进入Wave时，联系人列表上的朋友一般较少，都是拥有Wave帐号的G  Talk联系人，为了扩大交流的范围，可以通过下面的方式添加朋友：</p>
<p>■ <strong>找已经有Wave帐号的朋友</strong>：点击联系人列表上的加号，将TA的帐号复制上去，点击Submit。</p>
<p>■ <strong>出现在Wave中的朋友</strong>：在你参与的Wave中，点击顶部朋友的头像，选择Add to Contacts。</p></blockquote>
</blockquote>
<h2>Google Wave 快捷键列表</h2>
<blockquote><p><strong>原版快捷键列表</strong>（在Wave中搜索<em>with:public  title:Keyboard Shortcut Cheat Sheet tag:help</em>）由这些热心的Wave网友整理而成 ──Kang kang (and ✿Melissa✿ Elliott, Alex Elsayed, …):</p>
<p>因为这篇文章是写给中国用户的，所以<strong>我将这个列表中部分快捷键翻译为中文</strong>，献给可能吧的读者们：</p>
<blockquote><p><strong>Wave 导航栏</strong></p>
<blockquote><p>上/下 箭头键 ── 用于在导航栏中切换信息</p>
<p>Tab/Shift-tab ── 与上/下 箭头功能相同(编辑模式除外)</p>
<p>Home/End ── 移动到第一条/最后一条信息</p>
<p>空格键 ── 转到下一条未读信息（不一定非要在同一个Wave中，可穿越）</p>
<p>左/右 箭头键 ── 切换于导航面板和Wave面板</p>
<p>Ctrl+空格键                 ── 将所有信息标记为已读（必须切换到Wave面板中）</p></blockquote>
<p><strong>信 息</strong></p>
<blockquote><p>回车键                       ── 回复信息：回复的新信息会出现在所选信息的下面</p>
<p>Shift+回车键 ──           回复最后一个对话框，新的信息和所回复信息在同一层级上，并且在最下端</p>
<p>高亮选中文本+回车键   ── 嵌套回复：回复的新信息会嵌套在当前信息内部</p>
<p>Ctrl+E                         ── 编辑信息</p>
<p>Ctrl+回车键 ──                (在编辑时) 在加字号上插入嵌套的回复</p></blockquote>
</blockquote>
</blockquote>
<h2>Google Wave的第三方插件应用</h2>
<p>因为GW的平台是开放的，所以第三方的插件和服务很多，这里就不一一列举，只选择10个热门的插件机器人做以介绍，更多内容请参考：<strong>Google  Wave扩展列表 </strong>(在Wave中搜索<em>with:public title:Google \/\/ave  Extensions List tag:gadgets</em>)</p>
<blockquote>
<h3>1. 将GW嵌入到博客中</h3>
<blockquote><p>就是说把一个Wave嵌入到博客中，方法也很简单，在Wave中添加机器人 <em>embeddy@appspot.com</em> ，然后在出现的设置面板中，把下面那大段代码复制到BLOG的HTML《body》和《/body》之间<strong>（请自己将《》换成&lt;&gt;）</strong>， 然后再把那单独的一行代码复制到文章里就可以了。</p>
<p>但请注意，给文章加入Wave会影响文章的开启速度，没有Wave帐号的人是看不到嵌入Wave的。</p></blockquote>
<h3>2. 嵌入国内视频</h3>
<blockquote><p>请在GW中阅读这个Wave(在Wave中搜索<em>with:public title:在Wave里嵌入国内视频的方法</em>) 的教程并安装插件。</p></blockquote>
<h3>3. 翻译</h3>
<blockquote><p>添加 <em>rosy@wavesandbox.com</em> 到联系人列表，这是Google的翻译机器人，把它添加进需要翻译服务的Wave中，可以实时看到自动翻译的结果。<strong>（下面的插件，均 与此使用方法相同。）</strong></p></blockquote>
<h3>4. 发推</h3>
<blockquote><p>添加机器人 <em>tweety-wave@appspot.com</em></p></blockquote>
<h3>5. 投票</h3>
<blockquote><p>添加机器人 <em>polly-wave@appspot.com</em></p></blockquote>
<h3>6. 看股票</h3>
<blockquote><p>添加机器人 <em>stocky-wave@appspot.com</em></p></blockquote>
<h3>7. 公开Wave机器人</h3>
<blockquote><p>它和官方的公开机器人使用方法相同，不过它不会在联系人列表中消失，添加机器人 <em>blog-wave@appspot.com</em></p></blockquote>
<h3>8. 统计</h3>
<blockquote><p>它可以统计Wave中的行数和字数等文本信息统计，添加机器人 <em>countcolon@appspot.com</em></p></blockquote>
<h3>9. 只读</h3>
<blockquote><p>它会保护Wave原始的内容，这很适合知识传播，无论Wave被如何编辑，它都可以被自动替换为添加机器人时的原始内容， 添加机器人 <em>readonliebot@appspot.com</em></p></blockquote>
<h3>10. 删空白</h3>
<blockquote><p>它会删除Wave中没有内容的对话框，比如大家不小心点了回复，却没有写任何内容在里面，很实用的一个功能，添加机器人 <em>sweepy-wave@appspot.com</em></p></blockquote>
</blockquote>
<h2>Google Wave亟待解决的问题</h2>
<blockquote>
<h3>1. 卡</h3>
<blockquote><p>这是令众多用户望而却步的原因，目前所知的情况是，这种<strong>卡不完全是由硬件或者用户网速造成</strong>，而是 Wave本身的问题，希望能在以后的更新中逐渐得到解决。</p></blockquote>
<h3>2. 乱</h3>
<blockquote><p>因为是开放性的讨论，所以经常出现没有关联性的回复，虽然有嵌套式讨论，但很多用户不会用嵌套，就导致很多平行话题的展 开，使得Wave整体<strong>阅读起来没有逻辑性</strong>。</p></blockquote>
<h3>3. 删</h3>
<blockquote><p>可能是Google认为删除是危险的，所以目前没有提供完全的删除功能，比如你不想再看某个Wave时，你<strong>只能把它拖到回收 站去</strong>，而这个回收站是不能清空的…</p></blockquote>
<h3>4. 权</h3>
<blockquote><p>没有权限设置是最大的问题，这也是造成公开Wave乱的主要原因之一，谁都拥有最高控制权，修改别人的话等等，于是国外和 国内的朋友，开始建立Wave公约，希望大家自觉遵守网友们共同制定的Wave公约。</p></blockquote>
<h3>5. 少</h3>
<blockquote><p>不可否认，GW的公开还是很局限，<strong>国内拥有帐号的人，或者说真正使用的人并不太多</strong>，但愿官方能早日 开放二代Wave的提名权限，让我们邀请更多的人加入GW的世界。</p></blockquote>
</blockquote>
<h2>关于Google Wave的帐号</h2>
<blockquote><p>人人都想拿到GW的帐号，这是不争的事实，但是官方这次测试仍然比较谨慎，每个参与Develop测试的沙盒帐号只给8个 提名的名额，也就是我们所说的一代Wave。</p>
<p>而被上面一代Wave提名的用户，就是二代Wave，目前没有任何提名的名额，所以现在向二代Wave索要提名或邀请是没用的。</p></blockquote>
<h2>结语</h2>
<blockquote><p>这篇文章终于在我&#8221;吐血&#8221;之后写完了，花了很多时间测试和翻译，写得蛮苦的一篇文章，但我想是值得的。另外我们<strong>可能吧已建立读 者交流用的公开Wave</strong>(在Wave中搜索<em>with:public tag:kenengba</em>)，欢迎大家 加入讨论。</p>
<p>Google Wave才刚刚启航，更多的波浪会接踵而来，但愿它能长江后浪拍前浪，把××拍倒在沙滩上。</p>
<p><strong>原 文地址：</strong><a href="http://www.kenengba.com/post/1886.html">http://www.kenengba.com/post/1886.html</a></p></blockquote>
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.lizhenglin.com/blog/">广陵散 `s 博客 lizhenglin.com</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.lizhenglin.com/blog/?p=731">Google Wave从入门到进阶</a></p>
</div>
<p style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">文章的脚注信息由WordPress的<a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl插件</a>自动生成</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lizhenglin.com/blog/?feed=rss2&amp;p=731</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ubuntu linux 下安装迅雷(crossover-pro-7.1.0.sh+Thunder.cxarchiv)及关联firefox</title>
		<link>http://www.lizhenglin.com/blog/?p=729</link>
		<comments>http://www.lizhenglin.com/blog/?p=729#comments</comments>
		<pubDate>Fri, 09 Apr 2010 13:35:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[CrossOver]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Thunder]]></category>
		<category><![CDATA[关联]]></category>
		<category><![CDATA[迅雷]]></category>

		<guid isPermaLink="false">http://www.lizhenglin.com/blog/?p=729</guid>
		<description><![CDATA[在以下位置可公开查看您的文档： http://docs.google.com/View?id=ddqsjgzx_802978x6nc3 同时强烈推荐大家使用aMule 反吸血电驴 http://forum.ubuntu.org.cn/viewtopic.php?f=95&#38;t=233117 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- 貌似linux版本的xl已经开发，没发布，xl用来收钱？ viewtopic.php?f=101&#38;t=235006 ============================================================================ 写给刚刚使用ubuntu还不习惯没有迅雷的同学。 一般的下载使用Firefox 的downthemall插件就OK 本贴介绍 linux下安装迅雷+firefox的FlashGot插件+VBS脚本等=firefox支持迅雷5下载 ============================================================================ crossover（wine）安装迅雷 install-crossover-pro-7.1.0.sh+Thunder.cxarchive 这个版本的迅雷支持BT和EMule 支持关联一起用crossover安装的IE，个人感觉比WINE安装的IE稳定。 不要使用sudo apt-get install crossover-pro 安装源里的30天试用版本 软件比较大，无法上传 下载 install-crossover-pro-7.1.0.sh 文件大小：24.98MB http://www.brsbox.com/filebox/down/fc/32c4ae25219a136f01e0c0f37b38669b 和 Thunder.cxarchive 文件大小：48.3MB http://www.brsbox.com/filebox/down/fc/77a072686d7cc6a1dccb80f18f6c3960 安装 install-crossover-pro-7.1.0.sh 安装方法 $ chmod +x install-crossover-pro-7.1.0.sh $ ./install-crossover-pro-7.1.0.sh 就OK了 首先要确保机器上有crossover， 然后在configuration里选Manage Bottles点击restore archive 找到下载的Thunder.cxarchive安装就OK 安装迅雷 点击下方的restore archive ========== 启动 切换语言 设置]]></description>
			<content:encoded><![CDATA[<p><strong>在以下位置可公开查看您的文档：</strong> <a id="publishedDocumentUrl" href="http://docs.google.com/View?id=ddqsjgzx_802978x6nc3" target="_blank">http://docs.google.com/View?id=ddqsjgzx_802978x6nc3</a></p>
<p>同时强烈推荐大家使用aMule 反吸血电驴 <a href="http://forum.ubuntu.org.cn/viewtopic.php?f=95&amp;t=233117">http://forum.ubuntu.org.cn/viewtopic.php?f=95&amp;t=233117</a><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
貌似linux版本的xl已经开发，没发布，xl用来收钱？ <a href="http://forum.ubuntu.org.cn/viewtopic.php?f=101&amp;t=235006">viewtopic.php?f=101&amp;t=235006</a><br />
============================================================================<br />
写给刚刚使用ubuntu还不习惯没有迅雷的同学。<br />
一般的下载使用Firefox 的downthemall插件就OK<br />
本贴介绍  linux下安装迅雷+firefox的FlashGot插件+VBS脚本等=firefox支持迅雷5下载<br />
============================================================================<br />
crossover（wine）安装迅雷 install-crossover-pro-7.1.0.sh+Thunder.cxarchive<br />
这个版本的迅雷支持BT和EMule<br />
支持关联一起用crossover安装的IE，个人感觉比WINE安装的IE稳定。</p>
<p>不要使用sudo apt-get install crossover-pro 安装源里的30天试用版本<br />
软件比较大，无法上传<br />
下载<br />
install-crossover-pro-7.1.0.sh<br />
文件大小：24.98MB<br />
<a href="http://www.brsbox.com/filebox/down/fc/32c4ae25219a136f01e0c0f37b38669b">http://www.brsbox.com/filebox/down/fc/32c4ae25219a136f01e0c0f37b38669b</a><br />
和<br />
Thunder.cxarchive<br />
文件大小：48.3MB<br />
<a href="http://www.brsbox.com/filebox/down/fc/77a072686d7cc6a1dccb80f18f6c3960">http://www.brsbox.com/filebox/down/fc/77a072686d7cc6a1dccb80f18f6c3960</a></p>
<p>安装<br />
install-crossover-pro-7.1.0.sh<br />
安装方法<br />
$ chmod +x install-crossover-pro-7.1.0.sh<br />
$ ./install-crossover-pro-7.1.0.sh</p>
<p>就OK了<br />
首先要确保机器上有crossover，<br />
然后在configuration里选Manage Bottles点击restore archive  找到下载的Thunder.cxarchive安装就OK</p>
<p><span id="more-729"></span></p>
<p><img title="更多..." src="http://www.lizhenglin.com/blog/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<div>
<div id="subq"><img title="ddqsjgzx_803fvvmk8g6_b" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/10/ddqsjgzx_803fvvmk8g6_b.png" alt="ddqsjgzx_803fvvmk8g6_b" width="523" height="217" /></div>
</div>
<p>安装迅雷</p>
<div>
<div id="hjdy"><img title="ddqsjgzx_804p9wffmd8_b" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/10/ddqsjgzx_804p9wffmd8_b.png" alt="ddqsjgzx_804p9wffmd8_b" width="624" height="604" /></div>
</div>
<p>点击下方的restore archive<br />
==========<br />
启动</p>
<div id="h.6i"><img title="ddqsjgzx_805csqt9nfg_b" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/10/ddqsjgzx_805csqt9nfg_b.png" alt="ddqsjgzx_805csqt9nfg_b" width="425" height="211" /></div>
<p>切换语言</p>
<div id="jbst"><img title="ddqsjgzx_806cgvq4tcq_b" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/10/ddqsjgzx_806cgvq4tcq_b.gif" alt="ddqsjgzx_806cgvq4tcq_b" width="1026" height="587" /></div>
<p>设置</p>
<div id="tz:b"><img title="ddqsjgzx_807cq4bvbdf_b" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/10/ddqsjgzx_807cq4bvbdf_b.png" alt="ddqsjgzx_807cq4bvbdf_b" width="616" height="505" /></div>
<p>=========================================<br />
设置浏览器支持<br />
关联IE <a href="http://www.gougou.com/">http://www.gougou.com/</a> 页面 左下角 点击 “把狗狗设为主页” 设置成IE的主页</p>
<p>启动IE,设置主页，方便以后搜索资源，设置成主页后就关闭IE</p>
<div id="inze"><img title="ddqsjgzx_808ct7qnbcm_b" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/10/ddqsjgzx_808ct7qnbcm_b.png" alt="ddqsjgzx_808ct7qnbcm_b" width="705" height="381" /></div>
<p>设置迅雷关联IE（和Thunder.cxarchiv自带的IE关联）</p>
<div id="p-x_"><img title="ddqsjgzx_809cbdx3hdb_b" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/10/ddqsjgzx_809cbdx3hdb_b.png" alt="ddqsjgzx_809cbdx3hdb_b" width="964" height="566" /></div>
<p>重新启动你的IE就可以看到 鼠标右键 有（使用迅雷下载了）</p>
<div id="a53y"><img title="ddqsjgzx_810czdhswdj_b" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/10/ddqsjgzx_810czdhswdj_b.png" alt="ddqsjgzx_810czdhswdj_b" width="717" height="645" /></div>
<p>=====================================================<br />
firefox直接调用迅雷的方法如下，刚刚整理好。很不错。<br />
=====================================================<br />
我整理下：</p>
<div><strong>代码:</strong></div>
<div>#!/bin/sh&#8221;/home/may/cxoffice/bin/wine&#8221; &#8211;bottle &#8220;Thunder&#8221; &#8211;untrusted  &#8211;workdir &#8220;/home/may/.cxoffice/Thunder&#8221;"/drive_c/Program Files/Thunder&#8221;  &#8212; &#8220;/home/may/.cxoffice/Thunder/drive_c/Program  Files/Thunder/Thunder.exe&#8221;</p>
<p>if [ $# -eq 1 ]<br />
then<br />
#echo $1<br />
&#8220;home/may/cxoffice/bin/wine&#8221; &#8211;bottle &#8220;Thunder&#8221; &#8211;untrusted &#8211;workdir  &#8220;/home/may/.cxoffice/Thunder&#8221;"/drive_c/windows&#8221; wscript  &#8220;/home/may/.cxoffice/Thunder/drive_c/thunder.vbs&#8221; $1<br />
fi</p>
</div>
<div><strong>引用:</strong></div>
<div>/home/may/<br />
中may是 我用户名，大家用搜索替换修改成自己的</div>
<p>存为thunder，加上可执行<br />
增加执行权限，进入控制台，输入&#8217;cd ./桌面&#8217;，来到文件保存的目录下，然后输入</p>
<div><strong>代码:</strong></div>
<div>sudo chmod +x thunder</div>
<p>增加好权限后，继续输入</p>
<div><strong>代码:</strong></div>
<div>sudo mv thunder /usr/bin/</div>
<p>完成后，测试一下，直接在控制台下输入thunder应该可以打开迅雷了，然后选中  工具&gt;&gt;浏览器支持&gt;&gt;作为IE下载工具 。关闭迅雷。（小图标栏里确认是否关闭了，关闭了，迅雷图标就不见了）<br />
&#8212;&#8212;&#8212;<br />
完成这一步后继续增加脚本thunder.vbs<br />
在桌面新建本件，名称为thunder.vbs，用文本编辑器打开，输入以下内容（下载后面的附件跳过这一步，附件中已包含了这个文件）：</p>
<div><strong>代码:</strong></div>
<div>Dim url<br />
url=&#8221;"<br />
If WScript.Arguments.Count = 1 Then<br />
url=WScript.Arguments.Item(0)<br />
End If<br />
msgBox urlSet ThunderAgent = CreateObject(&#8220;ThunderAgent.Agent.1&#8243;)<br />
Call ThunderAgent.AddTask(url,&#8221;",&#8221;",&#8221;",&#8221;",1,0,-1)<br />
Call ThunderAgent.CommitTasks2(1)</p>
<p>Set ThunderAgent = Nothing</p>
</div>
<p>保存后，将其移动或者复制到虚拟C盘下，<br />
打开应用程序/home/may/.cxoffice/Thunder/drive_c目录，复制到此处即可。</p>
<p>现通过firefox的addons插件，增加一个叫做FlashGot的firefox插件，firefox浏览器-工具-附加组件  搜索FlashGot安装即可</p>
<p>然后重启firefox后，在工具菜单下选中FlashGot&gt;&gt;更多选项&#8230;，在探出的对话框中看到了常规选项卡，点击新增名称为 thunder5,可执行路径填写/usr/bin/thunder，参数模板为默认的[URL],确定即可。</p>
<div id="pe2a"><img title="ddqsjgzx_811f38fkkhk_b" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/10/ddqsjgzx_811f38fkkhk_b.png" alt="ddqsjgzx_811f38fkkhk_b" width="511" height="494" /></div>
<p>现在你可以试一试firefox的 使用FlashGot下载此链接（迅雷链）了，进入 <a href="http://www.gougou.com/">http://www.gougou.com</a> 任意下载个</p>
<p>OK 测试成功<br />
我是在IPV6的<br />
<a href="http://www.fdigg.net/">http://www.fdigg.net</a> （文件挖掘者测试下载的）</p>
<div id="p1ee"><img title="ddqsjgzx_812cqxqnpf8_b" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/10/ddqsjgzx_812cqxqnpf8_b.png" alt="ddqsjgzx_812cqxqnpf8_b" width="358" height="523" /></div>
<p>弹出检测到的迅雷链接，点确定就可以下载了。</p>
<div>
<div id="o43j"><img title="ddqsjgzx_813djv8b6f7_b" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/10/ddqsjgzx_813djv8b6f7_b.png" alt="ddqsjgzx_813djv8b6f7_b" width="900" height="532" /></div>
</div>
<div>附件:</div>
<div><strong>文件注释:</strong> /home/may/中may是我用户名，大家用搜索替换修改成自己的<br />
<img src="http://forum.ubuntu.org.cn/styles/UbuntuCN/imageset/icon_topic_attach.gif" alt="" width="14" height="18" /> <a href="http://forum.ubuntu.org.cn/download/file.php?id=82628">thunder.7z</a> [293 Bytes]</div>
<div>附件:</div>
<div><strong>文件注释:</strong> thunder.vbs无须修改，直接可用<br />
<img src="http://forum.ubuntu.org.cn/styles/UbuntuCN/imageset/icon_topic_attach.gif" alt="" width="14" height="18" /> <a href="http://forum.ubuntu.org.cn/download/file.php?id=82629">thunder.vbs.7z</a> [288 Bytes]</div>
<p>备用下载：firefox支持迅雷5Thunder.cxarchiv下载.7z （包含上面两文件）<br />
<a href="http://www.brsbox.com/filebox/down/fc/24196500843c358d8f262aafe6945e12">http://www.brsbox.com/filebox/down/fc/24196500843c358d8f262aafe6945e12</a>
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.lizhenglin.com/blog/">广陵散 `s 博客 lizhenglin.com</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.lizhenglin.com/blog/?p=729">ubuntu linux 下安装迅雷(crossover-pro-7.1.0.sh+Thunder.cxarchiv)及关联firefox</a></p>
</div>
<p style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">文章的脚注信息由WordPress的<a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl插件</a>自动生成</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lizhenglin.com/blog/?feed=rss2&amp;p=729</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在ubuntu Linux 下通过 Firefox 网页直接播放 PPStream</title>
		<link>http://www.lizhenglin.com/blog/?p=727</link>
		<comments>http://www.lizhenglin.com/blog/?p=727#comments</comments>
		<pubDate>Fri, 09 Apr 2010 13:35:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[Firefoxm]]></category>
		<category><![CDATA[Greasemonkey]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PPStream]]></category>

		<guid isPermaLink="false">http://www.lizhenglin.com/blog/?p=727</guid>
		<description><![CDATA[http://kan.pps.tv/ 网页在线播放，效果如下 影院模式 好了，如果大家感兴趣的话，请往下看： 首先，我们需要准备如下软件： 1、可以播放rmvb文件和wmv文件的totem解码器，我想大家大概都有这个。 2、totem-pps，就是那个运行在totem里的pps插件，我想这个是绕不开的。安装方法请参照：http://forum.ubuntu.org.cn/viewtopic.php?f=74&#38;t=223582 3、Firefox下的Greasemonkey插件，这个是用来将客户的js代码嵌入网页的插件，非常神奇。 firefox搜索安装Greasemonkey插件 https://addons.mozilla.org/zh-CN/firefox/addon/748 4、totem-plugin，让Firefox能够使用totem。一般的Ubuntu系统都是默认安装的。 然后，在Greasemonkey里添加这个脚本就可以了： 单击此处直接安装：http://userscripts.org/scripts/source/59991.user.js 最新更新见这里 http://forum.ubuntu.org.cn/viewtopic.php?f=74&#38;t=232435 以下是代码： 代码: // ==UserScript== // @name           PPS for Firefox // @namespace      liu.wanfang@gmail.com // @description    pps for firefox in the totem-pps // @include        http://kan.pps.tv/play/* // ==/UserScript==function GmOnMouseOver(evt) { if(document.getElementById(&#8216;GmShowBig&#8217;).value == &#8220;影院模式&#8221;)]]></description>
			<content:encoded><![CDATA[<p>http://kan.pps.tv/ 网页在线播放，效果如下</p>
<p><img title="Screenshot-1" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/10/Screenshot-1-1024x789.png" alt="Screenshot-1" width="600" height="462" /></p>
<p>影院模式</p>
<p><img title="Screenshot-3" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/10/Screenshot-3-1024x694.png" alt="Screenshot-3" width="600" height="406" /></p>
<p>好了，如果大家感兴趣的话，请往下看：<br />
首先，我们需要准备如下软件：<br />
1、可以播放rmvb文件和wmv文件的totem解码器，我想大家大概都有这个。<br />
2、totem-pps，就是那个运行在totem里的pps插件，我想这个是绕不开的。安装方法请参照：<a href="http://forum.ubuntu.org.cn/viewtopic.php?f=74&amp;t=223582">http://forum.ubuntu.org.cn/viewtopic.php?f=74&amp;t=223582</a></p>
<p>3、Firefox下的Greasemonkey插件，这个是用来将客户的js代码嵌入网页的插件，非常神奇。<br />
firefox搜索安装Greasemonkey插件 <a href="https://addons.mozilla.org/zh-CN/firefox/addon/748" target="_blank">https://addons.mozilla.org/zh-CN/firefox/addon/748</a></p>
<p>4、totem-plugin，让Firefox能够使用totem。一般的Ubuntu系统都是默认安装的。<br />
然后，在Greasemonkey里添加这个脚本就可以了：<br />
单击此处直接安装：<a href="http://userscripts.org/scripts/source/59991.user.js">http://userscripts.org/scripts/source/59991.user.js</a></p>
<p>最新更新见这里</p>
<p><a href="http://forum.ubuntu.org.cn/viewtopic.php?f=74&amp;t=232435" target="_blank">http://forum.ubuntu.org.cn/viewtopic.php?f=74&amp;t=232435</a></p>
<p>以下是代码：</p>
<div><strong>代码:</strong></div>
<blockquote>
<div>// ==UserScript==<br />
// @name           PPS for Firefox<br />
// @namespace      liu.wanfang@gmail.com<br />
// @description    pps for firefox in the totem-pps<br />
// @include        http://kan.pps.tv/play/*<br />
// ==/UserScript==function GmOnMouseOver(evt)<br />
{<br />
if(document.getElementById(&#8216;GmShowBig&#8217;).value == &#8220;影院模式&#8221;)<br />
{<br />
document.getElementById(&#8216;GmShowBlack&#8217;).style.opacity = &#8220;1&#8243;;<br />
}<br />
}<br />
function GmOnMouseOut(evt)<br />
{<br />
if(document.getElementById(&#8216;GmShowBig&#8217;).value == &#8220;影院模式&#8221;)<br />
{<br />
document.getElementById(&#8216;GmShowBlack&#8217;).style.opacity = &#8220;0.1&#8243;;<br />
}<br />
}<br />
function GmOnClick(evt)<br />
{<br />
var t = document.getElementById(&#8216;GmShowBlack&#8217;);<br />
if(evt.target.value == &#8220;影院模式&#8221;)<br />
{<br />
evt.target.value = &#8220;恢复&#8221;<br />
t.style.left = &#8216;-70px&#8217;;<br />
t.style.top = &#8216;-200px&#8217;;<br />
t.style.width = &#8217;1140px&#8217;;<br />
t.style.height = &#8217;900px&#8217;;<br />
t.style.background = &#8216;rgba(0,0,0,0.6)&#8217;;</p>
<p>document.getElementById(&#8216;GmShowPlayBorder&#8217;).style.left = &#8217;104px&#8217;;<br />
document.getElementById(&#8216;GmShowPlay&#8217;).style.width = &#8217;712px&#8217;;</p>
<p>document.getElementById(&#8216;GmShowLeft&#8217;).style.top = &#8217;200px&#8217;;</p>
<p>document.getElementById(&#8216;onlineSee&#8217;).style.display = &#8216;none&#8217;;<br />
}<br />
else<br />
{<br />
evt.target.value = &#8220;影院模式&#8221;<br />
t.style.left = &#8217;60px&#8217;;<br />
t.style.top = &#8217;26px&#8217;;<br />
t.style.width = &#8217;650px&#8217;;<br />
t.style.height = &#8217;520px&#8217;;<br />
t.style.background = &#8216;rgba(0,0,0,0.4)&#8217;;</p>
<p>document.getElementById(&#8216;GmShowPlayBorder&#8217;).style.left = &#8217;180px&#8217;;<br />
document.getElementById(&#8216;GmShowPlay&#8217;).style.width = &#8217;500px&#8217;;</p>
<p>document.getElementById(&#8216;GmShowLeft&#8217;).style.top = &#8217;0px&#8217;;</p>
<p>document.getElementById(&#8216;onlineSee&#8217;).style.display = &#8221;;<br />
}<br />
}<br />
function GmConOnClick(evt)<br />
{<br />
if(evt.target.value == &#8220;隐藏控制&#8221;)<br />
{<br />
evt.target.value = &#8220;显示控制&#8221;<br />
document.getElementById(&#8216;GmShowPlayBorder&#8217;).style.height = &#8220;424px&#8221;;<br />
}<br />
else<br />
{<br />
evt.target.value = &#8220;隐藏控制&#8221;<br />
document.getElementById(&#8216;GmShowPlayBorder&#8217;).style.height = &#8220;auto&#8221;;<br />
}<br />
}</p>
<p>var o = document.getElementById(&#8216;showplayer&#8217;);<br />
var pps = o.innerHTML.match(/pps:\/\/.*?rmvb|pps:\/\/.*?wmv/);<br />
var s = &#8220;&lt;div id=&#8217;GmShowBlack&#8217;  style=&#8217;position:absolute;top:26px;left:60px;-moz-border-radius:40px;width:650px;height:534px;background:rgba(0,0,0,0.4);z-index:1000;opacity:0.1;&#8217;&gt;&#8221;;<br />
s += &#8220;&lt;div id=&#8217;GmShowLeft&#8217;  style=&#8217;position:absolute;left:30px;width:50px;height:442px;z-index:1001;padding:190px  180px 0px 0px;&#8217;&gt;&#8221;;<br />
s += &#8220;&lt;input Id=&#8217;GmShowBig&#8217; type=&#8217;button&#8217; value=&#8217;影院模式&#8217;  style=&#8217;height:65px;width:65px;background:rgba(0,0,0,0.4);-moz-border-radius:10px;color:#FFFFFF;border:1px  outset #000000;margin:10px;&#8217;/&gt;&#8221;;<br />
s += &#8220;&lt;input Id=&#8217;GmShowCon&#8217; type=&#8217;button&#8217; value=&#8217;隐藏控制&#8217;  style=&#8217;height:65px;width:65px;background:rgba(0,0,0,0.4);-moz-border-radius:10px;color:#FFFFFF;border:1px  outset #000000;margin:10px;&#8217;/&gt;&#8221;;<br />
s += &#8220;&lt;/div&gt;&lt;/div&gt;&#8221;;<br />
s += &#8220;&lt;div id=&#8217;GmShowPlayBorder&#8217;  style=&#8217;position:absolute;top:64px;left:180px;z-index:1001;overflow-y:hidden;height:auto;&#8217;&gt;&#8221;;<br />
s += &#8220;&lt;object id=&#8217;GmShowPlay&#8217; data=&#8217;&#8221;+pps+&#8221;&#8216;  type=&#8217;application/x-mplayer2&#8242; width=&#8217;500&#8242; height=&#8217;451&#8242; scr=&#8217;&#8221;+pps+&#8221;&#8216;  ShowControls=&#8217;true&#8217; autostart=&#8217;true&#8217; ShowTracker=&#8217;true&#8217;  style=&#8217;z-index:1002;&#8217;&gt;&lt;param name=&#8217;playcount&#8217;  value=&#8217;infinite&#8217;&gt;&lt;/object&gt;&#8221;;<br />
s += &#8220;&lt;/div&gt;&#8221;;<br />
o.innerHTML = s;</p>
<p>var gsb = document.getElementById(&#8216;GmShowLeft&#8217;);<br />
gsb.addEventListener(&#8220;mouseover&#8221;,GmOnMouseOver,false);<br />
gsb.addEventListener(&#8220;mouseout&#8221;,GmOnMouseOut,false);</p>
<p>document.getElementById(&#8216;GmShowBig&#8217;).addEventListener(&#8220;click&#8221;,GmOnClick,false);<br />
document.getElementById(&#8216;GmShowCon&#8217;).addEventListener(&#8220;click&#8221;,GmConOnClick,false);</p>
</div>
</blockquote>
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.lizhenglin.com/blog/">广陵散 `s 博客 lizhenglin.com</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.lizhenglin.com/blog/?p=727">在ubuntu Linux 下通过 Firefox 网页直接播放 PPStream</a></p>
</div>
<p style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">文章的脚注信息由WordPress的<a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl插件</a>自动生成</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lizhenglin.com/blog/?feed=rss2&amp;p=727</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Send Free SMS Worldwide &#8211; 免费向全世界发送短消息</title>
		<link>http://www.lizhenglin.com/blog/?p=725</link>
		<comments>http://www.lizhenglin.com/blog/?p=725#comments</comments>
		<pubDate>Fri, 09 Apr 2010 13:33:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[免费资源]]></category>
		<category><![CDATA[All]]></category>
		<category><![CDATA[sms]]></category>
		<category><![CDATA[免费]]></category>
		<category><![CDATA[手机]]></category>

		<guid isPermaLink="false">http://www.lizhenglin.com/blog/?p=725</guid>
		<description><![CDATA[缺点：只能发英文，每条都要输入验证码。 Error:English only,please. 发送 成功：Sent successfully.Thanks for your support. : ) 立刻 就接收到了： (425) 835-3390 (41 seconds ago) call (425) 835-3390: Send Free SMS Worldwide &#8211; free of charge to send a short message to the world (上午1:22) http://freesms.cloudapp.net 这个网站可能耐大了，能向全世界任何一部手机免费发送短消息，而且不用注册，而且是匿名。经我试验，是真的。号称是采用了云计算技术，唉，管不了那么多 了，能有免费的午餐就好。 原创文章，转载请注明： 转载自广陵散 `s 博客 lizhenglin.com 本文链接地址: Send Free SMS Worldwide &#8211; 免费向全世界发送短消息 文章的脚注信息由WordPress的wp-posturl插件自动生成]]></description>
			<content:encoded><![CDATA[<p><img title="Screenshot" src="http://www.lizhenglin.com/blog/wp-content/uploads/2009/10/Screenshot.png" alt="Screenshot" width="487" height="618" />缺点：只能发英文，每条都要输入验证码。</p>
<p>Error:English only,please.</p>
<p>发送 成功：Sent successfully.Thanks for your support. : )</p>
<p>立刻 就接收到了：</p>
<div><img src="https://www.google.com/voice/resources/2721923587-text_message.png" alt="Text_message" align="top" /> <strong> (425) 835-3390 </strong> (41 seconds ago) <a href="https://www.google.com/voice/m/caller?number=+14258353390">call</a></div>
<div><strong> (425) 835-3390: </strong> Send Free SMS Worldwide  &#8211; free of charge to send a short message to the world   (上午1:22)</div>
<p><a href="http://freesms.cloudapp.net/">http://freesms.cloudapp.net</a> 这个网站可能耐大了，能向全世界任何一部手机免费发送短消息，而且不用注册，而且是匿名。经我试验，是真的。号称是采用了云计算技术，唉，管不了那么多 了，能有免费的午餐就好。
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.lizhenglin.com/blog/">广陵散 `s 博客 lizhenglin.com</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.lizhenglin.com/blog/?p=725">Send Free SMS Worldwide &#8211; 免费向全世界发送短消息</a></p>
</div>
<p style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">文章的脚注信息由WordPress的<a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl插件</a>自动生成</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lizhenglin.com/blog/?feed=rss2&amp;p=725</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu下制作，安装USplash开机画面</title>
		<link>http://www.lizhenglin.com/blog/?p=723</link>
		<comments>http://www.lizhenglin.com/blog/?p=723#comments</comments>
		<pubDate>Fri, 09 Apr 2010 13:33:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[USplash]]></category>
		<category><![CDATA[制作]]></category>
		<category><![CDATA[安装]]></category>
		<category><![CDATA[开机画面]]></category>

		<guid isPermaLink="false">http://www.lizhenglin.com/blog/?p=723</guid>
		<description><![CDATA[来源：http://www.ningzai.net/2008/06/10/customize-and-install-a-usplash- theme-ubuntu/ 下了几个.so的USplash开机画面，不知道怎么装，上网查了一下，找到了，还顺带找到了制作USplash开机画面的方法。 1. 首先需要安装一个需要的包：BOGL。 sudo apt-get install libbogl-dev 2. 准备好一个用来做开机画面的.png，照着下面的步骤build出个.so文件，yourimage都是你自己的或自己想要的文件名（红字部分）。 把图片改名： cp yourimage.png usplash-artwork.png 从图片搞出个.c，好强悍： pngtobogl usplash-artwork.png &#62; usplash-artwork.c 编译成.o？ gcc -Os -g -I/usr/include/bogl -fPIC -c usplash-artwork.c -o usplash-artwork.o 继续gcc，搞成.so（才疏学浅，只能乱讲了）： gcc -shared -Wl,-soname,usplash-artwork.so usplash-artwork.o -o yourimage-splash.so 3. 在下面的位置建一个文件夹把刚才得到的或从网上下载的.so文件放进去，如果以前有这个文件夹就不用再新建了： sudo mkdir -p /usr/local/lib/usplash/ sudo cp yourimage-splash.so /usr/local/lib/usplash/yourimage-splash.so 4. 把splash加进alternatives系统里： sudo update-alternatives –install /usr/lib/usplash/usplash-artwork.so usplash-artwork.so /usr/local/lib/usplash/yourimage-splash.so]]></description>
			<content:encoded><![CDATA[<p>来源：http://www.ningzai.net/2008/06/10/customize-and-install-a-usplash- theme-ubuntu/</p>
<p>下了几个.so的USplash开机画面，不知道怎么装，上网查了一下，找到了，还顺带找到了制作USplash开机画面的方法。</p>
<p>1. 首先需要安装一个需要的包：BOGL。</p>
<p><strong>sudo apt-get install libbogl-dev</strong></p>
<p>2.  准备好一个用来做开机画面的.png，照着下面的步骤build出个.so文件，yourimage都是你自己的或自己想要的文件名（红字部分）。</p>
<p>把图片改名：<br />
<strong>cp yourimage.png usplash-artwork.png</strong></p>
<p>从图片搞出个.c，好强悍：<strong><br />
pngtobogl usplash-artwork.png &gt; usplash-artwork.c</strong></p>
<p>编译成.o？<strong><br />
gcc -Os -g -I/usr/include/bogl -fPIC -c usplash-artwork.c -o  usplash-artwork.o</strong></p>
<p>继续gcc，搞成.so（才疏学浅，只能乱讲了）：<strong><br />
gcc -shared -Wl,-soname,usplash-artwork.so usplash-artwork.o -o  yourimage-splash.so</strong></p>
<p>3. 在下面的位置建一个文件夹把刚才得到的或从网上下载的.so文件放进去，如果以前有这个文件夹就不用再新建了：<br />
<strong>sudo mkdir -p /usr/local/lib/usplash/<br />
sudo cp yourimage-splash.so  /usr/local/lib/usplash/yourimage-splash.so</strong></p>
<p>4. 把splash加进alternatives系统里：<br />
<strong>sudo update-alternatives –install /usr/lib/usplash/usplash-artwork.so  usplash-artwork.so /usr/local/lib/usplash/yourimage-splash.so 55</strong></p>
<p>5. 重新设置一下：<br />
<strong>sudo dpkg-reconfigure linux-image-$(uname -r)</strong></p>
<p>6. 重启看效果……哈哈！如果重启后的开机画面没了，变成一堆字符的话，恭喜，继续往下看。</p>
<p>7. 修改USplash的配置文件：<br />
<strong>sudo gedit /etc/usplash.conf</strong></p>
<p>在里面加入下面两行，你的显示器分辨率，如果原来里面有的话就改成你自己的，我的是1280＊800：</p>
<p><strong>xres=1280</strong></p>
<p><strong>yres=800</strong></p>
<p>红字换成你自己的分辨率。</p>
<p>8. 根据配置文件里面说的，还要update一下initramfs：<br />
<strong>sudo update-initramfs -u</strong></p>
<p>9. OK，重启，出来了。<br />
PS：如果你以后又想换回原来的开机画面，或者你安装了多个开机画面，想从里面选择一个，可以执行下面的命令选择alternatives：</p>
<p><strong>sudo update-alternatives –config usplash-artwork.so</strong>
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.lizhenglin.com/blog/">广陵散 `s 博客 lizhenglin.com</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.lizhenglin.com/blog/?p=723">Ubuntu下制作，安装USplash开机画面</a></p>
</div>
<p style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">文章的脚注信息由WordPress的<a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl插件</a>自动生成</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lizhenglin.com/blog/?feed=rss2&amp;p=723</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
