2010/11/11

android monkey 用法範例

文章原來源已遺失,好像類似情形不少,所以無法貼原文網址,原作者叫「俊傑」,感謝他:

Android 中Monkey的用法

簡介

Monkey是一個命令行工具,可以運行在模擬器裡或實際設備中。它向系統發送偽隨機的用戶事件流,實現對正在開發的應用程序進行壓力測試。Monkey包括許多選項,它們大致分為四大類:
  • 基本配置選項,如設置嘗試的事件數量。
  • 運行約束選項,如設置只對單獨的一個包進行測試。
  • 事件類型和頻率。
  • 調試選項。
在Monkey運行的時候,它生成事件,並把它們發給系統。 同時,Monkey還對測試中的系統進行監測,對下列三種情況進行特殊處理:
  • 如果限定了Monkey運行在一個或幾個特定的包上,那麼它會監測試圖轉到其它包的操作,並對其進行阻止。
  • 如果應用程序崩潰或接收到任何失控異常,Monkey將停止並報錯。
  • 如果應用程序產生了應用程序不響應(application not responding)的錯誤,Monkey將會停止並報錯。
按照選定的不同級別的反饋信息,在Monkey中還可以看到其執行過程報告和生成的事件。 Monkey基本用法 可以通過開發機器上的命令行或腳本來啟動Monkey。 由於Monkey運行在模擬器/設備環境中,所以必須用其環境中的shell來進行啟動。 可以通過在每條命令前加上adb shell來達到目的,也可以進入Shell後直接輸入Monkey命令。 基本語法如下: $ adb shell monkey [options] 如果不指定 options,Monkey將以無反饋模式啟動,並把事件任意發送到安裝在目標環境中的全部包。 下面是一個更為典型的命令行示例,它啟動指定的應用程序,並向其發送500個偽隨機事件: $ adb shell monkey -p your.package.name -v 500 命令選項參考 下表中列出了Monkey命令行可用的全部選項。
  • --help
    列出簡單的用法。
  • -v
    命令行的每一個-v將增加反饋信息的級別。Level 0(缺省值)除啟動提示、測試完成和最終結果之外,提供較少信息。Level 1提供較為詳細的測試信息,如逐個發送到Activity的事件。Level 2提供更加詳細的設置信息,如測試中被選中的或未被選中的Activity。
    事件
  • -s
    偽隨機數生成器的seed值。如果用相同的seed值再次運行Monkey,它將生成相同的事件序列。
  • --throttle
    在事件之間插入固定延遲。通過這個選項可以減緩Monkey的執行速度。如果不指定該選項,Monkey將不會被延遲,事件將儘可能快地被產成。
  • --pct-touch
    調整觸摸事件的百分比(觸摸事件是一個down-up事件,它發生在屏幕上的某單一位置)。
  • --pct-motion
    調整動作事件的百分比(動作事件由屏幕上某處的一個down事件、一系列的偽隨機事件和一個up事件組成)。
  • --pct-trackball
    調整軌跡事件的百分比(軌跡事件由一個或幾個隨機的移動組成,有時還伴隨有點擊)。
  • --pct-nav
    調整「基本」導航事件的百分比(導航事件由來自方向輸入設備的up/down/left/right組成)。
  • --pct-majornav
    調整「主要」導航事件的百分比(這些導航事件通常引發圖形界面中的動作,如:5-way鍵盤的中間按鍵、回退按鍵、菜單按鍵)
  • --pct-syskeys
    調整「系統」按鍵事件的百分比(這些按鍵通常被保留,由系統使用,如Home、Back、Start Call、End Call及音量控制鍵)。
  • --pct-appswitch
    調整啟動Activity的百分比。在隨機間隔裡,Monkey將執行一個startActivity()調用,作為最大程度覆蓋包中全部Activity的一種方法。
  • --pct-anyevent
    調整其它類型事件的百分比。它包羅了所有其它類型的事件,如:按鍵、其它不常用的設備按鈕、等等。
    約束限制
  • -p
    如果用此參數指定了一個或幾個包,Monkey將只允許系統啟動這些包裡的Activity。如果你的應用程序還需要訪問其它包裡的Activity(如選擇取一個聯繫人),那些包也需要在此同時指定。如果不指定任何包,Monkey將允許系統啟動全部包裡的Activity。要指定多個包,需要使用多個 -p選項,每個-p選項只能用於一個包。
  • -c
    如果用此參數指定了一個或幾個類別,Monkey將只允許系統啟動被這些類別中的某個類別列出的Activity。如果不指定任何類別,Monkey將選 擇下列類別中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多個類別,需要使用多個-c選項,每個-c選 項只能用於一個類別。
    調試
  • --dbg-no-events
    設置此選項,Monkey將執行初始啟動,進入到一個測試Activity,然後不會再進一步生成事件。為了得到最佳結果,把它與-v、一個或幾個包約 束、以及一個保持Monkey運行30秒或更長時間的非零值聯合起來,從而提供一個環境,可以監視應用程序所調用的包之間的轉換。
  • --hprof
    設置此選項,將在Monkey事件序列之前和之後立即生成profiling報告。這將會在data/misc中生成大文件(~5Mb),所以要小心使用它。
  • --ignore-crashes
    通常,當應用程序崩潰或發生任何失控異常時,Monkey將停止運行。如果設置此選項,Monkey將繼續向系統發送事件,直到計數完成。
  • --ignore-timeouts
    通常,當應用程序發生任何超時錯誤(如「Application Not Responding」對話框)時,Monkey將停止運行。如果設置此選項,Monkey將繼續向系統發送事件,直到計數完成。
  • --ignore-security-exceptions
    通常,當應用程序發生許可錯誤(如啟動一個需要某些許可的Activity)時,Monkey將停止運行。如果設置了此選項,Monkey將繼續向系統發送事件,直到計數完成。
  • --kill-process-after-error
    通常,當Monkey由於一個錯誤而停止時,出錯的應用程序將繼續處於運行狀態。當設置了此選項時,將會通知系統停止發生錯誤的進程。注意,正常的(成功的)結束,並沒有停止啟動的進程,設備只是在結束事件之後,簡單地保持在最後的狀態。
  • --monitor-native-crashes
    監視並報告Android系統中本地代碼的崩潰事件。如果設置了--kill-process-after-error,系統將停止運行。
  • --wait-dbg
    停止執行中的Monkey,直到有調試器和它相連接。
接下來看一個實例 Monkey 的用法是$ adb shell monkey -p your.package.name -v 500 首先,我們要找到應用程序在Emulator中所對應的包名,我一開始是一個個目錄找的,前7步完成了這項工作,最終發現應用程序包都在 data/data下,你可以在shell中cd data/data,然後ls查看當前Emulator中的所有應用程序包。 假如我們想對SDK中的APIDemos做壓力測試,
  1. 在Eclipse中新建工程,將

    F:\android-sdk-windows\platforms\android-2.0\samples\ApiDemos添加到工程中點擊運行,此時,他的APK應該加載到了Emulator上

  2. 在命令行輸入adb shell

  3. 輸入ls查看當前文件夾下的目錄,執行結果如下

    C:\Documents and Settings\Administrator>adb shell
    # ls
    ls
    sqlite_stmt_journals
    config
    cache
    sdcard
    d
    etc
    system
    sys
    sbin
    proc
    init.rc
    init.goldfish.rc
    init
    default.prop
    data
    root
    dev

  4. 應用程序包都在data下,我們輸入cd data進入data文件夾,如下

    # cd data
    cd data
    
  5. 輸入ls查看文件夾下的內容,如下所示:

    # ls
    ls
    misc
    local
    data
    app-private
    app
    property
    anr
    backup
    dontpanic
    dalvik-cache
    system
    lost+found

  6. 還有個data,所有的應用程序就在這個data下了,進入這個data,然後輸入ls如下:

    # cd data
    cd data
    # ls
    ls
    com.android.mms
    com.android.providers.applications
    com.android.globalsearch
    com.android.calculator2
    com.android.spare_parts
    com.android.gesture.builder
    com.android.music
    com.android.sdksetup
    com.android.packageinstaller
    com.android.fallback
    com.android.providers.settings
    com.android.providers.drm
    com.android.development
    com.android.providers.telephony
    com.android.inputmethod.pinyin
    com.android.htmlviewer
    com.android.settings
    com.android.netspeed
    com.android.providers.userdictionary
    com.android.browser
    com.android.contacts
    com.android.alarmclock
    com.android.camera
    com.android.providers.contacts
    jp.co.omronsoft.openwnn
    com.android.launcher
    com.android.phone
    com.android.soundrecorder
    com.google.android.providers.enhancedgooglesearch
    com.svox.pico
    com.android.customlocale
    com.android.term
    com.android.providers.downloads
    com.android.providers.media
    com.android.email
    android.tts
    com.android.inputmethod.latin
    com.android.server.vpn
    com.example.android.apis

  7. 最後一個就是我們剛才加載的APIDemo的應用程序包

  8. 可以直接輸入monkey -p com.example.android.apis -v 50,結果如下,也可以退出shell,在命令行輸入,adb shell monkey -p com.example.android.apis -v 50 ,運行過程中,Emulator中的應用程序在不斷地切換畫面,可以看一下,呵呵:)

    # monkey -p com.example.android.apis -v 50
    monkey -p com.example.android.apis -v 50
    :Monkey: seed=0 count=50
    :AllowPackage: com.example.android.apis
    :IncludeCategory: android.intent.category.LAUNCHER
    :IncludeCategory: android.intent.category.MONKEY
    // Event percentages:
    //   0: 15.0%
    //   1: 10.0%
    //   2: 15.0%
    //   3: 25.0%
    //   4: 15.0%
    //   5: 2.0%
    //   6: 2.0%
    //   7: 1.0%
    //   8: 15.0%
    :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.categ
    ory.LAUNCHER;launchFlags=0x10000000;component=com.example.android.apis/.ApiDemos
    ;end
        // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.in
    tent.category.LAUNCHER] cmp=com.example.android.apis/.ApiDemos } in package com.
    example.android.apis
    :Sending Pointer ACTION_MOVE x=-4.0 y=2.0
    :Sending Pointer ACTION_UP x=0.0 y=0.0
        // Allowing start of Intent { cmp=com.example.android.apis/.ApiDemos } in pa
    ckage com.example.android.apis
    :Sending Pointer ACTION_DOWN x=207.0 y=282.0
    :Sending Pointer ACTION_UP x=189.0 y=289.0
        // Allowing start of Intent { cmp=com.example.android.apis/.app.Intents } in
    package com.example.android.apis
    :Sending Pointer ACTION_DOWN x=95.0 y=259.0
    :Sending Pointer ACTION_UP x=95.0 y=259.0
    :Sending Pointer ACTION_DOWN x=295.0 y=223.0
    :Sending Pointer ACTION_UP x=290.0 y=213.0
    :Sending Pointer ACTION_MOVE x=-5.0 y=3.0
    :Dropped: keys=0 pointers=0 trackballs=0 flips=0
    ## Network stats: elapsed time=3799ms (3799ms mobile, 0ms wifi, 0ms not connecte
    d)
    // Monkey finished

2010/11/10

windows 上跑 adb 簡介

Android 基本上都可以透過 adb 從外面跟 DUT 溝通,可以參考 http://developer.android.com/guide/developing/tools/adb.html 的說明。
adb 只是 Android SDK 的一個工具,可以從 http://dl.google.com/android/android-sdk_r07-windows.zip 下載,或是從 http://developer.android.com/sdk/index.html 查最新的版本

網頁上文件說的很複雜,因為那是教人寫 Android Application 的文件,基本上最簡單的做法就是:
0. 安裝 windows 端的 android usb driver,這一步可能你們已經安裝了,可以把 DUT 插到 PC 上看能不能抓到裝置就知道了,若是未認得的裝置,再來安裝usb driver
1. 從上面的網址下載 SDK
2. 解開壓縮檔,譬如放在 android-sdk-windows 下
3. 直接進入 android-sdk-windows\tools 下用 cmd mode 的視窗(就是執行cmd.exe) 執行adb 即可

底下簡介一下 adb 的使用,當然都是在 cmd mode 下執行, 為了方便我底下說明,把要安裝的 TestSuite.apk 放在 C:\ android-sdk-windows\tools 下,可以依實際位置修改底下的命令:
  • C:\ android-sdk-windows\tools > adb devices <-- 查連接的 android devices,請先接一台就好
  • C:\ android-sdk-windows\tools > adb shell ls / <-- 遠端在 DUT 上的命令,假設只有連接一台,這個命令範例類似 dir C:\ 之意
  • C:\ android-sdk-windows\tools > adb push .\TestSuite.apk /data/TestSuite.apk <-- 將 TestSuite 從外面放到 DUT 上
  • C:\ android-sdk-windows\tools > adb install /data/TestSuite.apk <-- 要執行過上面的命令才能執行此命令。安裝後那台 DUT 就可以看到 TestSuite 的應用程式圖示
  • C:\ android-sdk-windows\tools > adb pull /proc/meminfo <-- 這樣可以抓到 DUT 上的 /proc/meminfo 這個檔,那是抓的當時 DUT 記憶體使用狀況
  • C:\ android-sdk-windows\tools > adb logcat <-- DUT 在執行應用程式時,通常會產生一堆的 標準log, 可以用這個命令抓下來,但是這個命令不會停止,若要離開請用 Ctrl-C 中斷它
  • C:\ android-sdk-windows\tools > adb reboot recovery <-- 可以讓 DUT 重開機進入 Recovery mode


Windows 上的 usb driver, 可以自 http://dl.google.com/android/repository/usb_driver_r03-windows.zip 取得,問題是網路上很難查到這樣的網址,這邊公佈一下我找的方法:

首先,取得 http://dl.google.com/android/repository/repository.xml,這個檔就是 android 的倉庫清單,剩下的就簡單了,譬如....裡面有一筆 <sdk:url>usb_driver_r03-windows.zip</sdk:url>,這樣就可以查到剛剛上面貼的 url: http://dl.google.com/android/repository/usb_driver_r03-windows.zip

2010/11/08

一個簡單的硬碟效能測試 -- dd

dd 是一個很特別的指令,尤其在 android 中並沒有 cp 存在,只有 dd....
當然,我會這樣說,就是可以用dd 來複製檔案,大家也都會 dd if=SOURCE of=TARGET 即可,底下再說一點點它特別之處

dd if=/dev/fd0 of=/home/sam/MBRboot.image bs=512 count=2
上面這樣可以將軟碟片的前面 512x2==1024 個 byte 讀出來,寫成一個新檔案叫 MBRboot.image

dd if=/dev/sda of=/home/sam/MBR.image bs=512 count=1
上面也是一樣道理,可以把硬體的開機磁區寫到一個新檔案叫 MBR.image

所謂的硬碟開機磁區,就是一個 partition table + boot code, 若您只需要 boot code, 可以用下面的方法:
dd if=/dev/sda of=/home/sam/MBR_boot.image bs=446 count=1

那還有沒有其他用法?
dd if=/dev/uramdom bs=1024 count=1000000 of=/home/sam/1Gb.file
dd if=/home/sam/1Gb.file bs=64k | dd of=/dev/null
上面的方法可以用來簡單測試硬碟效能,也就是你搭配將上面兩行寫成一個 shell, 再搭配 time 來量時間
若不想用 /dev/uramdom 也可以用 /dev/zero 來取代

如果想弄一個空的 1G 檔案出來,一般會寫成
dd if=/dev/zero of=1G-file bs=1M count=1024
可是啊,這樣真的就要寫「很久很久」,卻又有一個很簡單的方式,一瞬間就寫完了,真的是神奇
dd if=/dev/zero of=1G-file bs=1 count=0 seek=1G

2010/11/04

Android 開機過程 boot sequence

請見The Android boot process from power on一文

全部有幾個階段:
1. Power on and boot ROM code execution
2. The boot loader
3. The Linux kernel
4. The init process
5. Zygote and Dalvik
6. The system server
7. Boot completed

在 kernel 之前還算跟一般的 embedded linux 一樣,但是在 init 之後就完全走它自己的路。先來看前面步驟的示意圖










1. Power on and boot ROM code execution




  • A. The Boot ROM code will detect the boot media using a system register that maps to some physical balls on the asic. This is to determine where to find the first stage of the boot loader.
  • B. Once the boot media sequence is established the boot ROM will try to load the first stage boot loader to internal RAM. Once the boot loader is in place the boot ROM code will perform a jump and execution continues in the boot loader.

2. The boot loader



  • A. The first boot loader stage will detect and set up external RAM.
  • B. Once external RAM is available and the system is ready the to run something more significant the first stage will load the main boot loader and place it in external RAM.
  • C. The second stage of the boot loader is the first major program that will run. This may contain code to set up file systems, additional memory, network support and other things. On a mobile phone it may also be responsible for loading code for the modem CPU and setting up low level memory protections and security options.
  • D. Once the boot loader is done with any special tasks it will look for a Linux kernel to boot. It will load this from the boot media (or some other source depending on system configuration) and place it in the RAM. It will also place some boot parameters in memory for the kernel to read when it starts up.
  • E. Once the boot loader is done it will perform a jump to the Linux kernel, usually some decompression routine, and the kernel assumes system responsibility.

3. The Linux kernel

  • A. Once the memory management units and caches have been initialized the system will be able to use virtual memory and launch user space processes.
  • B. The kernel will look in the root file system for the init process (found under system/core/init in the Android open source tree) and launch it as the initial user space process.

4. The init process

  • A. The init process in Android will look for a file called init.rc. This is a script that describes the system services, file system and other parameters that need to be set up. The init.rc script is placed in system/core/rootdir in the Android open source project.
  • B. The init process will parse the init script and launch the system service processes.

5. Zygote and Dalvik

The Zygote is launched by the init process and will basically just start executing and initialize the Dalvik VM.

6. The system server

The system server is the first java component to run in the system. It will start all the Android services such as telephony manager and bluetooth. Start up of each service is currently written directly into the run method of the system server. The system server source can be found in the file frameworks/base/services/java/com/android/server/SystemServer.java in the open source project.

7. Boot completed

Once the System Server is up and running and the system boot has completed there is a standard broadcast action called ACTION_BOOT_COMPLETED. To start your own service, register an alarm or otherwise make your application perform some action after boot you should register to receive this broadcast intent.

2010/10/31

為你的電腦降溫 cooldown CPU

請直接參考BBOY 寫的這篇 Frequency Scaling

在linux底下首先打開make menuconfig-> Power Management support --->
[*] CPU Frequency scaling --->
Default CPUFreq governor (userspace)
< > 'performance' governor
< > 'powersave' governor
-*- 'userspace' governor for userspace frequency scaling
< > 'ondemand' cpufreq policy governor
< > 'conservative' cpufreq governor

