Monday, March 30, 2009

如何利用网络学习

来自Lifehacker的文章: Top 10 Tools for a Free Online Education [Lifehacker Top 10], 文中介绍了Google Code University, 适合CS (Computer Science) 专业学生学习. 通过Personal MBA网站来学习MBA课程. 如果你是一个Linux新手, 那么可以看看Ubuntu Guide, 里面详细介绍了Linux下的各种软件和一些历史故事. Mango Languages的课程可以帮助你学习11门外语 (其实还有一门是汉语...). Lifehacker的另一篇文章还收集了各种乐器的网上教程, 前提是你的听力得很好, XD. 最后是包括MIT (麻省理工学院), Stanford University (斯坦福大学), Carnegie Mellon University (卡耐基梅隆大学), University of California, Berkeley (加州大学伯克利分校), Princeton University (普林斯顿大学), University of Washington (华盛顿大学) 等众多学校的各种网络课程, 顺便抱怨下为何中国的高校如此封闭.

Saturday, March 28, 2009

Gmail也能用Twitter!


上篇介绍了Twitter的一个桌面客户端, 昨天猛然发现Gmail也能用Twitter! 来自Lifehacker的介绍, TwitterGadget满足了我的需求, 除了没有提醒功能以外, 其它都比桌面客户端好上不少.

如果你想使用的话, 需要先打开Gmail Labs中的Add any gadget by URL功能, 然后在Settings的Gadgets里添加以下网址: http://www.twittergadget.com/gadget_gmail.xml, 这样就可以使用了.

Friday, March 27, 2009

Twitter桌面客户端——Gwibber

Gwibber
自从开始用Twitter, 就用上了LinuxTOY上介绍的Gwibber, 但默认主题不是很好看, 又换上了一老外制作的主题: Gilouche, 还挺漂亮的.

Ubuntu用户可以参考官方Wiki进行安装, 用的是Launchpad的PPA源. 并且Gwibber已经进入了9.04的官方源, 这下可方便多了.

免费字体网站

Lifehacker的文章Killer Typography Tools and Free Font Downloads [Fonts]里收集的, 发现好看的英文真是多, 相比之下中文就要少很多了, 毕竟中文文字既复杂又繁多.
我比较喜欢第二个和第三个网站, 第二个的字体都很好看, 第三个则很有趣, 都是些电影标题的字体, 比如我去下了个The Lord of the Rings的.

对blog布局的一点小改进

把原来长长的标签列表替换成了标签云, 其实早就想弄了, 可是因为懒, 一直没弄... 早上闲来无事, 就下决心弄了. 代码全部参考这篇文章的, 只有颜色和字体部分修改了下. 啧啧~ 这下可以节省很多空间了.

然后就是把常用的Web 2.0服务聚合在一起了, 这样访问起来也方便点, 至少方便了我自己, XD

下面是标签云的代码, 因为那篇文章没有排版, 所以就贴一下, 代码的具体位置还是要参考原文:
/* Label Cloud Styles
----------------------------------------------- */
#labelCloud
{
  text-align: center;
  font-family: sans, arial, sans-serif;
}

#labelCloud .label-cloud li
{
  display: inline;
  background-image: none !important;
  padding: 0 5px;
  margin: 0;
  vertical-align: baseline !important;
  border: 0 !important;
}

#labelCloud ul
{
  list-style-type: none;
  margin: 0 auto;
  padding: 0;
}

#labelCloud a img
{
  border: 0;
  display: inline;
  margin: 0 0 0 3px;
  padding: 0
}

#labelCloud a
{
  text-decoration: none
}

#labelCloud a:hover
{
  text-decoration: underline
}

#labelCloud li a {}

#labelCloud .label-cloud {}

#labelCloud .label-count
{
  padding-left: 0.2em;
  font-size: 9px;
  color: #000;
}

#labelCloud .label-cloud li:before
{
  content: "" !important;
}

...

<script type='text/javascript'>
  // Label Cloud
  var lcBlogURL = "http://xiaogaozi.blogspot.com";
  var maxFontSize = 25;
  var maxColor = [23,92,162];
  var minFontSize = 15;
  var minColor = [82,139,197];
  var lcShowCount = false;
