星期二, 2月 06, 2018

Golang Fibonacci Closure


A Tour of Go玩到Fibonacci closure exercise
被前一個範例影響,一直在想把值保留著
但fibonacci是前兩個項目值相加,所以累加沒用,也沒辦法再減前一項的值
想了好久,瞄了解答才瞭解要用「暫存值」

有了"提示"就比較好寫了 XD
package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    n := 0
    sum := 0
    x := 0
    y := 0
    return func() int{
        if n <= 1 {
            sum = n
        } else {
            sum = x + y
        }
        x = y 
        y = sum
        n++
        return sum
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

看解答的下方還有人回更簡單的回覆
真是太強了...

func fibonacci() func() int {
    x, y := 0, 1
    return func() int {
        x, y = y, x+y
        return y - x
    }
}
p.s 話說這個swap的寫法真方便


Reference
Exercise: Fibonacci closure
An answer of the exercise: Fibonacci closure on a tour of Go

星期一, 1月 29, 2018

Coding style guide


忘了從哪抄來的 XD
把自己常用的語言排前面
不過GO真的是不錯,存檔時就先排好,寫不對還不給你Compile
PHP我還得靠hook來做,新的語言就是不一樣

Style guide
Code change should conform to the programming style guide of the respective languages:

  • Go: https://github.com/golang/go/wiki/CodeReviewComments
  • PHP: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
  • Java: https://google.github.io/styleguide/javaguide.html
  • JavaScript: https://github.com/airbnb/javascript
  • Android: https://source.android.com/source/code-style.html
  • C#: https://msdn.microsoft.com/en-us/library/vstudio/ff926074.aspx
  • C++: https://google.github.io/styleguide/cppguide.html
  • Haskell: https://github.com/tibbe/haskell-style-guide/blob/master/haskell-style.md
  • Groovy: http://groovy-lang.org/style-guide.html
  • ObjC: https://github.com/NYTimes/objective-c-style-guide
  • Perl: http://perldoc.perl.org/perlstyle.html
  • Python: https://www.python.org/dev/peps/pep-0008/
  • Ruby: https://github.com/bbatsov/ruby-style-guide
  • Scala: http://docs.scala-lang.org/style/
  • Swift: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html
  • TypeScript: https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines

星期日, 1月 14, 2018

該來打地鼠了 GOGOGO

最近有認真讀了一下golang,感覺真的滿不錯的
針對現在的開發/佈署環境特性設計的,果然可以稱一下modern language

最吸引我的地方是套件及佈署的部份,因為這是我的痛點
在公司治理連年得名的地方,資安管理非常機車嚴謹!!!
NO YUM, NO FTP, NO INTERNET...
想像拔掉網路線把環境裝起來... 我是說真的(泣)

裝個PHP會裝起肖!!!
常遇到要裝1個rpm要抓30多個dependency packages
最近要升php 7... 真是瘋了!!!
p.s. 感謝有docker,雖然一樣得一個個rpm抓來裝,但已經方便多了

用java有好一點,只要把jar包進來就好,但maven一樣沒辦法直接抓
另外也被規定只能用jboss,對mircroservice而言不太適合
再者java開發挺花時間,要多寫很多code
以前沒感覺,接觸Coding Convention後,就真覺挺花時間的

還有還有~ compile花時間... 用慣PHP,再回來寫java就覺得開發很慢
如圖


抱怨了好多,快來看一下,只留自己想講的
其他看文章

Reference




  • Simple
  • 效能
  • 簡易的library管理
    Go 原生大多數的Library, 還沒真的拿來開發所以還沒遇過,但即使沒有,看起就像npm裝一下就好了
    沒有對外的網路,也是把library抓進來放就搞定
    這對我太重要了!!!
  • 易部署
    compile後,只有一個binary檔案,不用再zip有的沒的
    感覺沒什麼,不就是少寫一些deploy script!?
    嘖嘖!這可以大大減少維護成本呀!!!
    公司治理連年得獎的公司,上線一定還有Rollback plan,有時舊沒跑,真發生問題還不敢執行
    而且這種公司一定有分權限,寫script的人,跟實際執行的人一定不同人
    也就是說出錯了,懂的人看不到,看到的人不懂... 讓我死算了...

    而且而且
    Go把Code及library整個包進去,不同環境的Server不需要安裝套件就可以執行
    光這點就不知道為此付多少血淚,我可以擺脫rpm dependency hell了!!! (泣)
  • 更易用,更強大的執行緖 - Goroutines
    Goroutine就像輕量級的執行緒,但稱其為併發,效能都是原生級的,範例如下
    func main {
    go loop //併發,程式會繼續往下走
    }
    跟java寫thread比起來,還真的更簡單,嘖嘖
其他補充
  • 沒有Exception
    我一直推不要用error code來判斷,用try-catch
    try放happy path, exception就放exception,這樣程式碼很乾淨

    沒想到golang居然沒有!?
    一開始還滿難想像,也很難接受,本以為是一群怪咖對c狂熱導致
    仔細讀一下,似乎還滿有道理的
    作者認為try-catch-finally會導致convoluted code (不會翻譯,盤旋形的程式碼... 嗯 大概有抓到意思)

    最後直接比一下,似乎還真的比較"simple"
    
    //java 
    try {
    } catch (Exception ex)
    }
    
    
    //go
    if err != nil {
    // handle the error
    }

    如果有多個就用switch,替代多個exception也是夠
    
    if err != nil {
    switch err.(type) {
    case *ErrZeroDivision:
    fmt.Println(err.Error())
    default:
    fmt.Println("What the h* just happened?")
    }
    }
    不過敢拿出來嗆是因為go有multi-value returns,還真的挺方便的
    如下例算平方根,如果只能return數字,那靠throw exception會比較好接
    但如果可以分別回error及result,那就很好接了
    
    func Sqrt(f float64) (float64, error) {
        if f < 0 {
             return 0, errors.New("math: square root of negative number")     
        }     
        // implementation 
    }  
    
    f, err := Sqrt(-1) 
    if err != nil {     
        fmt.Println(err) 
    } 


    好像真有點被說服了...
    讓我想起一位前輩說,科技進步,有時會推翻像地球是平的那種不可能改變的想法

    Reference
  • No type hierarchy
    很多新觀念得再讀了

星期五, 12月 01, 2017

AWS Lambda Function Step by Step

Background

最近有個需求,因為要求全網站走https
但網站允許外站圖,因此沒辦法要求某些圖檔走http
原本在公司內做了轉抓圖直接回吐的程式,但因為從公司Server連外
因此得開Proxy,外站圖實在太多,沒辦法一一開通,也不太有道理全開
原本做法是在外網架個server跑,但Serverless service似乎更適合這需求
所以就找上AWS Lambda Function

在寫Serverless service過程,主要卡在觀念上,瞭解了就滿容易的
先從架構下手比較容易上手

應用架構

三個元件組成,如下圖

簡單來說,Lambda只是程式,
需API Gateway來處理http的request及response,
而Cloudwatch就可以monitor及看ap log,還可以設定dashboard及alarm

基本上只要寫好Lambda fucntion及設定Api Gateway就可以動了
那就開始吧~

1. Lambda function

  1. Create function
    剛開始先選樣版來練習(在Blueprint輸入hello)
  2. Config
    下一步填寫function name及role
    第一次建立會有role的問題,所以要先create new role
    選擇"Basic edge lambda"即可

    完成後,就可以看到hello的code,另外右上方有test
    可以設定測試案例


    1. 建立新的test case
    2. 系統已預算,直接created即可

    3. 測試


    沒問題就算完成了,再來就要設定Api Gateway


2. Setup Api Gateway
Api Gateway是來處理http request,再轉call lambda function
所以要設定相關的http request/response header及parameter
知道Api Gateway的定位,就容易設定了

  1. Create API
    找一下Api Gateway(1的部份),然後建立API(2的部份)


  2. 先從最簡單的get開始
    醜醜的動畫...

  3. 指定lambda function
    這個有好一點

    因為我的lambda設置在ap-northeast-1(不知道的話,就點回labmda function找一下)
    下方的function就會自己帶出來~
    這樣就完成了



  4. 測試一下
    click "TEST"


    再次click "TEST",右邊就是結果
    Response body是null,是因為原lambda function要帶參數,所以是回null


  5. Request/Response參數
    放另一篇,太多看起來挺煩的



3. Cloud Watch
  1. 看ap log
    進入CloudWatch Service, 點選"Logs",找對應的Log Group
    如下圖,所有AWS的log都會放在cloudwathch,所以要分group

    log會用時間序切開,這樣比較方便以時間點切入找log
    有時log沒這麼快出現,就點一下1的refresh圖示即可


    進入就可以看到lambda function記的log
    在1的部份,由於未帶參數,所以三個value都是undefind
    如果有帶的話,就會如2的部份

  2. 設定dashboard
  3. 設定alarm
    好歹出了問題要知道
== Cache設定 因為是認url,應該認到uri (含?後帶的參數),所以得在method裡選cache

星期四, 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