接著echo你想要的頻率到/sys底下的file node。
ex:"echo 500000000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed"
如果我們去查一下該目錄,可以發現
# ls -l /sys/devices/system/cpu/cpu0/cpufreq
總計 0
-r--r--r-- 1 root root 4096 2010-10-31 23:44 affected_cpus
-r-------- 1 root root 4096 2010-10-31 23:44 cpuinfo_cur_freq
-r--r--r-- 1 root root 4096 2010-10-31 21:39 cpuinfo_max_freq
-r--r--r-- 1 root root 4096 2010-10-31 23:44 cpuinfo_min_freq
-r--r--r-- 1 root root 4096 2010-10-31 23:44 cpuinfo_transition_latency
-r--r--r-- 1 root root 4096 2010-10-31 23:44 related_cpus
-r--r--r-- 1 root root 4096 2010-10-31 21:41 scaling_available_frequencies
-r--r--r-- 1 root root 4096 2010-10-31 21:41 scaling_available_governors
-r--r--r-- 1 root root 4096 2010-10-31 21:41 scaling_cur_freq
-r--r--r-- 1 root root 4096 2010-10-31 21:41 scaling_driver
-rw-r--r-- 1 root root 4096 2010-10-31 21:39 scaling_governor
-rw-r--r-- 1 root root 4096 2010-10-31 21:41 scaling_max_freq
-rw-r--r-- 1 root root 4096 2010-10-31 21:41 scaling_min_freq
-rw-r--r-- 1 root root 4096 2010-10-31 23:41 scaling_setspeed
drwxr-xr-x 2 root root    0 2010-10-31 23:44 stats
底下就試著....
# cd /sys/devices/system/cpu/cpu0/cpufreq
# cat cpuinfo_cur_freq
2000000
發現我的電腦目前的頻率也才 2000000, 似乎單位與原文中的不一樣。
後來我去試著用c3dl demo來衡量 CPU 速度,確實可以透過原文章中的方式調慢,我的命令如下:
# for i in 0 1; do echo 1000000 > /sys/devices/system/cpu/cpu$i/cpufreq/scaling_setspeed; done

原文章有更多有用的資訊,有興趣的人請親自前往觀看

2010/10/25

cross compile busybox for android (為 android 準備 busybox)

我主要是參考cross compile busybox for android,大綱是:

1. 準備 cross compile 工具。
1. 這一項我原本試著用 ubuntu 的內建工具,也就是 xxxx-arm-linux-gnueabi 套件組,可是失敗。
2. 在文中提到可以自Download Sourcery G++ Lite Edition for ARM下載,請選『EABI』、『IA32 GNU/Linux TAR』,我下載的版本是 https://sourcery.mentor.com/public/gnu_toolchain/arm-none-linux-gnueabi/arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

3. 解壓後,我是放在 /usr/local/cross-arm 下

2. 若不想自己編譯,也可以從 busybox 網站直接下載執行檔,我試過可以執行的有 busybox-armv6l, busybox-armv5l, busybox-armv4tl

3. 下載 busybox source code, 上面執行檔最新的是 1.17.2, 但是 source code 是 1.17.3, 因此也可以自己編譯 最新的 busybox 1.17.3 source code
1. 解壓後,使用 make menuconfig 來選擇組態
2. Busybox Settings -> Build Options -> 裡面,挑下面的選項,將它編譯成靜態載入
[*] Build BusyBox as a static binary (no shared libs)
3. 在同樣的地方,挑 () Cross Compiler prefex,按 Enter 後必須填第一步安裝的 cross compile tools, 我的是:
/usr/local/cross-arm/bin/arm-none-linux-gnueabi-
確定後剛剛的選項會變成:
(/usr/local/cross-arm/bin/arm-none-linux-gnueabi-) Cross Compiler prefex
4. 在 Busybox Settings -> Installation Options-> 裡面,挑下面的選項,讓 busybox 可以不必安裝到 /usr 下
[*] Don't use /usr
註:1.19.3 版移到 Busybox Settings -> General Configuration -> 下面了
4. 上面的選項存檔、離開後,就可以用 make 來編譯
5. 放到 device 上,我是模擬機,道理一樣:
adb push busybox /data/busybox.exe
上面是故意改名字的,下一步要用到
6. adb shell:
# mkdir /data/busybox
# cd /data/busybox
# /data/busybox.exe --install .

7. 改變 PATH 環境變數
這一項比較麻煩,原則上就是要改變 system image, 所以有兩個方法,一個是自己改 ramdisk.img, 要用這一招的話請參考 busybox及bash在android中的安裝及init.rc修改
還有一個方法,就是第一點文中的方法,將系統重新掛載成 rewritable.....

su #取得root權限
mount -o remount,rw /dev/block/mtdblock6 /system #重新mount使/system可寫
mv busybox /system/bin/ #移動busybox
chmod 777 /system/bin/busybox #設為可執行
/system/bin/busybox --isntall .
mount -o remount,ro /dev/block/mtdblock6 /system #恢復/system為只讀

2010/10/12

android dynamic GUI 動態介面--範例程式

先來看看 config 檔,
$ cat Sample.xml

<?xml version="1.0" encoding="UTF-8"?>
<cmds>
<cmd text="Test1" path="Add\add" params="3 5"/>
<cmd text="Test2" path="Add\add" params="7 9"/>
</cmds>


$ cat Sample1.xml

<?xml version="1.0" encoding="UTF-8"?>
<cmds>
<cmd text="umount sdcard" path="/system/bin/umount" params="/sdcard"/>
<cmd text="top" path="/system/bin/top" params=""/>
<cmd text="reboot" path="/system/bin/reboot" params=""/>
</cmds>


範例程式如下:

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

import android.view.View;
import android.widget.LinearLayout;
import android.widget.Button;
import android.widget.TextView;

public class HelloAndroid extends Activity {
/** 底下這個是放分析 xml 完的內容,資料結構要自己再想過,或是直接以 DOM 的方式存取,而不必另外放也可以
也就是在外面也是用 Document doc 這個物件來存取
**/
String[][] items;

// 底下這三個是我們的 GUI 上會有的元件的「容器」
Button cmd[];
TextView cmdPath;
TextView cmdParam;

/** Called when the activity is first created. */
/** onCreate() 是每個應用程式的入口,所以算是一般 C 裡面的 main() **/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.main); // 這個是原來的 HelloAndroid 範例程式,我們不需要原來的 layout 設計,用自己的方式
// 目前以 LinearLayout 來設計,可以改成矩陣式的,不過最好是可以容許橫拿直拿動態調整,第一版可以不必有此彈性功能
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(1);

// 呼叫我們的 XML file 分析載入函式
GetXMLInfo();

// 底下這三個是我們的 GUI 上會有的元件的「容器」
cmd = new Button[items.length];
cmdPath = new TextView(this);
cmdParam = new TextView(this);

/** 底下就是直接把 XML 內容, 也就是 items 拿來放到 GUI 上
資料結構可以改變,整個 GUI 也可以改變設計
**/
int iCmd;
for (iCmd=0; iCmd<items.length; iCmd++)
{
cmd[iCmd] = new Button(this);
cmd[iCmd].setId(iCmd);

/** 為每個 button 加上按鍵的事件以便做出反應 **/
cmd[iCmd].setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v)
{
cmdPath.setText(items[v.getId()][1]);
cmdParam.setText(items[v.getId()][2]);
}
});
cmd[iCmd].setText(items[iCmd][0]);
layout.addView(cmd[iCmd]); // 最後真正加到我們的 layout 中
}
// 上面的 for 迴圈是加按鍵,底下只是加上顯示訊息的文字區塊
layout.addView(cmdPath);
layout.addView(cmdParam);
setContentView(layout);
}
private void GetXMLInfo()
{
try{
File f=new File("/sdcard/Sample.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName("cmd");

int _cmdLength = nl.getLength();
int _cmdAttributes=3;

items = new String[_cmdLength][_cmdAttributes];

for (int i=0;i<_cmdLength;i++){

items[i][0]= nl.item(i).getAttributes().getNamedItem("text").getNodeValue();
items[i][1]= nl.item(i).getAttributes().getNamedItem("path").getNodeValue();
items[i][2]= nl.item(i).getAttributes().getNamedItem("params").getNodeValue();

}

//System.out.println("cmd " + RecordS.length);

}
catch(Exception e){
e.printStackTrace();
}
}
}


執行時:
$ adb push Sample.xml /sdcard/Sample.xml
----呼叫該應用執行





----換成新的 GUI, 用新的 Sample1.xml 取代原先的 Sample.xml, 記得放的檔名是一樣的
$ adb push Sample1.xml /sdcard/Sample.xml
----呼叫該應用執行

android dynamic GUI 動態介面

--動態 GUI--
寫應用程式,動態 GUI 是常常會有此需求的,原則上Dynamic Layout 的簡單概念,可以參考這篇:
http://www.dreamincode.net/forums/topic/130521-android-part-iii-dynamic-layouts/

在網路上找到一個寶庫, 一堆 Android source code 含有 test tools:
http://devdaily.com/java/jwarehouse/android/
其中有一份 DynamicLayout() 的範例:
http://devdaily.com/java/jwarehouse/android/core/java/android/text/DynamicLayout.java.shtml

或者我們可以從底下的問題開始了解我在說什麼:
1. 有人問他想要從 XML 來動態呈現 GUI,但是求問者有些功能做不到
http://efreedom.com/Question/1-2901333/Dynamic-Layout-Change-Runtime
2. 所以有人就回答他,用 setLayoutParams() 或請參考:
http://efreedom.com/Question/1-2693744/Android-Runtime-Layout-Tutorial

--執行外部命令--
至於 Dynamic Layout 之後,每個按鈕的功能,就變成要處理 button event.....再加上執行外部命令功能
http://code.google.com/p/market-enabler/wiki/ShellCommands
想要完整的 code 的話,可以參考:
http://gimite.net/en/index.php?Run%20native%20executable%20in%20Android%20App

還有相對簡單的方法是用 Java RunTime:
http://developer.android.com/reference/java/lang/Runtime.html
如果要使用 RunTime 的話,要能夠對外部命令做 I/O, 完整範例可以參考:
http://devdaily.com/java/edu/pj/pj010016/

2010/09/20

android adb over wifi

android adb 算是非常好用的介面,不過....預設是用 USB 來連接 Host 與 Device。有沒有方法可以透過無線網路?

首先,要能讓 Device 知道該透過 TCP/IP 或是 USB,似乎只能二選一切換,方法是:
-- 切成 TCP/IP --
setprop service.adb.tcp.port 5555
stop adbd
start adbd

-- 或切成 USB --
setprop service.adb.tcp.port -1
stop adbd
start adbd

在 Host 端,就可以用下面命令讓 adb 連線
adb tcpip 5555
adb connect WIFI.IP.ADDRESS:5555
-- 或透過 usb --
adb usb

SMART EDISON

愛迪生一向被稱讚,這邊就有一個用他的名字來取的一個新詞,用在思維、溝通、做事上很值得參考:
S.M.A.R.T E.D.I.S.O.N

全稱是:
Specific: 說話做事講究具體,不空洞
Measurable: 所有數據、問題,都應該可量測,不能太理論、抽象、高調
Accountable: 責任清楚,之前上過一堂「當責」的課,用的也是這個詞
Relevant: 切題,也就是所謂題中之意要符合目的與整體的價值
Timeline: 講究時效性,時機重於一切,等端出解決方案時黃花菜都涼了,客人跑光了,那就失去其意義

Emotional: 要能激勵人心、讓人熱情澎湃,不要澆息大夥兒的工作熱忱
Decisive: 能堅決果斷,要具備決定性的思維,做事不拖泥帶水,不做三姑六婆式的思維
Integrated: 要能整合、整體性的思維,而不是散兵游勇般的各自作戰
Sensory: 要能與別人感同身受,而不能唱獨角戲,不能自我感覺太良好而自絕於大眾之外
Optimistic: 要具樂觀思維,要影響並提升團體的樂觀氛圍,永不放棄,總要「再試一次」
Now: 立刻做

2010/09/17

Gtalk HOWTO Multi-Clients

現在因為申請 google appengine 的帳號後,就變成有多個 google 帳號,可以安裝 firefox + gmail checker....此時若想利用像 gtalk 來隨時讓人找得到,或是檢查郵件也是不錯的方式。

但是 gtalk 預設只能上一個帳號,一個非常簡單的方法:
1. 在啟動 Gtalk 的小圖示(捷徑圖示)按右鍵選內容,找到命令路徑加上 /nomutex, 以我的來說是 "C:\Program Files\Google\Google Talk\googletalk.exe" /nomutex /startmenu
2. 在 gtalk 登入畫面,不要勾選 Remember password

第二步若是來不及的話,只要在登入後的 system tray 按右鍵功能表選 Sign Out, 再按左鍵叫出登入畫面即可。注意此時不要勾選 Remember password!!! 這樣你就可以叫多個 gtalk 出來,user name 輸入全部的 email 即可。

2010/09/15

android java.util.zip.ZipException: duplicate entry: hyts_Foo.c

這個標題有點長,是因為直接貼訊息。編譯 android cts 時出現的錯誤,我的解決辦法就是把錯誤訊息中的重複檔案砍了....包括

./dalvik/libcore/support/src/test/resources/hyts_Foo.c 及
./dalvik/libcore/dom/src/test/resources/ 底下的
hc_staff.xml
staff2.xml
staffNS.dtd
xhtml1-strict.dtd
staff2.dtd
staff.dtd
staff.xml

2010/09/09

如何經營辦公室戀情

底下內容來自公司的內部文件,覺得不錯就貼上來了。老是遇到總字輩的玩辦公室戀情,底下的人總是感覺非常無奈,官位愈高,應愈謹言慎行啊!

--

隨著工作時間佔我們的生活重心愈來愈重,與同事互動的機會越來越多,在相互合作的氣氛中,也許您會發現對一些同事有不一樣的感覺,或察覺到身邊的辦公室戀情慢慢增加了。辦公室戀情處理的好,不但對工作氣氛有加分效果,更有可能促成佳偶良緣;但如果稍有不慎,卻也可能造成辦公室的災難,當事人也會身陷八卦中心,增加困擾。本月文章與您分享幾個面對辦公室戀情的方式。

Tip1.誠實的處理感情議題

請先檢視自己的心態,如果只是想尋求短期的心理安慰或是一時衝動,並沒有發展長期關係的意願,請您三思而後行。在辦公室裡,如何維持正直公平是非常重要的,如果您的身份不宜,或是只想搞曖昧增加生活刺激,是非常危險的事情,而且會為自己與組織引起非常大的危機,因此保持情感上的誠實是非常重要的。

Tip2.如果辦公室戀情的對象與您有權力關係,請想清楚再做決定

如果您的對象與您有權力關係,例如是您的客戶,廠商或是上司,部屬,您要注意,戀情可能會有兩極化的結果。特別是面臨結束關係時,您又是提出分手的一方,而且結束的過程並不夠理智成熟;那麼在分手後,有可能會面臨到工作上無理的要求,或是提出無謂的刁難,讓工作關係更加惡劣,需要極高的智慧,才能拿捏好其中的尺度。因為職場戀情與職位高低有必然的權力關係或潛在風險,因此當您面臨這個議題時,必須要更加審慎的思考所有可能後果,再做決定。

Tip3務必保持低調

如果您不希望您們的戀情受到太多的關注,或是被拿到顯微鏡下放大,那麼,請您務必保持低調,尤其是在同個辦公室裡,無心的一舉一動,如果被有意的解讀,或是只要有同事對您們其中一人有不滿或抱怨,都有可能影響工作。因此衷心的建議,除非決定要結婚了才通知大家,否則低調保守的處理這份戀情,不但能夠降低對辦公室工作的干擾,也會使感情之路省掉很多不必要的外在眼光。

Tips4享受真正認識一個人並且成熟交往的樂趣

事實上,辦公室是屬於遇見適合對象的好地點之ㄧ,因為您會透過工作互動看到身邊的人展現出他的個性、如何處理事情、面對壓力時最真實的樣子。您會是在真正了解以及認識這個人的個
性與特質之後才做出決定。在工作場合所遇到的對象,會較其他地方認識的對象,更深入且合適。所以一旦您要發展辦公室戀情,用成熟的方式去面對,您會享受到感情生活裡美好的感受。

結語:

辦公室戀情本身並無對錯,只是您一定要誠實且成熟的處理兩人感情。因此建議您如果遇到辦公室戀情或是身邊有同事正身處辦公室戀情中,您可以根據上述的幾個提醒作為感情發展的參考。若是能夠請楚了解辦公室戀情中拿捏公私關係的尺度,以及職務權力不同可能會造成的衝擊,在成熟的考慮之下發展辦公室戀情,就能夠享有愉快的心情與有效率的工作。

2010/08/17

ubuntu 10.10 將可內建支援多點觸控

詳情請見Multi-touch Support Lands in Maverick

既然有新聞,就自己去找,在 ubuntu 10.10 系統上,確實可以找到 utouch:

$sudo apt-cache search utouch
libutouch-geis-dev - Gesture engine interface support - dev files
libutouch-geis-doc - Gesture engine interface support - documentation
libutouch-geis1 - Gesture engine interface support
libutouch-grail-dev - Gesture Recognition And Instantiation Library - dev files
libutouch-grail1 - Gesture Recognition And Instantiation Library
utouch - A meta-package to install gesture libraries and tools
utouch-geis-tools - Gesture engine interface support - test tools
utouch-gesturetest - Test tool for the X Gesture extension
utouch-grail-tools - Gesture Recognition And Instantiation Library - test tools
xserver-xorg-input-mutouch - X.Org X server -- muTouch input driver


重點是,這邊感嘆一下,好像都國外廠商在玩這個,國內玩 Linux 的廠商沒半個願意搞....

2010/08/06

empathy under proxy

Empathy 是 Ubuntu 預設的 IM client, 可以支援相當多的 IM, 包括 MSN, Yahoo IM, gtalk。
敝公司會把 gtalk 的 5222/5223 擋住,此時可以用 gmail 裡面的 Port 設定值,也就是用 https在用的 443, 設定範例如下

account : username@gmail.com
encryption required TLS/ssl : (YES)
ignore ssl certificate error : (YES)
server : talk.google.com
port : 443
use old ssl : (YES)

或請參考下面的圖
.叫出帳號設定,可以在新增帳號時就設定,或是用修改的方式

.設定畫面如下,或請參考上面的設定值

2010/08/03

android build on ubuntu 10.04

Dependance
  • sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev java-common unixodbc libsdl-dev libesd0-dev
Java
  • sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
    sudo apt-get update
    sudo apt-get install sun-java6-jdk
Source Code
  • curl http://android.git.kernel.org/repo > ~/bin/repo
  • chmod a+x ~/bin/repo
  • mkdir -p ~/src/android
  • cd ~/src/android
  • repo init -u git://android.git.kernel.org/platform/manifest.git
  • repo sync
  • repo forall -c git checkout --track -b sai-master korg/master
Environment
  • export JAVA_HOME=/usr/lib/jvm/java-6-sun/
    export PATH=$PATH:${JAVA_HOME}/bin:$HOME/src/android/android-sdk-linux_86/tools:$HOME/src/android/out/host/linux-x86/bin
    export ANDROID_PRODUCT_OUT=$HOME/src/android/out/target/product/generic
  • chmod a+x build/envsetup.sh
  • source build/envsetup.sh
Build
  • make -j4
Run
  • export DISPLAY=:0.0
    #ps: 如果沒有設定 DISPLAY, 會顯示的訊息跟一般的 X app 不一樣,如下:
    SDL init failure, reason is: No available video device
  • emulator -system system.img -data userdata.img -ramdisk ramdisk.img

