2015年2月8日 星期日

Service APIs of python-swiftclient

python-swiftclient 是一個 OpenStack swift 的 client tool 簡而言之就是 command line interface(CLI).

之前有想過如何可以直接使用 swiftclient 裡面的 library 直接與 swift APIs 做溝通,省去寫 http client 與 APIs 的攥寫時間,這是一個很單純的問題。就 code 的邏輯是一定沒問題,只是怎麼做比較漂亮,那個地方是插入點,就值得花點時間研究。

作法一: 直接利用 shell.st_FUNCTION 來做,把所需參數倒入即可

  • 缺點:需要處理 swiftclient output 的非同步問題,已經處理完 APIs ,但是回來的 buffer 內容就是少些東西。
  • 優點:很直覺,直接把參數帶在function後面即可。
#!/usr/bin/env python

import socket
from os import environ
from optparse import OptionParser
from swiftclient import shell
from swiftclient import RequestException
from swiftclient.exceptions import ClientException
from swiftclient.multithreading import OutputManager

def options():
    parser = OptionParser()
    parser.add_option('-A', '--auth', dest='auth',
                    default=environ.get('ST_AUTH'))
    parser.add_option('-V', '--auth-version',
                    default=environ.get('ST_AUTH_VERSION',
                                        (environ.get('OS_AUTH_VERSION',
                                                    '1.0'))))
    parser.add_option('-U', '--user', dest='user',
                    default=environ.get('ST_USER'))
    parser.add_option('-K', '--key', dest='key',
                    default=environ.get('ST_KEY'))

    parser.add_option('--os_user_id')
    parser.add_option('--os_user_domain_id')
    parser.add_option('--os_user_domain_name')
    parser.add_option('--os_tenant_id')
    parser.add_option('--os_tenant_name')
    parser.add_option('--os_project_id')
    parser.add_option('--os_project_domain_id')
    parser.add_option('--os_project_name')
    parser.add_option('--os_project_domain_name')
    parser.add_option('--os_service_type')
    parser.add_option('--os_endpoint_type')
    parser.add_option('--os_auth_token')
    parser.add_option('--os_storage_url')
    parser.add_option('--os_region_name')
    parser.add_option('--verbose')
    parser.add_option('--insecure', default='True')
    return parser

def stat(*args):
    args = ('',) + args
    with OutputManager() as output:
        parser = options()
        try:
            shell.st_stat(parser, list(args), output)
        except (ClientException, RequestException, socket.error) as err:
            output.error(str(err))

print 'show swift cluster stat'
stat() 

輸出

$ ./wrapper_swiftcleint.py 
show swift cluster stat
                                Account: AUTH_demo
                             Containers: 4
                                Objects: 5679
                                  Bytes: 468730045
Containers in policy "standard-replica": 4
   Objects in policy "standard-replica": 5679
     Bytes in policy "standard-replica": 468730045
                      Meta Temp-Url-Key: f270afa2-0552-43c6-ada0-0688d92c083d
                          Accept-Ranges: bytes
                             Connection: keep-alive
                            X-Timestamp: 1422242407.75372
                             X-Trans-Id: txb135b30b90384105bf100-0054d728c8
                           Content-Type: text/plain; charset=utf-8

做法二:利用 SwiftService class (Hight Level APIs 或稱為 Service APIs)

  • 優點:該有的都有,output 是一個 dicitionary,處理起來挺方便的。
#!/usr/bin/env python

import json
from swiftclient.service import SwiftService

client_opts = {'insecure': True}

with SwiftService(options=client_opts) as swift:
    stat_output = swift.stat()
    print json.dumps(stat_output, indent=2)

