星期四, 11月 25, 2010

Jira Soap API

如何close issue
指令有createIssue,但卻沒有close issue這指令
看了官網提的,應該是用progressWorkflowAction中的參數action將設為close
以下是官網的範例,用ruby寫的
# Close the issue with a resolution of "Fixed".
action = "2" # 2 = "Close". Note how this is actually a string, not an integer.
resolution_type = "1" # 1 = "Fixed". Also a string.
issue = soap.progressWorkflowAction(token, issue.key, action, [{ :id => "resolution", :values => resolution_type }])



Reference
  • Soap API
  • http://confluence.atlassian.com/display/JIRA/Remote+API+%28SOAP%29+Examples

星期三, 11月 17, 2010

Zend Captcha

  1. ASCII captcha (最簡單的用法)
    ex.

    $captcha = new Zend_Form_Element_Captcha( 'captcha', array(
      'label' => 'Please enter the 5 letters displayed below:',
      'name' => 'captcha', //回傳post欄位的名稱
      'required' => true,
      'captcha' => array('captcha' => 'Figlet', 'wordLen' => 5, 'timeout' => 300)
    ));
    echo captcha;

    判斷是否正確
    $captcha = $request->getPost('captcha');
    $captchaId = $captcha['id'];
    // And here's the user submitted word...
    $captchaInput = $captcha['input'];
    // We are accessing the session with the corresponding namespace
    // Try overwriting this, hah!
    $captchaSession = new Zend_Session_Namespace('Zend_Form_Captcha_'.$captchaId);
    // To access what's inside the session, we need the Iterator
    // So we get one...
    $captchaIterator = $captchaSession->getIterator();
    // And here's the correct word which is on the image...

    $captchaWord = $captchaIterator['word'] ;
    // Now just compare them...
    if ($captchaInput == $captchaWord)
    echo "valid";
    else
    echo "invalid";


  2. 圖文表示
    ex.

    注意事項
    • 要給ttf字型檔
    $this->view->captcha = new Zend_Form_Element_Captcha(
      'captcha', // This is the name of the input field
      array('label' => 'Write the chars to the field',
       'captcha' => array( // Here comes the magic...
       // First the type...
       'captcha' => 'Image',
       // Length of the word...
       'wordLen' => 4,
       // Captcha timeout, 5 mins
       'timeout' => 300,
       // What font to use...
       'font' => 'captcha/arial.ttf',
       // Where to put the image
       'imgDir' => 'captcha/tmp/',
       //<img src="?" > 的位置
       'imgUrl' => 'http://' . $this->_request->getHttpHost() . $this->_request->getBaseUrl() . '/captcha/tmp/'
       )
      )
    );
  3. 自定背景
    ex.

    注意事項
    由於預設會將底色用白,所以直接改圖沒用
    到/library/Zend/Captcha/Image.php改程式碼
    p.s. 因為機車johnny又在唸不喜歡彎彎的字及干擾的點及線,因此順便把扭曲的程式碼拿掉了

    不要點及線只要在建構子下...
    $captcha = new Zend_Form_Element_Captcha(
    'captcha', // This is the name of the input field
    array(
    ...
    'lineNoiseLevel' => 0,
    'dotNoiseLevel' => 0,
    ...
    )
    )
    );


    如果不要扭曲的字型,那就把_generateImage方法的內容改成以下程式碼
    protected function _generateImage($id, $word)
    {
      if (!extension_loaded("gd")) {
       require_once 'Zend/Captcha/Exception.php';
       throw new Zend_Captcha_Exception("Image CAPTCHA requires GD extension");
      }

      if (!function_exists("imagepng")) {
       require_once 'Zend/Captcha/Exception.php';
       throw new Zend_Captcha_Exception("Image CAPTCHA requires PNG support");
      }

      if (!function_exists("imageftbbox")) {
       require_once 'Zend/Captcha/Exception.php';
       throw new Zend_Captcha_Exception("Image CAPTCHA requires FT fonts support");
      }

      $font = $this->getFont();

      if (empty($font)) {
       require_once 'Zend/Captcha/Exception.php';
       throw new Zend_Captcha_Exception("Image CAPTCHA requires font");
      }

      $w = $this->getWidth();
      $h = $this->getHeight();
      $fsize = $this->getFontSize();

      $img_file = $this->getImgDir() . $id . $this->getSuffix();
      if(empty($this->_startImage)) {
       $img = imagecreatetruecolor($w, $h);
      } else {
       $img = imagecreatefrompng($this->_startImage);
       if(!$img) {
        require_once 'Zend/Captcha/Exception.php';
        throw new Zend_Captcha_Exception("Can not load start image");
       }
       $w = imagesx($img);
       $h = imagesy($img);
      }
      $text_color = imagecolorallocate($img, 255, 255, 255);
      //$bg_color = imagecolorallocate($img, 255, 255, 255);
      //imagefilledrectangle($img, 0, 0, $w-1, $h-1, $bg_color);
      $textbox = imageftbbox($fsize, 0, $font, $word);
      $x = ($w - ($textbox[2] - $textbox[0])) / 2;
      $y = ($h - ($textbox[7] - $textbox[1])) / 2;
      imagefttext($img, $fsize, 0, $x, $y, $text_color, $font, $word);
      imagepng($img, $img_file);
    }
  4. 自定captcha版面格式
    很機車的johnny不喜歡預設拆成兩行的樣子,硬要我併成一行
    只好硬著頭皮又去改原碼了
    有2個地方要改
    1.到fucntion render()
    public function render(Zend_View_Interface $view = null, $element = null)
    {
      return '<img alt="'.$this->getImgAlt().'" height="'.$this->getHeight().'" src="' . $this->getImgUrl() . $this->getId() . $this->getSuffix() . '" width="'.$this->getWidth().'" /><br>'; //將br拿掉
    }

    另外如果還要拿掉dt,dd等,則需要下個步驟

    2.到library/form/Element/Zend_Form_Element_Captcha.php 改function loadDefaultDecorators()