</script>

...

<b:widget id='Label1' locked='false' title='Cloud' type='Label'>
  <b:includable id='main'>
    <b:if cond='data:title'>
      <h2><data:title/></h2>
    </b:if>
    <div class='widget-content'>
      <div id='labelCloud'/>
      <script type='text/javascript'>
        function s(a, b, i, x)
        {
          if(a &gt; b)
          {
            var m = (a - b) / Math.log(x), v = a - Math.floor(Math.log(i) * m);
          }
          else
          {
            var m = (b - a) / Math.log(x), v = Math.floor(Math.log(i) * m + a);
          }
          return v;
        }
        var ta = 0;
        var c = [];
        var labelCount = new Array();
        var ts = new Object;
        <b:loop values='data:labels' var='label'>
          var theName = &quot;<data:label.name/>&quot;;
          ts[theName] = <data:label.count/>;
        </b:loop>
        for (t in ts)
        {
          if (!labelCount[ts[t]])
          {
            labelCount[ts[t]] = new Array(ts[t]);
          }
        }
        tz = labelCount.length-1;
        lc2 = document.getElementById('labelCloud');
        ul = document.createElement('ul');
        ul.className = 'label-cloud';
        for(var t in ts)
        {
          for (var i = 0; 3 &gt; i; i++)
          {
            c[i] = s(minColor[i], maxColor[i], ts[t] - ta, tz);
          }
          var fs = s(minFontSize, maxFontSize, ts[t] - ta, tz);
          li = document.createElement('li');
          li.style.fontSize = fs + 'px';
          li.style.lineHeight = '1';
          a = document.createElement('a');
          a.title = ts[t] + ' Posts in ' + t;
          a.style.color = 'rgb('+c[0]+','+c[1]+','+c[2]+')';
          a.href = lcBlogURL + '/search/label/' + encodeURIComponent(t);
          if (lcShowCount)
          {
            span = document.createElement('span');
            span.innerHTML = '('+ts[t]+') ';
            span.className = 'label-count';
            a.appendChild(document.createTextNode(t));
            li.appendChild(a);
            li.appendChild(span);
          }
          else
          {
            a.appendChild(document.createTextNode(t));
            li.appendChild(a);
          }
          ul.appendChild(li);
          abnk = document.createTextNode(' ');
          ul.appendChild(abnk);
        }
        lc2.appendChild(ul);
      </script>
      <noscript>
        <ul>
          <b:loop values='data:labels' var='label'>
            <li>
              <b:if cond='data:blog.url == data:label.url'>
                <data:label.name/>
                <b:else/>
                <a expr:href='data:label.url'><data:label.name/></a>
              </b:if>
              (<data:label.count/>)
            </li>
          </b:loop>
        </ul>
      </noscript>
      <b:include name='quickedit'/>
    </div>
  </b:includable>
</b:widget>

Blogger的定制性还是很强的, 只要你懂HTML或者JavaScript, 对于我这样暂时不想去折腾个人网站的人来说足够了.

Thursday, March 26, 2009

Window$ Server 2008中启用Media Player

想听点网上流媒体的音乐, 发现还没启用Media Player, 找了半天都没找到在哪... 费尽千辛万苦, 终于在一个角落找到了, 囧

Start->Server Manager->Features->Add Features, 然后勾选Desktop Experience, 如下图:
Desktop Experience

重启就OK了.

今天晚上关于 iGoogle 的讲座

今天晚上Google来学校搞了个iGoogle大赛的讲座, 这个当然不能错过, 即使是逃课去的~ 嘿嘿~

技术总监
Google的技术总监, 还是很强的, 至少是在国外呆过一段时间. 演讲才能很棒, 而且中途也不是一味地套用幻灯片来讲, 会穿插很多实例和小故事, 很有趣~

Gmail!
Gmail图案包装的日历, 当时那个想要啊, 就想了个问题举手了, 很幸运地得到了最后一次提问机会, 然后很幸运地得到了这个奖品. 终于得到实体版的Google Calendar了, 呵呵~ 不过包装后来被那小妮子很暴力地扯烂了...

便签
里面还附赠了两套便签纸, 本来想让那小妮子写自己的名字的, 结果就写了这个, XD