輸出
$ ./highlevel-swiftclient.py 
{
  "headers": {
    "content-length": "0", 
    "x-account-storage-policy-standard-replica-container-count": "4", 
    "accept-ranges": "bytes", 
    "connection": "keep-alive", 
    "x-account-object-count": "5679", 
    "x-timestamp": "1422242407.75372", 
    "x-account-meta-temp-url-key": "f270afa2-0552-43c6-ada0-0688d92c083d", 
    "x-trans-id": "tx56fe3088a81f4696ad79d-0054d72c57", 
    "date": "Sun, 08 Feb 2015 09:28:55 GMT", 
    "x-account-storage-policy-standard-replica-bytes-used": "468730045", 
    "x-account-container-count": "4", 
    "content-type": "text/plain; charset=utf-8", 
    "x-account-bytes-used": "468730045", 
    "x-account-storage-policy-standard-replica-object-count": "5679"
  }, 
  "container": null, 
  "success": true, 
  "action": "stat_account", 
  "items": [
    [
      "Account", 
      "AUTH_demo"
    ], 
    [
      "Containers", 
      4
    ], 
    [
      "Objects", 
      "5679"
    ], 
    [
      "Bytes", 
      "468730045"
    ], 
    [
      "Containers in policy \"standard-replica\"", 
      "4"
    ], 
    [
      "Objects in policy \"standard-replica\"", 
      "5679"
    ], 
    [
      "Bytes in policy \"standard-replica\"", 
      "468730045"
    ]
  ], 
  "object": null
}

其實方法一,是我原本處理的方式。一直到今天才發現這個 blueprint: Move high-level functionality from bin/swift into importable/testable library ,而且已經完成。而且解釋了為什麼需要做這 Service APIs (就是我所遇到的問題),下次做之前一定要『多看,多聽,多問』。

另外關於這個 Patch Review ,不免可以發現其實在 OpenStack 下的 project 已經算是有很完整的 Code review (Gerrit) 以及 continuous integration (Jenkins + Zuul + Gerrit) ,這個 patch 經歷的四個月,而且都是在線上討論完成,而且經過 Code review 與 CI 的洗禮,品質相對會比較穩定。

不過 python-swiftclient 的 performance 真的挺不好的,很慢啊!Head 5k 的 Objects 需要 10分鐘,不過也是因為它每次去取得資料都會去做一次 Auth,難怪會這麼慢。

2014年12月4日 星期四

用Markdown寫Blog

這幾天花了點時間,想說應該花點時間更新自己的blog,另外也該分出一些時間寫些技術性的文章。

由於工作上會用到很多Markdown的格式,所以想說找個可以發布的軟體,讓我寫blog可以比較輕鬆些。

希望可以支援的功能:

  • Mac平臺
  • Markdown support
      • Code block
      • Table
  • 原始文字格式儲存(.md)
  • 圖片拖拉
  • 支援 blogger 或其他 blog

大概就是上面這樣的內容,看了一下似乎有幾套可以滿足我的需求,所以就先下手嘗試看看。


使用了一會,大致上瞭解了支援的程度。

Desk 

對於一般使用者Desk是不錯的選擇,前提是你不知道所謂的Markdown也沒關係,因為他會有簡單的提示告訴你如何調整格式。如果你是Markdown的使用者,Desk對你來說應該不太夠用,因為目前似乎還未支援:

  • Table
  • Code block
  • 其他進階功能

Byword

如果你是進階的使用者,可以推薦你這款軟體,Table and code block都有支援,其他的進階功能還沒嘗試過,所以也還不知道支援程度。

缺點如下:

  • Publish to blog 需而外付費(NT 150)
  • 不支援圖片拖拉,須自行上傳網站然自行加入圖片(這有點討厭)

所以目前我應該是選擇Desk來當我主力寫文章的工具,Byword拿來寫文件好了。


其實Byword + scriptogr.am + dropbox也是可以當作另外一種Markdown blog,只可惜第一次嘗試的時候 scriptogr.am 對markdown的支援沒有想像中好啊(code block整個爛掉)!


2014年12月3日 星期三

Startup

前陣子換了一家Startup公司,規模更小,雖然公司的人不多,但是算算也有30來個。工作上的性質也變得不太一樣,不是單純的Porgrammer,做起來的感覺像是 QA+DevOP+Customer service+Develop,真是有趣啊!

大家真的很認真在上班,打混摸魚的人幾乎沒有,大家都很認真的在做自己的事情,雖然不在同一個時區工作,但是整個工作的狀況真的很國際化,加上使用的軟體以及工具,真的是很少在台灣看到,有機會再來分享一下心得。

雖然還是有些地方不太適應,但是應該會越來越好。

