Total Pageviews

2015/09/10

[AngularJS] How to set CSS style conditionally

Requirement
We use ng-repeat directive instantiates a template once per item from a collection
Here is the code snippet:
1
2
3
4
5
6
7
<tbody data-ng-repeat="fms406v3 in fms406v3List" data-ng-form="formInTableRow" data-c-form-validation>
 <tr>
       <td class="text-left border-right"><span data-ng-bind="fms406v3.pdateWithDesc"></span></td>
       <td class="text-center border-right"><span data-ng-bind="fms406v3.rocWeekDate"></span></td>
    <!-- ignore .... -->
 </tr>
</tbody> 

Our requirement is to set each row's background color depends on the date is workday or weekend. If the date is workday, then set its background color to white. If the date is weekend, then set its background color to yellow.

How-To
Apply ngStyle directive set CSS style on an HTML element conditionally.

Here is the code snippet for JavaScript:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
//set row style: 假日底色顯示黃色;工作日底色顯示白色 
// 非工作日註記 (1: 休假日, 0: 工作日)
$scope.setRowStyle = function(noWorkInd){
    var rowStyle = null;
    if(noWorkInd == 0){ //工作日
        rowStyle = {'background-color' : 'white'};
    }else if(noWorkInd == 1){ //休假日
        rowStyle = {'background-color' : 'yellow'};
    }
    return rowStyle;
};

Here is the code snippet for HTML:

1
2
3
4
5
6
7
<tbody data-ng-repeat="fms406v3 in fms406v3List" data-ng-form="formInTableRow" data-c-form-validation>
  <tr data-ng-style="setRowStyle(fms406v3.noWorkInd)"  >
       <td class="text-left border-right"><span data-ng-bind="fms406v3.pdateWithDesc"></span></td>
       <td class="text-center border-right"><span data-ng-bind="fms406v3.rocWeekDate"></span></td>
    <!-- ignore .... -->
  </tr>
</tbody> 

Test :


REFERENCES
[1] https://docs.angularjs.org/api/ng/directive/ngStyle

2015/09/03

De Morgan's laws (笛摩根定律) in programming

在命題邏輯和邏輯代數中,De Morgan’s Law [笛摩根定律 (或稱德摩根定理) ] 是關於命題邏輯規律的一對法則。奧古斯塔斯·德摩根首先發現了在命題邏輯中存在著下面這些關係:

  • 非(P 且 Q)=(非 P)或(非 Q)
  • 非(P 或 Q)=(非 P)且(非 Q)

如果忘記什麼是笛摩根定律,可以來複習一下高中數學,高一下數學2-1B觀念08集合的笛摩根定律

在撰寫程式中,一定會在商業邏輯中使用很多if-else的條件式,若善用De Morgan’s Law將其改寫,能將boolean 表示式以更清晰的方式表達

如以下兩個寫法,採用De Morgan’s Law以後,可讀性大幅提昇
1
2
3
4
5
6
7
 // 原本的寫法
 if (!(file_exists && !is_proteced)) {
 }

 // 改採De Morgan’s Law的寫法:把not分配到各項,再反轉and / or
 if (!file_exists || is_proteced) {
 }


Reference
[1] https://www.junyiacademy.org/math-grade-10/root/permutations-and-combinations_a/logic-set-and-arithmetic-theory/v/ymrcargLHN8
[2] https://zh.wikipedia.org/wiki/%E5%BE%B7%E6%91%A9%E6%A0%B9%E5%AE%9A%E5%BE%8B

2015/09/02

[AngularJS] How to clear file input

Problem
After I select file and click reset button, but the file input value does not be cleared as expected.



Code snippet in HTML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<div class="row">
    <div class="col-sm-12">
        <div class="col-sm-6 ">
            <label class="control-label label-width-4 text-right">選擇檔案</label>
            <input id="attachment" name="attachment" type="file" class="form-control" 
                   data-ng-file-select="onSelect($files)" data-ng-model="attachment" 
                   style="width: 60%;">
        </div>
        <div class="col-sm-6 "></div>
    </div>
</div>


Code snippet in JavaScript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 $scope.onSelect = function($files) {
     $scope.attachment = $files[0].name;
     $scope.files = $files;
 };
 
 $scope.resetForm = function(){
    cAlerter.clear();
    
    $scope.dbm002eFormBean.impType = "";
    $scope.findImpTypes();
    $scope.dbm002eFormBean= $scope.dbm002eFormBean || {};
    $scope.dbm002eFormBean.updType = "0";
    
    $scope.attachment = null;
    $scope.files = null;               
 };


Solution
update resetForm Function:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
 $scope.resetForm = function(){
    cAlerter.clear();
    
    $scope.dbm002eFormBean.impType = "";
    $scope.findImpTypes();
    $scope.dbm002eFormBean= $scope.dbm002eFormBean || {};
    $scope.dbm002eFormBean.updType = "0";
    
    $scope.files = null;
    
    //find all file input and set value to null
    angular.forEach(
      angular.element("input[type='file']"),
         function(inputElem) {
           angular.element(inputElem).val(null);
    });
 };



Reference
[1] http://stackoverflow.com/questions/15079779/how-to-clear-a-file-input-from-angular-js

[閱讀筆記] 大杯星巴克比較划算


  1. 完全相同的商品卻以不同價格銷售的原因只有一個,就是所謂的transaction costs的不同,transaction costs 包含勞力、時間等
  2. 經濟學所說的arbitrage(套利),是指相同商品在同一時間以不同價格買賣,利用價差賺取利潤的交易,就是套利
  3. 在金融業者由於交易成本幾近零,只要在電腦前滑鼠點幾下,即能運作鉅額資金,買賣股票、外匯,故套利在金融業最常見
  4. 店家不用調降商品價格,藉由減少顧客的交易成本,也能吸引顧客上門。對店家而言,這種做法比單純降價促銷更有利
  5. 將店面設在客源絡繹不絕的區域非常重要,越多顧客上門,降價空間越大,也越容易在價格上取得優勢,進而拉大客流量的差距
  6. 競爭愈激烈的區域,愈能凸顯服務上的差異
  7. 將不同廠商的產品,一次運送到各門市的高效率做法,源自7-11,並逐漸擴展到其他領域。如載運朝日啤酒的卡車,從2007年開始順道載送可果美果汁,藉此削減物流成本、降低顧客的交易成本,讓顧客的時間使用更有效率
  8. 當生產規模擴大,每單位產品的生產成本下降,這種特性稱為規模經濟
  9. 平均成本 = (固定成本 / 生產數量) + 每單位產品的變動成本
  10. 必須投入鉅額固定成本進行技術開發、充實生產設備的家電產品,其平均成本(每單位產品的生產成本)隨生產數量擴大而降低,這就是規模經濟。然而,生產規模擴大的前提是產品能順利售出,當銷售量好,平均成本就會降低,產品售價便有調降空間,這就是正向循環
  11. 在規模經濟效益強烈的產業中,逼死競爭對手縮小生產規模甚至退出市場,盡可能獲取高市佔率,成為企業主要目標
  12. 家電用品是容易達成規模經濟效益的產品,產量越多,平均成本越低,因此製造商在生產時無不想盡辦法提昇市佔率
  13. 多數企業銷售商品或服務時採取的策略是:對於不在乎價格的顧客盡量抬高價格出售;相反的,對於只買便宜貨的顧客,則盡量壓低價格出售。這就是在經濟學上說的價格歧視或差別取價(price discrimination)
  14. 企業努力降低成本可以增加本身獲利,連消費者也會獲利。同樣的,降低交易成本也能達到相同效果,創造買賣雙方雙贏
  15. 企業最理想的訂價策略是:高價賣給不在乎價格的顧客,低價賣給只買便宜貨的顧客
  16. 企業原則上會將附加功能越多的產品,設定較昂貴的價格,以達到較高的獲利。實際上,附加功能較多的產品的成本不會比基本款多太多,故利潤較高。但是,對於商品功能在乎的顧客,還是願意買單
  17. 對於企業來說,針對願意付高價購買的顧客,推出附加多樣獨特功能款,並盡量設定高價位出售。至於只願意買便宜貨的顧客,則供應價格低廉的基本功能款
  18. 企業要想辦法開發獨特功能的產品,才能自由運用差別取價的手法。若只有具備基本功能的陽春產品,就容易陷入激烈競爭、流血戰爭
  19. 電信業者為了面對激烈的競爭,不得不降價應戰,但是不會全面調降各種不同用途的通話費用。比較聰明的作法是,只針對容易受降價刺激而增加通話頻率的情況調降費用(如比較常與情人、好友、家人通話的人);至於沒有其他替代方案,一定得使用行動電話通話的客戶,則盡量維持較昂貴的通話費用(如因為工作需要,需要把事情溝通清楚、交代妥當,不太有縮短通話時間餘地的人)
  20. 設法使別無其他替代方法的消費者付出高額費用,是企業進行差別定價時常見的作法
  21. 電信業複雜的資費系統,使消費者變更資費方案時,所需花費的交易成本提高,差別定價變得可行,行動電話業者的利潤因而提昇。由此可知,企業能否有效實施差別定價,關鍵在於消費者的交易成本。怕麻煩的人,容易成為差別定價的犧牲品,因為這類型的人不會想深入了解資費系統,選取對自己有利的資費方案。
  22. 咖啡經營者的首要之務是設法增加來客量。此外,還要提升每位客戶的單次來店消費金額,也就是所謂的來客單價。這是經營餐飲店最基本的手法
  23. 投入鉅額宣傳、廣告費,宣傳商品特色或價格等資訊,是為了降低消費者的資訊成本。而樹立品質優良企業的品牌形象,獲得消費者的信賴,也能有效降低消費者蒐集品質資訊所需花費的時間成本
  24. 若能將商品的附加價值做某種程度的分解,並分析、探討各個附加價值的意義,將可以從中看透很多經濟活動的本質
  25. 愈是擁有卓越銷售實力且採取大量進貨的店家,愈能以低廉價格進貨
  26. 購物時真正重要的是交易成本的考量,以及與其他商店的比價
  27. 對於金融交易商品,建議選購由自己進行交易、價格接近成本價(低手續費)的金融商品,至於低成本價但高手續費的金融商品則最好避開
  28. 高所得與低所得者之間形成嚴重落差,根本原因是有一種高所得者擁有特殊的社會地位(擁有卓越能力與投入大量時間的高所得者不再此類),這個特殊的社會地位本身就是一種資產,他不用擁有卓越的工作能力、不用投入很長的工作時間,就變成高所得者。故所得差距的絕大部分,在本質上屬於資產差距問題
  29. 縮小資產差距遠比縮小所得差距還困難得多。人們以各種形式持有或繼承資產,想要透過公平方法縮小差距實際上是不可能的。而社會大眾關注的所得差距問題,本質上大部分又因資產差距而引起。因此,貧富差距問題難以徹底解決
  30. 各方面能力俱優者,若有人在旁協助,工作效率會更高;各方面能力俱低者,一定要找到發揮個人優勢的工作
  31. 把工作交給具有比較優勢(機會成本低廉)的人負責,可以提昇整體效率。所以,工作能力強的人,不要把所有工作都攬在自己身上,請能力低於自己的人協助,可以更加提昇自己的工作效率
  32. 所謂真正的『賺錢能力』是由兩部分組成:一、從事為多數人謀利的工作,二、自己可以確實分得部分的利潤
  33. 具備這四種能力的人,若長期從事某一工作,也能從經驗中學習並提升專業能力,因此賺大錢:一、清楚自己會什麼、不會什麼,而且可以確實做好自己能力範圍內的事,富有責任感;二、能夠將心比心,站在對方的立場思考,設想各種不同狀況;三、做事有邏輯或富有熱情、誠意,具有一定程度的說明能力;四、不吝於向他人討教以避免犯錯
  34. Sunk cost (沈沒成本)是指原有價值已不復存在,在做新選擇時應果決的放棄掉
  35. 免費兒童醫療政策,一定會發生的事情是,等候的時間變長了,因為免費所以動不動就來醫院的人變多了。因為少子化,小兒科醫師變少,不會因為免費醫療政策讓小兒科醫生變多
  36. 免費的兒童醫療政策反而讓父母親的交易成本增加,因為看病的人變多、等候時間變長,為了避開人潮可能還要特地請假帶小孩來看病。如此昂貴的交易成本,與少子化的政策目標背道而馳
  37. 油價和金價是許多商品價格的代表性指標,油價高漲也會波及金屬價格,甚至連胡椒價格也受到影響,因為農民停種胡椒,改種其他農作物或改採錫謀生
  38. 日本燒肉店食物美味且價格合理的秘密,在於可以便宜進貨。進貨秘訣在於購入一整頭牛。一次購買一整頭牛,處理起來很花功夫,但卻能物盡其用,毫不浪費,既能在店裡推出價格低廉又安全衛生的良質燒肉,而且能確實獲得少數頂級肉部位
  39. 超市食品賣場也採取類似傢俱展示間的銷售手法。亦即將特定料理的材料如蔬菜、相關的加工食品和調味料等,全部擺在同一貨架,為客戶獻策同時,也默默在銷售,此做法稱為交叉陳列(cross-merchandising),已有越來越多毋需透過降價,營業額便快速成長的成功案例
  40. 店家發現消費者期望省下的功夫,並代為達成,大幅降低顧客的交易成本,藉此期望吸引更多客人上門,這是服務業的基本做法


2015/09/01

[閱讀筆記] The Intelligent Investor (Part 1)


  1. 股票市場是一個鐘擺,擺向無可救藥的樂觀主義者與毫無判斷能力的悲觀主義者。智慧型投資人,會把股票賣給樂觀主義者,向悲觀主義者買股票
  2. 控制好你的margin of safety (安全邊際),不要追高、不要被興奮的市場情緒所影響,藉此降低你犯錯的次數
  3. 在投資的世界,耐性與勇氣是必須具備的,不要受到他人而影響你的決定
  4. 熊市測試投資人的耐性,牛市測試投資人的紀律
  5. 企業的實質成長,並不會總是反映到股價,提供顯著的利潤給投資人
  6. 牛市的結束不是壞消息,隨著熊市的到來,股價會按照市場機制下滑、修正到其合理的價位,這時就是你建立財富的好時機。你應該要歡迎熊市,在牛市時戒慎恐懼
  7. Graham建議投資人應該同時投資股市與債券,最簡單的比例是各50%,如果嗅到市場有危險的味道,建議股市與債券的比率調整為25%與75%;若是覺得前景大好,建議股市與債券的比率調整為75%與25%的配置
  8. 你無法預測與控制市場的行為,但是你可以預測與控制你的行為
  9. 債券的價格與利率息息相關,彼此呈現負相關
  10. 投資股票三要素:購買前必須分析這家公司與其業務,瞭解其合理價值;訂定安全邊際,保護自己避免遭受鉅額損失;追求適當的績效
  11. 投資是在幫你自己賺錢,投機是在幫你的券商賺錢
  12. 對於智慧型投資來說,不會因為股價下跌而急著賣出股票,他們會先看這家公司的真實價值是否已經改變
  13. 在股票市場,無法用過去的績效來預測未來。一家公司未來的股價漲跌,端視其未來經營的好壞,與過去的資料、數字無關
  14. 雖然說投機是人類自然的天性,Graham提醒:當你是在投機的時候就不要迷惑自己是在投資、投機是一個非常危險的行為、嚴格控制投入的上限是你的投資資本的10%並做好停損
  15. 相較於bond,stock的風險較高,但是遇到大規模的inflation時,stock受影響的程度會較少一點,故記得檢視你的投資組合,stock與bond都要同時投資
  16. 智慧型投資者應避免直接購買黃金,因為其既無法有效對抗通膨,每年還要被收取保管費。不如購買專攻貴重金屬公司的共同基金,但是頂多佔你的投資金額2%就好
  17. 在deflation期間,借方會比貸方有優勢,這也是為什麼投資人在其投資組合中,應該要持有bond來對抗deflation
  18. 投資人常忽略inflation的影響,你賺的錢要減去infation,才是真正獲得的
  19. 當 inflation 為負數的時候,會被稱之為 deflation。 deflation意味著價格下跌,聽起來好像不錯,但是看看日本從1989年以來的例子,deflation 會造成房地產與股市連年下跌
  20. 溫和的 inflation,會使商品價格與所得同步溫和上漲,但是若是遇到劇烈的 infation,將會嚴重影響人民的購買力,並壓抑國家經濟活動力
  21. 依據歷史經驗,若是發生嚴重 inflation/deflation 的時候,股市的表現都至少損失10%以上,所以買股並不是對抗 inflation/deflation 的萬靈丹
  22. 為了有效對抗 inflation,除了擁有股票以外,你應該還要擁有REITs (Real Estate Investment Trust, 不動產投資信託) 與TIPS (通漲保值債券,即美國政府債券)
  23. 相較於投資REIT fund,若你直接購買房子,其對抗 inflation 的效果會更強大,因為你是直接擁有不動產的所有權
  24. 在現實世界,股票的績效並非一定可以贏過債券,有時候反而會比債券差
  25. 任何投資的價值,端視你當初花多少錢買入。一家企業能賺的錢是有限的,投資人對於要花多少錢來買這家企業的股票也是有限的
  26. 當股票市場的投資者越是狂熱看好,就會越確定最終他們會是錯的
  27. 影響股市表現的三要素:公司業績的成長、通膨率、投資大眾的投資
  28. 在股票市場所做的預測,絕大多數都會出乎你意料之外
  29. 對於保守型的投資人來說,Graham建議,在你的投資組合中,股票與債券各投資50%
  30. 投資人應該避開高收益債券 (high-yield bond),因為其違約風險高



2015/08/24

[iReport] Custom Format

Problem
The original setting interest-related column in this report is as follows:

The value of interest-related column's show 5 decimal places:

But the foregoing report does not meet user's requirement. The digits to the right of the decimal point in a number determined by the data. If the value is 0.55000, show 0.55; if the value is 0.62690, show 0.6269. The correct report is as following:


Solution
Use custom format instead. The configuration is as bellows: 

2015/08/21

一家公司手上應該有多少現金才夠

一家公司手上應該有多少現金才夠?

為什麼這個問題會重要?
因為若市場發生劇烈變化,很可能會因為手上現金不夠,導致無法度過難關,公司因此倒閉

Graham於Security Analysis一書中有提到兩個原則
1. 流動資產至少是流動負債的兩倍
2. 流動資產扣除庫存後,至少要等於流動負債,超過越多越好

以台股為例,我們針對台灣50成分股,依據EPS由高到低,找出最賺錢的前十大的公司如下 (包含股價、EPS、本益比):

接下來到 http://goodinfo.tw/ 找出這十家公司的流動資產與流動負債


上述十家公司的流動資產、流動負債以及流動資產與負債比如下:

由上表可以得知,可成、台積電與鴻準這三家公司有滿足第一個條件。
一般說來,比率越高,代表企業資產的變現能力越強,短期償債能力也越強;反之則弱。

接下來,一樣到 http://goodinfo.tw/ 查詢存貨資訊


上述十家的庫存以及流動資產減去庫存、流動負債後的資訊如下:

從以上表格中的數字可以得知,除了其中兩家以外,都有符合第二個條件

綜合兩個條件來看,以財務健康程度來說,以可成、台積電與鴻準這三家公司最健康,其變現能力與短期償債能力都是最強的


Reference
[1] http://goodinfo.tw/
[2] http://www.fivedream.com/page1.aspx?no=221266&step=1&newsno=36291

2015/08/17

[Oracle] LISTAGG cannot handle NVARCHAR2

Problem
Assume this following SQL statement will get agency name
1
2
3
4
SELECT age, agency
FROM ave011fa
WHERE fyr='104'
AND age IN ('0240005', '0000000', '2971021');

The search result is as bellows:

If we would like to concatenate multiple agencies into one row, we need to make good use of LISTAGG function.

Therefore, the SQL statement will modify as following:
1
2
3
4
5
6
SELECT fyr,
       LISTAGG(AGENCY, ';') WITHIN GROUP (ORDER BY fyr) AGENCY
FROM ave011fa
WHERE fyr='104'
AND age IN ('0240005', '0000000', '2971021')
GROUP BY fyr;


But the agency name's characters are broken

Solution
Owing to agency column's data type is NVARCHAR2, LISTAGG function cannot handle NVARCHAR2 properly

So you need to cast agency to a char to fix this problem

1
2
3
4
5
6
SELECT fyr,
        LISTAGG(TO_CHAR(AGENCY), ';') WITHIN GROUP (ORDER BY fyr) AGENCY
FROM ave011fa
WHERE fyr='104'
AND age IN ('0240005', '0000000', '2971021')
GROUP BY fyr

Then we can get the expected result:


Reference
[1] http://stackoverflow.com/questions/15304648/oracle-sql-developer-3-1-07-extra-spaces-between-characters-using-listagg
[2] http://www.techonthenet.com/oracle/functions/listagg.php

2015/08/16

[Programming] 提高控制流程可讀性

最近閱讀了易讀程式之美一書,在提高控制流程可讀性此章節提到幾個重點

  1. 在使用if-else判斷式時,先處理肯定條件;先處理簡單的情況,必較能在畫面中同時呈現if與else區塊,在閱讀上很有幫助;先處理比較有趣或明顯的情況
  2. 縮短其他人理解程式所需的時間,比減少程式碼行數來得重要
  3. 只有在最簡單的情況下使用三元運算子(ternary operator),複雜的情況還是盡量使用if / else
  4. 避免使用do / while loop
  5. C++的創造者Bjarne Stroustrup說,在我的個人經驗裡,do / while 敘述經常是錯誤與誤解的來源,我寧願把條件式列在最前面,總而言之,我會盡量避免使用do / while 敘述
  6. 修改程式碼時要以全新的角度審視,退一步以整體的角度考慮程式碼
  7. 盡量消除loop中的巢狀結構,因為巢狀結構可讀性較差


Example1. 如果是很簡單的情況,用ternary operator是ok的
1
timeStr += (hour >= 12) ? "pm" : "am";

若是遇到較複雜的狀況,如下:
1
int result = exponent >= 0 ? mantissa * (1 << exponent) : mantissa * (1 << -exponent);

則建議將上述的表示方式改用if-else的方式表達
1
2
3
4
5
if (exponent >= 0) {
 result = mantissa * (1 << exponent);
} else {
 result = mantissa * (1 << -exponent);
}


Example2. 盡量避免用do-while

如原本為do-while的表示方式
1
2
3
4
5
int sum = 0;
int count = 1;
do {
    sum += count++;
} while (count <= 10);

除非有什麼特別原因,盡量改成while-loop
1
2
3
4
int sum = 0, count = 1;
while (count <= 10) {
 sum += count++;
}









2015/08/13

Promises in AngularJS

Problem
We would like to update the value which be marked by red rectangle in the following screenshot:


The value will be updated from 20 to 30:



After clicked save button, it will do search at once. The value seems does not be updated successfully, because the search result does not show the up-to-date value :

But as I click search button again, it show correct value.


original JavaScript code:
$scope.save = function(){            
    //do save
    fms426qService.save($scope.fms426qUpdateGridData);
    //do query
    $scope.query();
};


Solution
The root cause is the Javascript code had executed query before it finish its save action. Hence, you should make sure do query after save.

You can use Promises in AngularJS. The most powerful features of promises is the ability to chain them together. This allows the data to flow through the chain and be manipulated and mutated at each step. 

Therefore, you should update JavaScript code as bellows::
$scope.save = function(){            
    //do save
    fms426qService.save($scope.fms426qUpdateGridData).then(function(response) {
        //do query after save
        $scope.query();
    });
};


Reference
[1] http://andyshora.com/promises-angularjs-explained-as-cartoon.html
[2] https://thinkster.io/a-better-way-to-learn-angularjs/promises