对了, 我问的问题是Google内部使用最广泛的语言是什么? 回答是C和C++, 道理很简单, 速度. 还告诉我不是什么传说中的JS和Python, 这两种因为在用户界面上使用较多, 所以产生了一种误导.

Saturday, March 21, 2009

关于JS的跨域访问

上周在写一个小工具, 简易的字典翻译功能. 由于用的是其它网站的字典数据, 所以最大的技术细节就是跨域访问了. 什么是跨域访问? 说白了就是访问非本地服务器上的内容. 比如我想通过我这台服务器上的网页来查看其它网站的内容就属于这种情况. 这种行为在JS中是严厉禁止的, 被叫做"The Same-Origin Policy"

当然, 网上也流传着很多破解这条规定的方法. 有通过在server上配置"代理"的, 有调整Apache配置的, 还有通过<iframe><script>标签来迂回的. 对于第二种, 通用性不高, 要是遇到非Apache服务器就没辙了. 第三种, 恕我才疏学浅, 看了几篇文章都没搞明白到底该怎么弄. 第一种倒是在几篇文章的帮助下成功了, 遂记之.

首先讲下原理, 由于JS被禁止直接访问, 所以我们就采用迂回战术, 通过服务器上另一个页面作为中转, 再传递给JS处理, 这个和平时使用的通过代理服务器来中转, 以便查看一些被墙的网页是一个道理.

我用的是PHP页面来作为中转, 这个页面的功能是把目标网页的源代码传送回来. 代码是用的这个网站的, 里面也介绍了上面的另外两种方法, 有兴趣的同学可以去看看.
$ cat proxy.php
<?php
$url = $_GET['path'];
$session = curl_init($url);

// Don't return HTTP headers. Do return the contents of the call.
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
// Make the call.
$html = curl_exec($session);

// The web service returns HTML.
header("Content-Type: text/html; charset=gbk");

echo $html;
curl_close($session);
?>
需要注意的是, 这段代码要求server的PHP具有cURL模块的支持. 非常不爽的一点就是, Win下PHP只需要改下配置文件就可以使用cURL了, 而Linux下则必须重新编译一次PHP才行. 你需要先下载cURL, 然后是常规的编译安装三部曲, 具体的编译参数可以参照./configure --help自行调整:
$ ./configure --enable-http --enable-file
$ make
$ sudo make install
接着是编译PHP, 在编译参数里面添加两个参数:
$ ./configure --with-curl=/usr/local --with-curlwrappers
/usr/local是默认安装地址, 如果你没有改的话. 最后修改PHP的配置文件, 添加:
extension=curl.so
这样上面那段PHP代码就能正常执行了.

有了上面PHP的支持, 剩下的操作就易如反掌了, 和本地就没什么区别了, 想怎么弄就怎么弄, 嘿嘿~ 思路上很大程度上是受了这篇文章的影响, 虽然最后没有用上文中介绍的JSON, 但还是发现JSON是个很好很强大的东西. 下面的JS代码示例中用了jQuery中的API作为AJAX的简化操作, 这也是我第一次用jQuery, 发现这个也挺爽的, 包装了很多有用的功能, 也算偷了下懒. 示例代码部分:
$.get(
       "proxy.php",
       { path: "http://www.google.com/" },
       function(data)
       {
         // Do something on data...
       },
       "html"
     );
余下的就看你的需求了, end.

Friday, March 13, 2009

Grass-mud Horse

Chinese Subvert Censorship With a Popular Pun

囧, 老外也够无聊的~

Round 1: AC

作为一个标准的ACM菜鸟, 我成功地花了近一周的时间AC了一道题...

好吧, 其实我之前一直在考虑要不要写下来的, 毕竟这也不是什么好的成绩, 不过后来觉得还是写下来小庆祝一下吧, 成功的一小步, 未来的一大步~

题目是高精度求幂, 开始我还很傻很天真地用pow()来解决, 历史和现实证明这种幼稚加无知的想法是要不得滴. 后来在Discuss里得到了些启发, 就一直朝着那个方向走, 最后呢? 两次WA加两次AC. (第一次WA是因为太激动了, 忘了把代码中用来调试的语句删了...)

为什么是两次AC呢? 因为我闲得没事就去试了试GCC和C两种方式的提交, 结果居然还是有差别的, 见下图:
1001

话说传说用Java很简单, 有人只用了30多行就搞定了, 而我用了200行... 不过看了下用Java的最快的也没我快 (XD), 看来Java虽然简化了很多东西, 但性能上实在是不怎么样.

准备再建个项目用来放ACM的代码了, 不过等我积累多点以后再说吧~

Wednesday, March 11, 2009

英文环境下的中文美化

今天换到了英文local, 可中文显示都变成了难看的点阵 (关于点阵和矢量, 仁者见仁, 智者见智), 于是乎, 到处去寻求解决方法. 在比较了各种方案以后, 选择了一种比较简便的.

首先, 你不需要把Appearance中的字体都改成中文, 虽然那样也行, 但由于我用的是文泉驿正黑, 而我又不喜欢正黑的英文效果, 所以我保持了默认的设置, 如下图:
Appearance

我们需要做的是修改一个配置文件就好了.
$ sudo fontconfig-voodoo -f -s zh_CN
$ sudo vim /etc/fonts/conf.d/69-language-selector-zh-cn.conf
...
<match target="pattern">
<test qual="any" name="family">
<string>serif</string>
</test>
<edit name="family" mode="prepend" binding="strong">
<string>Bitstream Vera Serif</string>
<string>DejaVu Serif</string>
<string>WenQuanYi Zen Hei</string>
<string>AR PL UMing CN</string>
<string>AR PL ShanHeiSun Uni</string>
<string>AR PL UKai CN</string>
<string>AR PL ZenKai Uni</string>
</edit>
</match>
...
WenQuanYi Zen Hei放到了最上面, 也就是渲染中文字体的时候优先选择文泉驿正黑, 然后重启就好了.

English & Chinese

Saturday, March 7, 2009

截图软件推荐: Shutter

Shutter
TX对这个软件做了详细的介绍, 试用了一下, 觉得挺不错的, 可以满足我现阶段的所有需求, 以前一直就想找这样的软件. 大家可以到这里下载, Ubuntu的用户还可以设置第三方源, 教育网虽然访问Launchpad慢点, 但是下载时间还可以忍受 (不像VBox的源...)

Thursday, March 5, 2009

又建了一个项目 -- texsky

今天在Google Code上又给自己建了个项目: texsky, 专门用来存放我个人的LaTeX文档和源文件. 作为第一个上传进去的文档, 是前几天写的关于安装和配置LAMP的小手册, 吾以为写得那叫一个细致, 完全不是Blog上的风格, 估计只要不是文盲再加点RP看完这个都能用上自己编译的LAMP (当然, 不包括L, XD).

typeof, ISO C, GCC, 没有空格的代码, 奇怪的比赛

这个故事的起源是Matrix67博客上的一篇文章, 一个叫做Time Limit Exceeded的创意编程比赛有一道很有意思的题: Compile Error, 这道题不允许代码中出现空格. 一个最简单的问题就是像 int a; 中的空格如何避免, Matrix67的文章中提到可以用typeof解决. 昨天Ray提醒我这个typeof在C语言里没见过, 然后我就一直想啊, 这个typeof是个什么东西啊. 查了一下才知道, 原来typeof不是标准C/C++中的关键字, 目前GCC提供了对typeof的支持, 这里有详细的解释, 里面有一个绝妙的例子, 可以在C中实现类似C++中Template的功能. 这是Wikipedia上关于typeof的解释: http://en.wikipedia.org/wiki/Typeof, 在C#、JS中也有这个关键字, 不过细节上有差别.

好了, 弄清了typeof的来龙去脉以后, 再回到那个编程比赛上. 现在我们就有了一种方法来避免空格了:
typeof(int)a;
本来以为这个已经够难想到的了, 不过又发现了一个更简单, 且很好理解的方法:
int(a);

没想到一个typeof引申了这么多东西出来, 真是神奇~

Sunday, March 1, 2009

Wine之Diablo II: Lord of Destruction

Diablo II: Lord of Destruction
用的同学的硬盘版, 果然我的强劲集成显卡适合这种高端游戏 XD