星期四, 10月 19, 2017

git submodule

把別人的code放進自己的git repository會加入追蹤
但這樣挺怪的,而且將來3rd parity code會有更新問題
後來才發現原來git有submodule的東西,用一陣子後還挺好用的

  • 新增
    git submodule add <repo> <local>

    注意!! 得在原git repo的根目錄加submodule,才不會造成git路徑錯誤
  • 更新
    git submodule update --init --recursive
    第一次git clone後也要下,不然會是空的

升級PHP7及Phalcon3已知問題


PHP 7

  1. COUNT field incorrect or syntax error
    placeholders must have unique names even if they have the same value
    不確認是PDO還是Phalcon,但知道placeholder不可重覆
    
    $sql = "SELECT * FROM m
    WHERE m.prod_market_sdate <= :nowDate         
    AND m.prod_market_edate >= :nowDate
    $statement = $db->prepare($sql);
    $result = $db->executePrepared(
    $statement,
    array(
    'nowDate' => date("Y-m-d H:i:s", time())
    ),
    array()
    );
    Reference: https://stackoverflow.com/questions/34089614/count-field-incorrect-or-syntax-error
  2. Static property
    
    - $this->$fileErr => $self::fileErr


Phalcon 3

  1. 不可以有重覆的andWhere
    雖然不應該有這問題...
    不過有時候條件太多,看走眼...
    
    $builder->andWhere("name = 'Peter'");
    $builder->andWhere("name = 'Peter'"); //重覆會有錯
    

星期五, 6月 09, 2017

讓Stub跑原本的Code

本來Stubbing寫好好的,遇到要call stub裡未stubbing的method
一時還不知道怎麼寫,因為會遇到undefined mock function
原來直接用getMockBuilder就可以了
class aaa {
  public function test1(){return true;}
  public function test2(){return true;}
}

class StubTest extends PHPUnit_Framework_TestCase
{
  public function testStub()
  {
      $stub = $this->getMockBuilder('aaa')
        ->setMethods(array('test1'))
        ->getMock();

      $stub->expects($this->any())
        ->method('test1')
        ->will($this->returnValue(false));

        $this->assertFalse($stub->test1());
        $this->assertTrue($stub->test2());
  }
}

加上Namespace後,getMockBuilder裡的class,要加完整的namepspace才會真的取到, 不然會做個假的(test2會是undefined function)

星期二, 3月 14, 2017

打造當責影響力


如果你真的想做一件事,你一定會找到一個「方法」
如果你不想做一件,你一定會找到「一個藉口」


今天上了內訓課程- 「打造當責影響力」
講師是李河泉老師
原本上課的計劃是學著怎麼帶人,讓同仁有當責的觀念
反而是上了一堂怎麼帶小孩的課程,倒是滿實用的... 回家馬上試試

新人難帶,自己是共犯


學員有人反應常發現有新人不會主動做事
想指責,新人倒是很自然的回應:「沒人跟我說要做」

講師便提到觀念來自- 1.家庭2.經驗
在場多為人父母,請問你家的小孩會主動做家事嗎?為什麼會這樣?
小孩從小就知道他沒做,爸媽就會做掉,自然沒有負責的心態,出社會就同一個樣子
卸責是人之常情,就是要讓他扛起責任,沒人會幫他,他就會扛起責任

從負責到當責

高鐵清潔員快步走VS觀望走

為什麼要當責

責任三層次

1.卸責- 「找藉口」避免被怪是人的天性
一般人「逃避」、「抱怨」
成功者「改變現狀」

工作中,六種一般心態
  • 領多少做多少事
  • 那不是我的工作範圍
  • 有指示再做事
  • 該有人告訴我怎麼做
  • 下班該是我的時間吧
  • 為什麼他這樣也行
改要從心態改起
為最終結果負責- 團隊中,每個人都從get reasons轉移到get results
抱怨是本能,解決是本事

2.負責- 只做好份內工作
人該積極主動最主要的理由
  1. 薪水
  2. 自己
「所有人」指責「某個人」,卻「沒有人」去做「任何人」都可以做的事
「負責」與「當責」 比一比
把事情做完把事做完並做好
有義務採取行動有義務確保這些行動能交出成果
只對「自己」許下承諾對「自己」和「別人」許下承諾
只願意執行被交付的任務,沒有功勞也有苦勞成果至上,不管多少困難,一定要交出成果
沒有人認為自己不負責,只是認為那些非份內之事

3.當責- 每個人「多做一點」,為結果「盡責」

如何當責
不斷自問的態度- 我還能做些什麼,好超越我的環境,取得我想要的成果
沒人能強迫你做事,除了你自己
每次主動扛起問題的呆瓜,有一天才發現他是學最多的人

團隊

奧茲法則- 人沒有完美,看你如何組合團隊


動態競爭

把成果跟其他人比,而不是跟自己比

人生不是得到($),就是學到(經驗)

難題不是解開就是跳開,當一路跳開,最後剩的只有難題

把時間花在哪,成就就在哪

當責- 王牌法則


  • 當仁不讓,責無旁貸
    每個人都練習把自己的責任往外擴張,讓團隊完整的圓沒有缺陷。
    花公司的時間,做自己的事情=>花公司的時間,學自己的本領
  • 當然為最終結果負責
    團隊中,每個人都從get reasons轉移到get results

雪崩時,沒有一片雪花覺得自己有責任
--法國文學家伏爾泰(Voltaire)

當責- 團隊篇


3M當責文化,信件從董室會到收發室
盡責地把重要文件準時寄出
進一步確認對方收到

超越主管的期待,找到你的不可取代性
「累己」才能「累積」自己的實力

當責的最佳團隊(雁行理論)


借著V字隊形,整個雁群比每隻雁鳥單飛時,至少增加了71%的飛行距離
而顉頭的雁鳥最累,要交換時,會由誰來取代- anyone都可



星期四, 3月 09, 2017

CSPO課程心得


為什麼上CSPO
去年上了SCM課程,上完課發現「挺好的」(呂毅語氣)
學到滿多東西的,特別是Scrum每個meeting的Goal及Why
例如,講師詢問Daily meeting的Goal
自以為的回答「觀察每日進度及即時調整!」,又被追問那Why?為什麼要做這件事
才發現回答的都是What,回答不出來為什麼
Daily meeting的Goal是觀察及調整沒錯,但要知道目標才知道如何調整
目標到底是什麼 - 滿足這個sprint backlog item呀

被糾正觀念後,就覺得這課程真的滿不錯的
因此決定再來上PO的課程

學到什麼呢?以下做個筆記
Origin of scrum
The new new product development game
只給日期,時間到了要有Shippable product
其他讓Team自己決定(Cross-functional/Self-originated)
雖然之前SCM就有聽過了,但再聽一次,總是refresh一下Scrum最核心的精神

Empirical process (野雁)
開發Product如同野雁南飛一樣
做一段,檢查一下(Inspect & Adapt)
離目標多遠,需要調整以更接近目標
Scrum很多Practice就是要這事兒發生, ex. daily scrum, burn down chart, ...

Sprint中,PO需要參與嗎

  • Product Backlog Item(What)
    • PO的職責
  • Sprint Backlog Item(How + What)
    • Dev的職責
也就是Sprint中,Dev有需要再問PO,PO不用插手Dev
PO關心What,不是How


Demo meeting改叫Review meeting

回到剛的Daily meeting的Goal是要完成sprint backlog item
而Demo meeting的Goal呢?
除了demo外... 應該要Inspect與Goal的差異
因此應該叫Review meeting比較合適

Scrum framework 欠缺Why
Why是離Goal的差距,因此Review meeting是PO Inspect & Adapt的時機

再看各個meeting的重點 - 以終為始
說很簡單,但實做才發現自己都漫無目標的在做
雖然有inspect,但都沒在與goal比較,只是求局部最佳
Goal不是只有指如期完成,而是如期交付最適合市場的Product,也就是說最後交付的Product有可能已經不是當初定的Goal了

換位思考
這次上CSPO最大的感受... 就是每個問題的答案都跟我的想法有出入
甚至有時聽不太懂講師在說什麼,上SCM還沒差這麼大
後來才意識到我還在用developer的角度思考
我只想著要把MVP做出來,而PO想著是有Business value的feature
而且... 做出來要能feedback到之後的sprint

為什麼!?調整產品的走向呀~~
我還是只能想到自省會議的改善項目(Deliver的部份)
PO要想著Discover的部份

PM的價值在於Project成功,PO的價值在於Product成功
課程中有討論Product Owner與Project Manager的不同
點出兩者職責的不同,因此重視的東西便不同

「PM的價值在於Project成功」
這句話真是有fu
感受到過去被PM壓榨的fu
感覺上PM只在乎有沒有如期交付,但不會深入討論有價值的feature
只會逼著developer交付,把develop team當可以置換的人力
成功都是他的,失敗都是別人

但什麼才是對的,Project成功了,但Product失敗了,這能叫成功嗎?

PO應重視Business Value

課程中有玩Business Value Game,這跟之前玩的Kanban Game滿像的
遊戲裡有些可以改善開發效率的feature,很直覺的就應該先擺在前面先做

但遊戲結束後,才發現分數並不高
因為遊戲故意設計重點在Business Value(有做完才算!!!)
所以要評估如何讓Business value最大化
這裡的陷阱在回合有限,做完改善後,遊戲(專案)已經結束了
改善的項目是沒有business value的!!!

因此PO常不理develop team的改善需求
雖然現實也是這樣,但對PO還是有很多抱怨

事後討論,這類型的改善,應該在每個sprint一點一滴的做掉是最好的

