2008年12月17日 星期三

2008 日本關西之五

[伏見稻荷大社]
第七天 因為是最後一天,隊友們都想睡到自然醒,所以還是獨自行動
首先,從京都車站搭乘JR到 伏見稻荷大社 一遊,神社就在JR稻荷站的對面
這個神社可是日本全國各地的稻荷神社之首,祭祠稻荷神,使者是狐貍
還有超多的鳥居,由來此許願的人所捐款豎立的,形成 "千本鳥居" 的特色
JR奈良線 稻荷站

[宇治 平等院]
接著繼續搭上JR前往宇治,而宇治可去的地方很多,也是源氏物語的主要舞台
但是今天只有半天的時間,所以直接去看最有名的 平等院,又稱為 鳳凰堂
在安平時代就建造了平等院,10元日幣背面的圖案就是這個了
JR奈良線 宇治站

到了宇治記得要吃吃有加抹茶粉的 抹茶霜淇淋喔~

由京都去關西空港時,使用 KANSAI THRU PASS,從京都車站搭近畿日本鐵道的宇治線
-> 大和西大寺站 轉 奈良線 -> 難波站 轉 南海電鐵的南海空港線

- 完 -

2008年12月14日 星期日

2008 日本關西之四

[京都市區]
第六天雨停了,可以租自轉車,今天要騎車來逛京都市區
KCTP 有提供自轉車出租,而且設有幾個不同的服務處可以取車、還車
這次是在錦市場附近的 Co-op Inn Kyoto Hotel 租的,離我們住的旅館也最近

以下是今天的路線:

順著河原町通往北走,先到達 下鴨神社 以及更北一點的 上賀茂神社,兩個都是京都最古老的神社


之後轉到堀川通往南走,會先到 晴明神社,就在西陣織會館旁邊
這是祭祠陰陽師安倍晴明的神社,陰陽師迷必來的地方,五芒星的繪馬是其特色


再往南走是 東、西本願寺,和前述所參觀的神社不同的是,本願寺是佛教的寺廟
在此可體驗到傳統的日本佛教及有別於神社的寺廟建築


本願寺之後便去附近的 涉成園,這是一個優美的日式庭園,屬於東本願寺的別院

最後一站是位於七條通上的 三十三間堂,其名稱是因為正殿內有33根立柱隔開的間隔
三十三間堂最有看頭的是供奉著1001座千手觀世音菩薩像,非常壯觀,不過裏面是禁止攝影的喔

回程則走川端通,沿著鴨川北上,騎車回到祗園及四條河原町

2008年12月9日 星期二

2008 日本關西之三

[時代祭]
第四天(10/22)在京都有兩個祭典,中午開始的是京都每年三大祭之一的 時代祭,晚上則是鞍馬的火祭


於是早上就先從大阪移動到京都,並且在四條河原町本店享用傳說中的 "名代豬排",接著時代祭就開始了
時代祭的遊行路線是從京都御所至平安神宮,我們就在河原町通的市役所附近觀看


整個祭典是以時光倒流的方式呈現,由明治維新開始往前演示日本歷史上的各個時代
很可惜的是天氣不好,遊行開始沒多久就下起雨了,而且連下三天的雨...
地下鐵東西線 京都市役所前站

[鞍馬火祭]
火祭是在鞍馬的由岐神社舉行,由 18:00開始到 24:00才結束,整個祭典活動的時間相當長
但是遊客超多,為了避開回程時可能遇到的人潮,火祭看了兩個小時我們就離開了
這時都是在進行點火把的儀式,其實祭典的主要部份還沒開始吧~
叡山電車鞍馬線 鞍馬站

[天橋立]
第五天大家安排京都的市區觀光,我就去有日本三景之稱的 "宮津天橋立"
天橋立位於京都府西北方的宮津灣內,其特色是有一條狹長的沙洲,而且沙洲可是長滿了松樹
沙洲的兩邊都有通往小山丘的纜車,在山丘上彎腰由胯下望去時,沙洲就好像天上的一座橋
這次是由 JR天橋立站開始步行走過 "天橋" 到對岸的傘松公園,再坐船回來