References
Zend Reference Guide - Captcha Operation
A Zend_Captcha example
Captcha problem
Zend_Form_Element_Captcha

星期日, 11月 14, 2010

系統分析設計與實作 Week 2 - Modeling By UML 三劍客

Modeling By UML 三劍客
  • Use Case Diagram
    由SA畫出使用者需求
  • Class Diagram
    由SD畫出結構圖
  • 物件合作圖
    方便Programmer實作
各代表不同view, 三大構面:需求、結構、實作

問題:已經足夠?
視專業,原則上已經符合大部份需求,最好還有table schema

系統是提供服務(API), 畫面(介面)及DB都不是系統

過去常用畫面捕抓需求
直覺,但不易找出user使用的目的,因為太多操縱細節,最常抓「欄位」、「企業規則」,但一開始其實不需要(先過濾細節),且使用者常不知自己所需,因此SA要能抓出「目的」(使用者使用系統的目的)
ex,付款時,要填「地址」(欄位,易變),目的在付款時,提供滿足需求的服務,但跟end user溝通,仍是一個溝通工具

前導工作
-訪談、會議記錄、畫面、錄音 以導出use case

use case model
  • Use Case Diagram => 聚焦在what, 而非how-to
    買咖啡及點餐各為一個use case,但結帳不是,因結帳非目的,而是點餐後的一項
  • Use Case Description 細節、互動

4.1 Web ATM
晶片金融卡視為一外部系統
因為密碼及交易計錄(約10筆)會存在金融卡,而金融卡會提供存取的API,因此算系統

寫好Use Case的好處
  • 好維護
  • 保持開發節奏順暢
*重覆的use case如何處理?
先當獨立,事後再依refactoring評估是否相關,再進行合併

2.3.1 系統範圍
抓價值高的=>交易
而非價值低的維護欄位

星期五, 11月 12, 2010

轉:螞蟻的故事

rob傳來的...還加了一句話「一開始是三隻小螞蟻」
還沒看內容時,還想不懂他在說什麼
看完內容就覺得似曾相識的樣子...

留下來,提醒自己
還可以學一下動物的英文...


Every day, a small ant arrives at work very early and starts work immediately.
每天,小螞蟻很早來上工,並且一來就開始做事。
She produces a lot was happy.
她的生產力很高,並且工作愉快。

The Chief, a lion,
was surprised to see that the ant was working without supervision.
身為老闆的獅子,非常驚奇螞蟻能自行工作而不須監督。

He thought if the ant can produce so much without supervision, wouldn’t she produce even more if she had a supervisor!
他認為在沒有監督下的螞蟻生產力是如此的好,如果有人監督的話她的生產力應該會更好才對!

So he recruited a cockroach
who had extensive experience as supervisor and who was famous for writing excellent reports.
因此他招募了有豐富經驗的蟑螂作為監督員,蟑螂以擅長撰寫優良報告而聞名。

The cockroach’s first decision was to set up a clocking in attendance system.
蟑螂的第一個決定是設立了打卡計時系統。

He also needed a secretary to help him write and type his reports and …
他也需要一個秘書幫助他繕寫和鍵入報告和……

... he recruited a spider, who managed the archives and monitored all phone calls.
他招募了蜘蛛,負責管理檔案和監管所有電話。

The lion was delighted with the cockroach's reports
and asked him to produce graphs to describe production rates and to analyse trends, so that he could use them for presentations at Board‘s meetings.
獅子對蟑螂的報告非常高興並要求他用圖表描述生產率和分析趨勢變化,因而他能在董事會上用這些資料來報告。

So the cockroach had to buy a new computer and a laser printer and ...
因此蟑螂必須買一臺新的電腦和雷射印表機和…

... recruited a fly
to manage the IT department.
.. 並招募蒼蠅來管理資訊部門。

The ant, who had once been so productive and relaxed, hated this new plethora of paperwork and meetings which used up most of her time…!
曾經是很有生產力和輕鬆的螞蟻,恨透了這些耗盡她大多數時間的過多文書作業和會議…!

The lion came to the conclusion that it was high time to nominate a person in charge of the department where the ant worked.
獅子做出結論這是提名螞蟻工作部門負責人的時候了。

The position was given to the cicada, whose first decision was to buy a carpet and an ergonomic chair for his office.
這個位置被賦予給了蟬,蟬的第一個決定是為他的辦公室買一張地毯和一把符合人體工學的椅子。

The new person in charge, the cicada, also needed a computer and a personal assistant, who he brought from his previous department, to help him prepare a Work and Budget Control Strategic Optimisation Plan …
新的人負責,蟬,也需要一部電腦和一位從他原先部門帶來的個人助理,來幫助他準備工作和預算控制策略優化計劃…

The Department where the ant works is now a sad place, where nobody laughs anymore and everybody has become upset...
螞蟻工作的部門現在是一個哀傷的地方,不再有人會笑,而且大家變得抓狂…

It was at that time that the cicada convinced the boss , the lion, of the absolute necessity to start a climatic study of the environment .
就是那時蟬說服獅子上司,強調要開始進行組織氣候調查的绝對必要性。

Having reviewed the charges for running the ant’s department , the lion found out that the production was much less than before.
在審查了螞蟻的部門運作費用後,獅子發現生產力比以前大幅減少。

So he recruited the owl , a prestigious and renowned consultant to carry out an audit and suggest solutions.
所以他招募了貓頭鷹,一位有名望和顯耀的顧問來執行稽核工作並建議解決之道。

The owl spent three months in the department and came up with an enormous report , in several volumes,
that concluded :
“ The department is overstaffed ...”
貓頭鷹在部門待了三個月並且產生了一份有數冊之多的巨大的報告,結論是:「部門成員人數過多…」

Guess who the lion fires first?
猜猜獅子首先解雇誰?

The ant , of course, because she
“showed lack of motivation and had a negative attitude".
當然,是螞蟻,因為她「顯現出缺乏做事的動機並且態度消極」。


The characters in this fable are fictitious; any resemblance to real people or facts within the Corporation is pure coincidence…
這個寓言裡的人物是虛擬的; 若與公司內部任何的人物或情事雷同係純屬巧合

星期四, 11月 11, 2010

引用google libraries

  1. Google Libraries API - Developer's Guide
    還挺多的

    Available Libraries
    Chrome Frame
    Dojo
    Ext Core
    jQuery
    jQuery UI
    MooTools
    Prototype
    script_aculo_us
    SWFObject
    Yahoo! User Interface Library (YUI)
    WebFont Loader

    用法也很簡單,像jquery就先到該文件下找"path",再放入src就好啦
    <!-- jquery -->
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>

    <!-- jquery ui -->
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js"></script>


  2. dynamically load jquery if 'jQuery' does not exist
    function initJQuery() {
       //if the jQuery object isn't available
       if (typeof(jQuery) == 'undefined') {
         if (typeof initJQuery.jQueryScriptOutputted == 'undefined') {
           //only output the script once..
           initJQuery.jQueryScriptOutputted = true;
           //output the script (load it from google api)
           document.write("");
         }   
         setTimeout("initJQuery()", 50);
       } else {
         (function($){ // CLOSURE -> save to use $
            $.fn.foo = function(input) {
            alert("foo:" + input) ;
          } ;
         })(jQuery) ;
       }

       window.onload = function() {
       $('body').foo("bar") ; // won't necessarily fire if jQuery loads after   document load
      }
    }
    initJQuery();

星期一, 11月 08, 2010

The Zend PHP Certification Practice Test Book

Ch1.PHP Programming Basics
  • PHP is a _____ scripting language based on the ____ engine. It is primarily used to
    develop dynamic _____ content, although it can be used to generate ____ documents
    (among others) as well.
    A.Dynamic, PHP, Database, HTML
    B.Embedded, Zend, HTML, XML
    C.Perl-based, PHP, Web, Static
    D.Embedded, Zend, Docbook, MySQL
    E.Zend-based, PHP, Image, HTML

    Result: B
    Looking at the answers, the only one that makes sense for every blank is B. PHP is a
    scripting language based on the Zend Engine that is usually embedded in HTML code. As
    such, it is primarily used to develop HTML documents, although it can be used just as nicely to develop other types of documents, such as XML.
  • 16.Under what circumstance is it impossible to assign a default value to a parameter while declaring a function?
    A.When the parameter is Boolean
    B.When the function is being declared as a member of a class
    C.When the parameter is being declared as passed by reference
    D.When the function contains only one parameter
    E.Never

    Answer:
    When a parameter is declared as being passed by reference you cannot specify a default
    value for it, since the interpreter will expect a variable that can be modified from within the
    function itself. Therefore, Answer C is correct.
  • 17.The ____ operator returns True if either of its operands can be evaluated as True, but not both.
    Answer: xor
    用法$result = ($A xor $B);
  • 19. Which of the following expressions multiply the value of the integer variable $a by 4?
    (Choose 2)
    $a *= pow (2, 2);
    $a >>= 2;
    $a <<= 2; $a += $a + $a; None of the above Result: A,C 嗯 是往左... 我怎麼會想成往右...



Ch2.
1,2,3,6,8,9,12,13,14,17,18

星期日, 11月 07, 2010

系統分析設計與實作 Week 1

如何分析系統(How)?從何分析,分析什麼?

聚焦重點,系統為提供服務,而服務是從需求而來,所以分析需求即為重點
ex. 咖啡廳的需求為何?
咖啡廳提供服務有
  • 餐點
  • 設備
組成咖啡廳的元素 (內部結構)

問:咖啡機也是組成元素,為何沒列入?
因為重點在Service,咖啡機有如framework(基礎建設),很重要,但不會自己做,將重點放在滿足需求,而不是自己再造輪子

三大構面
依使用者角度不同,分析出來的需求也不同

PG Skill

分析 (SA )
著重功能、需求
設計
內部結構元素
實作
Infrastructure
當三者有技術衝突時,靠Architect講合
PM 人、客戶的溝通、時程的掌握

Ch1. 軟體開發方法論(Methodology)
1.1.1 方法論的組成元素 - 溝通語言與開發流程(Process)
軟體開發會有PM,Architect, SA/D, Programmer組成的團隊,在一定的時程內、運用有麥的資源,來達成有效率的系統開發。如果做有效率的專案控管,「溝通」與「開發製程」即為影影專案成敗的最重要關鍵 。
  • 開發流程: Waterfall, RUP, XP, agile
    因project的性質、團隊素質不同,不可能適用每次的project
  • Notation: UML
    統一溝通的語言,讓PM,SA/D, Architect, Programmer有共同的語言
團隊開發成員之間可講相同的語言(UML),以利相互的溝通;但每個團隊要如何達成目標,則各有方法與程序(Process)來達成任務。程序是"How-to",每個團隊的"How-to"是不會完全一樣的。

1.1.2 什麼是有效的開發流程
軟體開發失敗原因,不外乎
  • 溝通的障礙
  • 無法處理需求的變更
  • 脆弱的架構
  • 難處理的複雜性(團隊合作造成的複雜 ex.維護別人的code)
  • 不一致的需求、設計和實作 (分析文件太多,不易維護)
  • 無法分析並克服風險 (讓風險儘早發現)
  • 無法建立標準化的測試環境

最佳實務
  • 以反覆式開發方式去開發軟體
    每個開發流程的目的都是期望在專案的四大變數:成本、品質、時程與規模達成一定的均衡
    但前三樣由客戶決定,能夠控制的只有「規模」,將規模分階段完成
  • 需求的變動管理
  • 以元件為基礎(Component-based)的架構
  • 用視覺化方式製作軟體模型(Visually Model Software)
  • 持續驗證軟體品質
1.1.3 軟體的變動無常
軟體系統的專案開發,特別的是,需求往往不明確,更何況是經常處於變動中,所以導
致專案的範圍與規模無法界定,連帶也引起時程無法估算。能做的只有將變動抑制收斂在某一程度可被控管的範圍
專案四大變數:成本、時程、品質與規模中,前兩樣都控制在客戶,能夠控制的只有「規模」=> 將規模分階段完成 ( I & I)

1.1.4 典型開發模式 - 瀑布式 (Waterfall)
因軟體「變動無常」,所以想要「凍結」,再開發出系統,如同建築工程,但軟體開發與建構大樓的差異在於瀑布式兩個基本假設點
  • 需求會固定不變
    • 更多的使用者
    • IKIWIS效應(I'll Know It When I See It)
      只有到實作完成,有了畫面,使用者才能知道他是否為他要的
    • 無法捕抓需求足夠的細節和精確度
  • 紙上談兵 - 從設計圖就可以導出正確的實作 (Implementation)
    軟體工程的基礎理論很薄弱而且缺乏瞭解,探索的方法也非常糙。直到實作時,發現設計有嚴重瑕疵,造成系統崩潰。
管理階層易接受「瀑布式」,因為每個階段都有「明確」、「標準」的產出,方便「監督」與「追蹤」

1.1.5 I&I(Iteration and Incremental)的開發模式
Iteration就是將整個專案生命周期,分成好幾個迷你專案,每個專案有自己的開發循環,包括分析、設計、實作與測試。
有多迷你?
以「使用案例(Use Case)」或「功能點(Functioinal Point)」為功能單位,大約一星期,最晚不超過兩個星期。每個功能單位,依複雜度切為2~5個Iteration,從第一固Iteration對框奇目標的建立,然後逐漸加入細節,從低精確度往高精確度,到最終完成定案的產出。
好處?開發時間會縮短?
其實沒有,因為重點在提早揭露風險(Risk),而儘早處理掉。開發人員可在一個Iteration看到具體成果,從中得到Feedback,隨時回頭修正,時間不會離得太遠,而不會等到整個系統完成了,使用者才說這不是我要的,或是架構要調整。
優點:
  • 提早降低風險
  • 較早能具有可視性(Visible)的進展(Progress)。
  • 較早能得到回饋,較可以得到使用者的保證(engagement)及適應性(adaptation)由此再精緻由此再精緻(refine)系統的設計,以更進一步契合使用者的需求。
  • 增加團隊的信心,並且可以一直持續學習。
  • 產品的整體品質較佳

系統分析設計與實作課程大綱

Iteration #1

課程階段目標:找捉系統功能需求,快速設計,立即產出程式碼 (先求有)
重點在做出來,著重抓需求
  1. 軟體開發方法論 - 開發流程與塑模
    • 開發模式介紹
    • 專案開發的工作流程
      • 各角色人員的工作執掌
      • 各階段的產出(artifacts)介紹
    • 軟體開發的最佳實務
    • 軟體塑模 - UML介紹
  2. 需求面的功能分析設計 - Modeling by UML 三劍客
    需求如何mapping到實作
  3. 物件導向觀念養成與應用- 觀念、模型與程式碼的三面表達
  4. 實做面 by Spring Framework
  5. 案例分析與實作

Iteration #2
課程階段目標:重構程式碼與類別結構,讓系統更有彈性 (不影響原功能下,改善系統)
  1. 軟體結構面的分析與設計
  2. 重構
  3. 案例分析與實作

整體開發流程總複習
  • 檢視兩個循環(Iteration)開發所各自產出的設計圖與程式碼
  • 回顧每一個流程開發階段的產出與所運用的設計、技術與技能
  • 學員課程中的問題提問與回答總整理