這遊戲真厲害,一次讓兩個角色搞明白(呂毅語氣)

Product Version
影片 - IDEO Shopping Cart
影片提到如何在幾天內重新設計Shopping Cart(重點當然是在如何進行重新設計)

  • 收集客戶問題,想辦法解決
    • 不要自己想,太花時間了
  • 看客戶怎麼用,自己也下去玩

Excise: Spec Writing Game
分成兩組人,一組寫文件,一組實作

  • 題目
    • 左邊是題目,右邊是我們的成果 XD
  • 規則
    • Timebox : 10分鐘
    • 兩組人只能透過文字(件)溝通
    • 不可畫圖(當然!!!)
    • 可以修改文件
      • Writer可以觀察實作者的情況,再修改文件
      • 實作者不可提問


結果
太晚給Spec,有疑惑來不及修改文件
忘了把文件拍下來... 不然大家可以來畫畫看...
記得文件寫左上角的六角型直徑1.5公分
但Writer看我們畫完,才發現.... 他們是要寫半徑1.5公司... 所以大小差很多

上方的星星跟下方的甜甜圈則是連文件都來不及寫...

心得

  • Writer會想把文件一次寫清楚,但花太多時間且有認知落差,發現實作誤解再調整文件
  • 越早開始,越早修正認知落差
  • 能當面溝通或畫圖描述都是很直接的幫助 => 用文字(件)不一定是最好的方法
又是一個一次讓兩個角色搞明白的遊戲(太強了)


Story是Delta,不是Baseline
透過Acceptance Test留下活文件



星期二, 12月 20, 2016

Install igbinary



  1. 安裝
    • 透過PECL
      pecl install igbinary
    • 透過Source Code
      1. 下載igbinary.tgz
        wget https://pecl.php.net/get/igbinary-2.0.0.tgz
        
      2. Install
        #1 以igbinary-2.0.0.tgz為例
        cd {install}/ 
        #安裝igbinary-2.0.0.tgz
        $ tar zxvf igbinary-2.0.0.tgz
        $ cd igbinary-2.0.0..tgz/
        $ phpize
        $ ./configure
        $ make && make install
        如果./configure出現 no acceptable C compiler found in $PATH 需安裝gcc
  2. 檢查是否有igbinary.so
    $ ll /usr/lib64/php/modules/ | grep igbinary.so  
    -rwxr-xr-x 1 root root 312644 Dec 20 07:40 igbinary.so
  3. 編輯將igbinary.ini
     $ vi /etc/php.d/igbinary.ini 
     ============= 我是分隔線 =================  
    ; Enable igbinary extension module 
     extension=igbinary.so 
     ; Enable or disable compacting of duplicate strings  
    ; The default is On.  igbinary.compact_strings=On 
     ; Use igbinary as session serializer 
     session.serialize_handler=igbinary 
     ; Use igbinary as APC serializer 
     apc.serializer=igbinary    # php7後,還沒試過
  4.  重新啟動apache
     $ service httpd restart 
     $ php -m | grep igbinary #檢查是否安裝成功 
     igbinary 
 Reference
  1. http://www.metod.si/how-to-install-igbinary-serializer-for-php/ 
  2. http://blog.csdn.net/zhangxinrun/article/details/16964819 
  3. http://www.cnblogs.com/cndavidwang/p/3335846.html 
  4. http://bensnotepad.com/install-igbinary-for-php5-on-ubuntu/

星期一, 12月 19, 2016

Docker用Redhat/Centos7 出現 Failed to get D-Bus connection

我的媽呀~~
裝好一堆套件,想restart一下httpd卻出現Failed to get D-Bus connection
請示google大神,有人說CentOS 7.2就可以了~ 但用了是有錯


  1. Container
    最後看到個解法
    必需要加上--privileged及/sbin/init
    sudo docker run --privileged -d centos /sbin/init  
    
    p.s /sbin/init也要哦~ 不然也沒用

    話說docker run --privileged 是啥
    看起來是讓container裡的root擁有真正的root權限
    一開始看不太懂,不過想一下LXC的觀念就能理解了~
  2. Dockerfile
    解了container,寫docerfile也遇到
    但dockerfile就不知怎麼給privileged! Dang it!

補充
利用--privileged及/sbin/init解後,container跑一陣子會出現agetty 100%
據說用這招就解了
systemctl stop getty@tty1.service; systemctl mask getty@tty1.service

Reference
https://github.com/moby/moby/issues/4040



星期二, 12月 06, 2016

Top 10 mistakes in handling website images and how to solve them

Reference: Top 10 mistakes in handling website images and how to solve them

挺不錯的整理,也把一些觀念一次釐清
還有說明做法~ 值得讀一下
以下簡述重點,詳細就看原作吧

  1. Wasteful browser-side resizing
    最好與指定的大小一樣大,不要靠browser自動縮放
  2. Unnecessarily high quality JPEGs
    85%與95% JPEG看起來不多,但前者17KB,後者要34KB 
  3. Incorrect image file types
    JPEG: 適用風景圖,只要15KB,PNG卻要110KB
    PNG: 適用圖表charts, logos,有留白的那種
    GIF: 小動畫
  4. Delivering non-optimized images
    PNG可適度壓縮,讓檔案小50%
  5. Forgetting to strip image meta-data
    meta-data可能夾太多無用資訊,可以清掉省空間。
  6. Delivering images straight from your servers
    透過CDN加速。
  7. Delivering static icons one by one
    小的icons應該併成大張圖一起交付。
  8. Using images when CSS3 can be used
    不要用圖做button的圓角或mouseover的效果,可以透過CSS達成。
  9. Incorrect image cache settings
    圖片幾乎不會變,也就是說cache不需失效,但如果真的會變,可以透過fingerprint改變,就是url加上version之類的字串。
  10. Using a single image size across all delivery mediums
    利用JavaScript判斷device的解淅度,再讀取適當大小的圖






星期六, 11月 19, 2016

[書]誰在團隊搞破壞



本來覺得是標題殺人法,所以沒什麼興趣看
不過隨意讀個兩頁就覺得好有趣
心想這不是在講我們嗎

每個做法都是現在組織真實遇到的問題
一定要分享給大家

破壞就在你身邊

團隊破壞的行為,在日常生活看似不影響,但卻殺傷力十足
在二戰就利用這戰術來從內部進行破壞瓦解敵營,還出書叫「簡單破壞實戰手冊」

八種戰術如下:
  1. 堅持每件事者必須經過正式管道請示,絕不允許為了迅速執行決策而抄捷徑。
  2. 發表演說,毫遲疑提出適當的愛國言論。一有機會就滔滔不絕、長篇大論,用冗長的故事與個人經驗來闡述重點。
  3. 盡可能把所有事都推給委員會,進一步研議與考量。並試圖壯大委員會,規模絕不少於五人。
  4. 抓到時機就馬上提出毫不相干的議題。
  5. 對訊息、會議記錄或決議的用字遣詞爭論不休。
  6. 重新提起上次會議中的決議,企圖對之前的決議是否明智進行翻案。
  7. 講道理,對要求團隊成員講導理。提倡謹慎,唯恐因倉促而造成日後的難堪與爭執。
  8. 擔心任何決策的正當性。質疑深思熟後的行動是否合手權限,是否會與某個更高階層的政策相抵觸。


頭頭是道,也沒理由反駁
上面戰術真不是我在說,每個說起來都頭頭是道,也沒理由反駁
最常遇到就是這未經驗證,要經由正式管道申報通過後才能使用
開個會要把所有相關的人找進來
在公司推個技術,但東卡西卡,我就放棄了...
最後就是沒有一個東西推的動...

不然就是搬出大絕招「 稽核」
這到時稽核會過不了... 都火在燒了,還管什麼程序!!!

換成職場就是以下幾招
  • 第1招 凡事都要問主管
  • 第2招 長篇大論話當年
  • 第3招 每次都說再討論
  • 第4招 東拉西扯沒重點
  • 第5招 斤斤計較幾個字
  • 第6招 決定之後又重來
  • 第7招 過度謹慎怕犯錯
  • 第8招 遲遲無法做決定
  • 新花招 信件副本所有人

(好順口,不得不說譯者翻得很認真)

書裡也有提到如何根除破壞,要建立以下階段
  • 辨識
    在破壞發生當下立刻發現,幫助他人看出正當行為何時越界、何時開發產生反效果或破壞性。
  • 校準
    建立對容忍的正確期望值,即可接受的行為範圍。如此一來,有助於生產的行為將受到鼓勵,而破壞就能夠事先預防。
  • 糾正
    給團隊裡的每個人許可,教他們表達方式與技巧,用有建設性的做法大聲譴責破壞行為。
  • 預防
    推行工具、標準與流程的變革,以防止破壞出現或重現,培養低破壞文化。

心得

我覺得要根除破壞太難了... 自己先得罪一堆人...
還是多送幾個這種人到對手公司,讓他們內耗,從內部破壞他們~
讓他們自爆!!!... 這樣我們就會活下來了...(誤)

星期六, 10月 29, 2016

特定資料夾下禁執行php

由於可以上傳檔案,所以就有可能被丟上php,或產生php script之類的檔案
最好的辦法就透過白名單的方法,只限定某些資料夾執行PHP的權限,再配合禁寫入PHP
用白名單比較安全,不過也比較難,有時還忘記開權限

所以反過來用黑名單來實做
將系統結構分成兩種
  • Ap Code //開放執行PHP
    放Ap相關的程式碼
  • Ap Data //禁止執行PHP
    操作系統產生的data, ex, log, cache, 上傳的檔案


透過.htaccess達成
以public資料夾當Ap Data

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>

<FilesMatch "(?<!^index)\.php$">
RemoveHandler .php .php3 .phtml
RemoveType .php .php3 .phtml
php_flag engine off
#php_admin_flag engine off
</FilesMatch>

如何轉換發言權,告別冷場

有些人就是很難聊,但有時就是想聽聽他的想法
我也沒還跟人聊,但無法度~ 現在要帶人
帶人要帶心,不知道team member的想法就不知道怎麼帶

記得以前有個同事
問他什麼他都只有兩種回答:「好」,「可以呀」
似乎是很隨和,但實在不知道他內心是否到底支持這個做法

之前去學了「引導」的課 - ORID
感覺就可以派上用場,讓對方能說出口

最近也看到一本提到「如何轉換發言權,告別冷場」 忘了是看哪本書了 哈哈
就記錄下來,讓自己練習一下


  • 鎖定目標
    挑一個此感興趣的問題。例如喜宴上談此認識新人的過程;研討或發表會上談對方正在做的研究
  • 真心稱讚
    喜歡哪某段對方說過的話,寫過的文章
    聽過朋友提過對方的事
  • 具體肯定
    具地說出喜歡對方的幾個優點或做過的事
  • 動機式提問
    如果希望對方多說一點,用「為什麼」來開頭。
    ex.當時為何想這麼做
  • 連結式提問
    串連兩人的關係,讓對方感覺到有關心對方的事,
    ex 我也試著這麼做,有何建議
  • 事件發展結果
    未來想怎麼做

傾聽的技巧

利用身體語言表達關心, SOLER

  • Squarely(面向對方)
    先暫停手邊的事,不然就變成單向溝通
  • Open(抓取開放的姿態)
    想像是一個杯子,接納對方想訴說的話
    雙手不要抱胸前,自然的放在膝蓋上
  • Lean(上半身向對方前傾)
  • Eye Contact
    適當注視對方,讓他感到受到關注和尊重
  • Relax
    保持身體輕鬆自然


技巧二:把自己當作鏡子,用簡短的回應引導對方說話

  • 不要急著想幫忙出主意
  • 傾聽者是要鼓勵對方多說,透過話語可以梳理糾結的思緒
  • 利用簡短的話語,讓對方順水推舟地繼續話題,協助他自己解決問題即可
  • 聽到問題後,提問對方覺得怎麼做比較好
  • 重點要讓對方感覺到
  • 同理:讓對方感受到試圖了解他的狀況和情緒
  • 支持:讓當事人覺得,不論他說什麼,你都願意在身邊陪伴他
  • 接觸:讓他更能和自己、和事件、甚至和情緒接觸。因為唯有面對它,情緒才能被抒解

星期六, 9月 03, 2016

[書]7個習慣教出優秀的孩子

與成功有約:高效能人士的七個習慣
  • 習慣一:主動積極
  • 習慣二:以終為始
    先設定目標、做好計畫。
  • 習慣三:要事第一
  • 習慣四:雙贏思維
  • 習慣五:知彼解已
  • 習慣六:統合綜效
    看重別人的長處,並努力向他們學習。團隊合作可以創造出比個人努力更婕的結果
  • 習慣七:不斷更新

七個習慣如何養成

七個習慣父母、老師、企業要什麼
習慣一至三(獨立)
主動積極
以終為始
要事第一
  • 目標設定
  • 規劃
  • 時間管理
  • 組織
主動自發
責任感
願景
誠信
習慣四至六(互賴)
雙贏思維
知彼解已
統合綜效
  • 衝突管理
  • 聆聽(同理心)
  • 表達能力
  • 問題解決
  • 心胸開放
  • 團隊合作
  • 尊重
  • 道德/進退應對
  • 誠實
  • 重視多元
習慣七(全人)
不斷更新
(照顧自己的身、腦、心、靈)
  • 身體強健
  • 社交能力
  • 腦力
  • 有趣

  • 情緒穩定度
  • 貢獻/意義
  • 學習動機






習慣低效能文化高效能文化How
1被動消極:喜歡找藉口,把錯誤歸咎於別人或制度,情緒不、習慣將注意力放在自己控制圈之外的事、等待別人來告訴自己該做什麼。主動積極:主動任事、勇於承擔、掌控自己的情緒、專注於自己可以控制的事情、不等別人開口就主動把事情做好。
共享式領導:每個人都是領導人,領導責任


2茫無目標:同仁缺乏願景與使命、沒有共同的目標,計畫隨時改變。以終為始:同仁共同追求有意義的願景、擁有明確的企業性目標及策略,每個人也有清晰的個人目標。
設定個人目標/部門目標,讓同仁自己學習定目標

3回應所有緊急事務:同仁持續回應各種危機。沒有時間規劃或培養人才、缺乏紀律。要事第一:專注於重要的事、勇於對於無緊要的事情說「不」。大家撥出時間做計畫、花時間在準備及預防的工作。排優先
4贏輸思維:同仁只想「我贏你輸」或乾脆雙輸,互信不足。大家爭搶資源、因為擔心別人超越自己而不分享經驗與做法。雙贏思維:同仁擁有雙贏思維、值得信賴,隨時在「勇氣」與「體諒」之間尋求平衡、想方設法讓同仁都受益。企業鼓勵合作及經驗分享。
5先求解己:大家不肯彼此聆聽,也覺得自己不被了解。同仁無視的感受,也不敢分享自己的感受及意見先求知彼:在提出解決方案之前,會先仔細了解問題。大家充分發揮同理心、不隨意評斷別人、可以自在表達自己的想法
6單打獨鬥:大家自掃門前雪或拉幫結派 ,訒為自己的想法永遠比別人好、不喜歡跟想法不同的人在一起。統合綜效:同事之間努力發掘彼此的想法、珍視多元思維、謙虛,大家喜歡團隊合作、創意無限、不怕跳出框架思考。把注意力放在別人的優點身上,就會發現對方的缺點似乎不見了
7保持駑鈍:同仁的專業技能過時,生活不平衡、忽視人際關係,而且有時彼此根本不熟悉、生活缺乏意義。不斷更新:大家一起不斷精進、努力與時俱進、活力充沛、享受家庭般的感覺。士氣高昂。

每個人都是天才。但如果你根據爬樹的能力來評斷一條魚,它將終其一生認定自己是個笨蛋。 愛因斯坦

變革行動為何失敗

關鍵在於找到「過少」或「過多」的平衡點

過少過多
缺乏非變不可的理由及目的目的、目標脫離現實
利害關係人不願改變變動太頻繁、花招太多
缺少強而有力的高層太依賴強勢的高層
請人上車的時間及功夫做得不足浪費太多時間於求得全體共識
缺乏策略策略過度瑣碎、賦權不足
步調太慢 - 熱情及動能流失推行步調太快,大家吃不消
合作不足 - 各唱各的調太強調合作,壓抑個人動能
對成果未給予足夠的認可及獎勵太早宣揚成果、誇張成效
當責及回饋不足追蹤考核過多,流於細節管理






星期四, 8月 18, 2016

Install PHP ImageMagick

下載
  • http://www.imagemagick.org/download/ //ex. ImageMagick-6.9.1-1.tar.gz 
  • http://pecl.php.net/get/imagick-3.1.2.tgz
  • http://prdownloads.sourceforge.net/optipng/optipng-0.7.5.tar.gz?download
  • http://www.lcdf.org/gifsicle/gifsicle-1.87.tar.gz
  • http://jpegclub.org/jpegcrop.tar.gz
  1. 將檔案放至/tmp/安裝
    /tmp/
  2. 安裝optipng-0.7.5.tar.gz(3th party)
    tar -zxvf optipng-0.7.5.tar.gz
    cd optipng-0.7.5
    ./configure
    make && make install
  3. 安裝gifsicle-1.87.tar.gz(3th party)
    tar -zxvf gifsicle-1.87.tar.gz
    cd gifsicle-1.87
    ./configure
    make && make install
  4. 安裝jpegcrop.tar.gz(若第6點imagick安裝失敗才需要安裝此步驟)
    tar -zxvf jpegcrop.tar.gz
    cd jpegcrop/jpeg-9a
    ./configure
    make libdir=/usr/lib64
    make libdir=/usr/lib64 install
  5. yum安裝相關lib
    yum install libjpeg libjpeg-devel libpng libpng-devel libtiff libtiff-devel
  6. 安裝ImageMagick-6.9.1- 1.tar.gz
    tar -zxvf ImageMagick-6.9.1- 1.tar.gz
    cd ImageMagick-6.9.1- 1
    ./configure --prefix=/usr/local/imagemagick --with-bzlib=yes --with-fontconfig=yes --with-freetype=yes --with-gslib=yes --with-gvc=yes --with-jpeg=yes --with-jp2=yes --with-png=yes --with-tiff=yes
    若出現「undefined reference to `jpeg_default_qtables'」
    表示第4步沒裝好,再重安裝試試

    make && make install
  7. 安裝imagick-3.1.2.tgz
    pecl install imagick-3.1.2.tgz

    安裝過程中請輸入:/usr/local/imagemagick
  8. 安裝完成後檢查/usr/lib64/php/modules是否有imagick.so
    ls /usr/lib64/php/modules/ | grep imagick.so
  9. 新增/etc/php.d/imagick.ini,內容如下:
    ; Enable imagick extension module

    extension=imagick.so
    確認extension=imagick.so是否有於/etc/php.ini定義過,若有請移除。
  10. 重新啟動
    service httpd restart
  11. 確認JPG, JPEG, PNG, PNG00, PNG24, PNG32, PNG48, PNG64,PNG8格式是否存在
    php -i | grep "ImageMagick supported formats"
    php -m | grep imagick
Thanks for the hard work~  Demo


星期四, 6月 02, 2016

[Coding Style] Train Wrecks

啥系Train Wrecks
字面上來看就是”火車事故” 或 “火車殘骸”
Train Wrecks

這裡是用來比喻以下的程式碥
滿常看到程式寫成這樣
這樣的程式很難理解,因為有4個objects需理解(ctxt+3個getXxx)
而這裡有三層,短短一行就得讀很久

那該怎麼寫呢

1.Split
閱讀者可以直接看到Class Type會比較容易閱讀些
不過也不是很好

2.寫成屬性呢
比function好一些,畢竟function還有logic,而property就單純些
不過會expose internal structure
所以也不是很建議

3.Hybrids
省略…看標題應該就懂了…

4.Hiding Structure
最好的方式,就是不要讓人想,所以細節直接包起來最快
直接在ctxt寫個function,不用看細節(這招真好,不虧是Uncle Bob)
p.s. 這裡小小的跳過一段,程式最終的用意是要取file path,再寫file,所以直接回給OutputStream


總結
過去就一直覺得Train Wrecks的寫法很難閱讀
幸好被大師指正,有理由可以不這樣寫了

Reference
唔... 我忘了...

星期四, 4月 14, 2016

第一次 的引導經驗

預先準備


  • 題目:開發流程自省會議
  • 目標:讓不同開發Team瞭解彼此的開發流程
  • 設定:每個人都有發言,對話有堆壘
  • ORID的問題內容
    • O
      • 開發過程有有什麼會議
      • 參與的角色
      • 會議時間
      • 有什麼產出
      • 會議用途、目標
    • R
      • 對於各種會議的感受
    • I
      • 為何感到XX,能具體說明嗎
      • 遭遇到什麼問題
      • 有什麼方法可以克服
    • D
      • 下次發生,會有什麼做法

成果


  • 大家有聽到不同的聲音
  • 對話也有堆疊,感覺不錯

好的地方


  • 連貫性的題目
  • 原本以為容易回答,反造成大家會等待說出該項目的成員持續回答後續問題
  • O的題目是要讓大家開口,當下有發現,趕緊換問法"有誰能說出更多xxx"
  • 讓每個人發言
  • 有1,2位也許因主管在而沒開口,除了直接指定外,最後請每個人分享心得,算有讓對方願意開口說
  • 改掉主持人式風格
    • 儘量以"大家覺得","誰能夠說明"或"還有人要補充",取代指名

改善


  • 聚焦與發散
  • 原寫下幾個提出的會議想聚焦,卻反而讓大家圍繞到白板上的題目
  • 也許是題目本身就太大

星期六, 3月 26, 2016

JavaScript Convention

JavaScript不應該四散在html裡
至少應寫成獨立的js

  1. html較小,能較快的呈現
  2. 雖然需另一個request取js,不過該js可被cache


三種類型的js檔
1. 3rd-party js
a. jQuery
2. Component.js
a. Untity.js
b. 自行開發
3. Local.js

原則上禁止寫js在html裡,不過某些例外還是方便簡單
1.寫在html tag裡比較方便

1. Close Window


2. Back to Previous Page


2.local.js 只有一小段
如果只有幾行… 就算了啦… ( 20行內)

Reference
Top 10 JavaScript Snippets for Common Tasks

不要挑最便宜的產品,要挑品質好一點的產品


購買東西時,通常會拿最便宜的就好,例如:捲筒廁紙
原本想說這東西不就拿來擦屁屁的,哪會有什麼差
本來沒注意,但有次去高檔餐廳上廁所
隨意撕就延著切線完美的撕下
但家裡的,每次撕都會殘留下一小段沒撕完整
這才發現怎麼差這麼多

「最低價」導向會造成惡性循環

挑最便宜的產品等於鼓勵廠商追求低成本
當然成本能低是好事,好一點廠商自我改善,降低營運成本,讓售價可以比市面更便宜
但就會有廠商會偷工減料,或是用差的原物料
更沒良心的就是用傷身的手法使成本更低(用化學藥劑等)

有良心的廠商成本比別人高,沒有獲利而倒閉
最後留下一群黑心廠商,繼續拚低價,更嘗試更可怕的手法

你們亞洲人命不值錢

上次聽在汽車製造業的朋友提到汽車安全係數問題
板金要厚,安全係數才會高,但相對會耗油
他們實在做不出安全係數高,又不耗油的汽車

因此找來日本某汽車 大廠的顧問,詢問究竟如何打造安全係數高又省油的車
顧問回答:「板金薄一點,就省油啦,安全係數低沒關係,反正你們亞洲人命不值錢」
朋友當下聽到有點生氣,怎麼這麼說話,但顧問繼續說:
「這是你們自己選擇的,你們只在意耗油,不在乎安全」

我是不知道朋友的反應,但自己是滿汗顏
因為我也會挑省油的,而這正是我們逼廠商要走的方向
是我們自己選擇的...

這東西太便宜了,是不是有問題呀...

公司附近有A, B兩間小吃店,兩間都有相同的一道湯-「蕃茄蔬菜湯」
A的價格較貴,料較少,湯頭也淡,且沒冷氣
而B的價格較便宜,料也多,且湯頭也好喝,還有冷氣!
請問你會挑哪一間的湯?

當然是B呀,CP較對高,而且有冷氣
但... 反過來想想... B的材料是不是有問題呀
那有每樣好的呀...

後來A沒營業了,雖然不知道跟生意有沒有關係
但總覺得怪怪的,我也不太敢跟B買湯喝

「品質」導向才能形成正向循環

最近有體會到,挑商品應注意「品質」
用品質好一點,是為了讓好的廠商留在市面上
這裡是說挑品質好一點,不是挑貴的
也許品質好一點會貴一些,但重點是讓好的廠商可以存活下來
而且這會是一個好的正向循環




星期日, 3月 20, 2016

JavaScript Convention - 全域變數篇

為Application建立一個全域物件
所有變數、函數都放置於底下
/* 最上層進入點 */
//全域物件
var APP = {};
 
 
//模組物件容器
APP.modules = {};
 
/* 各模組進入點 */
//ex. 商品詳細頁
APP.modules.productDetail = {};


加上防禦性
/* 最上層進入點 */
//全域物件
var APP = {};
 
//模組物件容器
APP.modules = {};
 
/* 各模組進入點 */
//ex. 商品詳細頁
var APP = APP || {};
APP.modules.productDetail = {};

證人初體驗

最近因朋友遇到些問題,被傳去當證人
雖然覺得照實回答即可,不過過程中對方律師會挖洞給你
造成自己前後回答的矛盾,我方的律師就說那故意設定的
事後想想真有感覺是中對方的圈套

寫一篇當心得,也好提醒自己要改進的地方

心得一:別緊張,放輕鬆
一緊張腦子一片空白,自己都不知道自己在說什麼

心得二:事前準備
事情經過如何,先想過,回答就很順口

心得三:不用加油添醋
有時為了強調會加點東西,但反而越講越不清楚,更造成自己前後矛盾
這次就是中這個計,對我方有利的點,就說了幾個,對方律師就刻意說"只"有這樣而已
很自然地多說了幾點,說出了對方期望我跳進去的洞,就提出證據說並沒有這一點

事實是什麼就是什麼,不用加油添醋

最後還是要再強調一次 --- 別緊張,放輕鬆!!!
事後再看對方提的證據,根本就跟我說的沒關係
是自己緊張到壓力大,就自亂陣腳了

在很多有衝突會議上也是,有時被嗆了幾句
壓力大到眼前一片黑,什麼東西也想不到
但事後回想到好方法回擊,但已經晚了幾個小時

技巧
最近看一本書「邏輯贏話術」學了幾個不錯的技巧
辯論前,有以下正面的想法(依情境不同),就能有效積極面對

  • 辯論
    • 我是來練習改進我的辯論技巧
    • 我會達成這一切
    • 不入虎穴、焉得虎子
    • 放棄奮鬥就等於失敗
  • 演溝(面對大眾)
    • 我要表現出自己最好的實力
    • 我很棒
    • 我很懷疑,這些聽眾是否真能聽得我的報告




星期一, 12月 21, 2015

Java Web Services and Security 課堂筆記



  • 過去有PRC, RMI, COMBO,不過都過時了
  • Base64會做Binary大1/3倍,300KB=>400KB
  • XML定義
    • Well-Formed XML
      • 有PI
      • 唯一root
      • 對應的tag
      • 大小寫有分
    • Validated XML(Valid XML)
      • DTD
      • XML Schema
  • 歷史
    • XML已式微,但有其功能
      • 交換資料可驗證
        • ex, 潤年 2015-02-29(不需AP判斷)
    • SOAP也式微,但
      • 電子簽章等
      • 自己寫也可以... 所以有點雞肋
  • 名詞
    • AP Server
      • Web Container
      • EJB Container
      • 實做Jave EE製定的規格
    • Tomcat只有web container及實做一點點Java EE的規格
  • 名詞
    • REpresentational Service
      • 可output各式的format, json, xml, csv, ...
  • Convention
    • db命名單數 tb_member
    • RESTFul複數 members
  • JSON定義
    • [ { a: 1 } ] , 不合法(但可用),最上層要加{ }
    • [ ]的Security Issue
    • javascript會呼叫array construction,而js允許亡寫array的constructor,駭客可透過此攻擊系統
    • 修改方法:利用{ }包起來