不過去天橋立要花不少時間,最簡單的交通方式是搭 JR從京都車站至天橋立站的直達車
詳情可見官方網站 http://www.amanohashidate.jp/index.html

2008年11月23日 星期日

2008 日本關西之二

[四天王寺]
第一天從機場出關、坐電車到大阪市,再找到旅館做完Check In,時間已經是下午四點了
決定去位於旅館同一區的四天王寺,但是最後進場時間是15:30,晚了一步,殘念~
地下鐵谷町線 四天王寺前夕陽之丘站 4號出口


[姬路城]
第二天去姬路城,位於兵庫縣姬路市的城堡。從大阪市區過去的話,距離稍遠,但是很值得去
因為這個城存保得很好,加上外觀典雅,城的內部也有看頭,同時也是世界遺產喔
這裏如果慢慢逛,可以待一整個下午
山陽電鐵本線 山陽姬路站


[心齋橋+道頓堀]
心齋橋是一條長長的商店街,是瞎拼、敗家的好地方。而道頓堀是美食區,就在心齋橋的旁邊
在這裏當然就是盡情的買東西、吃東西啦~
地下鐵御堂筋線 心齋橋筋站

[和歌山城]
第三天所有人都去環球影城了,因為之前去過一次,所以今天決定去和歌山城以及拜訪貓咪站長
和歌山地區有不少可去之處,但礙於交通及時間問題,上午只去了和歌山城
其實昨天才去過姬路城,相較之下,和歌山城就遜色不少...
JR阪和線 和歌山站 再轉公車


[貴志 貓咪站長]
下午則乘坐 JR貴志川線,去看看日本鐵道的超級站長 たま
這條鐵路支線原本沒什麼人氣,而終點站 貴志 是一個無人車站,倒是車站的商店老闆
養了一隻三色貓 たま,鐵路公司為了振興該線的運輸量,想到任命 たま 擔任貴志站站長的點子
果然貓咪站長馬上爆紅,後來還升官成為 "超級站長" 了呢!!


貴志川線官網 http://www.wakayama-dentetsu.co.jp/

2008年11月7日 星期五

2008 日本關西之一

公司的員工旅遊組成關西自助團,10/19-10/25 有7天的時間

[交通手段]
1. 關西地區使用 KANSAI THRU PASS 3日卷,這是可在關西一帶乘坐地鐵、私鐵、巴士
的優惠卡,適合長距離移動
2. 大阪市內使用 大阪一日周遊卷,除了可乘坐電車、巴士外,還有送許多的折價卷或免費卷
3. 京都市內使用 City Bus All-day Pass,一日內可不限次數的乘坐市公車
4. 京都自轉車出租 KCTP,京都的景點多分布在市區內,加上沒有太多的地形起伏,適合
騎腳踏車,不過要注意行車的方向和台灣是相反的

[行程規劃]
由於京都、大阪之前已經來過二次了,所以這次的行程都排一些不曾去過的地方
此外,10/22 在京都有時代祭以及鞍馬火祭二個祭典,是這次關西之旅的重頭戲

Day.1
台北 -> 關西空港(購買 KANSAI THRU PASS) -> 大阪市區(使用大阪一日周遊卷)
四天王寺
梅田

Day.2
姬路城(使用 KANSAI THRU PASS)
心齋橋、道頓堀

Day.3
和歌山城
貴志站 貓咪站長
心齋橋、道頓堀

Day.4
大阪 -> 京都(使用 KANSAI THRU PASS)
本能寺
時代祭
鞍馬火祭

Day.5
宮津 天橋立(坐 JR的直達車來回)
四條河原町

Day.6 (租自轉車)
下鴨神社、上賀茂神社、晴明神社
東本願寺、西本願寺、涉成園、三十三間堂
四條河原町

Day.7
伏見稻荷大社
宇治 平等院
京都 -> 關西空港(使用 KANSAI THRU PASS) -> 台北

[住的地方]
1. 大阪 Sheraton Miyako Hotel Osaka(大阪喜來登都飯店)
2. 京都 Hotel Mystays Kyoto Shijo

2008年9月7日 星期日

再上六十石山