2014年5月2日 星期五

世代交替

漸漸感受到世代交替的重要性,公司(政府)能不能轉型,往往在於是否改革方能用新的方式 ,作法或技術來處理同樣的問題。

如果還是想拿舊的方式,態度面對新的產業,有時直接會被產業淘汰掉,淘汰的速度比較像是溫水煮青蛙,慢慢的但你發現時已經無力回天。

工程技術人員也一樣,如果只是在公司把事情完成,沒有嘗試與其他技術人員交流,尤其是新創公司的開發者,他們往往會用新的技術與工具來加速開發,等到你想換另一份工作時,就會發現怎麼產業完全不同,自己會的東西已經沒有需求!


看到50多歲還能在矽谷打拼的工程師,真的是不簡單!希望自己到那年紀還能有這樣的熱誠,但口袋可以麥可麥克!

2014年5月1日 星期四

Git and git-p4

Perforce is great source version tool for owner of company, because it's centralize control and can track each client behavior. But I don't like it anymore.
So I used Git to manage my local repo that is sync from perforce server. Use git to track my local commits and use p4/p4v to submit changes to Perforce server. But the work flow will complex and waste time(file always locks to read only with p4).

Few couple months passed, I found the tool git-p4 that can manage p4 repo like remote git branch. That similar like git-svn tool (git 與 git-svn 簡單教學)

The git-p4 is wrote by python and it integrates to git source tree. you need turn off the compile flag(ON_PYTHON) when you compiling git. In official build on git website, the NO_PYTHON is enable, so you can't use it with git-p4.

$ git p4
fatal: git was built without support for git-p4 (NO_PYTHON=1).

Please clone the git and switch to tag v1.9.2
$ git clone https://github.com/git/git
$ git checkout v1.9.2 -b v1.9.2

Follow INSTALL document to compile and install git, Please make sure the python already install in your environment (NO_PYTHON will turn OFF when you compile)
$ make prefix=/usr all 
$ sudo make prefix=/usr install

Check your git and git-p4 are ready to use

$ git --version
git version 1.9.2

$ git-p4
usage: /usr/bin/git-p4  [options]

valid commands: clone, rollback, debug, commit, rebase, branches, sync, submit

Try /usr/bin/git-p4  --help for command specific help.

Add p4 alias to your ~/.gitconfig

[alias]
    p4 = !/usr/bin/git-p4

Don't forget your p4 command and environemnt

$ export P4CLIENT=[your_client_name]
$ export P4HOST=[perforce_server_ip]:1666
$ export P4USER=[login_user_name]
$ export P4EDITOR=vim


Now, you can clone a proj from perforce.

# Clone a repository and covert all change list to git log
$ git p4 clone //depot/path/project@all myproject

# Clone a repository without log
$ git p4 clone //depot/path/project myproject
  
# Do some work and commit to your local git repo
$ git add foo.py
$ git commit foo.py
# Submit your local commit to remote repo (Perforce server)
# git p4 will create a change list for commit
$ git p4 submit

# Synchronize with Perforce (almost like 'git fetch' and 'get pull')
$ git p4 rebase
All done, enjoy it! :)

2014年4月23日 星期三

安裝 Xcode 5.1 Command line tools 所引起的問題

在 MacOS 10.9.2 上面如果有安裝 xcode command line tools,當你在裝第三方packages (python pip or ruby gem)而且有compile native library (大部份應該都是 c library),請記得加入這樣的 flag 在你環境上:


Ruby

sudo  gem update --verbose

export ARCHFLAGS="-Wno-error=unused-command-line-argument-hard-error-in-future"
sudo gem update --verbose


Python

pip install xxx

export ARCHFLAGS="-Wno-error=unused-command-line-argument-hard-error-in-future"
pip install xxx


不然就會感受到 compiler 很熱情地抱怨...

./ruby_xml_encoding.h:11:51: note: passing argument to parameter 'xencoding' here
VALUE rxml_new_cstr(const char* xstr, const char* xencoding);
                                                  ^
1 warning generated.
compiling ruby_xml_xpointer.c
linking shared-object libxml_ruby.bundle
clang: error: unknown argument: '-multiply_definedsuppress' [-Wunused-command-line-argument-hard-error-in-future]
clang: note: this will be a hard error (cannot be downgraded to a warning) in the future
make: *** [libxml_ruby.bundle] Error 1