2010/06/04

如何加速 dd?

dd 是很常見的命令,但是在大量資料的複製時,會顯得非常慢,最簡單的範例是
dd if=/dev/zero of=/vmem.img count=2G
2G 以目前來說非常常見,例如要把一個作業系統放到隨身碟中,或是像 ChromiumOS 也差不多就這個數值。

我把我測試執行的結果貼一下:

首先用 bs=4M 來試,這個數值是 ChromiumOS 的 script 中內建的值:

$ time dd if=my-8G.img of=/dev/sdc bs=4M

1919+1 records in
1919+1 records out
8050966528 bytes (8.1 GB) copied, 1189.83 s, 6.8 MB/s

real 19m49.848s
user 0m0.030s
sys 0m18.410s


接下來用預設的來比對,預設的 block size 是 512byte

$ sudo time dd if=my-8G.img of=/dev/sdc
15724544+0 records in
15724544+0 records out
8050966528 bytes (8.1 GB) copied, 6303.21 s, 1.3 MB/s

real 105m3.254s
user 0m7.740s
sys 1m36.380s


最後,用一個更大的比較一下,用 12M

$sudo  time dd if=my-8G.img of=/dev/sdc bs=12M
639+1 records in
639+1 records out
8050966528 bytes (8.1 GB) copied, 1060.62 s, 7.6 MB/s

real 17m40.653s
user 0m0.010s
sys 0m11.730s


會發現,4M 遠比預設值快非常多,而 12M 與 4M 相差不大,但是仍然有比較快。
以上僅供參考

2010/05/21

cron 與 anacron

剛好朋友問到 crontab 怎麼不見了一事,就提醒他,現在的系統,大概都是用 anacron,因此就來說說兩個的不同。關於 anacron, 請參考 sourceforge 的說明。(我翻的也不會比較好)

首先,最主要會出現 anacron 的原因是,機器不見得會開機,所以,在原來 cron 設定的時間點過了之後,該事件就不會被觸發!也就是說,anacron 不是靠「時間點」來觸發,它是檢查要做的事在那個時間點有沒有被做,沒有?那就觸發它。

基本上兩個是互補的。例如,cron 可以設定到時、分,而 anacron 只有「天」!
又例如,anacron 並非 daemon, 通常設計成在開機時做一次.....可是又不是常常開機,所以 ubuntu 是利用 cron 來定期叫 anacron 檢查,也就是 cron 本身不再是用來設定事件,而是...

叫 anacron 替代之前的 cron, 再叫 cron 叫 anacron 起來。

什麼?疊床架屋?不是啦,要從(文章的)頭想起。這種機制最有用的地方,除了系統會掛掉或是像有的是網路的動作,剛剛好網路不通,透過 anacron 就會有機會再重做,此外,....像筆電才是它最佳的舞台,你叫它做的事,在你下次開機時,只要時間點到了(或過了),它就會幫你完成。

最後,anacron 最新的版本是 2.3, release date 是.....2000 年 06 月 22 日!!!

2010/05/19

chromiumOS 的建立與執行 -- under ubuntu-3

寫過 chromiumOS 的建立與執行 -- under ubuntu-1chromiumOS 的建立與執行 -- under ubuntu-2,一直都無法正確的在 Virtualbox 執行,後來在 ChromiumOS 論壇看到一篇討論,提到把 Virtualbox 的 Machines/下的 CHROMIUMOS.xml 內容修正如下,就可以執行了!

<Hardware version="2">
<CPU count="1">
<HardwareVirtEx enabled="true" exclusive="false"/>
<HardwareVirtExNestedPaging enabled="false"/>
<HardwareVirtExVPID enabled="false"/>
<PAE enabled="false"/>
</CPU>
......
<BIOS>
<ACPI enabled="false"/>
<IOAPIC enabled="false"/>
<Logo fadeIn="true" fadeOut="true" displayTime="0"/>
<BootMenu mode="MessageAndMenu"/>
<TimeOffset value="0"/>
<PXEDebug enabled="false"/>
</BIOS>

chromium 的測試概觀


從結構圖來看,google 企圖以 Client/Server 的架構來簡化工廠生產時的人力配置,同時提供 Web 介面以及 command line 介面。

有幾個問題先列下來:
1. 如何簡化 Server/Client 架構的建立?也就是從 server 端如何知道 client 端的 IP?
AUTOIP? ZeroConfig? DHCP?
2. 以 autotest 來說,似乎不必人力坐在電腦前面,但是,若需要 locate device 時,如何得知是哪一台?
3. 對需要 manual test 的狀況下,如何進行?


2010/05/18

chromiumOS 的建立與執行 -- under ubuntu-2

之前寫了第一篇「chromium的建立與執行-1」,不過若是要建立 virtualbox image 的話,我自己試半天都無法執行。

Running Tests一文裡,有提到另一種快速的方法來建立可供測試的影像檔。看這種文章,比較需要注意的反而是 "inside" 與 "outside" 是指有沒有 chroot, 也就是有沒有執行過 ./enter_chroot.sh。inside 就是要執行過 enter_chroot.sh, 而 outside 就是沒有執行過它,也就是一般普通的環境。

該文的後面有一節提到「Create and run a test-enabled image on your device (the easy way)」,這真的是相當方便的方式! 只要一行,對,一行命令即可。

我在我的機器終於有試出怎樣用 virtualbox 看到開機畫面,目前尚未成功,畫面如下:

首先,Virtualbox 有兩個地方要注意,一個是開啟 EFI....



but, EFI 設了只是虛擬的,目前手邊都沒有機器的 BIOS 是跑 EFI 的!!!

除了 EFI 要開啟,還要注意,我們的 CPU 都是 Intel 的,所以....AMD 的虛擬機器選項要關掉:



這樣可以看到開機畫面,心裡會爽一點,只是.....



可以發現.....一直找不到可以透過 EFI 找到的開機裝置!!!



所以,最後,就進這個維護畫面.....

2010/05/14

Seamless 使用經驗

之前在寫Hal Dbus udev automount usb device?文章提到的參考文獻已經不見了!若有興趣的話,除了我的那篇文章外,也可以自行再參考阿呆的HAL、D-bus、ivman、udev心得

會用這個標題,原因是同事提到「Gnoem與KDE兩大陣營的戰爭」這件事,似乎跟 udev, HAL, Dbus無關?在我們把話題轉回來 Seamless 之前,先讓我再說說關於 Gnome/KDE 的後續見解。

我們可以從現有狀況來思考。如果要看 Desktop 的話,現今 Linux distribution 市占率最大的仍然是 Ubuntu, 它不一定最好,譬如硬體支援恐怕還不如 SuSE, Embedded 市占恐怕還不如 MontaVista, 但是,以 Desktop 來看它卻是最大宗。我認為原因不在純粹的 Desktop 是選 Gnome or Kde, 因為 Ubuntu 還有分支是 Kubuntu 採用 KDE。

整合度、易取得、進入門檻、客製化等等都是重要考量因素。純粹就整合度來看,KDE 整合的東西較完整,問題是,KDE 太笨重了,當它變得愈來愈像微軟時,它就真的變的跟微軟一樣。

Ubuntu 採用 Debian 系統,我想也是一個它受歡迎很重要的原因之一,雖然 Redhat/Mandrake 與 Ubuntu/Debian 的套件現今要整合變得比較容易,但是畢竟我還是比較喜歡 Debian, 尤其在做嵌入式系統的時候。試想,ChromeOS 預設支援的就是 Ubuntu,而當初 Intel 在推 Moblin 第一個找的也是 Ubuntu。原因何在?

現況是,從市占來看,明顯採用 Gnome 的人比較多。至於真正的現況除了 Desktop 外,不管是 Android, Meego, ChromeOS 等等,絕對是從另一個角度切入。反倒是我們該思考的不應該是 Gnome or KDE ? 這樣的路線。就像 Meego 想通吃,ChromeOS 有沒有可能走這樣的通吃的機會?

ChomeOS 開發團隊一直被問到,ChromeOS 有沒有可能執行 Desktop Applications? 若要問答案,當然是可以,但是目前 ChomeOS 開發團隊似乎較堅持走純 WebOS 的路。我們要 followup Google 的決策呢?還是要滿足更多人的需求呢?

我想,Intel 也不是笨蛋,善用 Web 而不純粹 WebOS 的市場在目前仍然是最大的,所以,我想,似乎 Google 的堅持也會有被動搖的一天。未來潮流到底會如何走?是選擇 WebOS? 還是選擇 Gnome? KDE? or.....Meego?

接下來談談為何我會談 Seamless。udev, HAL, Dbus 是三個主題,卻也是一個主題,是連著 GNOME/KDE 來的。Ubuntu 會讓人覺得好用的一個很重要的地方,它輕量級卻有著像 Windows 那樣方便的使用經驗,這得歸功於這三者在 Gnome 中被整合的很好。DBus 不止用來取代 IPC, 它其實是各個 module, 包含底層 kernel, daemons, drivers, application, and window manager 之間的橋樑,但是它畢竟只是橋樑而已,要讓使用者覺得方便,在於一個觀念的施行: seamless。

談這麼多終於可以談 Seamless。正因為 Seamless 的緣故,早期 KDE 是比較受歡迎的,至少 Redhat 就用它,而當時 Redhat 也是最大的 linux distribution。但是 KDE 最大的問題在於它的笨重。而在 Ubuntu 的推波助瀾之下,現在 Gnome 使用率應該是最大的了,就如我前面說的,我個人認為最大的原因在於 Ubuntu 讓人有一種類似 windows 帶來的 Seamless 使用經驗。它整合好 hotplug, udev, HAL, dbus....and window manager 層,所以就打通了硬體與使用者間的無縫隙使用經驗。

把格局放大來看,iPhone 為何會流行?Android 是以什麼樣的方式來迎頭追擊?iPad 又是採取什麼策略?我個人認為背後最大的原因就是 Seamless......再把時光拉回 Netscape 與 IE 的戰爭時代,說穿了,也是同樣的原因,當IE與作業系統整合,它就贏了這場戰爭。講白話一點,就是,使用者是笨蛋,使用者是懶惰的。

沒錯!別想要打我。現在的手持裝置就夠 Seamless 了嗎?沒有!路還很長。我看好的很多技術,若有跟我常常聊天就會知道,一項一項都在實現當中,未來其實是很明顯的。

註一:我也是使用者
註二:dbus 參考文獻

2010/05/13

Open Source License Scanning tool - from Florence

一篇來自中研院葛冬梅小姐的信轉貼於此,主題是「關於原始碼版權的掃描分析工具」,在此特別感謝她。並順便協助宣導一下 OpenFoundry, 她們一直努力推廣 Open Source, 不止是版權問題的討論,還辦過非常多研討會等活動,也都有資料可以下載

【掃描原始碼】

就我所知,目前有三套系統是可以掃描軟體原始碼,來查驗原始碼是否包含自由軟 體程式碼,以及判斷這些原始碼是採用哪一份條款來授權。這三套系統為 FOSSology、Blackduck與Palamida。雖然這三套系統都可以掃描原始碼、提供授權 資訊,不過就我個人所知,這些系統掃描精確度都有需要改進之處,因此這些掃描 結果僅可以作為輔助參考之用,若真的發現有授權狀態不相容、侵權情況的時候, 還是必須要諮詢技術與法律人員,來解決不相容、侵權的問題。以下針對三個系統 分別說明。

1. Fossology

這是一套掃描原始碼檔頭授權資訊的系統,系統會將掃描到的檔頭資訊與資料庫中 的自由軟體授權資訊相比對,來確認軟體中是否有利用到自由軟體,並不會掃描所 有的原始碼。對於檔頭沒有授權資訊的原始碼檔案來說,就無法確認該檔案的授權 狀況。優點是免費、任何人都可以自由下載與安裝。您利用這套系統的方式有二:


(1) 利用現成的vdi檔。

為了方便他人利用這套系統,鑄造場將Fossology系統製作成vdi檔,只要安裝 VirtualMachine後,將這個vdi檔掛載上去,依照說明就可以掃描原始碼的授權狀態。

請您進入下列網頁,進入後點選左方選單「下載區」,進入下載區頁面後,就可以 下載vdi檔與相關說明文件

Fossology vdi from OSSF:http://of.openfoundry.org/projects/1342

(2) 自行下載與安裝。

自行到Fossology網站下載後安裝起來,網址: http://www.fossology.org/


2. Blackduck

這是美國一家專門提供自由軟體原始碼掃描比對服務的公司,收費不貲,優點是資 料庫龐大。該軟體目前在台灣有兩家代理公司分別如下:

鈦智科技:http://www.adnetwork.com.tw/pro-blackduck-cn.htm

倚碩科技:http://www.esoft.com.tw/blackduck.php


3. Palamida

這是一家提供自由軟體安全諮詢管理公司,提供服務的方式是透過系統掃描原始碼 檔案,然後針對掃描結果提供諮詢服務,這間公司並且與 OSRM合作,提供自由軟 體 風險保單供業者購買。


Palamida:http://www.palamida.com/

OSRM風險保單的頁面:http://www.osriskmanagement.com/insurance.html

【掃描目的碼】

就我目前所知,僅有一套軟體可以掃描二進位的目的碼,也就是今日講師Shane所 提過的Binary Analyzing Tool。這是自由軟體,您可以上網自行下載安裝來掃 描。網址如下:

http://www.binaryanalysis.org/en/home


由於這套軟體最近才釋出,我對於這套系統所知有限,因此無法多做評論。若是您 之後有下載來使用,非常歡迎提供您的心得給我參考。


以上每個系統各有優缺點,因此我想您還是必須就貴公司的狀況,來個案評估,採 用哪一個系統比較適合。

以上資訊供參考,希望對您有所幫助。若還有任何疑問與意見,歡迎來信討論!


祝 順心

Florence T.M. Ko 葛冬梅
Legal Specialist, OSSF
e: tmk2005@citi.sinica.edu.tw
p: +886-2-27883799 ext. 1474
w: http://www.openfoundry.org/

2010/05/10

熱門技術 3D

其實立體視覺的成像「原理」上都大同小異,也就是利用兩顆眼睛所見到的影像的微小不一樣產生的立體感來的。
早期,我在讀研究所時,曾經流行過 3D 立體書,例如這張圖片裡面是一個騎士騎著馬,右手拿著一面旗子迎風飄揚。那時候我們就想要做你的這個題目了。當然後來沒真的去做。請見 Wiki 對 Stereogram 的解釋

單一影像呈現立體視覺與戴特殊分光眼鏡看似兩種非常不同的方法,其實原理也並無不同,既然說到了,可以上網找找 SIS, SIRDS等關鍵字看看。

透過光柵來呈現立體影像的,可以參考這篇. 或是同網站的這篇。而光柵板的原理可以參考這篇

當然這樣的文獻很多,譬如這篇就將前面光柵的原理視覺化,一定要進去看看。

要談數學運算的話,可以參考這篇

看完原理之後,要用兩顆攝影機取得3d立體影像,其實不算太難,難的是後製的運算......不過,若是以立體攝影文獻來說,可以參考立體攝影這篇

working with ubuntu and XP 2 - sshfs

雖然知道 sshfs 很久,卻一直沒有用,在我提出 working ubuntu and XP 的同時,同事提到 sshfs,可以用的 tool 有兩個,一個是 Dokan,可以擁有類似網路磁碟機的無縫使用經驗,也可以用 WinSCP,這個工具也是非常好用。

搭配 sshfs 及 ssh 遠端作業,應該可以符合大部份的作業需求,剩下的,或許會希望用 svn 來實現。

2010/05/05

working with ubuntu and XP

我的環境,是因為公司(絕大多數公司都如此)是建立在微軟體系上,所以,不另行在 Ubuntu 上建 Samba server,在讀本文時也請參考Mount samba shares with utf8 encoding using cifs一文,及Share Ubuntu Home Directories using Samba一文。

☆ Ubuntu 端看到 PC 上的目錄 ☆
1. 在 PC 上選定目錄,並按右鍵開啟分享,請注意,一般預設是沒寫入權,要在 Ubuntu 端能寫入的話,必須手動打開權限
2. 在 Ubuntu 上,有兩種方式,一個是手動掛載,一個是放在 /etc/fstab 讓系統自動掛載

a. sudo mount -t cifs //你的工作電腦位址/你分享的名稱(分享名稱不見得剛好就是目錄名稱) 掛載點 -o credentials=/你的HOME路徑/.smbcredentials,iocharset=utf8,file_mode=0777,dir_mode=0777
舉例來說是 sudo mount -t cifs //10.20.30.40/wade_share /home/wade/share -o credentials=/home/wade/.smbcredentials,iocharset=utf8,file_mode=0777,dir_mode=0777
上面的 .smbcredentials 權限設成唯讀(0400), 內容是工作PC 上的帳號,如:
username=wade
password=iamwade


b. /etc/fstab 仿上面執行例的相對內容如下:
//10.20.30.40/wade_share /home/wade/share cifs credentials=/home/wade/.smbcredentials,iocharset=utf8,file_mode=0777,dir_mode=0777 0 0


☆ PC 端看到 ubuntu 上的目錄 ☆

1. 安裝 samba
2. 修改 /etc/samba/smb.conf, 找到 [homes] 這一區段,內容如下:

[homes]
comment = Home Directories
browseable = yes
writable= yes
create mask = 0775
directory mask = 0775
valid users = %S


上面原來的設定當然有很多註解,並沒說一定要刪除註解。重點是 valid users = %S 及 writable = yes
3. sudo service smbd restart
4. sudo service nmbd restart
5. 在 PC 端,「開始」「執行」輸入 \\你的 ubuntu 位址\你的帳號 即可跳出帳號密碼畫面,請輸入在 ubuntu 上的帳號密碼,實際輸入例如下:
\\10.20.30.39\wade

2010/04/28

CHT8000 如何省電

上次寫了一篇我的3G手機 CHT8000 使用心得,再來貢獻一篇。

是有發現3G手機一下子就沒電了,所謂的一下子,就是撐不到一天。哦?那應該沒人敢用了吧。當然是有發現若用 3G 功能,會耗電很兇,一開始我在晚上睡覺時是直接關機,後來發現開網頁時若把螢幕關閉(輕按左上外側按鈕)的話也會背景抓網頁,所以就沒事關螢幕。

現在則是發現,「飛航模式」下(長按左上外側按鈕))非常省電。若是只是要玩遊戲,請記得把飛航模式開啟。

另外,常常背景有應用程式在執行,我是一開始就去抓了一個軟體,叫 Process Manager, 也下載一個移除軟體叫 AppRemover。前者可以很容易讓我看哪些應用程式在背景跑,沒什麼在用就刪了。

講這議題,就得說說我另一個軟體,叫 fring, 可以讓我用手機上 skype, msn, 目前猜測它會常常三不五時上網,因此沒事我還是得把它關閉。總之總之,沒要上網時開啟飛航模式,不過,這飛航模式也會讓你的手機無法接收來電,對我是沒差,要用此招時請自行評估

遠端桌面 remote desktop

遠端桌面當然有各種協定,有各種工具,底下來講一下兩種方法。

一、用 Ubuntu 的設定:
a. 用GUI 設定:「系統」->「管理」->「登入畫面」,切換到「遠端」的Tab,將「風格」改成「當成本地端」
b. 或是編輯 /etc/gdm/gdm.schemas, 確認一下是不是有把 xdmcp 設成 Enable, 或是看看是不是有這行<key>xdmcp/Enable</key>,若是 Disable 請改成 Enable
c. 「系統」->「偏好設定」->「遠端桌面」, 勾選「允許其他使用者觀看您的桌面」、「允許其他使用者控制您的桌面」、「使用者需要輸入密碼」,並且輸入密碼,而「詢問您以確認」則不要勾選,不過若基於安全考量,你想手動決定別人是否可以用遠端桌面的話,這項反而要勾選。這邊的密碼,是用 vnc viewer 從遠端要連線時輸入用的,可以的話最好不要跟登入密碼相同。

這個方法會讓你從遠端與你的桌面共用。這句話是要仔細看的,也就是兩個人的桌面是相同的,有點像早期我用過的 PC anywhere。也就是,因為一次只能有一個人登入到桌面,所以一次也就只有一個人可以用此方法連線,相較於下面的方法而言,也就不必設定 Port 號,只需要在連線軟體填入該機器的網址即可。

二、用 vnc4server
a. 確定有安裝 vnc4server
b. 用你的帳號執行 vnc4server, 第一次執行的話,它會讓你輸入密碼,說明同上。這個動作會在 $HOME 建立一個 .vnc 目錄,裡面會放個檔案叫 passwd。若需要更改密碼,也可以透過 vncpasswd 來修改。
c. 請注意上面執行的結果訊息,我的如下:
$ vnc4server

New 'wade-laptop:1 (wade)' desktop is wade-laptop:1

Starting applications specified in /home/wade/.vnc/xstartup
Log file is /home/wade/.vnc/wade-laptop:1.log

d. 此時在 PC 端,我是下載 tightvnc,連線時要搭配執行 vnc4server 的訊息,注意到上面是 wade-laptop:1 嗎?如果網路環境設定好,當然可以在 vnc viewer 中填這個值,不過我懶得設,所以直接填 XXX.XXX.XXX.XXX:1

這個方法當然比較麻煩,若重新開機過,你就得自己再下一次 vnc4server 命令,而且每次的 Port 都不見得一樣。要注意的是,若這台機器是多人使用的話,而且大家有在用這種方式連線的話,port 大於 1 是正常的,但是若只有你用,而你看到 port 大於 1, 那代表你執行了兩次,看是要刪掉哪一個,命令是 vnc4server -kill :1

2010/04/27

跨平台環境的建立 .... 你會怎麼用?

這一篇文章簡述了幾種可能用來 cross compile 的選項。另外,我個人很喜歡 scrachbox 的方式,其中經典之作就是 GeeXboX,不過 GeeXboX 你不能只是看首頁,一定要照著下載 source code 來編譯過後才會知道其精神。

乾淨的貓 netcat

貓,通常是有靈性的。嗯嗯,有點太抽象了,netcat 有如 busybox 一樣的萬用特性,在網路上它扮演著非常強的功能,只是一般人都不會用。這一篇文章講解怎樣用 netcat 來發信。該文講的很認真,我就不多說了

2010/04/26

我的3G手機 CHT8000 使用心得

我原本有在用台灣大哥大的 3G 上網,可是啊,台灣大哥大費用800不說,當初只送了一張 usb 3G上網小老鼠,合約到了又不主動給我降價,一氣之下,就跑去中華電信,把我的 3G 上網跟我的手機結合。我家很久沒在用寬頻上網了,將來小孩長大後就再來研究吧,目前是我的手機跟 3G 結合,感覺就很方便。

在還沒談之前,先說說分開與合併的優缺點。
合併優:隨時可以上網,缺:老婆要上網必須要我的手機在她身邊
為了鼓勵大家愛用 Android, 再說一下,最方便的是,非常非常多好玩的遊戲也好、應用也好、輸入法也好,統統是免費的!當然,開發 android 軟體,據說只要得到5星評價夠多,還可以得到免費的 Google Nexus One 手機一台。最需要鼓勵的是,Android 軟體非常自由,不必破解就可以滿足我絕大部份需求,何況,上面還有我要的所有 google 應用。
還有一項要長久才看得出功效的,就是電池可以更換!大家都知道手機一、兩年後就很難待機,而3G手機更是如此,常常要充電,那如果,連基本的電力都保持不住,又要怎麼用?

我到中華電信,選了 CHT8000, 之所以選這個,純粹是因為 Android 手機,竟然只有兩款!好吧,至少這款不必再負擔手機的錢,費用上,也跟我原本的組合式用法差不多,雖然要預繳12000元,但是可以分12期繳,感覺並沒有增加負擔任何費用。

CHT8000要上網,不管是在 WinXP or Ubuntu, 也都很方便。在 XP 有隨附的光碟可以安裝,叫 CHT DialUp, 不過若要在 Win7 的話,千萬千萬不要用隨附的光碟安裝,請參考 http://5i01.com/topicdetail.php?f=423&t=1410153&last=18261051,或下載這個網址下的撥接程式,或是適用 Win7 版的安裝軟體,後者的解壓密碼是小寫的 hw 兩個字,我猜測是「華為」的縮寫。比較常見的情況是,已經在 win7 裝了光碟版的軟體,我試過這樣做的話,想用前面提到的軟體來更新,結果是 FAILED! 不過,還好的是,簡單的去控制台新增移除軟體將原來的(或更新失敗的)的軟體移除後,再重新安裝即可。

至於 Ubuntu 下,只需要在掛載內建 driver 時指定 pid/vid 即可,例如:
$ sudo modprobe usbserial vendor=0x12d1 product=0x1502

若要系統自動認得的話,可以增加 /etc/modprobe.d/usbserial.conf 把上述資料加進去即可。
options usbserial vendor=0x12d1 product=0x1502

最後,我是愛用嘸蝦米沒錯,也喜歡自己修改對應按鍵,剛好 Android 上有一套 LIME 輸入法可以容易做到,請參考 LIME 網站自創對應表,或是參考這邊

最後補充,我的 CHT8000 上用 LIME 時,一開始一直還是出現手寫輸入法,後來利用 gmail 的寫信畫面來當輸入框,才有辦法照文件上的「長按」叫出更改輸入的畫面出來。

2010/04/24

accountability 當責.問責.負責




這是憲哥的一堂課,請見當責

課堂上,老師,也就是憲哥,一直在講什麼叫「負責」什麼叫「當責」,也一直在講「授權」與「賦權」的差異。其實,照我的理解,很多主管根本連什麼叫負責都不知道,完全做不到授權,要跟這些人談當責與賦權,我覺得有點對牛彈琴,只是多舉辦這種課,想必能觸發更多人的神經吧。

先說說我自己,這堂課我很想上,可是朋友剛離開廣達,難得回來跟我吃午餐,害我忘了上課時間,請見諒。三點時又跑去面試了一個小時,為了上這堂課,害我面試時不專心,沒問到對方重點。可見我是真的很重視這課的。現在就來稍微把理解中的當責講講。以下大部份來自上課心得(與講義),不過別以為看了我的文章,你的功力就大增,還是得多上這類的課才有用,親身體驗絕對不一樣的學習成就。

當責的核心精神:
.挹注成果(從頭到尾講的重點就是成果)
.執行力(講成果本來就要靠執行力)
.紀律(這一點非常難解釋,舉個例,公司一直在講要節約,多走樓梯,但是有多少人真的是走樓梯的?)

因為要講執行力,有四項執行力的特質:
.首先要有當責的觀念(要將當責精神深植內心是非常難的)
.能激發同仁活力(自己不先死掉就很高興了,所以真的是很難)
.擅於後續追蹤(不會五分鐘熱度)
.面對棘手問題能迅速做出決定(通常能避則避,或常見猶豫不決)

當然課堂講了很多其他的重點,不過先來談談當責與負責:(常常我們在講負責任的人時,是很貼近當責的,只是當責不止是負責這麼簡單而已)
當責是:
.對別人所訂下的承諾並交出符合的結果
.在責任、在成果上達成目標
.體認與接受並負起發生在管轄範圍內任何活動的全部責任,無論原因為何(是個經理人)
.做對的事
負責是:
.對自己所訂下的承諾並交出符合自己預期的結果(這一點定義我不是很認同)
.有責任感的確實執行被交付的任務
.執行特定任務或上級分派的工作,或圓滿達成被授權的職務內容(是個專業者)
.把事情做對

從上面,可以見到老師企圖把當責引導到更具「成果導向」的路上。上面也提到授權一事,現在再來談談這兩個的差異。(同樣的,這邊對賦權的定義,有時我也是以授權來理解的,有點硬要分成兩個詞的感覺)

授權(Delegation)是:(我發現我之前一直只做到這一階段而已)
.分身分勞
.工作下屬去做,責任上司承擔
.獲授權者揣摩上意,依規依約行事,缺乏獨立思考及判斷(這一點我是有企圖不讓它發生)
.講責任(responsibility)
賦權(Empowerment)是:(我一直很希望遇到這樣的上司,我的前上司或許也這麼自認為)
.全權處理(看似全權處理,很容易變成放羊吃草的境地)
.下屬一併承擔責任(這一點要有同舟共濟的精神,很難做到)
.需有充分資訊,充分能力,充分訓練,充分溝通,要下屬成長,獲賦權者有決策能力,要完成目標(這一點就是我與前主管間缺乏的部份)
.當責(accountability)

課堂上,老師一直在講,當責精神是要給下面的句子加上問號,要大家去質疑:
.雖敗猶榮?
.沒有功勞也有苦勞?
.重視過程而不重視成果?
.志在參加不在得獎?
.只問耕耘不問收獲?
==>當責的精神是,不僅要努力耕耘,更要有收獲,還要將本求利

老師把員工依X(被動-->主動)及Y(負面-->正面)分成四種人:
  .囚犯:就是那種等死的人,一切都在等待
  .過客:就是參與感不重的,叫他做事做的好好的,我稱這種人為混吃的人
  .抱怨者:這種人很積極參與,卻常抱怨。我反省一下,我很常落入這種狀態,不過有點像關起門來抱怨。也很應該改進。
  .玩家:就是積極又正向的當責精神

課堂上,老師講了兩個詞,很值得玩味:
  .分工合作。從小我們就在聽這個詞,但是分工了,就能合作嗎?這也是我一直在懷疑的,老師用下面的詞來說明
  .合作分工。有了共同的目標,再來看怎樣分工。這樣做事才會有「共識」,才能真正犧牲小我完成大我。可是很難,就算危機意識夠強也不見得能做到。就像即使要亡國了,仍然會有漢奸一樣。在講這一點的時候,老師提到賽局理論裡面很有名的「犯人的困局」,若是多人犯案被抓到,警察通常分開問訊,而且,許諾問案對象坦白從寬,抗拒從嚴,通常通常,人在「人不為己天誅地滅」的想法下,都會替自己求最大利益,因此坦白。

所以,來看看當責的七個重要行為:
  .了解公司與您的工作夥伴(嗯嗯,我們常自掃門前雪)
  .設定明確的目標與優先順序
  .實事求是
  .後續追蹤
  .論功行賞(很難,常常是做的要死被念的半死)
  .傳授經驗(也常常被忽略,都有藉口說很忙,或是自己學比較快)
  .了解自我的情緒韌性(不要只會抱怨)

最後最後,來講講 X-Y game

  明明,大家都知道要追求團體最大利益,可惜,這堂課一直到最後,都還是有人只追求自己的最大利益。明明大家都發誓的。遊戲過程我很難在這邊講清楚,我只能說,當考量到私人利益時,團體利益常常是被擺在最後的,殊不知,船沉了,就自己也活不了。當然,職場上,常常大家都會說,此處不留爺,自有留爺處。唉。難矣哉。

剛剛有空跟朋友聊天,把遊戲講過一遍,所以就貼下來,憲哥別罵我(不過我也知道這遊戲其實也是他抄來的,我以前就看過了)。

先說說遊戲規則,要看好哦:
  .整堂課,學員們分六個組
  .每個組,只能選擇X或是選擇Y之一,就是說,你可以選X,也可以選Y,但是不能同時選X及Y
  .我這麼囉嗦的說,只是在說,每一組有選擇權,可以自由選X或是選Y,但是事先你不知道別組選 X or Y
  .所以,最後若六組的結果如下的話,其獎懲也列在下面:
   ○ 6X: 則每一組都扣100元
   ○ 5X1Y: 則選X的組各得100元,選Y的組扣500元
   ○ 4X2Y: 則選X的組各得200元,選Y的組扣400元
   ○ 3X3Y: 則選X的組各得300元,選Y的組扣300元
   ○ 2X4Y: 則選X的組各得200元,選Y的組扣200元
   ○ 1X5Y: 則選X的組各得100元,選Y的組扣100元
   ○ 6Y: 則各組各得100元

我把題目寫在最後,請看的朋友們自己好好看清楚題目:
請你們各盡所能,求獲得最多的錢

其實不管題目如何,如果,如果能大家都投 Y, 就從頭到尾大家都會是贏的。可是拿我的組來說好了,就有組員一直在講,萬一別人投X呢?我說又說不過,一直在第五局之後才說服了大家,堅持從第5局到第10局都投Y。這已經很難了。但是但是,我前面也說了,一直到最後,也沒出現過6Y。這,就是廣達,嗎?

再來補充一點,在個人利益與團體利益的兩難情況下,你會如何選擇?
最後再說一點,題目,其實是求團體的最大利益,選 6X 就是負的,選 6Y 就是正的,其他都是 0, 答案很明顯。
最後最後再說一點,課堂上,根本都沒「錢」,何必一直有人跑票選X,這一點讓我苦悶到現在。
最後最後的最後,上面的那個問句,希望有人能看懂。(這,就是廣達,嗎?)

2010/04/20

shell script 處理空白字元

請參考這篇

一個方法是用 find 來解決,另一個是透過更改 IFS 的環境變數來解決,底下直接列範例:


#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for f in *
do
echo "$f"
done
IFS=$SAVEIFS




#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
# set me
FILES=/data/*
for f in $FILES
do
echo "$f"
done
IFS=$SAVEIFS


或直接拿來分析 /etc/passwd


while IFS=: read userName passWord userID groupID geCos homeDir userShell
do
echo "$userName -> $homeDir"
done < /etc/passwd


用 find 也行

find . -print0 | while read -d $'\0' file
do
echo -v "$file"
done

2010/04/14

chromium 的建立與執行...under ubuntu -1

我在摸索階段,是完全根據 Chromium OS上的說明來玩的,有些措詞會讓人看不懂。若你的目的是,下載 source code, 自己編譯, 進行「測試」,的話,那麼希望我的文章可以減少您摸索的時間。

一、開發環境的建立

我是直接把我的電腦安裝成 Ubuntu 64, 請見我的前一篇文章。我不想去解決 x86-32 環境是否可以 build, 反正改變自己的系統比較簡單些。

安裝套件:
$ sudo apt-get install bison fakeroot flex g++ g++-multilib gperf \
libapache2-mod-php5 libasound2-dev libbz2-dev libcairo2-dev \
libdbus-glib-1-dev libgconf2-dev libgl1-mesa-dev libglu1-mesa-dev \
libglib2.0-dev libgtk2.0-dev libjpeg62-dev libnspr4-dev libnss3-dev \
libpam0g-dev libsqlite3-dev libxslt1-dev libxss-dev \
mesa-common-dev msttcorefonts patch perl pkg-config python \
python2.5-dev rpm subversion apache2 wdiff lighttpd php5-cgi sun-java6-fonts \
msttcorefonts ttf-dejavu-core ttf-kochi-gothic ttf-kochi-mincho \
  lib32asound2-dev lib32bz2-dev git-core

甚至我還安裝了 virtualbox, qemu 等套件

二、取得原始碼

取得原始碼的話,我是遵照這一篇裡面的安裝 depot_tools來做,把 gclient 放在自己的家目錄中。

有了 gclient, 可以透過 gclient config http://src.chromium.org/svn/trunk/src 來設定 gclient 的環境,不過,請確定你要放 source code 的目錄位置再做此動作。以文件中的方式先放別的地方,再用 link 的方式也是可行。底下講的都是指這個放 source code 的目錄而言。

接下來就是抓 source code, 命令很簡單,就是 $ gclient sync

當然要抓很久很久....建議你去休息看個書,明天再來看。不過,沒理解錯的話(還需要確認),browser 的部份是採用 binary 的這種已編譯好的,若還需要另行編譯 browser 的話,需要參考編譯 Chromium OS裡面的 Option 說明。

三、建立開發系統

在編譯前,我建議一定要有一個認知再去讀原始文件,那就是建立 chromium os 的整個動作,它是建立一個新檔案系統,然後是用 chroot 進去執行的,所以,文件中有 "Inside", "Outside" 分別指的就是在 chroot 裡面,還是外面。換言之,Outside 就是一般你開機後的環境,也就是開發環境。而 Inside 是要透過 ./enter_chroot.sh 之後的環境。這一點尤其在看Running Tests一文時特別要注意。

有了上面的理解之後,當然要先來建立 chroot 的環境,請執行
$ ./make_chroot

建好環境後可以透過下面的方式進入,注意 chroot 環境不必常常重建,以後想要用,也只需要直接執行下面的步驟:
$ ./enter_chroot.sh

四、設定開發對象

接下來是設定環境,首先是設定要給什麼樣的平台使用,這邊只有兩種選擇,一個是 x86-genenric, 一個是 arm-generic,這只是開發環境,因此這兩類也就夠了。我是選 x86-generic
cd ~/trunk/src/scripts
./setup_board --board=x86-generic
echo x86-generic > ~/trunk/src/scripts/.default_board


五、建立測試帳號

ChromiumOS 開機後會需要以 google 帳號登入,或是 ssh 登入,此時請透過底下的方式建立此測試帳號:
./enable_localaccount.sh TEST_ACCOUNT
./set_shared_user_password.sh


六、編譯

就不多說了,直接用下面的命令建立套件及產生影像檔
./build_packages --board=x86-generic
./build_image --board=x86-generic


七、轉換成 virtualbox 或 vmware 虛擬機器環境的影像檔:

./image_to_virtualbox.sh --from=../build/images/x86-generic/0.7..... 這命令會產生一個 os.vdi 在 ../build/images/x86-generic 目錄下

2010/04/08

Chromium OS -- initialize

不知道為什麼,我似乎跟 chromium 脫不了關係,原因就不多說了,現在則要專心來讀讀這個流行的東西。

首先要說的是,chrome、chromium、chrome OS 與 chromium OS 的關係,我底下的認知不見得正確。

一、google 推出的,才叫 chrome, 才叫 chrome OS, 其他人推出的,都只能叫 Chromium 及 Chromium OS
二、Chrome OS 想當然,就是一個極類似 ubuntu or special for qualcomm 的 linux 加上 chrome
三、上面這說法還不見得正確,比較正確的是 Chromium OS 想當然,就是一個極類似 ubuntu or special for qualcomm 的 linux 加上 chromium
四、在編譯上,chromium os 需要 x86_64 的環境,這就導致下面的需求

若你想自己編譯 chromium os, 最好的方式是去 http://cdimages.ubuntu.com/ 找 amd64 的 iso 檔 來安裝。

若想拿到比較新的資訊,可以至 chromium查閱文件。

2010/03/21

致勝讀後心得-winning by Jack Welch

最近在讀致勝,傑克威爾許的中文版,非常值得所有人花點時間閱讀,我相信,在職場上的問題,或多或少都可以在這本書找到答案。

我很慶幸,在家裡,跟老婆相處,我能做到坦誠,書中非常重要的觀念。至於職場?若有看我前面的心得就會知道,我何其不幸。不過,永不言敗,我還是努力的去做好我的角色。

跟過我的人就會知道,我一向有話會直接跟他們說,有時我也會反省,我會不會講太多反而有傷害?我一直在跟我帶的伙伴們說,就算會有擔憂,我還是寧可選擇坦誠。

先講點簡單的,我認為,坦誠是雙向的,甚至是全面的,若只是上對下的坦誠,會變成比較接近溺愛,甚至是包疪,若只是下對上坦誠,會變成愚忠。只有雙向的坦誠,才是健康的環境。

2010/03/19

態度決定一切心得摘要 Attitude is everything

這一本書很久以前讀的,書也不知道被我放到哪兒了,甚至心得也寫下很久了,卻懶得查作者什麼的,請有興趣的人自行翻查。請參考簡報版本


  • 態度決定一切:永不放棄,無欲則剛,除死無大事
    • 工作就意味著責任:
      • 人人應把工作視為使命,負責任做到好。
      • 負責=信任
    • 勇敢地承認錯誤:
      • 能承認錯誤並負起責任者,方能委以重任。
      • 認錯=戰勝自己
    • 工作中無小事:
      • 人人都是螺絲釘。
      • 勿以善小而不為,勿以惡小而為之。
    • 像水牛一樣勤奮:
      • 只有勤奮才能與老闆獲得雙贏。
      • 滾石不生苔
      • 把工作當成自己的事業:
        • 從工作中實現夢想
      • 用心去工作:
        • 勤奮並非把工作當成機械性工作
      • 勞與逸的結合:
        • 最神秘的力量來自日夜交替,四季更替。
        • 終點是再出發的好地方
      • 繼續努力:
        • 鬆懈、安逸與放棄,永遠到不了終點
    • 盡職盡責才能盡善盡美:
      • 盡職只是本分,盡責把工作做好才能完美自己
  • 不要為自己找藉口:別學陳水扁
    • 藉口就是推卸責任:
      • 積極樂觀,持之以恆
    • 沒有任何藉口:
      • 服從、負責、榮譽、貫徹上級意志
      • ☆藉口:不關我事、我很忙、以前不是這樣的、這件事我不會、他比我適合
    • 服從是美德:
      • 覆誦命令、然後守紀律、盡己所能做好它
    • 不要成為藉口的奴隸:
      • 藉口是一種習慣,養成讓藉口遠離的習慣(工作文化)
      • 當老闆需要你時,為他加班、主動承擔任務、對工作表現興趣與熱忱、不做與工作無關的事
  • 這種事不用老闆交待:主動直接的行動為自己為公司爭利益
    • 主動與老闆溝通:
      • 只有學會與老闆溝通,才能把事情做好
      • 學會與老闆溝通才能與他的思想同步
      • 溝通時的態度:
        • 簡潔、不卑不亢、傾聽、勿貶低他人、勿踩在他人頭上
      • 養成注意小細節的習慣
      • 找到溝通的方式:每個人都有不同的溝通方式
      • 替他人留面子
    • 做好自己的工作,不需要老闆分咐:
      • 做好自己的工作是基本要求,卻是成功要素
      • 公司的工作都是自己的工作
      • 主動了解老闆與公司有助於自己工作的推展
    • 為老闆分憂解勞:
      • 這樣的人,誰都喜歡
      • 充實自己,隨時為上級分憂解勞
      • 正確看待工作,設法自己創造職位
    • 自動自發地工作:
      • 別在上級看不到時放鬆自己
      • 君子不欺暗室。
        • 禮記:莫見乎隱,莫顯乎微,故君子慎其獨也
      • 去發現需要的工作,哪怕那不是你的工作
  • 養成積極主動的習慣
    • 每天多做一點點:
      • 不止盡職盡責,不懈怠,成就自己與別人
    • 不要只為薪水工作:
      • 經驗的累積,從工作中創造自己的價值
      • ☆指的是對工作敷衍了事、到處兼職、隨時準備跳槽
    • 公司的每一件事,都值得我們去做:
      • 做好每件事者,方對公司最有價值
      • 即使日常生活中最平凡的事,也值得全神貫注地完成
      • 不積跬步無以至千里之外,不積小流無以成江海之大
    • 向老闆積極表現自己:
      • 不要以為這樣會踐踏別人,也別嫉妒別人
      • 提高自己的悟性,多用心體會上級的用心與用意
      • 設法讓自己與上級的思想同步,並適時予以鼓勵與理解
      • 關鍵時刻露一手:勇敢承擔重大的任務
      • 常用肯定的語氣
      • 讓老闆知道你的成績
      • 讓自己忙碌
      • 蛋糕若像一坨大便,再怎麼好吃也不會被看中
    • 比老闆更積極主動:
      • 老闆之所以是老闆,正因為他或他的祖先積極主動
      • 行動在老闆前面,並以此時刻勉勵自己
  • 把信送給加西亞:
    • 老闆看重的是具行動力的員工
    • 克服懶人的毛病
      • 懶是人類的大敵
      • 人無法完美,卻能從克服缺點做起
      • 煮青蛙的故事
    • 杜絕拖延:
      • 把握好時間,不要拖延,並追根究柢。
      • 勿以完美做藉口
    • 愈急的事要愈放慢腳步,冷靜仔細做好
    • 立刻行動起來:
      • 埋怨與等待對工作完全沒幫助
    • 最悲哀的一句話:
      • 我當初真該那麼做 ((卻沒有做))
    • 做一匹高效率的千里馬:
      • 耐跑而且會真的跑
    • 分清工作的輕重緩急
    • 不要延長你的工作時間:
      • 加班並不會讓人有效率
      • 延長工作時間會帶來藉口

2010/02/26

員工的心聲-25-悶燒與揭盅

悶燒應該對上「掀鍋」才對,不過我要講的不是爆發這種掀鍋行為,比較接近揭盅

賭博裡面有一種寶盅,裡面什麼牌,總要等到揭盅那一刻才會呈現在大家眼前。職場也常這樣,常搞神秘,常常發生「我」是最後一個知道的,上司在想什麼總是跟你不一樣。我之前有寫過一篇請下凡人間指的是要聽屬下的心聲,還有一篇請告訴我做的好不好這也是類似的,常常在要你離職那一刻主管把你視為糞土。

而相對的,員工也是,這篇主要是在講身為員工的我,之前犯的一個重大毛病就是,有心事都不會主動跟主管講。原本我以為離開前工作時我就學到了,因為當時該部門副總直接來找我談的時候,就指出員工在遇到部門有改進之處時,應該主動越級上報。問題是這邊的文化讓我遲疑,讓我寧可旁觀,請見我前面的心聲就可以知道我的想法。

員工自己也是常常發生「直到要離職了才告訴主管你在想什麼」,這也是非常要不得的現象。我知道大家的想法,因為我也是員工的一份子,畢竟,你的考績掌握在主管手裡,所以絕大多數的人總是不願意講,怕一講就影響自己在主管心中的印象。但是請想想,若主管沒雅量廣納建言,那再跟著這樣的主管只是平添苦悶而已,我是指,不講結果就是待不下去,講了也許還有改進空間。問題是現實生活就是這樣,離開了這個工作恐怕很難再找到相當的工作,甚至還有可能就此失業,因此導致很多人不敢提建言或指出組織的問題。

對公司或是整個部門來說,把心事放在心中然後直到下定決心離職的員工,對公司或部門並沒有任何好處,相反的員工因不平而離開,這中間過程會把壞的影響留下來。所以,我在整個事件過程中,我下定決心要中止這樣的我。

其實很多時候,主管都只聽到片面的訊息,如果每個人都能敞開心胸做好溝通的話,我相信事情會好轉,就算是我目前的處境也是。我不會再讓事情重演!如果把話講明了,主管不能接受,到時候再處理會比把心事一直悶燒在心裡好。

最近發生了很多事,整個事件讓我知道,包括我之前羞於與人打招呼,這些都可以做的更好。

2010/02/24

員工的心聲-24-我不會讓她撒野 I will not let her act wildly

一個主管的重要性不必我多說,可惜的是,我現在遇到的就是主管不對。

既然叫主管,總是有帶人,帶一個團隊有其必須具備的基本職能,包括如何激勵員工,如何讓團隊同心協力,如何協助員工解決問題。可是這邊的狀況卻是全然看不到這樣子的基本作為。我一直以「混亂」來形容這邊的現況,而對這邊的主管,我則給予「亂搞」的評價。當然,在說別人之前要先檢討自己,我為了怕落入這種狀況,一直採取明哲保身的態度在做事,這當然非常要不得,可惜這邊的問題太複雜了。

我講一個很簡單的情形來說明我的苦處。很多人很愛貼標籤,總愛「自己人」,總想要建立「自己的團隊」,其實我一開始也在這個自己人當中,問題是我只想做事,我不想跟他們搞團隊的事,所以我不跟這些愛搞圈圈的人吃中餐。搞團隊也沒什麼不好,只是我就看不慣我所屬團隊的行事作風,從一開始就看不慣。這就很慘,我又不能屬於別的團隊,而在我有了自己的 team 之後,我還怕落人口舌,直接導致我也無法跟我的 team member 吃中餐。很慘不是?

在我可以見到的情形下,幾乎每一個團隊都非常的混亂,在我確定要離職後,我才有比較好的心情去進一步了解,竟然得到一個結論,發現主其事者一直認為「做前段」的人非常重要。他親口對我說,「我保護你」,把我擺在後段保護起來,問題是綜觀全局後就會發現,他重用的人都是所謂前段的人。看到這兒也許你會問:我是覺得不受重用才想離職嗎?並不是,因為我的這個認知是在我確定離職後才發現的。

大頭的這個作法讓無德無能的人當主管,給予豐厚的薪水、股票、績效,就算不符公司用人政策也蠻幹使其升職甚至是位居高位。這樣的用人政策會帶來立即的衝突,在上位者無法御下,事實上對只想好好做事的屬下來說這或許還不是最嚴重的問題,更慘的是這樣的主管要嘛是不會做事,要嘛就是亂搞。

有個被大頭重用的副理級,甚至可以把他的主管搞走,就更不用說底下被搞的雞飛狗跳。他基本上專業職能不會也就算了,連自己負責的職務都不會,做前段就什麼都不會,要如何帶人?亂下指令也就算了,竟然還背著某人的背後對其他屬下說了一句經典的話「我不會讓她撒野」。這是當主管應有的處事作法嗎?

很可憐的是,我遇到比較好的主管,要嘛不是失敗,要嘛就是我選擇離職。失敗有時不是主管的問題,而離職更是整個公司的問題。我遇到最稱職的主管,其公司在其專業領域內是世界第一。除此之外,我甚少遇到具備不管是上課或是書上所說的「領導」職能的主管。嗚乎哀哉。

我們常在談什麼:新加坡能為何台灣不能,或是日本能為何台灣不能,或是韓國能為何台灣不能,甚至是中國能為何台灣不能。我在想,若每個人的專業職能都訓練好了,有組織有章程的做事,想必要成功就近了吧。

2010/02/23

員工的心聲 -23-小細節決定勝負

自從去年12月寫完「員工的心聲」後,就再也沒力氣去修改,那些其實寫的很亂,也沒有全部寫完。最近過了個不錯的年,趁心情還不錯再來補充一下。

以前,我曾經有一個新工作在報到後,不管是座位、文具、電話、甚至「注意事項」或是「長官講話」什麼的都準備好了。而某些工作的狀況卻是:文具?哦,請寫申請表,電話?還需要申請,垃圾桶?還沒買.....例如我現在旁邊那位就是,他的垃圾桶還是因為我要離開了把我的給他用才有(註)。這邊舉例的兩家公司都很大,但是一個是全台第一,世界排的上號,另一個卻有逐漸走下坡的風險。

會講這個說真的非常小的細節的事,是因為我現在要離開這個工作了近兩年的部門,就是一切小細節都不在乎,這狀況讓我非常非常忍受不了。我自認為自己已經是一個不注重小節的人,可是竟然還能遇到讓我受不了的部門,實在也算是神奇。

我的部門會發生像,工廠發出 email 來呼鑰 RD and PM, 請他們尊重公司的生產規則。然後也發生過,一個產品的生產流程可以從 A stage-->B stage-->C stage 再變回 A Stage....這麼誇張的事都會發生,神奇。這邊舉的只是一點點小故事,而且已遠遠超過小細節的範疇,主管人員若還無法警惕到而做些改變,其未來真的令人擔憂。

早上我要出門前,我會看看我的鞋子是不是很髒了,因為有人說,從鞋子可以看主人。每天上班,我會稍微檢查一下我的服裝儀容,因為有時我會發現我的拉鏈竟然沒拉上。細節決定一個人的成功,所以我也會養成在某些小事的注重。當然每個人看重的東西不一樣,譬如我上班會盤腿坐,但是我每天必定穿戴整齊出門,就算每天看起來都穿同一套衣服。

再舉例來說,我的桌面是亂的,但是很少東西互相疊來疊去的,又譬如像有些垃圾是可以資源回收的,我會多走幾十步路去分類置放。如果可以像我的部門這樣,我從報到起算十來個月就可以搬七次座位,似乎也可以預見某些未來吧!

註:寫這篇文章的起因,就是垃圾桶事件造成的,標題本來想寫成「請給我垃圾桶」

2010/02/12

what is success? 什麼叫成功?

當 RD....一個最起碼的成功,個人覺得至少有三個面向:

「老闆拚命幫我加薪」、「(team)持續成長」、「做出大賣的產品」

「老闆要拚命幫我加薪」

貫徹執行上級命令,與其他 team 合作愉快,突出的績效(不止完成上級交辦任務而已),主動解決問題,了解上司的喜好並滿足之,發明王(新技術、新產品),豐富自己不斷成長的潛質(例如能夠學習怎樣更有效學習)

「(team)持續成長」

team 不是只有一直找人就好,要有低的流動率,高的工作效率,接受任何艱鉅任務,有高效執行力,能有效善用 team 的能力,不斷累積專業技術,與團隊合作默契極佳

「做出大賣的產品」

產品要有高毛利(用最少的人賺最多的錢),高品質,差異化(比別人強比別人好比別人更多功能),要很會 Demo(推廣時需要),知名度高,產品黏著力強(就是人家愛用,常用),高創意(別人想不到,而且大家愛用),高附加價值

這三個都能做到,我想,也就算成功了吧,當然,這邊在講的是指軟體方面的,譬如帶負責應用程式 team, 但是相同的思考應用在不同的專業上應該也是可以互通的。

2010/01/18

build handvu-beta3 on ubuntu

HandVu 是一套利用 OpenCV 來做手勢控制的函式庫,作者大概已經沒空再維護了, 有興趣的人可以自行參考。

在 ubuntu 9.10 上編譯,建議使用 OpenCV 1.0, 但是會遇到幾個錯誤,底下把 Patch 貼上來

diff -ruN handvu-beta3/cubicles/CascadeFileParser.yy handvu/cubicles/CascadeFileParser.yy
--- handvu-beta3/cubicles/CascadeFileParser.yy 2004-10-10 01:04:53.000000000 +0800
+++ handvu/cubicles/CascadeFileParser.yy 2010-01-18 09:24:21.000000000 +0800
@@ -60,6 +60,7 @@
////////////////////////////////////////////////////////////////////

%{
+#include <string.h>
#include "Cascade.h"
#include "Classifiers.h"
#include "IntegralFeatures.h"
diff -ruN handvu-beta3/cubicles/IntegralFeatures.cpp handvu/cubicles/IntegralFeatures.cpp
--- handvu-beta3/cubicles/IntegralFeatures.cpp 2005-10-29 01:47:04.000000000 +0800
+++ handvu/cubicles/IntegralFeatures.cpp 2010-01-18 09:19:54.000000000 +0800
@@ -62,6 +62,9 @@
////////////////////////////////////////////////////////////////////


+#include <limits.h>
+#include <alloca.h>
+
#include "cubicles.hpp"
#include "IntegralFeatures.h"
#include "Exceptions.h"
diff -ruN handvu-beta3/cubicles/IntegralFeaturesSame.cpp handvu/cubicles/IntegralFeaturesSame.cpp
--- handvu-beta3/cubicles/IntegralFeaturesSame.cpp 2004-11-11 09:58:58.000000000 +0800
+++ handvu/cubicles/IntegralFeaturesSame.cpp 2010-01-18 09:20:34.000000000 +0800
@@ -65,6 +65,7 @@
////////////////////////////////////////////////////////////////////


+#include <alloca.h>
#include "cubicles.hpp"
#include "IntegralFeatures.h"
#include "Exceptions.h"
diff -ruN handvu-beta3/cubicles/IntegralImage.cxx handvu/cubicles/IntegralImage.cxx
--- handvu-beta3/cubicles/IntegralImage.cxx 2005-02-12 10:00:59.000000000 +0800
+++ handvu/cubicles/IntegralImage.cxx 2010-01-18 09:41:57.000000000 +0800
@@ -64,6 +64,8 @@
////////////////////////////////////////////////////////////////////


+#include <stdio.h>
+#include <string.h>
#include <math.h>
#include <ostream>

diff -ruN handvu-beta3/cubicles/Scanner.h handvu/cubicles/Scanner.h
--- handvu-beta3/cubicles/Scanner.h 2005-02-12 10:00:59.000000000 +0800
+++ handvu/cubicles/Scanner.h 2010-01-18 09:41:34.000000000 +0800
@@ -63,6 +63,7 @@
#ifndef __SCANNER_H
#define __SCANNER_H

+#include <limits.h>
#include "IntegralImage.h"
#ifdef HAVE_FLOAT_H
#include <float.h>
diff -ruN handvu-beta3/handvu/CubicleWrapper.cpp handvu/handvu/CubicleWrapper.cpp
--- handvu-beta3/handvu/CubicleWrapper.cpp 2005-10-31 05:16:03.000000000 +0800
+++ handvu/handvu/CubicleWrapper.cpp 2010-01-18 09:53:24.000000000 +0800
@@ -21,6 +21,7 @@
* $Id: CubicleWrapper.cpp,v 1.13 2005/10/30 21:16:03 matz Exp $
**/

+#include <limits.h>
#include "Common.h"
#include "CubicleWrapper.h"
#include "HandVu.hpp"
diff -ruN handvu-beta3/handvu/FileHandling.cpp handvu/handvu/FileHandling.cpp
--- handvu-beta3/handvu/FileHandling.cpp 2005-08-16 08:14:26.000000000 +0800
+++ handvu/handvu/FileHandling.cpp 2010-01-18 10:12:57.000000000 +0800
@@ -21,6 +21,13 @@
* $Id: FileHandling.cpp,v 1.6 2005/08/16 00:14:26 matz Exp $
**/

+#include <string.h>
+
#include "Common.h"
#include "FileHandling.h"
#include "Exceptions.h"
@@ -135,8 +142,8 @@
fname[0] = 0;
ext[0] = 0;

- char* slashpos = strrchr(path, '/');
- char* dotpos = strrchr(path, '.');
+ char* slashpos = strrchr((char*)path, '/');
+ char* dotpos = strrchr((char*)path, '.');

if (slashpos==NULL) {
if (dotpos==NULL) {
diff -ruN handvu-beta3/handvu/HandVu.cpp handvu/handvu/HandVu.cpp
--- handvu-beta3/handvu/HandVu.cpp 2006-01-04 08:55:29.000000000 +0800
+++ handvu/handvu/HandVu.cpp 2010-01-18 09:50:37.000000000 +0800
@@ -24,6 +24,7 @@
// HandVu.cpp: main library implementation file
//

+#include <limits.h>
#include "Common.h"
#include "CubicleWrapper.h"
#include "Skincolor.h"
diff -ruN handvu-beta3/handvu/Mask.cpp handvu/handvu/Mask.cpp
--- handvu-beta3/handvu/Mask.cpp 2005-08-16 08:14:26.000000000 +0800
+++ handvu/handvu/Mask.cpp 2010-01-18 10:01:45.000000000 +0800
@@ -21,6 +21,8 @@
* $Id: Mask.cpp,v 1.7 2005/08/16 00:14:26 matz Exp $
**/

+#include <cstring>
+#include <stdlib.h>
#include "Common.h"
#include "Mask.h"
#include "Exceptions.h"

2010/01/13

洪朝貴之「扭曲的智財宣導及評鑑制度 迫使大學追逐『內耗型競爭力』」

請見洪朝貴之「扭曲的智財宣導及評鑑制度 迫使大學追逐『內耗型競爭力』」一文,或至洪教授 blog

這篇文章講了很重要的課題,專利、創新、與進步的關係。把章節標題摘述如下:

一、創新
二、擴散
三、忘記擴散的創新
四、傷害擴散的創新
五、讓真相擴散吧!

站的更高,就應該看的更遠

欲窮千里目,更上一層樓。

上面這句話是對的,但是站的更高,就能看的更遠嗎?常常很令人遺憾,有些人站的高卻只會產生更害怕的心,有些人站的高了卻因為目光短淺,反而眼前基本的事都看不到。

站的更高,就應該看的更遠,走的最前,就應該更鋒銳。

2010/01/07

你在「打造菁英」,還是「改造菁英」?

這標題是大師輕鬆讀353期〈新時代指揮官〉裡的,很早就想貼了,底下把該網址所摘要出來的觀點貼一下:

.觀點一:正視「高階菁英」自我發展的意願及可塑性
.觀點二:勿將「菁英培育」與「績效改善」混為一談
.觀點三:移轉焦點至關注「初階菁英」的培育

綜觀上面的觀點,若細看內容,有不少跟我貼過的員工的心聲很像,總共寫了二十幾點,也算嘔心瀝血之作。

觀點一,主要是講「個人意願」,其實這是可以引導,或是可以討論的,但是很大部份的情況是根本就沒有尊重個人意願,也沒去引導,沒有討論。很多長官以為尊重就是員工想做什麼就讓他做什麼,其實這真的是大錯特錯。尊重是一個日常生活上,尊重是心靈上與思維上的,巨細彌遺。正因為如此,引導的過程很花時間,而且容易讓人失去耐性,所以真正能「正視『高階菁英』自我發展的意願及可塑性」幾乎不存在。

觀點二,其實可以看成菁英是才是菁英,而不是要把爛人變菁英,需要做的是把菁英變的更好用。爛人之所以爛,就是因為爛,是沒辦法變好的。我以前是個農夫,爛掉的菜從來不可能變成生機勃勃。所以重點有時會變成,找出怎樣才是菁英人才。以前種菜時,你可以很容易從葉子一眼看出是好是壞,人才呢?是不是也有明顯的標記?答案是有的,但是不想在這邊多說,但是很肯定的,那種平常沒事在你身邊哈拉的,通常只是吃菜葉的蟲,而不是生機勃勃的菜。

觀點三,其實在講的是伯樂問題,已經是菁英的人自己會努力奮發向上,自己會主動學習,而沒經驗的優秀人才,幾年後常常會懷才不遇。不過....

若統合上面三點來看,其實有根本的二個問題,一個是溝通不足,這邊的溝通也可以說是篩選,另一個問題是管理上的制度與執行面問題。這邊不想說太多,只希望身為管理者能多好好想想,不要老是只看眼前,不要老是只急著獲利,重視菁英的發掘與培育。

2009/12/23

2009 微軟多點觸控大賽亞軍




2009/12/11

chrome 與 自家產品 相衝

雖然之前就試用過 chrome, 不過當初因為沒半個 extensions 所以就放棄了,今天又用起來 chrome, 剛開始一切還算順利,所以就想要來寫一篇心的,沒想到 chrome 竟然跟 blogger 相衝!最上面的登入不見了,在貼文章時也沒有發佈,這什麼啊!

後來又用回 firefox 貼了一篇文章,現在則是在用 gmail 來發佈,可憐。

--1224--
最近發現用 chrome 連 gmail 都會一直出現問題,只好放棄 chrome 用回 firefox。之前想用 chrome 的最大原因是,它的界面簡潔,而且,不會像 firefox 大吃記憶體之後變的很 lag...

唉,有一好沒兩好....

Best Regards
--
自由的精靈, 狂想的空間
Free Spirit, Fantasy Space
Mike Ditka - "If God had wanted man to play soccer, he wouldn't have given us arms."

員工的心聲 -22-都不幫我加薪

.為何都不幫我加薪

這個問題並非我本身的問題,但是卻是普遍存在的現象,公司為資深人員加的薪都太少了,因此很多人總是處於一種困境中,到底我該不該換工作以求取更多的薪水?

前面提到外來的和尚會念經,這現象也困擾著現有的人員,也就是公司的資深人員,大家總是會抱怨從外面請來的人都給那麼高薪,難道我們都這麼沒用?

公司內部的人才培訓總是缺乏全面的考量,對現有人員總是希望發揮他們最大的績效,因此每天忙不完,而他們也被主管定型化,每當公司需要什麼人才時,總是先向外搜尋,而在加薪時,卻又忽略了這些資深人員。

舉例來說,國內每年調薪的公司比例恐怕不多,而那些願意每年幫員工加薪的公司,調薪比例能有3%就偷笑了。我們就拿3%來講好了,做個10年才調整 34%,若以三萬起薪來說,十年後才調整到 4萬元。請所有老闆想想看,這樣合不合理。就算拿同一行的技術人員來說,新進的十年的員工,你願意給多少薪水?

不過話說回來,現在換工作愈來愈難找到新工作,公司寧願從新手訓練起,又有幹勁給薪又少。到底,公司的人力計畫是什麼?我想,這是老闆應該去好好想想的,不要讓員工老是感嘆為何都不幫我加薪!

2009/12/07

員工的心聲 -21-我也是有優點

.我也是有優點

本來要寫我也是有貢獻。絕大多數情況下,每個員工都有貢獻,但是難免會面臨是不是要裁員的情況,而大多數主管都不知道該怎樣面對,最簡單的說詞就是「上面交待的」,不然就是「按照考績制度」。問題是考績怎麼來的,老實講我到現在還沒遇到任何主管好好跟我講他是怎麼打我的考績的。相信那些被裁的員工心裡也很幹,明明做的要死,卻最不得上司疼愛。

前面的心得裡面也提到過,訂定目標,達不達到就很容易知道。就這一點來說,我也不反對某些大公司的做法,就是直接講,今年的成績比去年高三成。問題是工程師很難明訂這樣的目標,因此主管有責任去定義出每個員工的角色與核心價值,然後給與適當而明確的目標。這邊我就不特別提。

找出員工的優點並且最大化,最後讓每位員工的優點變成團隊向上成長的動力來源。前面提到的保持活力就很重要,要讓團隊是一個整體,而不是各自為政的散沙。讓每個人各安其職,各盡所能,各展其才。其實我很多篇都在講這樣的概念,可見這真的深深植入在我的腦海中,深怕自己像我遇到的絕大多數主管那樣。

雖然我寫了這麼多,每位主管也都對我很好,他們也都有不錯的人格特質,我寫這些心得不是要抱怨抱怨再抱怨,我知道我自己是要求多了點,有誰能完美?我寫這些心聲要講的是,我一直在反省,盡量去學,努力去做,不敢說我做的很好,但是這些主管都將成為我明日成長的養分。

員工的心聲 -20-保持活力

.保持活力

常見到的現象就是,整個辦公室死氣沉沉。前面也探討了諸多原因,想要有產業競爭力,持續創新與不斷學習是非常重要的,而這,無非就是要一個有活力的辦公環境。

保持活力並非老闆三不五時找員工哈拉就夠了,也不是請大家吃吃喝喝就算了,破除本位主義與保護主義也是相當重要的課題。我有遇到一個工作環境,我找別的 team 的員工討論或是尋問某些問題,有時會要些資料,我想,大家都相同部門,應該沒什麼秘密可言吧,可是對方主管竟然警告他的成員說,以後 Wade 找你們談什麼,一定要讓我知道。

成員的位置不明,就容易讓人推卸責任,分工明確外,還要加強員工的專業。常常見到就是號稱以專案導向的主管,看誰有空就找誰做事,看似每個人都能獨當一面,事實卻是大家都做著類似的工作,很難精益求精,互相間學習的力道也少了,反正就是「上網查」。每個人忙著自己的事,也無法互相照應,新的案子一來又是從頭忙到尾。

我遇到不少工程師,他們只想當工程師,這原本是應該的,但是彼此間的互動幾乎是零,只想做好自己的事,若遇到放任(好聽叫信任)的主管,那整個就是不思進取,難有寸進。之前一直強調要分工,要顧流程,要精益求精,清楚一個開發流程有哪些分工要顧好是很重要的,天才型的工程師可以軟硬兼施,可以美工與品質並重,問題是這種人很少。為了精減人事,在分工不明的情況下,案子一多,誰該做什麼反而都亂了,人再多都不夠用。

忙,就沒有活力。我一直強調要正常生活,家庭顧好一方面也會讓工程師沒有後顧之憂,另一方面頭腦清醒有活力,正是公司不斷向上提升的基本要求。有朋友說,Wade,你又要第一,又要正常生活,又要核心價值,又要這又要那,幾乎是不可能的。我們只要想著一件事就好,為何古人常常有大師?既是物理大師又是數學大師又是心理大師又是藝術大師什麼的,古老數百年才出一個這樣的人物,而現在呢?正因為分工日益細日益精,才使得科學突飛猛晉,難道要回到古時候一個人要做所有事?

常常主管很怕降格與員工談話,這當然也是一種帝王術,我也知道我的毛病是凡事都與員工分享與討論,我從自己是員工來看,我寧可要主管在工作上有什麼事都要講出來,不管是好的壞的。有時主管會說,我正是怕你們擔心,一切苦悶我自己承擔。業績掉了,被大老闆罵了,進度落後了,又怕員工壓力大,又怕員工跑掉,怕東怕西的,反而事情做不好。我也看過主管只會一味的要求員工,動不動就罵人的,這樣不叫溝通,無法有效找出解決之道。兩種到最後就是死氣沉沉。

我還遇到一種主管,對上唯唯諾諾,對下也就變成可有可無,一切都是上面講的算。說的好聽點,這種主管怕員工犯錯,說的難聽點,這種主管只怕做錯事。主管要有所為有所不為,要有個人的風格,因為到現在,我還不曉得那位主管有何特長。最後變成有什麼事跟他講也沒用,反應又怕上頭怪罪,於是大家沒事少論是非。也許很多主管喜歡這樣,但是這就是我要說的缺少活力。

活力的來源很多,常常都是主管把它堵住了,培養敢言敢做勇於擔當的員工,創造活力十足的工作環境,這對公司的未來是相當重要的課題。

2009/12/05

員工的心聲 -19-外來的和尚會唸經

.外來的和尚會唸經

工作久了,自然就會遇到外來的和尚會唸經這件事。這事要分兩個面向來看,一個是我自己就是外來的和尚,一個是看到外來會唸經的和尚。

其實不管哪一種,這種事難免會發生,常常會讓人見到搞圈圈的事,圈圈還有大有小,而依我的個性極度不願打破人家的圈圈,因此老是在圈圈外。

其實並非我不想打破別人的圈圈,而是長官授權不夠,前面我也曾提過我的一個特性是,主管叫我做的事我一定努力做好,但是主管沒叫我做的事我會儘量不去碰。通常圈圈都不是我權責內的事,否則我怎麼會讓它發生!

我很愛看故事,超特愛看歷史故事,史記不敢說從頭看到尾,但也看了不少,有名的書能拿到的大概也都看了。其中常見到的一種情節叫「拜將」,古代會設拜將台,比較出名的就是韓信。拜將的功用是昭告天下,本王要重用的將軍是你。可是現代人對新進的人員或主管沒這些動作,除非發生大事。所以,這邊特別要講的心聲就是,一個好的老闆,應該要對你要重用的人進行登壇拜將動作!將權力範圍好好說明清楚。其實前面也提到主管有責任幫員工找到位置,這其實在說的就是權責畫分要明確。大家分工清楚,權責相符,然後自然就能相安無事。

很可惜的,我常常遇到的是,大家在開會時,都說這不是我的事,可是在搶功勞時卻常常搶在前頭。沒錯,有人會質疑我前面說的置身圈外也是一樣沒什麼比較好,這又一言難盡,我在講的是圈內的人也互相推諉塞責,冷眼旁觀。我敢說,該我負責的我不會逃避,我力所不及的,我會辭職以示負責。但是,很可惜我還沒遇到跟我一樣做法的人,有幾次在我離職時,同事或是朋友會告訴我,「wade, 你想太多了」,也有時候有人會說「wade, 退一步海闊天空」,也有人會說「你就算不會自己想,也要為家人想」。

前面講了幾篇,請主管要下凡到人間就是一個好例子,在事發後,主管也常常息事寧人,更令人無奈的是遇到那種明顯有自己人非自己人之分的主管。其實若非為了家人著想,我幹嘛坐視不理,幹嘛置身事外,幹嘛不去打破圈圈?世事常有無奈之處,老闆不應坐視圈圈的形成,更不應主動去建立圈圈,而對新進員工要明確賦與授權,而且要公開行之。

簡單講就是,請有權責的老闆們,對新進的人員,公開其權責,明確賦與,這才是讓整個部門甚至是公司相安無事的唯一之道。

2009/12/04

員工的心聲 -18-如果還有明天

.如果還有明天

寫到這邊,腦袋一片空白,剛剛還出去透透氣,可是大概已經寫完了吧,所以最後就以這個標題暫時做為今天心情的結束。如果還有明天。

有一首歌是我少數會唱的歌裡面的一首,當然我一貫只會唱其中幾句,歌詞是這樣的:

如果還有明天
你想怎樣裝扮你的臉
如果沒有明天
要怎麼說再見

每次換工作,都會遇到要怎麼說再見的痛苦。我不想傷害任何人,我會離職一定有我表現不好的地方,當然前面的心聲裡面,也占了很大的篇幅希望我的主管能做的更好,既然是心聲,也是希望如果還有明天,我可以表現的更好。而我相信往後我也會一直是主管,那當然不能讓自己走別人帶給我痛苦的老路。

如果還有明天,我希望我能成長的肩負更多的責任,如果沒有明天,我希望我會好好跟每個人說再見。

肩負更大責任就代表我不得不面對更多問題,雖然這一直是我的追求,事實上這很難,但是也是我願意花更多時間去做的事。要好好跟每個人說再見更難,因為,這邊畢竟養了我很久,而我也跟一部份人養成了感情,當然,我也得到某些人的信任。要揮別這些關係很難,當再見之後還要能保持朋友關係時常聯絡更難。

幸好,我一直能遇到好的朋友,也還有再見後的前同事前老闆肯賞識我。所以,就讓這篇做為我希望再出發的註解吧。

員工的心聲 -17-請不要師心自用

.請不要師心自用

前面提到過,長官要有長官的威嚴,但是我只是一個小小的員工,我哪管你什麼威嚴,我只希望讓長官知道事情的真相而已。可是,偏偏,你一定會遇到那種師心自用的長官。嗯,這個詞有人可能看不懂,也可能有人會以為我寫錯字,我是說,請不要太固執自以為是,甚至是驕傲自大。

俗話說,人有兩面,牆有八方,誰能事事兼顧呢?偶而聽聽小井市民的聲音是非常重要的。前面講到請下凡到人間,這跟這篇的主題是兩回事。高高在上是連聽都聽不到,若員工肯找長官講心裡話,請長官不要帶著有色的眼鏡看事情。

當然這不是鼓勵做報馬仔。有的長官遇到某些人,總是會有成見,說到底有成見這件事幾乎人人都會,我也不敢說我不會發生。但是把敢說真話當成破壞群體和諧的人看待,那又有誰敢講真話?

尤其有些主管會自動把屬下畫分成自己人與非自己人,遇到這種主管真的是頭痛的很。要嘛就努力把自己打入主管的圈圈,要嘛就置身事外,從此斷了溝通的管道。試問,既然是你的下屬,為何要把他們排除在外呢?

我一直很努力很小心的避免這件事。老實講,平常講話總有活潑的員工特別容易回答我的問題,私下聊天也一定有的人可以聊的愉快,也一定有人像木頭一樣。但是這不能拿來當親疏的理由。若有主管因為親疏的理由來決定要不要聽一個人的話,或是因此而打考績,那真的是自我毀滅的開始。

員工的心聲 -16-減薪裁員沒關係,我只要合理就好

.減薪裁員沒關係,我只要合理就好

這個主題要說的內容很令人感嘆,若光從題目減薪裁員的字面來看其實我不算有遇到。我真正想說的不是減薪或裁員,而是一種合理的要求。

有一種狀況是,大環境不好,所以一直要求員工加班加班,可是明明大環境不好,加班做東西也賣不出去。有一種狀況是,明明公司狀況不好,可是老闆硬是不裁員不減薪,最後搞到整個解散了。兩種情況都很糟糕。

其中第二種狀況裡,前面提到老闆有責任要帶領大家前進,要找到公司的核心價值,要把產品賣出去,但是,有時大環境就那麼糟,公司就是入不敷出,可是老闆基於大家都那麼辛苦的情況下始終不肯談裁員。好老闆不見得能為員工帶來幸福。其實明明白白把困境跟員工分享是很重要的,不見得是要同舟共濟,至少讓員工有心裡準備,至少讓員工能為前途早早打算。

當然,遇到那種把加班當有趣的老闆,賺錢要加班,不賺錢更要加班來讓大老闆高興,減薪減的十分高興,裁員裁的不知所謂,底下的人只會心冷而已。我知道這種公司的老闆會成功都是因為有他的一套管理方法,甚至出書什麼的,大家爭相訪問,問題是,現行做法到底合不合理?

以前當兵時,每次要大集會時,明明主持的長官是說十點開始,排長的我就得四點起床,行前準備加上一遍又一遍的演練。上面一句話,下面做牛做馬。前面也提到請主管要下到凡間來,那是另一個主題,這個主題要講的是一切要合理。兩種情況裡面,一種是因為主管自我要求太高連帶高條件地要求部屬,一種是主管太體貼部屬,結果拖垮整個公司或部門。

兩種我都遇過,其實員工要的只是坦誠與合理而已。

員工的心聲 -15-請下凡到人間

.請下凡到人間

長官要有長官的威嚴,這件事我知道,這是我當兵時就學到的。但是若長官一直不食人間煙火,底下已經雞飛狗跳了,身為主管還一副老神在在的樣子,員工講的話又聽不進去,那員工只會心灰意冷。

遇到那種一副老神在在的樣子也真的令人頭痛,會叫我不要太急,會叫要我融入團體中,會告訴我一切都在掌控中。可是實際上已經走了不少人了,難道都真的活在古墓中?

我自從當了真正的主管,明確賦與我生殺大權之後,我一直很小心翼翼的注意不能活在古墓中。當然我也在反省著,是不是我把太多心聲與他們分享,反而打亂了他們的心?但是至少目前沒人來打亂我的心,所以這至少還不是我的心聲。

要下凡到人間,很主要一部份要看主管的心態。有時候忙是一個很好的藉口,有時候充份授權也是不錯的講法,更多的時候是尊重每個員工。這些都是實情也是很重要的管理原則沒錯,但是身為員工的我,只希望我的主管能更貼近民意一點。至於要怎樣做才能做到?我想很多書上會寫,不見得要站在平等的地位跟員工相處,但是一定要用心。

員工的心聲 -14-請帶動我前進

.請帶動我前進

這個議題似乎前面有談到,我現在是腦袋停頓了,想到什麼就寫什麼。

前面提到要讓員工有學習的機會,這個很大一部份是老闆的責任,不是讓他上上網就好了,何況很多公司還東擋西擋的,唯恐員工不專心工作。也提到要讓員工做有創意的工作,這個就是員工與主管都有責任,老闆常常是扼殺員工創意的最大殺手,而員工不思進取的也大有人在。當然訂定目標也是前進的重要因素,沒目標光盲忙茫也沒用。

這篇要講的是一種往前進的動力,帶動員工前進的氛圍,很難講清楚。像有一篇提到請不要完全相信我,若老闆完全相信我,放任我,也許我會像脫韁的野馬一樣,何況有時我根本就做不到。

公司要前進,部門要前進,團隊要前進,個人要前進,總要有目標,總要有動力,還要有人掌握方向盤。很多時候,主管都沒盡到責任,當然員工也有責任就是了。我遇到三次部門解散的,其中只有一次領到資遣費,其中一次我的責任最大。所以我是有資格說這個議題。

帶動員工前進,首先要幫自己的團隊找到價值與做出貢獻。做死做活若還是沒辦法賺錢,那境況真的很慘。上面提到的三次裡面,有一次還更慘,什麼都還沒做就解散了。

所以老闆真的要好好思考,做什麼產品才能為公司帶來長治久安的前進動力。不要連老闆都跟員工一樣盲忙茫。老闆,拜託,請找出你的核心價值,我們會幫你實現。也不要就下達「今年成長三成」這樣的目標,當然若是過去年年實現我也沒話講,能帶動員工一起達成的話,員工會相當感激你的。

找出公司或部門的核心價值,做出能賣錢的產品,帶領員工有目的地的往前進吧。

每次要換工作時,我總是會認為,這次的工作有前途,有幾次有幸也真的遇到有前途的工作,可是最後最後我還是選擇換工作,原因已經寫在前面了,所以這篇就到此吧。

員工的心聲 -13-請告訴我做的好不好

.請告訴我做的好不好

我常常遇到一種狀況,老闆對屬下都很好,可是打考績時卻沒辦法給很好,獎金股票也就發的少。這不代表員工表現不好,明明知道他很優秀,可是因為公司沒賺錢,或是他的產出不如預期,所以考績就無法往上調。

當然我不是純粹在說考績,我也常常遇到所謂「自己人」這件事。但是這不是這篇文章的主題,這種事我也不想講。

前面說過,幫員工找到好位置,幫員工訂定明確的目標,若員工表現好,他自然應該有好的考績。我說過,案子的成敗,最大的責任在主管。所以不要用產出來幫員工打考績。

當員工表現不好時,要明確告訴他,同樣當員工表現的好,那就明明白白告訴他。光這項就很少有主管能做的很好。主管只想表現成一個好主管,對每個員工表面上都很好,當然主管心中自有一把尺,可是在員工表現不如自己預期時,並不會主動告之。更慘的是,常常有主管當著所有人的面誇讚他認定的好員工。

我不是說對表現好的員工不應該稱讚。首先要一視同仁,要讓大家知道,每個人的辛苦在哪,表現好的地方是什麼,什麼狀況是表現不好。否則有些人永遠就該死,永遠都在幕後,永遠都是沒事幹。

我前面說過,要成為世界第一,這並不是專指個人,團隊的成長是很重要的,團隊的整體優良表現才有辦法與外面競爭。所以,請主管先把這項基本的要求做好,在我表現不好時,明白告訴我。

員工的心聲 -12-請尊重專業

.請尊重專業

專業分工顯然是重要的必修課題。我也有遇到專長不符的主管,他個人的能力暫且不論,但是當你要帶領一個與自己專長不符的團隊時,請保持謙虛的心,請擁有一顆尊重的心,看是要與部屬好好學習,還是尊重他。這一點不是在說我(而已),官階愈大,這種主管發生的機率就愈高。當我升官了,管的事情多了,哪有可能樣樣都是我的專業。因此我在說的不是不夠專業就不該當主管,而是一種尊重自己的權責的心。

在講尊重專業時,分工就很重要,若團隊夠大,把不同專業領域的人分辨出來,然後讓大家能協調相處,努力提升團隊的能力不斷往前進。有時,責任是賦與了,員工也協調了,只是協調不成時,員工也反應了,此時主管有責任跨部門溝通,而不要讓底下的人單打獨鬥。

這是兩個不同的議題。一個是部門內,一個是跨部門。我其實常常自問,部門內的我做好了嗎?跨部門溝通時我有沒有讓員工自己去面對?我知道我還可以做的更好,也希望主管們都能做好。

員工的心聲 -11-不要讓我單打獨鬥

.不要讓我單打獨鬥

說真的,很不想寫這一段,因為這是我現在正面臨的痛苦。

要融入一個既有的團隊很難,就像前面提到的那個好老闆讓我用三個月時間了解公司,但是,這裡面缺少了一個主動的因素,老闆總是認為好的員工應該能很快融入群體。事實上能做到的人是很多,但是也有很多做不到。而我,常常自己設限,總認為老闆交待我做的事,我努力做好,沒交待我的事,我盡量少碰。

我定義中的老闆有時就是指一級主管,有時是指能負責的較高決策者,而主管就是一級主管,而那些階級高的非直屬的主管我會特別講。經歷過這麼多工作,不同的環境,不同的主管,不同的老闆,我很少遇到壞主管或壞老闆。當然所謂的壞我有我自己的定義。我講一個實例,我當兵是在成功嶺,當時還有兩個師,每個師還有三個旅,也在我退伍前正在進行精實案,那是後話。我下部隊的旅長,罵人真的是可以用狗血淋頭來形容,我常常自問,要是我是被罵的那個人,也許我會自殺。當然他是老資格的,他都對那些掛校級的大罵特罵,可是老實說,他也是我遇到的少數自我要求很高的軍官之一,而且,對待部屬真的是很用心。好像有點矛盾?沒錯,我要說的是他是好個長官,缺點只是太會罵人了。

帶人有很多方法,我之前也有過跟現在很像的狀況,我在單打獨鬥。有幸我跟了之前講的那個旅長,我見到很多大部隊的行動,我知道團隊作戰的方式,所以我對單打獨鬥很無力。說真的不是我不想融入大團隊,而是大家不是沒能力搞清楚狀況,就是保護自己保護的太好。沒錯,我被排除在外。我努力過,所以我心中坦然。

請主管一定要注意,你帶的都是你的子弟兵,要盡責的做好溝通協調的工作。不止是像前面說的幫員工找到位置,要讓團隊是整體的。人要無私很難,但是對大是大非面前,主管應該做好帶動團隊的責任。我也常見到互推責任的狀況,或是資深或是高階職位的人不肯負責任的情況。我也常自問到底是否我就是這種不肯多負責任的人?還是主管不肯給與更多責任?還是本來該別人負的責任他卻不知道?

這個不要讓我單打獨鬥也跟前面的議題有關。舉例來說也跟明確目標有關,也跟後面還沒特別提的專業分工有關。同儕之間都會怕互相得罪,所以身為主管協調不同團隊間的合作非常重要,這一點沒做好的話,沒資格當多團隊的主管。

員工的心聲 -10-請給我明確目標

.請給我明確目標

我有一份工作,主管人很好,我進去三個月了竟然都沒叫我做什麼,有一次我實在受不了跑去問主管的主管,主管的主管是總經理,官夠大了吧,總經理說,哦,我只是想讓你有充分的時間瞭解這間公司。我現在的這份工作,老闆人對我很是非常的好。

但是,上面說的兩份工作裡,前一份工作我跟總經理談辭職談了一年,目前這份工作也談過一次。當然會辭職不是因為沒明確目標,只是在說,這樣的好老闆,我還是一樣面臨換工作的痛苦。請相信我,當員工在跟你談「老闆,我想辭職」時,他的內心是很痛苦的。

我想,非常多人在遇到好工作時,都想在該份工作裡退休。至少我就有很多次起過這樣的念頭,可是最後最後我都選擇離職。我也很無奈,前面說了九個心聲,這個肯定也很重要。

很多有制度的公司,每年都會打考績,也常常有個步驟是要員工自評。其實,在我看來這都只是做表面的工夫。我到現在還沒遇到有哪個主管好好的跟我訂定年度目標,就更別說半年或是季度的目標。拜託,若主管都不知道我的目標在哪,我自己怎麼可能會知道?我若不知道我的目標在哪,每天每天就只是不停的把案子做完,我也會問,這樣就夠了嗎?

我相信,若真正有與員工談過目標的話,會發現所謂的目標並不是專案數或是能為公司帶來多少錢。當然很多主管就只會看錢。主管有責任為你的屬下訂定明確的目標,而專案,是主管的責任。

不懂的還是不懂,所以我多說一些好了。我會給我的屬下明確的說,請你負責把我們團隊的開發流程顧好。或是我會跟屬下說,我希望我們在丟給客戶的產品裡,都會要出現任何 bug。從這些目標,他會知道他的方向,當然,不是每個員工都能做好,那是他的責任。

我會遇到一個問題是,老闆老是談些虛幻的東西。給與正確的位置,賦與明確的責任,然後幫員工訂定明確的目標,這是很多主管做不到的。當然,我也正在努力而已,畢竟我真正當主管才一年多。

員工的心聲 -9-讓員工成為第一

.讓員工成為第一

我一直追求成為第一,成為世界第一。人貴自知,這四個字意義重大。我一直在反省自己,檢討自己。我也知道自己的短處,有些,是我不願意改的,有些是見仁見智的問題,改了不見得就比較好。當然,成為第一這件事不是指成就個人。讓員工學有專精,讓每個人都是頂尖人物,而且要不斷的學習。

成為第一,這件事也很難一言以蔽之。個人要如何成為第一?團隊要如何成為第一?不是努力付出就行。包含團隊是否和樂融融,包含互相間是否能無私奉獻,包含是不是能互相提攜。

很多人整天出差加班,已經加班到天怒人怨了,真的很多我認識的人都在抱怨,也有不少例子是因為加班到女友跑了,甚至,離婚的我也見識過。可是這樣的付出,他還是一臉茫然,當他停下來時,還是會發出「所為何求」的感嘆。更不要說成為第一了。

成為第一不是一項口號,喊喊就好。身為主管,一定要不斷的反省,不是只會要屬下反省。常常老闆就會出一張嘴,然後要屬下反省,要屬下付出。我說過了,不是付出更多就能成為第一。深切的反省是全面的,包含是不是人太少了?是不是用錯人了?是不是產品或是公司策略有問題?該反省的太多,實際上有反省,或是往正確方向反省的老闆少之又少。

我,常常遇到想做而做不到的狀況。我是個衝動的人,常常不顧自己的前途,可是換來的是沒有任何變化的可能。我通常選擇離開,也許我更該堅持。誰也不知道怎樣做才是最好的,所以我不後悔,只希望下次能更好。

員工的心聲 -8-讓員工有貢獻

.讓員工有貢獻

老實講,每個員工都應該是有貢獻的,要讓他明白,至少他在你心裡有著什麼貢獻。就算員工找到了自己的位置,不見得是有貢獻的。一個測試員對團隊有什麼貢獻?日復一日做著機械化的工作,到底他有什麼貢獻?我相信很多測試員會發出這樣的心聲。我舉一個最近的案例來說。

我的團隊參加一項比賽,當中只有一部份人有參與,隨著案子的進行,有的人是後來加入的,有的人提早離開,有的人是默默的進行,而總是會有人活躍於整個案子。誰的貢獻大些?那些沒參與的就沒貢獻?錯!常常的情況是沒在案子裡的,績效就差,有獎金制度的公司,這些人就很少有機會領到獎金。實情是,那些不活躍的或是沒參與的,都做些沒人要做的工作,才使得有人可以表現活躍,才使得整個案子成功。

任何情況下,要感謝每一個人,更要明白讓他們知道,你是知道他們的辛苦的。

事實上很多人都做著沒人要做的辛苦工,又覺得不受老闆重視,因此鬱鬱寡歡而選擇換工作。我常常自問,我的工作值得我領那麼多薪水嗎?事實上,很抱歉,我覺得不值。所以我都兢兢業業的,至少不要做破壞一鍋粥的老鼠屎。

老闆能不能幫員工找到最佳位置通常是個很大的挑戰,包括是不是有時間,也包括是不是有魄力排除人情因素。多方嚐試是必須的,但是也不能像無頭蒼蠅一樣讓員工盲忙茫,因盲目瞎忙而感到迷茫。我一直堅信工作是做不完的,我也相信只要肯用心,就能幫員工找到他適合的位置,因為我始終相信只有無用之將,沒有無用之兵。

員工的心聲 -7-請不要完全相信我,但是請尊重我

.請不要完全相信我,但是請尊重我

這個題目很奇怪,只是因為我遇到非常非常多的主管,都太相信我了。我的能力有限,真的。我也需要幫助,我也需要傾聽。當我碰到這種狀況時,我會選擇逃避,因為我會覺得愧對老闆。

負責任的員工常常內責,有時自己給的壓力太大而受不了。所以,請主管一定一定要去了解,要去問員工,為何進度落後,為何要加班,並且協助尋求解決的方法。在這邊我對那些被我拋棄的老闆們深深感到抱歉。

站在主管的立場來說,相信員工是應該的,站在員工的立場來說,獲得主管的信任是一種榮幸。但是,要了解員工不是神。就像我前面說的,要幫員工找到位置,若是賦與不適當的工作,常常是壓垮員工的最主要因素。

我沒什麼好方法去了解員工,也常常因為跟主管的距離感而不敢跟主管講我的處境,也常常因為自我要求而畫地自限。但是我本來就不是要提供方法,只是在講我的心聲而已。所以,主管請不要完全相信員工一定能做到你賦與的任務,也不要說什麼,我不管你怎麼做,就是一定要做到。

是的,我努力做到,但是請與我一起努力。

員工的心聲 -6-給我核心價值

.給我核心價值

前面提到要幫員工找到位置,那段文並沒特別強調核心價值,核心價值與貢獻並不保持正比例的相關。

常常有工程師,寫了很多的程式,也生產了很多產品,也每天加班了,股票也領了,獎金也拿了,可是還是不知道自己的核心價值。有一天,他突然失去工作了,下一份工作卻遲遲找不到。我週圍有些退休的人還想找到工作,也許只是為了肯定自己,也許只是為了讓生活不會太無聊,可是很多人能做的,就是警衛,甚至還找不到。

我以前在寫履歷時,上面會寫我會多少程式語言,會寫我生產多少產品。是的,這些都是工作累積的資本,但是,我也常常問我的核心價值是什麼?常常我面試時,看到的履歷上面會寫一段話,希望為公司帶來更大的利益,這,無法讓我看到核心價值。每個人每份工作,都有他的與它的核心價值。要去找出來,要大聲說出來。

要成為世界第一,首重的就是核心價值。我們常常看到別人的產品成功了,卻不知道它為何成功,或是自認為找到了,卻無法做到。當然我也會有這毛病。很多成功的背後,是要付出非常大的代價的。找到每個人的核心價值,找到團隊的核心價值,找到公司的核心價值,然後不斷的加強,不斷的累積,才有可能成為第一。

核心價值並不是一味的與眾不同,有些人的與眾不同只是嘩眾取寵而已。有些人的角色是讓產品更美,有些人的角色是讓產品更穩,有些人的角色是讓人使用起來很順暢,有些人的角色只是讓團隊能走好。必須肯定每個人的工作,並且,幫他找到核心價值。

我一直希望我能像老子說的,無為而治。無為而治是一種很高的境界,不是什麼都不做就算做到。其實我也曾遇到無為而治的主管,而我講的話又不被接受,所以我只好換工作。我真的希望每個員工都能找到自己的好位置,並且從中求得其核心價值,然後安心充實自我,並且提升團隊的能力與價值。

講這麼多還是沒講什麼叫核心價值。想想看,當你在找工作時,你如何說服老闆,用我就對了。這不用我說,每個人有他的角色該扮演,不同的角色會有不同的核心價值。

我老婆買菜,不同的菜色(肉、魚、蔬菜)會到不同的攤位去買,原因是什麼?因為,那些老闆會用最公正的價錢賣最好的貨。那,你呢?喔哦,我是指,那,我呢?

員工的心聲 -5-給我正常的生活

.給我正常的生活

我不想定義什麼叫正常的生活,有些人很自虐的,每天加班叫正常。涉入員工的生活當然不是好事,但是適度關心員工的需求是必要的,而不只是關心員工的苦悶而已。

正常的生活若純粹就加班來說,我不常加班,當然這意味著我也曾經加班。常見的工程師的生活型態是,加班到很晚,然後隔天很晚到公司,然後繼續加班到很晚。試問,這有意義嗎?當然還有的公司更糟,就算員工前天加班到凌晨,還是要求當天準時上班。

我在講創意時就說過,創意來自健康的身心,這就意味著要有正常的生活。一日三餐,早睡早起。我相信絕大多數的人都會同意在正常的生活下,人才有辦法保持長久的活力與靈活的腦力。可是身為主管卻常常為了要趕案子而讓員工加班,案子又永遠趕不完,所以加班加班再加班就變成常態。

是誰讓員工沒有正常的生活的?我也知道有些人私生活不正常,排除這種私人因素,若普遍存在員工一直加班,那只有一種可能,這個主管需要檢討,甚至可以說他不適任。

我知道不少人為了賺更多錢而努力加班,有些公司發獎金是看他累積多少加班時數。在我看來,加班時間愈多的人,代表他的績效愈差。

不過,有一種無奈的情形是,有能力的員工,主管就賦與他更重的責任,然後就天天加不完的班。常常主管也很無奈,不是找不到人,就是請不起更多人。我卻認為主管有責任全面提升每個員工的能力,也有責任平均分配員工的責任。當然安排適當的工作外,給予更多的責任也是必要的,但是常常是有能力的做的要死,沒能力的也閒的慌。

所以,給與員工正常的的生活,責任主要在於主管。對政府我們常有一種說法是,錯誤的政策比貪污還可怕。同樣的,主管下決策要小心。為公司帶來最大的利益有時不是一直接案子。

員工的心聲 -4-讓我停下來

.讓我停下來

我也曾加班過,也曾日夜顛倒過,當然做逃兵的次數更多。先不要說員工常常要應付鎖事,就說不斷的加班出差開會與簡報,對了,開會或是簡報也很煩人,員工每天要做這些事當然是應該的,但是身為主管,不能只一味的要求,而是要去思考,或是幫員工著想,有什麼辦法讓員工停下來。

我曾經在某高中同學的畢業紀念冊上寫著一句話,看,前面是休息再出發的好地方。就像一般人在說的,休息是為了走更長的路。但是工作中常常是不斷的加班,不斷的出差,不斷的開會,不斷的簡報,為了趕案子,然後,就把人折磨到死。

主管給員工好位置,給員工好薪水,給員工不斷學習充實自我的環境,給員工開放的環境,但是若從來不讓員工停下來,那還是死路一條。要讓員工停下來也不必花多少錢,也不必花多少心思,也許只是吃飯時間多一點,開會時間少一點,聊天時間多一點。也許偶而邀員工下盤棋,也許拉出去唱個歌,也許拍拍他的肩多看他一眼多問他一句話,也許只是對他說辛苦了。

讓員工能有時間停下來思考工作上的徵結出在哪,讓員工能有時間停下來看看下一步該怎麼走才最好,讓員工能有時間停下來好好照顧他的家庭。

我一直認為,若員工需要不斷的加班,不斷的出差,不斷的開會,不斷的簡報,那一定是主管有問題。把事情做好不是只有員工需要負責,事情做不好不是只有主管才會心急。主管自己也要停下來,也許只是讓心情平靜,我知道有些主管一直在生氣中,一直在自我要求也要求員工,但是,停下來不會讓事情停頓,而會讓大家能喘口氣,也會讓大家把事情看的更清楚。

員工的心聲 -3-要做有創意的事

.要做有創意的事

創意這件事常常讓人誤會,以為披頭散髮,或是每天醉茫茫的,或是煙燻繚繞,或是每天通宵熬夜等等就比較有創意。也常常有人以為創意是個人天分。也常常有人以為創意是一瞬間的靈感。也常常有人以為創意是學不來的。

創意不是藝術。事實上創意本身是身心健康的人才有的,正常的生活,健康的身體,然後一點一點累積,慢慢修改,與他人互補長短,才能成就創意。我這樣說不是說藝術就是要披頭散髮,或是每天醉茫茫的,或是煙燻繚繞,或是每天通宵熬夜等等才能有藝術。但是我不否認有些天才,有些外人看來是瘋子,他們是天才橫溢,但這不是我要講的內容。

我常常舉測試員,這次先還是舉測試員來說。測試員或是工廠作業員,一定是常常日復一日做著相同的事,如果,他能想出如何縮短工時,或提升產品良率,或是減少人員的方法,那他會很有成就感。

鼓勵員工發揮創意。有時鼓勵員工發揮創意也很簡單,傾聽與關心。常常與員工討論他們的工作,這一點我還做的不夠好,但是每個員工若都沒時間了,哪還會有創意?

創意常常是一點一點累積而來的,常常是很多人共同討論得來的,常常是要左顧右盼,參考非常多的其他事物而得的。不要認為創意來自天才,不要認為創意來自靈感。

我曾經工作在非常沉悶的環境中,當然沒多久我就逃離了。我換工作的一個因素是,工作太沈悶,我怕我會被扼殺在裡面。輕鬆的環境,自由的環境都是非常重要的因素。環境的塑造是主管的責任,當然要這個主管知道該做肯做,也要主管知道該怎麼做。還是那句話,反省是全面的。

員工的心聲 -2-讓員工能學到點什麼

.讓員工能學到點什麼

我換工作還有一項因素,常常我會覺得「我在這邊學不到任何東西」。到底有什麼好學的?不要以為舉辦一些課程就可以滿足每個人的學習欲,不要以為放開心胸讓員工上網不受限就算讓他們有充份的學習空間。何況常常公司因為沒經費無法舉辦教授活動,也常常因為資安或是什麼要讓員工專心工作而把很多網站鎖死。

有些話可以表達什麼地方可以讓人學到東西。譬如做中學,常常忙半天,卻不知道自己在做些什麼,這些人如何從工作中學到東西?做,但是要讓他知道自己在做什麼,知不足然後學之。

譬如身教重於言教。常常是上身不正,如何讓員工學到東西?至於什麼叫正,這一點不在我寫文章的目的中。身教不是指要當個聖人,但是一言一行要能當員工的表率。更多的是主管常常只會出一張嘴,平時嘻嘻哈哈的,出事時總是拿員工出氣。身教也不是要主管十八般武藝俱全,是有人能全才,但是那不是重點,不懂的地方,要從懂的人身上學。若主管都肯學了,還有哪個員工不認真學的話,該怎麼做不就很明顯了?

譬如不恥下問。常常主管總是官大學問大,自認為自己想的都是對的,不對一定是員工出錯,出錯也不去深明究裡只會大罵一通。去問清楚,去搞清楚,好好解決問題。若主管能保持這樣的心態,事情怎麼還會做不好?當然,事情若本身是錯的是另一回事,我只是想說,眾志成城。

譬如一枝草一點露。這句話用在學習或許是錯的。老天爺會給每個東西恩澤,但是也可以這樣想,就算只是一枝草,也可以生出一點露來,我舉這句不太洽當的話只是想說「到處都是可以學習的」。認真做事,把事做好,這就是不得了的工作,裡面的學問就非常大了。有人說,如果有一件事,可以讓你天天做,就算只是那麼一次那麼一瞬間,也是件大事。同樣的,既然會出現的事,若是那種每個案子都會遇到的,那就不會是小事。

主管如何分派工作,如何盯緊工作,如何解決瓶頸,如何分享喜悅,這些雖然不必言宣於外,但是不要以為沒人知道,你的員工都身在其中感受著你的一言一行。為員工創造學習的氣氛,把好的當模範,把壞的當教材,讓員工勇於改進。

就像我前面說的我會換工作的一個因素就是「我在這邊學不到任何東西」,事實上最多的情形是主管造成的。

員工的心聲 -1-幫員工找到位置

又到了年底,是換工作的好時機,我想,我是有資格來說說這個議題,員工的心聲,當然我是站在我的過去來談的,一個爬到經理的工程師的心聲。

.幫員工找到位置

這不是說沒辦公桌,不太可能,那什麼叫位置?很多時候工程師都很忙,忙東忙西,若問他到底在忙什麼,他會說一大堆。若問他為什麼要忙這些東西,絕大多數都是因為,要趕案子。這個議題要說的,其實是很多主管都沒考慮到的,每一個工程師在專案中所站的位置。我這樣說肯定也有很多人否認,但是,若細細把所有專案攤開來看,應該會發現,怪了,怎麼每個人在不同的專案中的位置不一樣了。

不是說不能換位置,老實講,我最近的工作一年半內換了七次辦公座位,但是我工作的角色始終沒變。始終沒變比較好呢,還是變來變去比較好?當然各有優缺,始終沒變也許正是始終處在一個不適合的位置,變來變去也許正是找不到適合的位置。

要幫你的屬下考慮,他的位置適當嗎?什麼時候該換位置了?

2009/12/02

網頁上的廣告?

前面貼了一篇關於 chrome os 的個人看法,而對 google 這家公司,相當相當多人在探討,這篇要說的也正是 google 最賺錢的產業,網頁廣告。

怎麼擴大廣告的收益,相信相當傷 google 的腦筋,這邊提供一個點子,我覺得也是大有商機。

在內嵌的廣告,不能是單向的根據關鍵字顯現,若能雙向的讓廣告根據網頁內容來「美化」網頁,相信非常有商機。

這話是怎麼說的呢?一般的廣告雖然跟關鍵字有關,但是有些則是太多文字,有些則是不相關的圖片,放在網頁上總感覺有那麼點突兀,若是廣告即網頁的一部份,甚至是不可或缺的一部份,是不是更能吸引人收看與刊登廣告呢?

Chrome OS 之我見

有幾個趨勢是大家都可以感受到的,
智慧手機....與筆電....小筆電成長率驚人
電子紙.....軟性顯示器.....微投影機....暫成顯學
這些裝置再搭配先前 Android 一推出,現在狀況是幾乎什麼裝置都在用 Android。相信有一堆人出現既生瑜何生亮之慨?Google 為什麼已經有了 Android 之後還要推 Chrome OS? Android 與 Chrome OS 孰優孰劣?

在今年七月時回答某友人的疑問時是這麼寫的:

----------------------
不管是 google 放出的訊息,我也相信一般人目前都認定 Chrome OS 與 Android 的市場區隔明顯是前者適合大尺寸,後者適合小尺寸。

不過,若讓我們看他們的本質,都是 based on internet, based on Cloud, 事實上兩者互相影響是必然的。我相信 Android 是比較高 performance, 應用程式也會發展的比較迅速。不過 Chrome OS 擅長在 Web Application 上,整合的難度非常少,所需要的技術相對也較低。

但是 Chrome OS 有一個致命的缺點,就是離線的應用程式必須搭配 google 本身在推的 Gears, 似乎推展的不是那麼順利。也就是說,Chrome OS 要離真正的大尺寸應用,關鍵點不在應用程式數量與品質,不在整合難易,而在離線應用程式的推廣面。

我一直非常看好 google, 若你要我選擇投靠哪一邊的話,我會說短期 Android, 長期 Chrome OS。一來是 Android 成熟,二來是 Android 需要用到的技術是很多人熟悉的 Eclipse + Java。而長期來看,google 要打敗微軟,勢必是在大尺寸上決勝負,因此目前有兩條路,一個是把 Android 作成適用於大尺寸,一個是把 Chrome OS 弄成熟。前者也勢必會發生,只是那樣還是離不開 Linux, Java, 而後者最大的優勢就是可以真正跟微軟開戰,因為它開發的所有應用,都可以拿到「微軟」的平台上執行,應該說,在 Chrome OS 上開發的應用程式,都可以真正的跨平台。

所以,若想跟隨 Google 的腳步,選擇 Chrome OS 絕對對未來是有利的。
-------------------------------

半年過去了,Chrome OS 也正式推出,雖然讓很多人失望,我的看法卻沒變。純就 Google 本身來說,多種選擇多管齊下是需要的,Google 也一直這麼做。google 在多種蒐購行動中,都有一個共同點,那就是致力於本務,網路搜尋與廣告。可以想像,一家公司大到世界第一之後,剩下要做的就是不斷的擴充與創造新的商機。踏入 OS 是已經現在進行式,那麼把 OS 的版圖持續擴大也是必然的。

Android 能取代微軟嗎?我覺得不是行不行的問題。如果說 Google 能打敗微軟的利器,就是在雲端運算上把眾多的網路應用帶入人間的話,Chrome OS 有一個最大最大的優勢,那就是硬體成本可以比 Android 還便宜。

經歷過多次的金融風暴之後,成本將會是繼熱消耗之後的最大考量。其實成本一直是消費者購物的最大考量,問題是現有的 OS 若要美觀與功能夠多,就算是 embedded linux 也做不到真正便宜。而我,相信 Chrome OS 能比 Android 生產出更便宜的裝置。我相信不久的將來,使用者將會把整個網路運算帶在身邊,那時候一個 chrome OS 可能是你的手錶,可能在眼鏡上,也可能在搖控器上,更別說 1000 元手機上。

2009/11/24

引用文件時的版權比較 CC / FDL

請見FDL 與創用 CC 授權條款之細部差異比較一文。下面僅列出原文中提到的幾條差異,文中有對兩項版權聲明的進一步說明。

一、FDL 明文規定,授權條款可視需要產生翻譯版本,但當兩者不一致時,以英文原文版本為準。而 CC 的 International 計畫,推動創用 CC 六種核心授權條款在各司法管轄領域的本地化,以我國情形為例,即是將尚未本地化 (unported) 創用 CC 授權條款翻譯成華文外,並配合我國著作權及相關法規作最小範圍的必要調整(註四)。

二、FDL 原是補足適用於自由軟體的 GNU General Public License 而來,使自由軟體相關的說明文件有「文件」適用的授權條款,但並不限於此,任何文字性作品都可適用,但是建議使用於操作說明或參考目的之作品。創用 CC 授權條款的適用客體則相對較 FDL 廣泛,任何文學或藝術創作都可適用,書籍、小手冊、甚至繪畫、攝影著作、戲劇或舞蹈著作都可依據創用 CC 授權條款提供大眾利用。

三、FDL 允許被授權人重製、散佈、改作、再授權、為商業目的使用採 FDL 授權的文件(以下簡稱本文件),另外也允許出租和公開展示(publicly display)本文件的重製物(註五)。創用 CC 「姓名標示-相同方式分享」授權條款,允許被授權人重製、散佈、修改、為商業目的使用採創用 CC 授權的著作(以下簡稱本著作)外,還允許公開演播 (publicly perform) 本著作或基於本著作而來的改用作品 (Adaptation),但禁止對本著作再授權(註六)。

此外,FDL 與創用 CC 授權條款都是全球性、免授權金、非專屬及在著作權存續期間內永久地授權。

四、FDL 規定本文件得包含免責聲明,且當有此免責聲明,該聲明將被視為FDL之一部,除此之外,FDL 無更細節的免責聲明規定。創用 CC 授權條款中則特別言明,授權人是以現狀之基礎(AS-IS)提供本著作,且未提供關於本著作之任何保證,也不對使用授權條款或本著作產生之損害負責。

五、FDL 要求被授權人不得以科技措施妨礙或控制本文件複本被閱讀或再重製。創用 CC 授權條款對被授權人使用科技措施規定則更嚴格,禁止被授權人使用任何科技措施於本著作/改用作品,而限制從其取得本著作/改用作品的接受者,行使創用 CC 授權條款所賦與他的一切權利。

六、FDL 對本文件印刷版超過 100 份的大量重製,有別於少量重製,另外要求當本文件授權聲明中要求封皮文字時,則本文件複本亦必須附上封面及封底,且清楚標示這些複本的發行散佈者 (publisher)(註七)。此外,當大量發行或散佈本文件複本超過 100 份時,FDL 允許不透明的重製格式 (0paque),但必須同時附上機器可辨讀的透明格式 (Transparent) 複本,或提供電腦網址讓公眾可下載透明格式的本文件;當選擇提供網址時,須確保此網址自被授權人最後一次散佈該不透明格式的本文件複本時起算一年是有效的。創用 CC 授權則未特別區別本著作少量或大量份數的重製。

七、FDL 允許被授權人重製及散佈修改作品的前提是,修改作品必須採用和原作品一模一樣的授權條款。創用 CC 「姓名標示-相同方式分享」 3.0 授權條款要求則相對較寬鬆,允許改用作品可採用與原著作相同的授權條款(或其後續版本),或與該授權條款具有相同授權要素的(3.0 或後續版本的)尚未本地化或任一司法管轄領域的授權條款。

八、不論是原作品複本或由原作品而來的修改作品的散佈, FDL 皆要求需標明誰是該特定版本的發行散佈者。相對地,創用 CC 授權條款則不著重於著作複本散佈者的區別及標示。

九、FDL 要求在修改作品中,除非獲得原作品作者的免除,否則須列出至少五位原作品的主要作者,且應列明該修改作品的作者。除此姓名標示目的外,原作品作者並未授權被授權人得使用其姓名作為對修改作品的背書。創用 CC 授權條款則要求,當散佈本著作、改用作品或彙編 (Collection),除非收到授權人的移除表彰的通知,否則必須表彰本著作創作者(即原始著作人)的姓名或筆名,且若原始著作人或本著作的授權人指定第三人(例如贊助機構、期刊)為姓名標示對象,則應提供之。創用 CC 授權並未如 FDL,對最低應標明之原作者人數有所要求。

十、FDL 要求修改作品中必須刪除原作品「背書」 (Endorsements) 標題的章節,但可增加對於修改作品的背書,例如該修改作品已經同儕審閱 (peer review) 的聲明。創用 CC 授權條款則規定,除非事先取得原始著作人、授權人或第三人之姓名標示對象的同意,否則被授權人不得暗示或主張,其本人或其對原著作的使用,與原始著作人、授權人或第三人之姓名標示對象間存在任何關連或有贊助或背書關係。

十一、FDL 規定,當被授權人非依授權條款所定方式使用本文件時,所獲授權將自動終止。 1.3 版新增授權恢復的規定,只要被授權人停止所有違反 FDL 規定的行為,則自某一特定著作權人得到的授權,可重新恢復。授權的恢復又分為暫時性恢復及永久恢復,只要停止違反 FDL 規定的行為,則授權即可暫時性恢復,除非被授權人所利用本文件的著作權人明確、且終局的終止對該被授權人的授權;若著作權人自被授權人停止違反 FDL 規定行為起的六十日內,未以合理方式通知該被授權人其違反規定的事實,則該被授權人將可永久恢復 FDL 的授權。此外,若被授權人是首次收到某一特定著作權人關於違反 FDL 規定的通知,且該被授權人在收到通知後的三十日內,即矯正其行為時,則 FDL 授權亦可永久恢復。創用 CC 授權條款規定,當被授權人違反任一款項,則授權條款所授予的權利將自動終止。創用 CC 授權未若 FDL 設有授權自動恢復的機制。

十二、當作品採用 FDL 時,可指定或不指定版本。若授權人指定適用某特定版本(如 1.3 版)或其後續版本,被授權人得遵循該特定版本授權條款的規定,或選擇適用該特定授權條款的後續版本;當作品未指定適用的版本時,被授權人可選擇適用自由軟體基金會曾發行過的任一版本的 FDL,包含先前或後續版本。此外, 1.3 版增設了代理人 (proxy) 機制,授權人可選擇一代理人為其決定,其以 FDL 授權的作品,未來以哪一版本釋出。當新版創用 CC 授權條款推出,並不會自動適用於採舊版授權條款的著作上,若要一著作同時適用不同版本的創用 CC 授權條款,則可依循多重授權模式釋出。此外,創用 CC 授權條款開放改用作品得採用與原著作相同的授權條款或其後續版本外,也可選擇適用與該特定授權條款具有相同授權要素的 3.0 或後續版本的尚未本地化或任一司法管轄領域的創用 CC 授權條款,但並不允許適用之前的版本(如 2.5 或 2.0 版)。

十三、對於一作品如何使用 FDL ,於授權條款最後設有附錄 (addendum) 說明之,且有提供著作權及授權聲明用語。創用 CC 授權條款對於標示方式則未另以附錄提供授權聲明參考用語,但在授權條款最後有「注意事項」,特別提到被授權人對於 Creative Commons 商標或任何與 Creative Commons 相關的商標或表徵的使用,只能是為了表明一著作依循創用 CC 授權之目的,且必須遵循 CC 當時的商標使用方針。