每年的8月底至9月初這段時間正是花蓮的金針花季
那就出發吧(8/30~9/1)!!

第一天從台北開始,北宜高速公路一路順暢,先到南澳走一小段朝陽步道
為何走一小段呢?? 因為天氣熱,而且部份團員不喜步道,下次再來走完全程吧~

接著直接開車到花蓮的七星潭,在這用過午餐後,順著台9線往花蓮市走
路上會經過 "松園別館",原本是日治時期的軍官休憩所,為二層樓的洋房建築
位於美崙坡上,視野不錯
晚上就在花蓮市逛街、逛夜市~

第二天早上計劃要走砂卡礑步道,但步道維修中... 未開放,那就走另一條白楊步道吧

白楊步道全長2公里多,最大的驚奇是位於終點的 "水濂洞"
因挖掘到地下水脈而在洞內形成小型的瀑布,是個非常特別的景觀
由於洞內有水又很暗,所以沒拍照,請自行想像~

整條步道會通過多處且很黑暗的隧道,需帶照明設備,其中一處還有看到蝙蝠耶
此外,要準備雨衣再進入水濂洞,否則全身會淋濕的

下午前往六十石山,中途到林田山林業文化園區逛逛
這裏算是一個林業博物館吧
第三天凌晨便到山頂的忘憂亭卡位,從天黑至天亮這段時間是六十石山最美的時刻
前一次來到六十石山是在2004年的9月初,那時運氣很好,清晨的縱谷有雲海
這次雖然沒有雲海,卻有日出,也是一樣好運~

這次住的兩間民宿服務都很不錯,推~
1. 花蓮市 - 情定花蓮民宿
2. 六十石山 - 鐵掌櫃茶舍

2008年8月3日 星期日

單車遊記 - 桶后林道

今天(8/2)決定早起,去騎傳說中很美的桶后林道

桶后林道要從烏來進入,不想騎 新店-烏來 這段,就用 4+2 先開車到烏來停車場
接下來換成自行車,過烏來橋後左轉台9甲往孝義的方向走

進入林道之前會先經過 烏玉檢查哨,在這裏辦入山證
走到台9甲的末端就接上桶后林道的起點,全長 13km,是柏油和部份的水泥路面
騎到後半段就沒什麼上下坡,變得很好騎,有幾處離溪水很近,可直接走到溪邊

林道終點便是 桶后越嶺古道的登山口,在此稍作停留便可折返
林道美景如下:




在終點為坐騎拍張照吧~
全部的照片在此:
http://picasaweb.google.com/yichung.shen/20080802

2008年5月18日 星期日

太極峽谷與梯子吊橋

5/17 星期六,天氣晴... 之前一直想去的天梯之旅終於成行了

話說兩年前的夏天,已經開車到投49縣道,就在上山的途中開始下起大雨
雨很大,走在山路上覺得滿可怕的,於是就改成台中一日遊
後來又想再出團時,就發生好幾起遊覽車翻覆事件,天梯也一度被封閉

就這樣過了快兩年,又想起了天梯這個地方
從南投竹山鎮的49縣道上山,一路都有指標,不會迷路
也可以走54縣道,會接到天梯的另一端,我們是由49這一端進入的

通往梯子吊橋的步道,會先通過一片竹林,再走20分鐘便可抵達天梯
去程是一路的下坡,回程就累了~

這就是天梯——吊橋其中的一段是階梯,民國94年完工的,還很新
我們到這裏是中午時分,遊客不多。回程時人數就爆增,橋都被塞得滿滿的

過了天梯再往前行,就是太極峽谷了,這裏是上杭段
橫跨峽谷的是玉福吊橋,可以欣賞峽谷的地形之美

最後附贈竹南外埔漁港的夕陽~

2008年3月2日 星期日

Linux Process - 4

Linux 建立行程的情形可分為兩種:

• 在 User Space 執行的程式
使用 fork()vfork()clone() 函式產生新的行程
(實際上是透過系統呼叫,切換到 Kernel Mode 進行行程建立的動作)

• 在 Kernel Space 執行的程式
使用 kernel_thread() 產生 Kernel Mode 的行程

無論是以上哪種方式,最後產生出行程的工作,都是由 do_fork() 來完成
定義於 arch/i386/kernel/process.c


而 do_fork() 主要的工作是複製父行程的 Task 結構給子行程,並給予新的 PID
此時,父、子行程會暫時共用資源,只有 PID、堆疊空間等特定的資料會不同
當子行程對共享資源有寫入的動作時,再進行對應的資料複製,稱為 Copy-on-Write 的技術


Linux 終止行程的情形可分為兩種:

• 行程自己結束執行
User Space 的行程的終止,是在 main() 程式結束返回處插入 return()exit() 函式
(結果會經由系統呼叫切換到 Kernel Space,然後進行終止程序的動作)

• 行程被 Kernel 結束執行
例如,行程收到 kill 的訊號,或因發生錯誤而停止執行,或系統重開機 ...

無論是以上哪種方式,最後的清理工作都是由 do_exit() 來釋放該行程持有的資源
定義於 kernel/exit.c


在 do_exit() 完成後,行程的 Task 結構仍會存在,但行程已處於 Zombie 狀態,且不能執行
這是為了讓系統在行程終結後,還有機會取得該行程的相關資訊給父行程使用

2008年2月26日 星期二

元宵節之內湖炮炸土地公公

今年元宵節去內湖看夜弄土地公的節慶活動
跟鹽水烽炮類似的是土地公會繞行附近的街道一圈
店家則準備一箱箱的鞭炮,全部倒在神轎上,並且一次點燃

引爆時的威力還滿可怕的,不過沒有烽炮那麼危險
小小的土地公廟,活動卻很勁爆

時間:
元宵節的 18:30-22:30

地點:
木見頭土地公廟
台北市內湖路二段452號,就在德安百貨後方
("木見" 是一個字,但中文打不出來)

全部照片在此:
http://picasaweb.google.com/yichung.shen/20080221

2008年2月16日 星期六

Linux Process - 3

Process Kernel Stack 預設為 8KB,以 THREAD_SIZE 表示,也可以設定成 4KB
這代表每個行程在 Kernel Mode 所能使用的最大堆疊空間:

定義於 include/asm-i386/thread_info.h

#ifdef CONFIG_4KSTACKS
#define THREAD_SIZE  (4096)
#else
#define THREAD_SIZE  (8192)
#endif

在 Process Descriptor (即 struct task_struct) 中,有個 thread_info 的指標
會指向該行程的 struct thread_info 的位址,用來描述較為低階的行程資訊
這個 thread_info 會與 kernel stack 共用記憶體空間,因為是以 union 的方式宣告
定義於 include/linux/sched.h

union thread_union {
  struct thread_info thread_info;
  unsigned long stack[THREAD_SIZE/sizeof(long)];
};

其中,thread_info 位於記憶體的低位址處,而 stack 則起始於高位址處
堆疊的位置以暫存器 esp 指示,如下圖:


struct task_struct 及 struct thread_info 分別會以 thread_infotask 的指標互連
如此便可經由 esp 換算取得指向目前行程的指標,也就是 current 這個巨集的實作方法:

定義於 include/asm-i386/current.h

static inline struct task_struct * get_current(void)
{
  return current_thread_info()->task;
}
#define current get_current()

定義於 include/asm-i386/thread_info.h

/* how to get the thread information struct from C */
static inline struct thread_info *current_thread_info(void)
{
  struct thread_info *ti;
  __asm__("andl %%esp,%0; ":"=r" (ti) : "0" (~(THREAD_SIZE - 1)));
  return ti;
}
/* how to get the current stack pointer from C */
register unsigned long current_stack_pointer asm("esp") __attribute_used__;

2008年1月26日 星期六

Linux Process - 2

Linux Kernel 將所有的 Task 藉由 struct list_head 串成串列
依據指標鏈結方式的不同,會得到不同的串列結果

• 由 tasks 構成的行程的環狀雙向鏈結串列
串列首為 init_task,即 swapper(0),最後一個行程的 tasks 指標會指回 swapper(0)

假設系統中只存在 3個行程,分別為 swapper、init 及 Process-X,則 tasks 串列如下:
(以下的圖形都只畫出 next 方向的指標)

欲走訪 tasks 串列的所有節點,可使用以下方式:

struct task_struct *task = NULL;

for_each_process( task )
{
  //列出所有行程的名稱與 PID
  printk("%s(%d)\n", task->comm, task->pid);
}


• 由 children & sibliing 構成的父程序與子程序串列
每一個行程都可能會衍生出子行程,以 children 指標表示其第一個子行程
而子行程彼此之間以 sibling 指標鏈結,最後一個子行程的 sibling 指標則指向父行程
至於沒有子行程的行程,其 children 指標會指向自己

假設 Process-A 衍生出 Process-B,而 Process-B 衍生出 Process-C
children & sibling 串列如下:

假設 Process-D 衍生出 Process-E 與 Process-F,則 children & sibling 串列如下:

欲搜尋目前行程的所有子行程,可使用以下方式:

struct task_struct *task = NULL;
struct list_head *list = NULL;

list_for_each(list, &(current->children))
{
  task = list_entry(list, struct task_struct, sibling);
  //現在 task 已指向 current 的某個子行程
}

2008年1月25日 星期五

Linux Process - 1

Linux 將 Process 與 Thread 都視為 Task,所以兩者使用同樣的資料結構
定義於 include/linux/sched.h
事實上,struct task_struct 是很大的結構,又稱為 Process Descriptor,這裏只列出幾個欄位
其中 taskschildrensibling 為 struct list_head 的型態,用來建立所有 Task 彼此間的串列關係
pid 是用來識別各個 Task 的唯一編號

struct list_head
{
  struct list_head *next;
  struct list_head *prev;
};

定義於 include/linux/list.h
這是一個雙向鏈結串列,在 Task 結構中嵌入 struct list_head 的欄位,便可以建立串列
若要經由 list_head 的指標取回 Task 的結構,則使用以下的巨集:

list_entry(ptr, type, member)

此外,在 Kernel 中使用 current 這個巨集,可以直接取得目前正在執行的 Task 的指標
定義於 include/asm-i386/current.h


Linux 第一個執行的 Task 是 swapper(0),以靜態變數 init_task 表示
第二個 Task 是 init(1),是由 swapper 衍生出來的,然後 init 會再衍生出其他 Task
而這兩個最初的 Task 可以畫出以下的串列關係:

2008年1月8日 星期二

Linux Memory Paging - 3

Linux Kernel 有自己專屬的 Page Directory 及 Page Table
在系統初始化時,會先建立 2個 Page Table -- 包含 2048個 Page,共 8MB 的記憶體空間
這 8MB 是 Linux 開機最少需要的記憶體大小,而且保留給 Kernel 使用

Kernel Page Global Directory 是以變數 swapper_pg_dir 表示
其資料結構可視為含有 1024 個元素的 pgd_t 型態的陣列
實體記憶體位址為 0x00101000

Kernel Page Table (第 0及第 1個 Table) 是以變數 pg0pg1 表示
其資料結構可視為含有 1024個元素的 pte_t 型態的陣列
實體記憶體位址分別為 0x001020000x00103000

Linux Page 初始化的動作定義於 arch/i386/kernel/head.S
因為開機時僅需要 8MB,所以只要初始化 2個 Page Table 便可,即 pg0 及 pg1
其餘的 Page Table 均填入 0 的值

又為了讓這 2個 Page Table 可以被 Real Mode 及 Protect Mode 所存取
Kernel Page Global Directory 中的第 0、第 768個 Entry以及第 1、第 769個 Entry
分別會設為相同的 Page Table 的實體記憶體位址,如圖所示


初始化完成後,得到以下的結果:
swapper_pg_dir[0] = swapper_pg_dir[768] = 0x00102007
swapper_pg_dir[1] = swapper_pg_dir[769] = 0x00103007
pg0 加上 pg1 定址到實體記憶體 0x00000000 - 0x007FFFFF,共 8MB 的分頁

根據 pgd_t 及 pte_t 的欄位格式可得知:
1) bit 0-11 為 0x007,表示 Enable 旗號 Present、Read/Write、User/Supervisor
2) bit 12-31 為 Base Address