Gem files will remain installed in /Library/Ruby/Gems/2.0.0/gems/libxml-ruby-2.7.0 for inspection.
Results logged to /Library/Ruby/Gems/2.0.0/gems/libxml-ruby-2.7.0/ext/libxml/gem_make.out
Updating mini_portile
Fetching: mini_portile-0.6.0.gem (100%)
Successfully installed mini_portile-0.6.0
Parsing documentation for mini_portile-0.6.0
Installing ri documentation for mini_portile-0.6.0
Installing darkfish documentation for mini_portile-0.6.0
Updating nokogiri
Building native extensions.  This could take a while...
ERROR:  Error installing nokogiri:
 ERROR: Failed to build gem native extension.

這應該是 Apple 為了避免出現類似 iOS 7.0.4 裡面的 gotofail bug,所設下的 flag。
有一好沒兩好...

2014年3月25日 星期二

讓 vim 支援 multiple cscope DB

之前發現blog,有幾篇文章是比較熱門的,尤其是這篇(用 vim 有效閱讀 Android framework 程式碼),被點閱的次數還不少。不過看了之前寫的plugin,還是覺得寫得很差,都是可以動就好。

所以前幾天有點時間,就把部分拿來重寫,大致上已經修改完畢。大家可以到multi-cscope-db(github去看看。

安裝的方式跟以往相同,不過建議用 vundle 來管理你的 vim plugin。
我把 goproj.sh 的部分,移動到 vim script 裡面。所以不需這隻 shell。以後只需要在 vim 的 command line 打入

:CSBuild

就可以建立新的 DB 或是更新 DB 內容,相信這樣應該會比較好用些。

目前預設支援:

*.aidl
*.cc
*.h
*.c
*.cpp
*.java
*.py

當加上越多副檔名支援,更新或是新建  DB 的時間就會花比較多。

Fork and enjoy it! :)
歡迎討論!


2014年2月23日 星期日

Docopt - 比 argparse 更方便的 command line parser

其實不管用任何語言 c or python 在寫 console program 的時候,都會遇到一個討厭但是你又不得不做的東西,那就是 arguments parsing,就是輸入一堆參數,然後對應到不同的功能。

在 python 裡面其實已經有些 build-in module 可以用 ( argparse ),不過說真的,這 module 不得我心,寫起來覺得累贅,有點麻煩。改個小地方就要重寫一部分,加上一個參數,就會增加不少行數。

呼!這樣我寫完就下班了,人生苦短啊!

所以我就開始找相關的 module,竟然有個很方便的 module - docopt (PyCon UK 2012)。

不廢話,看個影片:




很美吧!簡潔有力,人生是彩色的啊!

作者很厲害把註解直接拿來做 parser 所需要的 patten,順便拿來當 help file。然後給你個dictionary 然後就打完收工。

這樣就完了嘛?還沒,不用急著開 terminal,現在是什麼時代,一定有提供web的試用版本(話說正式版也是免費的)。

http://try.docopt.org/

Installation:


GitHub: https://github.com/docopt/docopt

直接用 pip 來安裝

(env) $ pip install docopt 

其實不要以為只有 python 有這些東西,其實 Ruby, PHP, Lua, CoffeeScript 都已經有移植的版本!

一年多就有四個移植的版本,真是有趣啊!
這也就是 opensource 的本質與好處吧!

歡迎大家互相交流! :)








About 2014

新的年,很多東西改變了,環境也改變了,不變的是希望成長的心態,期望還可以在進步。

這Blog也荒廢很久,沒有在更新。其實去年兩年一直有在想要找時間重新來寫些東西,不過就是沒有個起頭,也是因為身邊很多事情需要自己去處理,所以也沒有太多的精力來寫文章。

一直到了最近,開始覺得自己好像退步,很多東西變得不夠敏銳,似乎有老化的傾向。所以是該準備來重新開始寫一些文章,記錄自己看到的事情與觀點。

