2010年3月31日 星期三

移植 rz / sz 公用程式到 BeagleBoard

使用 rz / sz 這兩支公用程式可以藉由 zmodem 協議將檔案在 PC 和 BeagleBoard 之間傳遞。雖然速率並不快,但對於一些小檔案偶爾還是很方便的。

移植時,我還是選擇 CodeSourcery Sourcery G++ Lite Edition 2009q3 這個 cross compiler。

首先下載 rzsz-3.48.tar.gz 這個源碼包。

wget -c http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz 

解開之後,修改它的 Makefile,先將 compiler 指定如下:

CC = arm-none-linux-gnueabi-

接著修改 sz.c 及 rz.c,均加入以下這行:

#define REGISTERED

或是將修改 Makefile 如下:

OFLAG = -O -DREGISTERED

最後,編譯完成取用 rz 及 sz 兩支公用程式即可。

make posix

2010年1月24日 星期日

如何建立 patch

假設要製作 Linux kernel 原始碼中 arch/arm/boot/Makefile 的 patch。首先準備好修改前後的檔案,例如 Makefile 及 Makefile.orig。然後使用 diff 指令產生兩個檔案的差異,指令如下:

LC_ALL=C TZ=UTC0 diff -up Makefile.orig Makefile > arch_arm_boot_makefile.patch

這時會得到以下的內容:

--- Makefile.orig 2010-01-14 01:26:36.000000000 +0000
+++ Makefile 2010-01-24 11:16:04.848551840 +0000
@@ -17,6 +17,16 @@ ifneq ($(MACHINE),)
include $(srctree)/$(MACHINE)/Makefile.boot
endif

+SEC_OUTDIR := $(shell if [ -f /etc/inetd.conf ]; then \
+ cat /etc/inetd.conf | grep in.tftpd | awk '{print $$8}'; \
+ elif [ -f /etc/xinetd.d/tftp ]; then \
+ cat /etc/xinetd.d/tftp | grep server_args | \
+ sed 's/^.*-s //g'; \
+ elif [ -f /etc/default/tftpd-hpa ]; then \
+ cat /etc/default/tftpd-hpa | grep OPTIONS | \
+ sed 's/^.*-s //g' | sed 's/\".*$//g'; \
+ fi)
+
# Note: the following conditions must always be true:
# ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
# PARAMS_PHYS must be within 4MB of ZRELADDR
@@ -56,8 +66,9 @@ $(obj)/compressed/vmlinux: $(obj)/Image
$(obj)/zImage: $(obj)/compressed/vmlinux FORCE
$(call if_changed,objcopy)
@echo ' Kernel: $@ is ready'
- cp -f arch/arm/boot/zImage /tftpboot/
- @echo ' Kernel: $@ is ready'
+ $(shell if [ -d $(SEC_OUTDIR) ]; then \
+ cp -f arch/arm/boot/zImage $(SEC_OUTDIR); fi)
+ @echo ' Kernel: $@ is also ready at $(SEC_OUTDIR)'

endif

但由於避免使用 *.orig 這類的名稱,且可以在最前面加上產生 patch 的指令,因此修改成如下:

diff -up old/arch/arm/boot/Makefile new/arch/arm/boot/Makefile
--- old/arch/arm/boot/Makefile 2010-01-14 01:26:36.000000000 +0000
+++ new/arch/arm/boot/Makefile 2010-01-24 11:16:04.848551840 +0000
@@ -17,6 +17,16 @@ ifneq ($(MACHINE),)
include $(srctree)/$(MACHINE)/Makefile.boot
endif

+SEC_OUTDIR := $(shell if [ -f /etc/inetd.conf ]; then \
+ cat /etc/inetd.conf | grep in.tftpd | awk '{print $$8}'; \
+ elif [ -f /etc/xinetd.d/tftp ]; then \
+ cat /etc/xinetd.d/tftp | grep server_args | \
+ sed 's/^.*-s //g'; \
+ elif [ -f /etc/default/tftpd-hpa ]; then \
+ cat /etc/default/tftpd-hpa | grep OPTIONS | \
+ sed 's/^.*-s //g' | sed 's/\".*$//g'; \
+ fi)
+
# Note: the following conditions must always be true:
# ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
# PARAMS_PHYS must be within 4MB of ZRELADDR
@@ -56,8 +66,9 @@ $(obj)/compressed/vmlinux: $(obj)/Image
$(obj)/zImage: $(obj)/compressed/vmlinux FORCE
$(call if_changed,objcopy)
@echo ' Kernel: $@ is ready'
- cp -f arch/arm/boot/zImage /tftpboot/
- @echo ' Kernel: $@ is ready'
+ $(shell if [ -d $(SEC_OUTDIR) ]; then \
+ cp -f arch/arm/boot/zImage $(SEC_OUTDIR); fi)
+ @echo ' Kernel: $@ is also ready at $(SEC_OUTDIR)'

endif

那麼怎麼使用這個 patch 呢?指令很簡單,如下:

patch -d $PWD/s3c6410-linux-2.6.27 -p1 < arch_arm_boot_makefile.patch

就可以用這個 patch 去修改 $PWD/s3c6410-linux-2.6.27/arch/arm/boot/Makefile 了。

延伸閱讀:

2010年1月22日 星期五

網路評論員?五毛黨?

最近看到「五毛黨」這個名詞,一時還想不出來是什麼,於是上網查了查,原來所謂「五毛黨」,指得就是網路評論員,是由政府部門聘雇在網路上發表評論的一群人。任務是主動導帖、積極跟帖、適時轉帖,特別是在發生突發事變的關鍵時刻,他們更肩負著引導網上輿論的重責大任。

在中時電子報對「五毛黨」的報導中提到:

根據網傳的「五毛黨」工作方法,他們日常工作是按照網站區分小組,並主要入侵熱門網站,對於某些人氣不錯的論壇,網友信用度比較高,這時「首先要做的是製造一種混亂,通過似是而非的文章進行干涉,跟帖做非理性的故意曲解、製造誤會和爭辯,轉移網民的注意力。」

在維基百科也可以找到以下這段說明:

在中國大陸,「網路評論員」最早出現南京大學官方BBS——南京大學BBS上。在小百合BBS拒絕按照官方命令進行整改,宣布關站之後,南京大學校方在原有域名上開設官方版本的南京大學BBS,指令學生會幹部及一部分熱心上進人士為「網評員」,「納入學校勤工助學體系,根據每月的考評結果發給適當的勤工助學補助」。這些網評員的主要職責是,「南京大學電子論壇通過發帖發布正面信息,跟帖回應抵制消除負面信息,營造積極健康的校園網路環境,同時對校內外網站上有關學校的重要信息及時上報學校網路管理工作領導小組辦公室」。隨後各個學校紛紛招聘網路評論員。

哈!原來如此,講白了不過就是中共當局用來控制、導引人民思想的一個棋子嘛!

延伸閱讀:

2009年12月27日 星期日

移植 Busybox 1.15.3 到 BeagleBoard

首先下載 Busybox 1.15.3CodeSourcery Sourcery G++ Lite Edition 2009q3

將 Busybox 1.15.3 解開,並修改 Makefile 裡的 CROSS_COMPILE 如下:

CROSS_COMPILE ?= arm-none-linux-gnueabi- 

然後編譯 Busybox:

$ make defconfig
$ make
$ make install

到這裡已經備妥 Busybox 了。

接著使用 dd 指令建立一個 64MB 大小的檔案(rootfs-1.15.3-2009q3.bin),並格式化為 ext2 格式。

$ dd if=/dev/zero of=rootfs-1.15.3-2009q3.bin bs=1024 count=65536
$ sudo mkfs.ext2 rootfs-1.15.3-2009q3.bin

建立 file system 除了需要 Busybox 外,還需要再編寫像是 etc/inittab 及 etc/profile 等設定檔,這些檔案可以在 Busybox 的原始碼裡的 examples 和 examples/bootfloppy 目錄裡找到範例,此外也可以利用 BeagleBoard 的範例,例如從 http://code.google.com/p/beagleboard/downloads/list 下載 rd-ext2-8M.bin 及 ramdisk_revc_v3.gz 來取得範例。

$ sudo mount -o loop rootfs-1.15.3-2009q3.bin /tmp/rootfs
$ sudo mount -o loop rd-ext2-8M.bin /tmp/orig

將 rootfs-1.15.3-2009q3.bin 掛載在 /tmp/rootfs,並將當參考範例的 rd-ext2-8M.bin 掛載在 /tmp/orig,然後將編譯後的 Busybox 複製到 /tmp/rootfs,並從 cross compiler 複製需要的 libc。

$ (cd ./busybox-1.15.3/_install/ && sudo tar cf - .) | \
(cd /tmp/rootfs/ && sudo tar xvf -)

$ (cd /opt/CodeSourcery/arm-2009q3/arm-none-linux-gnueabi/libc/lib/ \
&& sudo tar cf - .) | (cd /tmp/rootfs/lib/ && sudo tar xvf -)

再取用 rd-ext2-8M.bin 的 etc 目錄。

$ (cd /tmp/orig/etc/ && sudo tar cf - .) | \
(cd /tmp/rootfs/etc/ && sudo tar xvf -)

最後再建立 console 及 null 兩個裝置節點,基本上 file system 就建立完成了。

sudo mknod -m 600 console c 5 1
sudo mknod -m 666 null c 1 3

OK~~~以下是這個 file system 在 BeagleBoard 執行起來後的訊息摘錄:

VFS: Mounted root (ext2 filesystem) on device 1:0.
Freeing init memory: 120K

beagleboard.org (v0.90) : System initialization...

Kernel release : Linux 2.6.32-rc8-06879-g4355c41
Kernel version : #1 Sun Nov 29 12:20:43 CST 2009

Mounting /proc : [SUCCESS]
Mounting /sys : [SUCCESS]
Mounting /dev : [SUCCESS]
Mounting /dev/pts : [SUCCESS]
Enabling hot-plug : [SUCCESS]
Populating /dev : [SUCCESS]
Mounting other filesystems : [SUCCESS]
Starting syslogd : [SUCCESS]
Starting telnetd : [SUCCESS]
/etc/init.d/rcS: line 100: can't create /sys/power/fb_timeout_value: nonexistent directory
Jan 1 00:00:04 beagleboard syslog.info syslogd started: BusyBox v1.15.3

System initialization complete.

Please press Enter to activate this console.

延伸閱讀:

2009年10月7日 星期三

使用 SyntaxHighlighter

什麼是 SyntaxHighlighter 呢?在它的網站上可以找到以下這段解釋:

SyntaxHighlighter is a fully functional self-contained code syntax highlighter developed in JavaScript.

它採用了 LGPL 3

在 SyntaxHighlighter 1.5.1 版以前,SyntaxHighlighter 是放在 Google code 上的,根據 http://code.google.com/p/syntaxhighlighter/ 網頁上的說明,自 SyntaxHighlighter 2.0 版開始則搬家到 http://alexgorbatchev.com/wiki/ 了。

SyntaxHighlighter 吸引我的理由是它會自動為程式碼加上「行號」,這點比 google-code-prettify 優,因為如此一來當程式碼篇幅較大時,閱讀起來也方便許多。但 SyntaxHighlighter 在使用時除了框住程式碼,還得告訴它這段程式碼所使用的語言,相較之下,google-code-prettify 又較為聰明。

不過,SyntaxHighlighter 的設定相對地也麻煩些,之前嘗試使用 1.5 版時,總是被 <br /> 搞得快瘋了,怎麼弄都搞不定。幸好 SyntaxHighlighter 2.0 在設定上比起 1.5 / 1.5.1 版問題少了些。

同樣地,進入 Blogger 版面配置的「修改 HTML」裡,然後將以下這段加到 <head> 及 </head> 之間。


<link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shCore.css"/>
<link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shThemeDefault.css" id="shTheme"/>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shCore.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shLegacy.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushBash.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushCpp.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushCSharp.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushCss.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushDelphi.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushDiff.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushGroovy.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushJava.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushJScript.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushPhp.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushPlain.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushPython.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushRuby.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushScala.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushSql.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushVb.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushXml.js"></script>
<script type='text/javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.ClipboardSwf = 'http://http://alexgorbatchev.com/pub/sh/2.0.320/scripts/clipboard.swf';
SyntaxHighlighter.all();
</script

http://alexgorbatchev.com/wiki/SyntaxHighlighter 上提供了 Hosting 的使用方法,這裡我選擇使用 2.0.320 這個版本,原本我嘗試使用 current 的連結,但似乎有點問題,始終無法正確描繪程式碼的 Syntax,所以最後修改成使用 2.0.320 這個版本。

儲存之後,張貼程式碼只要使用 <pre class="brush: js"> </pre> 這樣的語法將程式碼框住就可以了。

不過,SyntaxHighlighter 需要指定程式碼所使用的語言,其中例如 class="brush: js" 表示這段程式碼使用 Javascript。在 http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes 這一頁裡列出了 SyntaxHighlighter 支援的語言種類。以下列出其中幾個:

  1. Bash / shell:class="brush: bash" 或 class="brush: shell"
  2. C#:class="brush: c-sharp"
  3. C++:class="brush: cpp" 或 class="brush: c"
  4. Diff:class="brush: diff" 或 class="brush: patch"
  5. Java:class="brush: java"
  6. Python:class="brush: python"
  7. XML:class="brush: xml"

延伸閱讀:

2009年10月6日 星期二

使用 google-code-prettify

什麼是 google-code-prettify 呢?在它的網站上解釋得其實很簡潔、清楚:

syntax highlighting of code snippets in a web page

google-code-prettify 最吸引我的理由就是它簡單、易用,不但容易設定,在使用上也相對地非常方便,而且最方便的就是只要框住程式碼,並不需要告訴 google-code-prettify 那段程式碼是什麼語言,因為 google-code-prettify 會自動判斷。不過呢…它的一個小小缺點就是不會自動為程式碼加上行號。

那,怎麼設定使用 google-code-prettify 呢?

進入 Blogger 版面配置的「修改 HTML」裡,然後將以下這段加到 <head> 及 </head> 之間。

<link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" type="text/css" rel="stylesheet" /> 
<script type="text/javascript" src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js"></script>

嘿!這裡用了點偷懶的方法,直接從 subversion 中取用 prettify.css 及 prettify.js 這兩個檔案。

接著找到 <body>,將它修改為 <body onload="prettyPrint()">。

儲存之後,當要張貼程式碼時,只要使用 <pre class="prettyprint"> </pre> 或 <code class="prettyprint"> </code> 框住整段程式碼就 OK 了。

延伸閱讀: