今天看到buzz上有一個好玩的新聞,就是google docs裡的document裡,只要你輸入Konami code(上上下下左右左右ba,相信玩過任天堂紅白機的朋友都會知道),google就會給你好玩的效果!據說不同瀏覽器有不同效果唷!
2010年9月9日 星期四
2010年7月29日 星期四
RHCE PASSED
昨天痛苦而密集的複習了RHCE的部份,今天很幸運的通過了RHCE考試,加上檢查一次的時間約90分鐘可以好好做完題目。準備考試是痛苦的,但是成果卻是甜美的唷!
考試時間有三個半小時,但是實際上約一個小時內就可以做完,若加檢查一輪約一個半小時可完成。考試分成RHCT跟RHCE兩部份;如果第一部份有達70%分數但第二部份未達70%,則可以拿到RHCT;假設第二部份達到70%但第一部份卻未達70%,則是兩者都未通過。只有兩者都達70%以上才能拿到RHCE。
我把我的certificated number隱藏起來了。這就是RHCE的證照唷。希望有心想考RHCE的同好也能好好加油。
不過我大概不會想再考Redhat系列的認證了。因為考試的時候選擇國家,我們台灣的後面又被灌上a province of china,實在是非常落伍又泛政治化的一間公司。
2010年7月26日 星期一
Memory for crash kernel not within permissible range
這個問題會發生在所有Redhat-based Linux上,包含Scientific Linux,當然更包含了虛擬機器下的Redhat-based linux--在開機時出現:「Memory for crash kernel (0x0 to 0x0) notwithin permissible range」的訊息。
這個警告寫得太像錯誤訊息,以至於雖然能夠成功開機,但是小心一點的管理員卻會擔憂這代表什麼意思。事實上,這是kdump(Kernel dump daemon)的訊息。這只是一個提示訊息(informational message),只要在init.d裡面拿掉kdump,或是安裝時選擇不安裝kdump即可。由於在開機時,系統不會知道你是否有為crash kernel保留一份記憶體位置,所以嚴格說來這是給kernel dump的服務所提供的訊息,是可以安心的忽略他的。如果你已經取消kdump開機時啟動,但仍然出現這個問題,那麼就當做沒看到吧!
雖然redhat的開發人員已經出面解釋這不是bug也可以從容的忽略他,但是許多人還是罵翻這個message,因為他讓太多網管人員花太多的時間在google這個近乎無用的訊息上。
論壇上許多網友建議的做memory test,更新或是手動編譯一個kernel都是於事無補的,請別浪費時間在這上面。
chroot初體驗
chroot是linux上一個可以讓你限制根目錄的有趣指令。在unix的世界裡,萬物的源頭就是/,就算是/的上一層目錄也還是根目錄本身。也就是說,任何使用者都無法離開/,就像是你永遠跨越不了宇宙的邊界,除非你已經不屬於該宇宙的一部分。
今天研究室學妹laptop上的opensuse遇到了一個有趣的問題。開機到stage2之後,無法掛載根目錄,其錯誤訊息是:『unknown "reiserfs" filesystem』。這在Redhat系列的linux並不意外,因為他們並不打算讓使用者不自訂kernel的情況下去使用reiserfs以及reiser4。反之,opensuse則是預設以reiserfs為檔案系統。很顯然是kernel不認識這個filesystem,但是是什麼原因使得kernel不認識filesystem呢?
我只是合理的猜測--更新kernel的過程中,或是在執行SuSEConfig之前更新的process被中斷。後來學妹也說因為太久沒更新,結果更新的清單一大疊,很可能是因為要回家前更新還沒有完成,所以就中斷這個process。跟Debian不同:Debian的更新是把所有的套件都抓下來之後再逐個安裝,Redhat/SuSE系列則是下載一個安裝一個,或許恰好是在安裝新的kernel時被終止,留下了一個沒有設定完成的kernel。
由於根檔案系統無法被掛載,我只剩下最基本的ls/mount等指令可用,連關機都不行@_@||| ...在Debian的liveCD裡,我無法利用rpm或是yast替opensuse安裝一個新的kernel上去;於是,我想到chroot。
mkdir /Virtual這個時候,我就擁有了opensuse的環境,雖然此時此刻所使用的kernel是debian的。由於我急著希望有一個可以正常開機的kernel,因此就先更新kernel吧!
mount /dev/sda1 /Virtual
mount --bind /proc /Virtual/proc
mount --bind /sys /Virtual/sys
mount --bind /dev /Virtual/dev
chroot /Virtual
zypper update kernel-defaultDebian重開機之後,原本的硬碟載入grub,到了stage2就可以成功掛載root檔案系統了!第一次使用chroot就有不錯的經驗,chroot真是好物!
延伸閱讀:
Tetralet大哥的好文:使用 debootstrap 來建立 CHROOT 環境
2010年6月24日 星期四
What did I see that?
最近為了趕WPGM的poster,幾乎每天都熬夜,加上RHCE考試在即,兩頭燒恐怕是凶多吉少。還好在上週末努力加班下,seismogram跟圖都出來了;加上老闆大力幫忙幫我修文字(其實是老闆全包啦),今天的poster還算順利,只是午後的一場暴雨,使得我回南港的路上淋得臭頭。
雖然考試在即,但我晚上還是去家樂福買了一箱黑麥汁來犒賞自己。結帳後,我聽到一個中年男子對手機大喊:
『What did I see that? What did I see that?』我覺得這個句子很奇怪,應該是What did you see或是why did you say that,怎麼會是what did I see that呢?
後來那男子再喊一次,我才聽懂他說什麼...
『哇底地下室啦!哇底地下室啦!(台語)』
我一定是今天在WPGM被那些日本人的爛英文疲勞轟炸害的....
2010年5月5日 星期三
LVM2學習筆記
LVM2(Logical Volume Manager, version 2)的前身是LVM,他是由Heinz Mauelshagen於1998年在HP-UX上開發。他當初為了解決unix上分割區空間分配的問題而設計出這個管理程式。有了LVM,我們可以動態的調整空間的大小,大大縮短置換硬碟所需的downtime。這個鬼才現在任職於Redhat,目前正主持幾個跟software raid相關的計畫。目前我們所接觸到的教學文件大多是LVM2,但是因為已經全面取代了舊版的的LVM,因此還是以LVM稱之。
LVM的基本架構
上圖引用自鳥哥的私房菜,是一個相當有助理解的架構圖。本文僅適合非常熟悉LVM架構的讀者做為快速複習使用;如果談到PV/LV/VG等名詞您還得停頓一下,本文可能對您毫無幫助。下表則是我自己整理的指令列表,但僅列出一些常用的commands。
| Function | PV | VG | LV | |
| 新增 | pvcreate | vgcreate | lvcreate | |
| 刪除 | pvremove | vgremove | lvremove | |
| 擴大 | vgextend | lvextend | lvresize | |
| 縮小 | vgreduce | lvreduce | ||
| 變更屬性 | pvchange | vgchange | lvchange | |
| 掃描 | pvscan | vgscan | lvscan | |
| 詳列清單 | pvdisplay | vgdisplay | lvdisplay | |
| 匯入/匯出 | vgimport vgexport |
|||
| 移動 | pvmove | |||
| 附註: | 1. pvchange與lvchange非常少用,本文也不會提及。 2. lvextend與lvreduce可以完全由lvresize來取代。 3. LVM不具備redundent的功能。如果想要有備援機制,請改用raid或是raid搭配LVM。 4. 目前的開機管理程式均無法辨識LVM,請獨立出/boot便於開機。 |
|||
設計一個實驗
藉由實做是理解LVM最好的方式。本實驗的流程與目的如下:
- 利用虛擬機器產生一個2G大小的硬碟用來產生LVM類型分割區
- 練習建立與刪除PV
- 練習建立與刪除VG
- 練習建立與刪除LV
- 在LV上建立檔案系統,並且動態改變LV以及檔案系統大小
- 實做LVM的snapshot功能並還原
- 以新硬碟取代舊硬碟
- 系統重灌或是硬碟轉移,LVM的轉移方案
我先前已經有一個2G的虛擬硬碟,我不想用fdisk慢慢組分割區,直接刪掉他的partiton table以利我們馬上就能使用:
dd if=/dev/zero of=/dev/hdb count=1接著利用fdisk產生四個分割區,假設分別是hdb{1,2,5,6},各為200M, 300M, 300M以及1200M。
把partition ID改成8e(LVM format)。改完後,別忘記更新核心的partition資訊:
partprobe /dev/hdb檢查一下核心是否已經更新partition table了:
cat /proc/partitions
major minor #blocks name 3 0 8388608 hda 3 1 8281476 hda1 3 2 104422 hda2 3 64 2097152 hdb 3 65 196024 hdb1 3 66 293328 hdb2 3 67 1 hdb3 3 69 293296 hdb5 3 70 1314400 hdb6如果能看到hdb的1,2,5,6號partition,那就表示可以進行下一步。
pv就是構成LVM最基本的元素,他可以是一整顆硬碟,也可以是一個partition。(實作上如果要把整顆硬碟加入LVM裡,還是建議至少做一個partition再加入)要把數個硬碟或是分割區加入PV裡,需要用pvcreate:
pvcreate /dev/hdb{1,5}把某個分割區從pv裡移除,使用pvremove:
pvremove /dev/hdb5查看現有的pv有哪些,可以用pvdisplay得知:
"/dev/hdb1" is a new physical volume of "191.43 MB" --- NEW Physical volume --- PV Name /dev/hdb1 VG Name PV Size 191.43 MB Allocatable NO PE Size (KByte) 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID OKTpgY-M2tF-KykI-xPB1-xJae-UMqI-XKvJ5U可以得知我們現在只有一個分割區加入到pv裡。我們把hdb{2,5}也加到pv裡,讓實驗繼續進行。
pvcreate /dev/hdb{2,5}
對於作業系統來說,vg相當於傳統硬碟的地位;把許多個傳統分割區加入pv裡,然後建立一個vg組成一個大的虛擬硬碟。現在我們建立一個名為myVG的vg,由hdb1及hdb2組成:
vgcreate myVG /dev/hdb{1,2}此時可以用vgdisplay以及vgscan觀察之:
--- Volume group --- VG Name myVG System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 2 Act PV 2 VG Size 472.00 MB PE Size 4.00 MB Total PE 118 Alloc PE / Size 0 / 0 Free PE / Size 118 / 472.00 MB VG UUID VyMTQc-1Cuy-z2UG-jXyF-LFvx-vRY2-oQaJLd由上面資訊可以得知,我們只有一個vg叫做myVG,大小為472MB,為118個PE的大小,目前完全沒有PE被使用。
再把hdb5加入到這個vg裡:
vgextend myVG /dev/hdb5然後再使用vgdisplay/vgscan觀察變化。要把某個傳統分割區從vg裡開除,則使用vgreduce:
vgreduce myVG /dev/hdb1要把整個vg砍掉重練,就使用vgremove:
vgremove myVG為了後續的實驗,趕快恢復原狀吧:
vgcreate myVG /dev/hdb{1,2,5}
從一個vg裡建立一個lv,就好比從一顆硬碟建立分割區,你需要清楚的知道分割區從哪顆硬碟建立,以及分割區的大小。利用lvcreate建立lv:
lvcreate -L 500M -n myLV myVG也可以特別指定vg裡的某個pv:
lvcreate -l 125 -n myLV myVG /dev/hdb1上例表示使用myVG的其中一個pv的空間來建立lv,以-L指定大小,-l指定PE數量;預設1PE=4MB。需特別注意的是,lv一旦建立,想要使用lv則必須像是寫一個分割區一樣寫完整的路徑。以myLV而言,他的完整路徑將會是/dev/myVG/myLV或是/dev/mapper/myVG-myLV。
現在擴大lv成為600M:
lvextend -l +25 /dev/myVG/myLV上例會再從vg裡剩餘的空間去分配。同樣的,要縮減lv也很容易:
lvreduce -l -5 /dev/myVG/myLV如果-l後面沒有接正負號,則表示改變大小成指定值。由於lvextend只能接正值,lvreduce後面只能接負值,這兩個指令可以完全被lvresize取代,例如上面兩個例子完全等於:
lvresize -l +25 /dev/myVG/myLV
lvresize -l -5 /dev/myVG/myLV因此,往後的實作將只使用lvresize。為了使實驗繼續進行,我們把myLV的大小設定成600M吧:
lvresize -L 600M /dev/mapper/myVG-myLV
建立好lv(想像成建立好傳統的分割區)之後,就必須在上面搭載檔案系統以供使用。請把lv當成一個分割區一樣的來進行格式化吧!
mkfs.ext3 -L "myLV" /dev/mapper/myVG-myLV
mount -t ext3 LABEL=myLV /mnt截至目前,這個lv已經正式上線使用了。不過我們可以藉由vgdisplay以及df得知,其實myLV並沒有用到全部的可用空間。LVM最強大的功能之一,就是允許線上擴大容量。由於lv是底層,檔案系統在上層,因此要擴大檔案系統必須lv先擴大,filesystem再擴大。
想要擴張lv到最大容量,你可以查看vg剩餘多少PE然後擴大,或是直接擴大到全部可用範圍:
lvresize -l +100%FREE /dev/myVG/myLV或是指定完全使用某幾個pv:
lvresize -l +100%PVS /dev/myVG/myLV /dev/hdb{2,5}由此可見,LVM的運用非常強大,且自訂性極高。
擴充lv的容量之後,接著就可以擴充檔案系統:
resize2fs /dev/myVG/myLV [700M]如果不指定擴充大小,則resize2fs會自動擴充到全部可用範圍。
要縮減lv大小則與擴充相反--必須先縮小上層的filesystem,再縮小底層的lv。如果你不照此順序進行,lv上面的資料會全部付之一炬。縮減lv不支援線上進行,而且縮減到有寫入資料的部份也會造成檔案lost,必須小心為之:
umount /mnt依序縮減filesystem以及lv大小後,就可以掛載後正式上線工作。
fsck.ext3 -f /dev/myVG/myLV
resize2fs /dev/myVG/myLV 500M
lvresize -l -25 /dev/myVG/myLV
mount LABEL=myLV /mnt
Solaris的ZFS檔案系統擁有非常卓越的snapshot功能,雖然LVM的snapshot沒有Solaris那麼powerful,但是也是一樣功能強大且便於使用。snapshot目前僅支援lv,vg的snapshot功能還尚未實做出來。
快照檔其實就是一個lv,他會與檔案系統共用『未變更』的PE,因此snapshot必須與原本的lv在同一個vg裡面。
上圖引用自鳥哥的私房菜,說明了snapshot可以很小的原因就是與原本的lv共用未變更的PE。
他的大小約為想執行snapshot的lv的15%~20%的大小。檢查我們的lv大小:
lvdisplay | grep Size以我們的例子而言,我們的lv約750MB,製作一個snapshot約需要150MB,恰好目標5的末段我們縮減了檔案系統,vg也還有約156M的空間可以用。我們讓snapshot就坐在這156MB上:
lvcreate -L 156M -s -n `date +"%Y-%m%d".snap` /dev/myVG/myLV產生了具有日期為檔名的快照檔之後,可以以此作為系統還原備份之用。例如半年後想要回到snapshot的狀態,只要把該snapshot掛載上去就好。
umount /mnt雖然snapshot只佔有156MB的空間,但是對於核心而言,他就是一個lv的clone,因此你從df看到的大小是一樣的:
mkdir /mnt/{myLV,date}
mount /dev/myVG/2010-0505.snap /mnt/date
mount LABEL=myLV /mnt/myLV
/dev/mapper/myVG-myLV
591M 17M 545M 3% /mnt/myLV
/dev/mapper/myVG-2010--0505.snap
591M 17M 545M 3% /mnt/date
把snapshot給umount之後,再來進行一些測試!
umount /mnt/date以上,我們做的所有更動都會紀錄在snapshot檔裡,可以用lvdisplay /dev/myVG/2010-0505.snap來觀察:
for words in $(seq 1 1000000); do
echo 'I love peace world!!' >> abc.txt
done
cp -r /etc/httpd /mnt/myLV
--- Logical volume --- LV Name /dev/myVG/2010-0505.snap VG Name myVG LV UUID JDGmIg-m0qW-M0VK-Gem1-4bqA-DEyS-83FtbL LV Write Access read/write LV snapshot status active destination for /dev/myVG/myLV LV Status available # open 0 LV Size 600.00 MB Current LE 150 COW-table size 156.00 MB COW-table LE 39 Allocated to snapshot 13.32% Snapshot chunk size 4.00 KB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:1請特別留意"Allocated to snapshot"已經佔了13.32%,由此可知LV的snapshot有個關鍵的要素:所容許的異動大小必須小於snapshot的大小。往後將此snapshot掛載,便可以取出製作快照前的檔案作為備援使用。snapshot被掛載的時候會停止紀錄變動,請非常留意。
刪除一個snapshot就是刪除一個lv:
lvremove /dev/myVG/2010-0505.snap
以上已經展示過LVM線上擴大檔案系統及lv的卓越能力,也展示過製作snapshot的功能,現在則是模擬淘汰一個快要壞掉的舊硬碟,換上一個又大又新的硬碟上去。我們假設舊硬碟是hdb1(200M),新硬碟是hdb6(1200M),首先必須把新硬碟加入:
pvcreate /dev/hdb6上述的指令顯示線上加入一個新硬碟到vg裡,然後把hdb1裡的PE都移動到hdb6裡,並且每隔2秒顯示詳細訊息:
vgextend myVG /dev/hdb6
pvmove -v -i 2 /dev/hdb1 /dev/hdb6
Finding volume group "myVG"
Archiving volume group "myVG" metadata (seqno 4).
Creating logical volume pvmove0
Moving 47 extents of logical volume myVG/myLV
Found volume group "myVG"
Updating volume group metadata
Suspending myVG-myLV (253:0) with device flush
Creating myVG-pvmove0
Loading myVG-pvmove0 table (253:1)
Resuming myVG-pvmove0 (253:1)
Creating volume group backup "/etc/lvm/backup/myVG" (seqno 5).
Checking progress every 2 seconds
/dev/hdb1: Moved: 14.9%
/dev/hdb1: Moved: 34.0%
/dev/hdb1: Moved: 46.8%
/dev/hdb1: Moved: 57.4%
/dev/hdb1: Moved: 66.0%
/dev/hdb1: Moved: 76.6%
/dev/hdb1: Moved: 89.4%
/dev/hdb1: Moved: 100.0%
Found volume group "myVG"
Loading myVG-myLV table (253:0)
Suspending myVG-myLV (253:0) with device flush
Suspending myVG-pvmove0 (253:1) with device flush
Resuming myVG-pvmove0 (253:1)
Removing temporary pvmove LV
Writing out final volume group after pvmove
Creating volume group backup "/etc/lvm/backup/myVG" (seqno 7).由於是每隔兩秒顯示一次訊息,因此訊息很長。
vgreduce myVG /dev/hdb1最後的兩行指令,就是把hdb1完整的從LVM裡面拿掉,接著就是找個可以允許短暫downtime的時間,把舊硬碟抽走。別忘了新硬碟容量大多了,別忘了先把lv變大,在擴大filesystem!
pvremove /dev/hdb1
lvresize -l +100%FREE /dev/myVG/myLV
resize2fs /dev/myVG/myLV
假設今天想要換新的機器或是重灌系統,但是lvm裡面的資料還是要保留下來,我們該怎麼處理呢?大致的流程如下:
umount->vgchange(deactivate)->vgexport->系統重灌->vgimport->vgchange(activate)->mount
承續剛才的狀況:
umount /mnt/myLV
vgchange -a n myVG
vgexport myVG #可以藉由vgdisplay觀察是否有exported!
上述的指令便是停止vg的運作,因此所有在vg上的lv也都會全部終止運作,因此假設你在vg上切不只一個lv,則需要把所有掛載點都umount之後,vgchange才有可能終止活動。我終止這個vg並且匯出vg之後,關閉虛擬的os並開啟一個新的os,假設是SLES11好了;我們可以在SLES11上面利用vgdisplay找到這個vg:
vgimport myVG如此一來便可以順利完成轉移。
vgchange -a y myVG
mkdir /export
mount /dev/myVG/myLV /export
參考文獻:
1. Redhat Enterprise Linux系統管理寶典 進階篇(陳永昇),第八章
2. Logical Volume Manager(一)、(二)(林彥明)
3. RHEL3/4 之Logical Volume Manager(林彥明)
4. 鳥哥的私房菜:Logical Volume Manager
2010年5月3日 星期一
[轉載]Steve Jobs的公開信談Apple拒絕flash
全文轉載自:Steve Jobs談為何蘋果討厭吃Flash(完整公開信,中文版),ZDnet Taiwan
蘋果跟Adobe有很深的關係,我們還曾在他們草創的車庫裡跟Adobe創辦人見過面,蘋果是他們第一個大客戶,把他們的Postcript語言用在我們新的Laserwriter印表機中。蘋果曾經投資過Adobe,也曾一度擁有Adobe 20%股權多年。我們曾密切合作創新推出桌面出版,雙方都有過許多甜蜜時光,但過了那段蜜月期後,我們就漸行漸遠了,蘋果歷經瀕死經驗,Adobe則以Acrobat產品打入企業市場。今日,我們依然共同服務雙方共有的創意客戶群,Mac用戶大概買了半數Adobe的Creative Suite產品,但除此之外,雙方已經殊少交集了。
我之前很想寫出我對Adobe Flash產品的想法,好讓大家能更瞭解為何我們不想讓Flash進到iPhones、iPods與iPads。Adobe一直認為我們的決定是出於商業考量,他們說我們這麼做是要保護App Store,但其實這一切都只是出於技術考量而已。Adobe說我們是封閉系統,而Flash是開放的,但事實根本相反,我在此解釋一下。
首先是開放問題。
Adobe的Flash產品是100%專屬的,僅能由Adobe提供,未來怎麼發展、價格等也全看Adobe自己的決定。雖然Adobe的Flash產品廣為使用,但這不代表他們是開放的,因為這個技術由Adobe自家掌控,從任何角度來看,Flash都是封閉系統。
蘋果自己也有很多專屬產品,不過iPhone、iPod與iPad雖然是封閉的,但十分相信所有跟Web有關的標準都應該公開。蘋果捨棄Flash,改用HTML5、CSS與JavaScript,這些都是公開標準。蘋果的行動裝置要用最高性能、最低耗電的部署方式推出。HTML5(蘋果、Google等都已經採用此一新標準)可讓Web開發者建立更先進的繪圖、字型、動畫與轉換,完全不需仰賴第三方瀏覽器外掛(不像Flash那樣)。HTML5完全開放,由標準委員會控制,蘋果也在其中。
蘋果甚至也自創Web的開放標準,比如,蘋果弄了一個小的開放原始碼計畫稱為WebKit,這是一個完整開放原始碼HTML5呈現引擎,是Safari網頁瀏覽器的核心。WebKit目前已經廣為採用,Google在Android的瀏覽器也有採用,Palm也是,Nokia也有用,RIM(BlackBerry)則已經宣布未來會採用。現在幾乎除了微軟以外,其他主要智慧手機瀏覽器都是使用WebKit。蘋果把WebKit技術開放出來,讓行動網路瀏覽器立下了標準。
Adobe也不斷說蘋果行動裝置無法存取完整的Web,因為75%的網路影片都是以Flash製作。但他們沒說的是,這些影片同時也都有提供更現代的格式:H.264,可在iPhone、iPod與iPad上觀看。YouTube(佔了網路影片40%市佔率)便可用在一款蘋果行動裝置都有搭配的應用程式中,iPad所提供的YouTube觀看經驗看是無與倫比。若再加入Vimeo、 Netflix、 Facebook、 ABC、 CBS、 CNN、 MSNBC、 Fox News、 ESPN、 NPR、 Time、 The New York Times、 The Wall Street Journal、 Sports Illustrated、 People、 National Geographic、等等的影片,則iPhone、iPod與iPad用戶並沒有少看太多影片。
Adobe還宣稱蘋果機器無法玩Flash遊戲,這點說得沒錯,但還好我們的App Store有超過5萬種遊戲程式,其中還有許多都是免費的,事實上,iPhone、iPod與iPad可用的遊戲比其他任何平台都還要來得多。
第三,我們看中穩定性、安全性與效能
賽門鐵克最近特別指出Flash是2009年安全性最差的軟體之一,我們也一手深知,Mac當機的頭號理由都是出在Flash。我們曾跟Adobe合作修正這些問題,但這些狀況多年下來依然存在,我們不想因為加入Flash而降低iPhone、iPod與iPad的穩定性與安全性。
此外,Flash在行動裝置上的效能不佳,我們多年來多次要求Adobe提出一個可在行動裝置上擁有良好效能的Flash版本,但我們從來沒看過。Adobe曾公開表示Flash會在2009年初用在一款智慧手機上,之後改口說是2009年下半,之後又延至2010年上半,現在則已經變成2010年下半年了。我們相信最終他們還是會推出,但還好我們不需癡癡等待,誰曉得屆時效能如何?
第四點,電池效能問題
播放影片若要達成電池長效,則手機必須能在硬體中進行影片解碼,若用軟體解碼會耗費太多電力,許多新一代行動裝置中所使用的晶片都含有H.264解碼器,這是一種產業標準,用在每一台藍光DVD播放機中,包括蘋果、Google(YouTube)、Vimeo、Netflix等大廠也都有採用。Flash最近雖然也加入支援H.264,但目前所有Flash網站的影片則必須使用較舊版本的解碼器,無法用在行動晶片中,且必須用軟體來執行,這兩者的差異十分顯著,比如在iPhone上,H.264影片可播放10小時,但若用軟體解碼,則只能播放5小時電池就沒電了。
網站若以H.264來重新編碼影片,則不需使用Flash就能提供出來,他們可在所有瀏覽器播放,比如蘋果的Safari或Google Chrome,不需外掛,而在iPhone、iPod與iPad上觀看效果都很好。
第五,觸控問題
Flash主要是提供給使用滑鼠的PC,而非給使用手指的觸控螢幕,比如許多Flash網站都都使用所謂的「rollovers」(滑鼠移過去會有動作),但蘋果的多重觸控介面不使用滑鼠,也沒有rollover概念。多數Flash網站都得重新改寫才能支援觸控裝置。若開發者需要重寫Flash網站,那何不乾脆使用更現代的技術,如HTML5、CSS與JavaScript?
就算我們真的支援Flash好了,這也無法解決多數Flash網站都必須改寫才能支援觸控裝置的事實。
第六,最重要的理由
除了上述缺點外,我們不允許Flash進入我們的行動裝置還有個最重要的理由:Adobe希望開發者使用Flash來開發可在我們行動裝置上可使用的應用程式。
我們從過去慘痛的經驗得知,讓一個第三方軟體層介入平台與開發者之間,則最終出現的都是次等程式,阻礙平台的創新與進步。若開發者變得很仰賴第三方開發資料庫與工具,則若第三方不提供新功能,他們就無法享受到平台更新的好處,我們不可能讓第三方來決定他們何時會把更新提供給我們的開發者。
若第三方還提供跨平台開發工具,情況則變得更糟,第三方有可能會等到所有平台的更新版本都準備就緒了才會推出,不必然會為單一平台推出更新,結果開發者僅能使用最大公約數的功能。我們無法接受這種結果,開發者竟然是因為其他平台還沒準備好,所以無法使用我們的創新功能。
Flash是跨平台開發工具,Adobe的目標並非協助開發者撰寫最好的iPhone、iPod與iPad程式,他們的目標是協助開發者撰寫跨平台程式。而Adobe向來對於蘋果平台的更新十分緩慢,比如,Mac OS X已經推出快10年了,Adobe才剛在兩週前推出的CS5才完整採用。Adobe是所有主要第三方開發者中,最慢完整採用Mac OS X的。
我們的出發點很簡單,我們希望提供最先進創新的平台給我們的開發者,我們希望他們是直接站在我們的平台肩膀上,寫出全世界最好的程式。我們會持續強化平台,好讓開發者寫出更棒、更強大、更好玩、更實用的程式。這是三贏局面,我們可賣出更多機器,因為我們有最好的程式、而開發者也可接觸更多的客戶,而使用者則可享受到最多的程式選擇性。
結論
Flash是PC與滑鼠時代的產物,Flash的確是Adobe的成功之作,也因此我們能理解為何他們想把Flash延伸至PC之外,但行動時代講究的是低耗電、觸控介面與開放Web標準,Flash在這幾個方面都是不及格的。
這麼多媒體爭相提供內容讓我們放在蘋果行動裝置,顯示Flash已經成了觀看影片或任何Web內容的雞肋。而蘋果App Store超過20萬種應用程式證明開發者不需要Flash一樣可寫出圖像十分豐富的程式,包括遊戲。
行動時代所新推出的開放標準(如HTML5)將在行動裝置上勝出(PC亦然)。或許Adobe應該多花一點時間專心在未來推出好用的HTML5工具,而不是不斷批評蘋果太不念舊。
Steve Jobs
April, 2010
全文轉載自:Steve Jobs談為何蘋果討厭吃Flash(完整公開信,中文版),ZDnet Taiwan
(陳奭璁譯)