這兩年主要的火力都放在cloud的部份去發展,所以python變成我的主力語言,雖然偶爾也會寫其他的語言,不過python的強大,很難讓我在去適應(應該是懶得關係)其他的語言。 
期望自己在今年還是能夠些比較深入的文章,不是那邊LDS。
看看可不可以介紹些好用的python module與開發上的想法。


2013年7月7日 星期日

這兩年

這兩年經歷了很多事情:
工作:
1. 嘗試自己創業接案
2. 加入一家Startup
3. 搞倒了Startup,換到一家大一些的公司去。

私人:
1.  一年內整理了三間房子,分屬不同的處理方式(很累啊!)
  • 大型工程:打掉重練,自己做統包
  • 中型工程:全部自己來
  • 小工程:請人來做
2. 手工戒指與國外求婚
3. 準備結婚的事情
4. 家人的健康問題

其實還有好多事情,已經沒辦法馬上記憶起來,不過我真的過的很充實啊!只是口袋沒有充實的感覺。。。

突然覺得長大好可怕,肩膀上的東西慢慢開始不同了。
不過日子還是要過,加油吧!

我應該要來重新開始寫blog才對...

2012年12月27日 星期四

轉角下一站

2012這年很有趣,認識了很多不一樣的人。
今年的聖誕節,應該是我很難忘的聖誕節,不過也不怎麼好過,但是還是要撐過去!加油!

只能期待2013開始,會是一個新的開始。

開始找工作!:)

2012年12月16日 星期日

2011年6月8日 星期三

Android 讓你的桌機飛起來?


稍早看到這個新聞,其實也覺得蠻有趣的,有趣到我想不通啊!這是要遠端來超頻嘛?不過如果是遠端監控那就OK。就是關於透過Android app 來讓你的桌機超頻, MSI 在 Computext 2011上所展示的 Android app。下面有參考的影片。



其實在台灣對於 CPU 的超頻是已經是見怪不怪,以前認為需要將硬體速度撐到極限,才能有最好的工作效率。不過當以軟體的角度來思考的時候,其實不然。硬體應該提供一個穩定的環境,然後透過人去操作軟體來達到工作的產出。而有效率的最大關鍵在於人,不在於硬體

當你軟體的使用模式不同,你的產出效率也會不同。
當你一直在閒晃網頁,即使給你 32 core cpu,你的產出可能比用 tablet 來工作的產出少。

而當一個開發員 Developer,你應該考量如何使用軟體或是你該產生些什麼樣的工具軟體,來減少你的工作量。讓你可以專注在那些你應該花時間的東西上面,而不是每天都在點滑鼠,然後產生些重複的東西。

與其追求硬體效能的極致,不如思考如何使用軟體,進而創造軟體。
在有限制的硬體效能下,才能看到軟體如何發揮他的價值!


只是透過手機去超頻?不知道哪些人會這樣用啊!
倒不如可以透過手機超頻然後可以炸掉電腦,這樣應該會有特別的客戶會需要!
不過既然是 Show ,當然就是什麼死人骨頭都要搬出來客戶看,才有機會爭取到訂單啊!


2011年6月3日 星期五

Day 85 - 創業的心理調適

當你提出一個想法與概念,最直接遇到的就是你身邊朋友的疑問與衝擊,接下來就是老闆與同事間的對話。尤其是想要創業的想法時更是會收到很多有趣的問題!不外乎是,你要做什麼?這樣風險會不會大大?這樣有機會嘛?收入會不會比現在還好?不過應該說我很幸運,周邊的聲音都是支持的居多(也許是我比較會忽略不支持聲音XD),雖然朋友大多不知道可以幫上什麼忙。

下面是我這陣子的一些體認:

  1. 時間控制需嚴格控制
  2. 創業的好處就是時間都是你的,你可以很揮霍,也可以很珍惜。如果你沒控制好,你就會比上班還散漫。收入更少,半年後就默默回去工作崗位。
  3. 沒有人會來問你進度,你需自己給自己回報。
  4. 如果以往你沒有記錄自己工作的狀態的習慣,當你成會一個soho或實業家,這部份會是你最頭痛的問題。因為沒有良好的產出效率,對於獨立工作者是大忌。
  5. 支撐你的只有夢想,沒有金錢。
  6. 創業初期,賺錢的機率很小,所以要有心理準備。你必須每天起來都很喜歡你現在做的事情。如果沒有,但你又走上了這不歸路,請調整你的心態,讓你開始愛上你做的東西。無論調整產品的方向或產業,都是可以的。
  7. 投入的時間不等於回報
  8. 軟體與網路業不是馬上可以回本的生意,所以不能有製造業的工作想法在裡面,工作一小時就會有一小時的收入?如果你有這樣的想法,代表你想太多。回去上班比較實際。
  9. 你只是 nobody
  10. 在你出名或是闖出些名號前你都是NOBODY,沒有人會關心你在做什麼!所以不用在意太多的事情,專心把你認為該做的事情完成,然後修正,提供更好的服務給你的顧客,一直無限遞迴。
  11. 創業預備金是需要的
  12. 創業重要,但生活也是要過,至少你要吃飯吧!請準備一部分資金,讓你可以白痴白喝一陣子。
  13. 你需要夥伴
  14. 適合的夥伴需要時間琢磨與機運,遇到你覺得不錯的人,不要害羞,提出些想法,邀請他進入你的團隊。遇到不適合的人,請依循你的直覺,明快的做出決定。
  15. 適合的運動
  16. 請保持身心健康,創業可以算是十年計畫,請確保你的身體可以撐到那時候,不然你怎麼爽爽的過日子?
  17. 低頻率的創業聚會
  18. 偶爾的同好聚會是需要的,但不要太頻繁,那會造成不必要的干擾。你會失去原本的方向,但如果你產品已經到可以展示的狀態,請不要客氣,每天都出去展示也是可以的。
  19. 外包非本身的專業工作
  20. 請外包某部分專業的工作,讓你可以花更多心思在你的專業領域上,整體來說你會得到較佳的產品品質。因為你不是萬能的。

上面這十戒,有些是創業前期就知道,有些是最近工作的體認。寫出來是可以整理思緒,也許對那些想跳出工作的圈圈,又很擔心的朋友一些參考。

2011年5月5日 星期四

買國外軟體要報稅?!



買國外軟體逾3千元 記得繳稅

今天看到這篇新聞,真的有點生氣。不過生氣的是要提出這樣的報稅模式,請趕快把相關法條訂定出來。不是只說要課稅就課,然後套用現在的營業稅的名稱,這不但會被誤解,更可能造成民怨。

不過我想說的是另一件事情,從這件事情來看,代表現在世界已經邁入下一個階段。買賣幾乎都在網路上做,你也不會在乎,是國外廠商或是國內賣家,只要東西好就會想買。因應這樣的狀況,政府才會有這種需要課稅的思考邏輯。也正因為這樣的新聞出現,代表無論是公司或個人,你必須要思考面對的是國際銷售。而在這樣的前提下,軟體可以幫上忙的就很多了!畢竟網路是透過軟體溝通而架構的,只要你給予了對的服務,使用者會願意付費的,尤其在往後網路成為必備品的時候,賣虛擬的服務,將會是一件正常的事情。

也許你不曾買過網路服務,但是這些網站 flickr, vimeo, wretch, 都提供基本的使用功能,如你需要加強功能的時候,也是可以付費購買的。而近期的 iPhone/Android Phone, tablet 都是你生活上會用到的工具,更有趣的是上面的軟體也是一直被創造出來。而漸漸的這些軟體會變成必備品,買網路服務的習慣也會被養成,也許這是軟體開發者或廠商需要去注意的。

這也許是一個好的創業機會,大的版塊在移動與變化,你也必須思考你的下一步是往那邊邁進。

2011年4月29日 星期五

獨立日誌 - Day 50

從第一份工作的開始,就期望有一天是可以為自己工作,讓自己做些想做的事情。也許有時候那個夢不那麼明確,但是相信會越來越清楚,越走越會知道你的方向是不是對的,也可以增加自己的歷練。

從 TechChrunch 的這篇文章 Are You A Pirate?  中文版 ,其實就是現在心理的感受。但是我必須承認,我對於經濟上的壓力還是有(太膽小),但是我這一個多月來一直在嘗試著習慣,並且思考應該怎麼繼續在這茫茫大海存活下去。其實少少的金額還是可以生活的,只是看你要怎麼去過。吃什麼不重要,玩什麼不重要,重要的是想創造些什麼出來,至少知道你在這個時間點做了什麼,以後可以拿來說嘴(哈)!

今天又看了這篇文章
    你是海盗吗(续):竞技场上的海盗
    原文連結

真的是說的很好,又簡潔。你可以拿你的生命去實現一些事情,但是在實現這想法之前,你可能必須說服一些夥伴,甚至投資者,讓他們相信你,相信你可以做的到。甚至即使他們知道你有99%的機會失敗,也願意與你一起賭這1%。雖然這樣的說法有點誇張,但是創業真的沒有想像中那麼有趣。唯一的有趣點在於你會很快速感受到生活的殘酷與使用者實際的回應,這點在幫人打工的環境下,是沒辦法感受到的。

有很多書,都建議社會新鮮人出社會的時候先去當當業務,這點其實跟創業很像但風險還是相對較低。這意味著要習慣現實的挫折,並快速修正方向,在重新出發。每一天都是新的一天,昨天都已經過去,那些不重要。而另外一件事情就是,你可以真實面對自己的不足,更認識自己。更會知道自己需要哪些夥伴,然後去尋找並相互幫忙。

當事情不能順利的完成,代表有某些環結出問題,意味著你必須在前期看出合作對象是否能夠長期合作下去。這也就是你是否找到真正可以一起打拼的夥伴,因為每個夥伴的目標與目的地是不同的,如果可以滿足對方的需要,又合得來就是很棒的一件事情。如果你不太了解這樣的概念,去看看 One Piece 這部卡通或是問問鄰居的小朋友,他應該可以跟你說落落長的故事。

雖然夢想很微小,但是要大聲的說出來,因為只要說出來,就會實現。

2011年4月25日 星期一

寫軟體

當兵的時候,身邊的同袍都小我個五歲左右,連長都比我小一歲。也許是因為當兵前就在做軟體的工作,所以跟同袍聊天的時候,不免會問到,當兵後想要做什麼事情。這時後我才發現,大家對軟體的認知真的有限。即使你花了30分鐘用很簡單的方式說明,也不見得他們會了解你在做什麼事情。不過你倒是可以看到很多不一樣的生活態度與思維。

其實在早期選填科系跟自願的時候,我可以有兩個選擇,美術 or 電腦。你可以說這兩個領域是差異很多,不過對我來說都是有興趣的。由現在的狀況回推,我是選擇的電腦方面相關的方向去工作,一直到現在獨立的開發(剛剛開始)。獨立開發的感覺,跟設計師在設計一個產品的感覺很類似,都是必須設計一個東西給客戶或是普羅大眾使用。但是比較大的差異就是,軟體比較好複製,產品比較難複製,有時候是沒辦法複製成一模一樣。

那軟體工程師,其實就是跟設計師做一樣的工作,只是出來的成品不同而已。其實設計師很注重自己的作品做的好不好,某種程度也是軟體工程師重視自己寫的軟體,好不好用?使用者喜不喜歡?這樣的感覺,就是設計師跟工程師所得到的成就感,對於某些設計者來說,這比給他一大筆錢還來的重要(我是其中之一)。不過失敗的產品,就是需要檢討,下一次才會知道用什麼樣的結構,設計概念來施工,才會讓使用者用開心。

軟體很重要,是很花時間的設計。而也是很有附加加值的地方,只要還有熱情,就應該要繼續努力下去。
如果可以開發出一些像 Aeron Chair 等級的軟體,人生就很有價值了。

2011年4月8日 星期五

軟體與設計思維

使用MacOS的朋友應該會有種感覺,為何常常在mac上都會有一些很奇怪,但是又是超級好用的軟體,可是偏偏價格就是十幾美金起跳。這些軟體某種程度來說,都是很單純的軟體,有時甚至是很簡單的軟體,他就是只做一些事情,但它就可以用很直覺的方式來幫你完成。


如同TaskPaper的概念一樣,它像是個筆記本。可以讓你容易條列一些東西,然後可以輕易幫你增加tag,你也可以簡單的點一下,就把已經完成的東西mark起來,並給予完成的時間戳記。

目前有看到幾種用法:
    - 當做開發軟體的開發記錄,記錄哪些功能完成,或是有那些臭蟲產生。(TaskPaper開發者)
    - 拿來當Todo List
    - 拿來當長期目標的規劃
    - 拿來寫Blog或文章
    - 拿來當投影片的大綱規劃
    - 拿來當會議記錄(這很方便,而且事後修正很快)

TaskPaper其實也有iPhone的版本,可以參考AppleSeed的介紹

也許用過的人會說,其實這套軟體很簡單,沒有什麼複雜的程式概念。但是他卻是帶來了一個使用上的新體驗,把設計者希望的使用模式設計出來,讓使用者也可以感受到原來記錄這些事項是可以很輕鬆。而這就是軟體的另一個價值,『設計思維』。而設計思維才是軟體的精神所在,也是軟體有價值的地方。

其實在windows上也有很多不錯的軟體,也許是因為盜版太猖獗的關係,很多軟體開法者,沒有辦法靠單一軟體生活下去,所以軟體就漸漸的不再更新,也不再那麼好用,因為沒有注入使用感受與設計思維。
反觀在Mac上的軟體,也許是因為使用者願意付費的關係,倒是存在非常多設計優良的軟體,有些軟體甚至只有一個開發者。這是很有趣的一個現象,其實我不確定TaskPaper是否只有一位開發者,但是似乎這樣的模式是可以支持開發者繼續專心設計好用的軟體,並提供後續更新的服務。
而對於使用者來說,其實後續『更新服務』也是另一個軟體所要呈現價值,這才是軟體服務業的概念,不是一次就售出結束,而是可以提供有限度的服務。

用這樣的角度其實跟在設計椅子(Herman Miller)或其他的商品,是有類似的概念。


Miller Aeron chair 的價格不便宜(約台幣三萬多),如果以下面兩個角度來看:
    - 設計思維
        其實不用再多說,因為已經被收入到博物館裡面,所以有空去坐坐看,你可以感受到她的價值。
    - 更新服務
        提供了主體十年保固,椅網五年,十年後還可以幫你回收原本的椅子,讓你在用半價買一張新的Aeron chair。

      
有點離題,不過如果軟體開發者能用這樣的思維去設計他的軟體,也許他會願意針對設計的部分花更多心思,這樣你的軟體才會有特色,讓購買者感受到你的用心,這樣軟體在消費者心中就會有一個無形價值,這種無形的價值常常被稱作『品牌』。

PS. 這篇文章是用TaskPaper打好,在貼上來的,當然結與字體的部份是有手動修改。

  

2010年11月7日 星期日

About Facebook: 關於FacbBook

這幾天上映的社群網站(The Social Network),相信已經有部分朋友看完了,來聊聊我的感覺吧!



這部片是在描述 Facebook(以下簡稱臉書)是如何成立,以及跟合夥關係人間的利益與友情的交葛,另外一部分也可以看到所謂的創投(創業投資者),在公司成立的時候是如何有技巧的取得新創公司的股權然後,並給予適當的幫忙,這也是一種投資的手法,不過這對一般市井小民來說,是很陌生的。剩下的內容不多贅述,請到戲院去觀看吧!或是您可以透過這邊的連結去看看國外的專訪,算是很清楚的訪問。

2010年10月24日 星期日

Angry Birds and Android: 憤怒鳥免費大放送

最近看到在 App store 上的 Angry Birds 在 Android 上發表,如果你不知道啥是憤怒鳥(Angry Birds)?看一下下面的 Video 也許你也會有興趣!



在當下的一瞬間,只想到一件事,他是免費的嘛?還是付費,如果是免費,那應該會有廣告。
果不其然,透過朋友的下載與安裝在 HTC Hero 手機上,看到的畫面就是在遊戲的右下角會出現 Admob 的廣告,這麼有趣的遊戲竟然免費提供?天下哪有這麼好的事情?軟體公司是佛心來的嘛?是因為 Angry Birds 在 iPhone 上賣太多了,所以免費提供給 Android ?

也許這背後的思考邏輯應該是下面幾點: