2011年5月31日 星期二

[C++] Iterator Patterns 例子

Autostart registry entries: contains values used to load applications when Windows is started.

Example: TROJ_DASMIN.C 在 HKLM\Software\Microsoft\Windows\CurrentVersion\Run 寫入 MSConfigr = "%System%\JDBGMRG.EXE" 和 VirusCheckII = "%System%\AVIRCHK.EXE",因此每次系統啟動時,TROJ_DASMIN.C 就會被執行。

怎麼找出這些威脅呢?當然就是列舉所有的 autostart registry entries。這讓我想到 iterator patterns: provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. [GoF]

有想法之後,該怎麼用 C++ 實做出來呢?首先先偷 [chrome]/trunk/src/base/win/registry.h,稍微修改一下,接著寫自己的 autostart_reg_iterator.h:
// The author disclaims copyright to this source code.

#ifndef MODULE_AUTOSTART_REG_ITERATOR_H_
#define MODULE_AUTOSTART_REG_ITERATOR_H_
#pragma once

#include <windows.h>

#include "base/basictypes.h"

#include <vector>

namespace base {
namespace win {
class RegValueIterator;
}
}

namespace module {

// Iterates the autostart entries.
class AutostartRegIterator {
public:
AutostartRegIterator();

~AutostartRegIterator();

DWORD ValueCount() const;

// True while the iterator is valid.
bool Valid() const;

// Advances to the next entry.
void Next();

const wchar_t* Key() const;
const wchar_t* Name() const;
const wchar_t* Value() const;
DWORD ValueSize() const;
DWORD Type() const;

private:
// All iterators of autostart registry iterator.
std::vector<base::win::RegValueIterator*> iterators_;

// Current index of iterators.
int index_;

DISALLOW_COPY_AND_ASSIGN(AutostartRegIterator);
};

} // namespace module

#endif // MODULE_AUTOSTART_REG_ITERATOR_H_
底下是 .cc 檔:
// The author disclaims copyright to this source code.

#include "module/autostart_reg_iterator.h"

#include "module/reg_value_iterator_factory.h"
#include "base/win/reg.h"

namespace module {

using base::win::RegValueIterator;

const wchar_t* kAutostartRegKey[] = { ... };

AutostartRegIterator::AutostartRegIterator() {
RegValueIteratorFactory factory;
for (int i = 0; i != arraysize(kAutostartRegKey); ++i) {
iterators_.push_back(factory.Create(kAutostartRegKey[i]));
}
index_ = iterators_.size() - 1;
}

AutostartRegIterator::~AutostartRegIterator() {
for (int i = 0; i != arraysize(kAutostartRegKey); ++i) {
delete iterators_.at(i);
}
iterators_.clear();
}

DWORD AutostartRegIterator::ValueCount() const {
DWORD count = 0;
for (int i = 0; i != arraysize(kAutostartRegKey); ++i) {
count += iterators_.at(i)->ValueCount();
}
return count;
}

bool AutostartRegIterator::Valid() const {
return index_ > 0 || iterators_.at(0)->Valid();
}

void AutostartRegIterator::Next() {
if (index_ > 0 && !iterators_.at(index_)->Valid()) {
--index_;
} else {
iterators_.at(index_)->Next();
}
}

const wchar_t* AutostartRegIterator::Key() const {
return kAutostartRegKey[index_];
}

const wchar_t* AutostartRegIterator::Name() const {
return iterators_.at(index_)->Name();
}

const wchar_t* AutostartRegIterator::Value() const {
return iterators_.at(index_)->Value();
}

DWORD AutostartRegIterator::ValueSize() const {
return iterators_.at(index_)->ValueSize();
}

DWORD AutostartRegIterator::Type() const {
return iterators_.at(index_)->Type();
}

} // namespace module
有些細節就略過了,重點就是如何用大的 iterator 包住小的 base::win::RegValueIterator iterators,如何實做 multiple traversals of aggregate objects。

2011年5月29日 星期日

[C#] Access is denied - 除錯心得

NET stack trace:
System.ComponentModel.Win32Exception: Access is denied
at System.Diagnostics.NtProcessManager.GetModuleInfos(
Int32 processId, Boolean firstModuleOnly)
at System.Diagnostics.NtProcessManager.GetFirstModuleInfo(
Int32 processId)
at System.Diagnostics.Process.get_MainModule()

My code snippet:
  process.Kill();
process.WaitForExit();
logger.Info(process.MainModule.FileName + " is killed.");

發現問題了嗎?The Kill() method executes asynchronously. After calling the Kill() method, call the WaitForExit() method to wait for the process to exit. 所以問題出在第三行: process.MainModule.FileName. 當 process 死掉之後,.NET 的 Process object 也會一起死掉。

因此正確的 code snippet 是:
  String process_filename = process.MainModule.FileName;
process.Kill();
process.WaitForExit();
logger.Info(process_filename + " is killed.");

這樣就能解決 Access is denied 的問題。

朝聖面天山、向天山、向天池

陽明山國家公園介紹:
面天山是大屯山的寄生火山,渾圓獨立的山形,面對寬闊的海洋。登頂後可觀賞270度的大視野景觀,從金山、三芝、淡水河出海口、觀音山、關渡、社子島至圓山,盡可一覽無遺,令人不禁有登高山而小天下的感覺。

向天池位處大屯山系西麓,為國家公園內現存較為完整火山口之一,每逢大雨過後積水成池,周遭林相完整,幽邈景觀,令人心曠神怡,池水因地層之裂縫僅可維持三至四天,卻孕育著少見的豐年蝦的生態。

PM3:45 從二子坪遊客服務中心出發,準備朝聖面天山、向天山及向天池,雖然昨天下雨,但二子坪步道並不難走,不一會兒就走到面天山登山口。石階並不好走,千萬不要踩青苔,超滑的。

PM4:45 至面天山,面天山頂有兩片醜醜的板子

休息片刻後,繼行向天山,無感路過。

PM5:20 至向天池。在附近發現藍天隊的指示牌。依指示試走一段路,感覺還不錯,下次可以走走看。雨後的向天池滿是淚水,黃昏夕陽讓火山口睜不開眼睛,漂亮極了,真希望太陽不要下山。

今天朝聖之旅頗為順利,這得感謝山神的庇佑,謝謝山神。

其他:
  • 山徑:二子坪遊客服務中心 → 二子坪休憩區 → 面天山登山口 → 面天山(▲H977M) → 向天山(▲H950M) → 向天池 → 二子坪休憩區 (路過面天山登山口) → 二子坪遊客服務中心
  • 朝聖記錄照片。iPhone 3GS 照的並不好看,大家請忍耐,我準備買 GF2 拯救大家的眼睛。
  • 費時:3hrs
  • 天雨路滑,請放慢腳步。

巴菲特指標 (2011.5.29)


國民所得統計摘要(100年5月更新)最新數據:99年 (r) 國民生產毛額 GNP = 14,020,591 (百萬元)。

巴菲特指標 = 167%。

右圖為趨勢變化,顯然股票還不夠便宜,只好慢慢等下去。

然後分享一個房地產的八卦 (來自帥過頭的八卦):其實,黃○○被報料111間之後到今天已兩個月了,手上只剩下約10間,我看到月底可能只有五間。包子店他是不買了,目前停業中。

這代表什麼?好好想想吧!

2011年5月28日 星期六

朝聖天母古道

天母古道親山步道穿越士林華岡地區的西北山坡,也是紗帽山南邊的鞍部,屬於早年魚路古道的後段,涵蓋華岡至天母間的數條步道,沿著大水管構築,潺潺溪水、原始林相,步行其間,讓人倍覺涼爽舒適。(臺北市政府產業發展局)

1930年間水管上陸續鋪設石板和水泥作為保護,水管路就因此而形成,水管路與步道在天母地區因山勢漸緩才分道揚鑣。目前步道入口處的三角埔發電廠是步道的起點,也是水管路的終點。(台北旅遊網)

我的路線是:中山北路七段232巷 → 天母古道入口大水管繞山腰 → 天母古道文大山仔后登山口

其他:
  • 漏掉翠峰瀑布及紗帽山。翠峰瀑布無標示,紗帽山找不到登山口。(朝聖方式:告示牌右往文化大學,取左往紗帽路方向續行,遇叉路取左小路往國家公園遊客中心,磺溪前叉路右可前往國家公園遊客中心,直行過溪、上石梯後接陽投公路,取左行下坡約300公尺右方為紗帽山登山口)
  • 舊登山口照片,千萬不要看舊照片找天母古道登山口。
  • 來回 3hrs (包括找紗帽山登山口時間),雨天石頭很滑,下山請放慢腳步。

2011年5月27日 星期五

山坡地住宅社區

1. 被點名社區 (來源是公文,公文不一定正確)

被點名的社區有瑞士山莊、綠野山坡、迎旭山莊、老爺山莊、凱旋大地玫瑰花園城堡、大千豪景、大地世紀、觀天下、大台北華城、鳳凰城、捷運森林、花園新城、萊茵山水、馥記大名人、湖山新城、薄荷公寓大廈、大慶四海名門、華克山莊、三峽傳奇社區、白雞山莊、薇多綠雅別墅、吉星山水園社區、關渡海悅大廈、國家藝術庭園、聖彼德堡、台北瑞士琉森社區、歌德花園、喜林莊智慧別墅、名人山莊、潤泰淡江生活大師、海誓山盟、常春藤社區。只是被點名,不要太緊張。

2. 應對方式

帥過頭說的很好:怕就別買

3. 其他事項
  • 台北都會區迄今仍有大型社區無自來水可用。新店市花園新城、湖山新城及汐止汐萬路山區的瑞士山莊、天外天大廈等,共約兩千一百戶居民長期沒有自來水可用,只能用簡易管線抽取溪水,若遇枯水期,居民就要花錢請水車載水,居民抱怨不已。這些社區早年推案時屬於「無自來水地區」,由於鋪設自來水管線、加壓站,須居民出錢購買私人用地的接管權,住戶不願負擔,自來水問題因而遲遲未解決。

  • 名人雲集的大台北華城社區及華潭路居民,交通尖峰時段開車由華城路到山下的安康路口,短短1公里路程竟要花25分鐘,嚴重影響沿線3萬多名住戶。

  • 木柵路二段109巷周邊觀星台北、敦南莊子、成家傳奇、南方桃花源、幸福等社區計1345戶,因過去管線品質差,長期大量漏水,有侵蝕地基疑慮。(請特別留意順向坡敏感區的山坡地住宅)

2011年5月26日 星期四

公司分析 - 萬寶週刊推薦

1. 萬寶週刊推薦理由:
新增 PVC 年產能 30萬噸 Q3 正式投產,成為 DOP 上下游一貫廠,營收年成長逾 20%。加上 Q3 DOP、PVC 價格看漲,有利毛利率提升。

2. K:
K = 9.13%,合理價位 14.2~21.3。

3. ROE:


很難分析。此外,民99大幅現金增資(!),依然不能阻止流動比率與速動比率下滑,若看絕對數字,Q1 速動比率 = 86.24% < 1,這表示公司存貨部位不低。若 DOP、PVC 價格不漲反跌,對公司營運會有不利的影響。此外,存貨過高也可能是下游市場需求轉弱前之警訊。

4. 營收分析:
民99年11月的時候,3月平均線從高峰往下,且跌破12月平均線,12月平均線上升仰角開始轉為下降,趨勢也出現與3月平均線同樣的下滑現象。操作策略:「出清」。

5. 現金流量表:
民99年出現重大變化。

結論:雖然 K 還不錯,但 ROE 無法令人放心,營收也不盡理想。

2011年5月25日 星期三

「別在乎薪水」之我的看法

我先提 Joseph Stiglitz 的看法.

Shapiro-Stiglitz model
  1. Unlike other forms of capital, humans can choose their level of effort.
  2. It is costly for firms to determine how much effort workers are exerting.

If the demand for labor falls, this lowers wages. But because wages have fallen, the probability of 'shirking' (workers not exerting effort) has risen. If employment levels are to be maintained, through a sufficient lowering of wages, workers will be less productive than before through the shirking effect.

我的看法就是 Joseph Stiglitz 的看法。台灣勞工薪資低,剛好印證低競爭力的現象。

2011年5月24日 星期二

西語自編對話

C - ¿Qué desea?
E - Deseo información sobre los cursos de Taiwanés.
C - Pero usted ya está en Taiwán.
E - Hablo muy poco. Estudio medicina en Taipei y practico en Kaohsiung, por eso necesito perfeccionar el idioma.
C - ¿Hablan Taiwanés los señores de Kaohsiung?
E - Sí. Deseo hablar Taiwanés.
C - Esto es todo. Firme aquí. Muchas gracias.

(C = Conserje. E = Estudiante)

2011年5月21日 星期六

朝聖塔曼山

塔曼山 2130M,位於新北市烏來區與桃園縣復興鄉交界處,為新北市最高峰。

進入塔曼山要辦乙種入山證,這可是我第一次進派出所,可惜值勤員警沒爬過塔曼山,沒辦法分享爬塔曼山的經驗。下午的警察是原住民,一開口就說「陡坡不好爬吧」,果然是行家。

塔曼山有三個登山口:大水塔、達觀亭、福巴越嶺古道。大水塔最好走,福巴越嶺古道最難走。我選到最難走的路。福巴越嶺古道很好走,但往三叉口的獵徑不好走。獵徑很小條,路旁的植物又高又密,得撥開植物找路(小心植物有刺)。此外,獵徑很多岔路,要仔細看路條免得迷路。

其實我想從達觀亭上塔曼山,但實在找不到路,只好走福巴越嶺古道接獵徑。福巴越嶺古道總長17km,將來有機會再來朝聖。

經過一番努力,終於爬到塔曼山山頂,新北市最高峰讚啦!下山改走達觀亭路線,獵徑體驗一次就夠了。下山除了滑倒一次外,沒有特殊狀況 (抽筋、受傷) 發生,這一切都要感謝山神的保佑!

摘要:
  • 照片:2011.5.21_塔曼山
  • 費時:上山四小時,下山兩小時。
  • 山徑:拉拉山神木 → 福巴越嶺古道 → 獵徑 → 三叉口 → 塔曼山 (休息十分鐘) → 三叉口 → 達觀亭
  • 騎車路線:省3 → 省7乙 → 省7 (到復興鄉的時候,務必把油加滿。北橫路況不佳,請小心慢行) → 桃116 → 巴陵派出所 → 拉拉山神木 (水泥道路非常難騎) → 拉拉山生態教育館
  • 如何辦入山證:準備身份證件,到巴陵派出所 (在上巴陵) 當場辦就可以了。

2011年5月19日 星期四

某公司債流標

事實: 公司債5年、7年和10年,利率分別為1.43%、1.66%和1.82%。

結論: 流標。

理由可能是全球處於升息趨勢中,買方認為利率太低。壽險業者不像笨蛋,投資比較保守,他們的看法很有意思。此外,中共多次調升存款準備率和存貸款利率,感覺毛毛的。個人認為某公司合理價位在 41.1 - 61.6 之間,超過都算買貴了。

此外,今天台股看到大盤委賣張數大於委買張數,委賣筆數大於委買筆數,這代表什麼意思呢?我不知道,靜靜看市場變化吧。

2011年5月18日 星期三

[C/C++] RansomWar.c 介紹

Link: eof-project.net (可能不安全)

Ransomware is computer malware which holds a computer system, or the data it contains, hostage against its user by demanding a ransom for its restoration. (wiki: Ransomware (malware))

Functions:
  • DWORD WINAPI MsgToUser(LPVOID Data)
    • 利用 GetSystemDirectory(), WriteFile() 寫檔。
    • 利用 ShellExecute() Win32 API 開檔。
  • void Encrypt_File(char *filename)
    • 用 blowfish encryption 加密 (找不到 blowfish.c)
    • 利用 CreateFile(), GetFileSize(), SetFilePointer(), WriteFile(), MoveFile() 操作檔案
    • Append RANSOMED_EXT to each encrypted file.
    • More sophisticated ransomware may hybrid-encrypt the victim's plaintext with a random symmetric key and a fixed public key.
    • The malware author is the only party that knows the needed private decryption key. The author who carries out this cryptoviral extortion attack offers to recover the symmetric key for a fee.
  • void S3arch(char *pt)
    • 利用 FindFirstFile(), FindNextFile() 找出所有非 dll, exe, ini, vxd, drv 的檔案來加密
    • Recursive.
  • DWORD WINAPI AntiDebug(LPVOID Data)
    • 利用 LoadLibrary("kernel32.dll") 及 GetProcAddress(Lib,"IsDebuggerPresent") 偵測有沒有人在 debug
    • 如果有,用 OutputDebugString() 送訊息給使用者
    • 用 WinExec() 及 while(1) 不斷打開記事本
  • DWORD WINAPI R4ns0m(LPVOID Data)
    • 用 GetDriveType() 找 drivers.
  • SendMail(), DisableMAPIWarning(), MailMySelf()
    • 值得研究


我得說 malware 作者 programming 功力還不錯,而且這個 business model 還挺有創意的,cryptovirology 真的太有意思了。

2011年5月17日 星期二

幾則市場的聲音

1. April U.S. Labor Numbers (Shadowstats)
  • April Household Survey Showed 190,000 Employment Drop
  • April Unemployment Rates: 9.0% (U.3), 15.9% (U.6), 22.3% (SGS)

2. 中央銀行新聞稿 (第092號)
  • 蔡主席英文係本行彭總裁舊識、昔日同事及長官。12日晚,本行彭總裁夫婦應蔡主席之邀會晤;其間僅閒話家常及交換國內外經濟情勢。與舊識、昔日同事及長官會面,此為人之常情,請外界勿作過多聯想。
  • 本行彭總裁重申100年3月10日於立法院財政委員會答覆委員質詢時之回答「央行總裁係個人最後一項公職」。

3. 他人看法
  • 520之前台股低檔的確有一隻無名的手支撐
  • 台股中期而言低檔空間似乎將較有限,。
  • 台股已走2年多頭,多頭應不至缺乏最後這半年拉抬。

4. 我的看法
  • 彭總裁對國內外經濟情勢的看法,早就「反應」在新聞稿、匯率、定存單……大家要持續追蹤央行網站。
  • 我不在乎別人怎麼看。仔細思考巴菲特指標的,現在股價的確普遍偏高,但末升段飆漲速度非常可怕,不要隨便摸頭放空……
  • 市場永遠是對的。

2011年5月16日 星期一

McAfee Free Tools - BinText

Link: McAfee.

這邊簡單介紹 BinText 3.03. BinText 可以找出檔案裡的 ascii, unicode and resource strings. 因此,我們不應把機敏字串寫入檔案之中,否則很容易被有心人用 BinText 撈出機敏字串。

McAfee 還提供其他有趣的工具,有空可以研究一下。

2011年5月14日 星期六

雨天朝聖小獅山

時間:2011.5.14 PM4:00

登山口:能仁家商。小獅山至少有十個登山口,步道錯綜複雜,一直往上走就對了。

細節:小獅山共有三峰 (177m、196m、223m),今天因為雨天的關係,只朝聖小獅山二峰。上去約十二分鐘,非常平易近人。

PS. 小獅山山腳就是新坡一街及長春路,雖然我喜歡爬山,但我不會在那邊買房子,理由很簡單:邊坡為順向的斜交坡,雖無順向坡滑動的危險,岩盤層面與節理發達,且局部有表層崩積岩塊層,石塊恐怕會掉落。

大自然的風景固然迷人,但還是要尊重大自然的力量。

2011年5月13日 星期五

公司分析 - 汽機車端子製造商

1. K
  • ROE = 18.38%
  • PBR = 2.93
  • K = 6.27
  • 合理價位 = 33.4 ~ 50.1

2. ROE細部邏輯關聯分析
  • 判斷獲利平穩但成熟型公司
  • 股價波動較小,投資風險及投資預期報酬率高低純粹由買進價格所決定。
  • 在買進價格上,一定要有高度耐心與堅持,股票未出現便宜價格之前,千萬不要輕易出手買進。

3. 最新合併現金流量表
  • 十年來首次出現「負營業活動現金流量 」

4. 別人的看法 (僅供參考)
  • 國內第一大汽機車端子製造商,汽車應用占約70%,機車約30%;依地區別來分,中國約占55%,台灣約15%,中東約20~30%。
  • 主要原料為銅,銅價持續上漲造成成本有增加的壓力。


結論:按兵不動,先納入觀察名單,目前預期報酬率不夠理想。

2011年5月11日 星期三

二十間不好的公司

為了挑出二十間不好的公司,我使用以下三個標準:
  1. 股本佔股東權益超過5成
  2. 股本形成來自現金增資的比率越多越好
  3. 上櫃上市滿兩年以後,出現大幅度現金增資

首先,我們先從股價淨值比排行開始找起。例如某 DRAM 大廠,今日收盤價 1.05 (今年初 2.07),100.1Q 股東權益 46E,普通股股本(不含資本公積) 254E,現金增資佔股本形成比重為 77.84%。

從第一名到二十一名,除了 161x 之外,股本佔股東權益皆超過5成。我並沒有暗示 161x 可以長期投資,因為最新 ROE (未年化) 為 0.9%,超醜,我怎麼可能推薦給大家呢?

[C#] 如何實做 IComparer

Example: (TopCoder, TheLotteryBothDivs)
There are 1,000,000,000 types of lottery tickets. They are numbered "000000000" to "999999999" (they may have leading zeroes). Each type of ticket has an equal probability of being bought by John. You are given a String[] goodSuffixes. If the number written on John's ticket has at least one element of goodSuffixes as a suffix, he will get a prize.

我的想法很簡單: 先把 goodSuffixes String array 做 sorting: string length 短的在前面,長的在後面,如果一樣長的話,按照字母順序排列。

我發現 Array.Sort(goodSuffixes) 不符合我的需求,String.Compare() 只會按照字母順序排序,因此我必須實做自己的 IComparer:
class StringLengthThenAlphabetComparer : IComparer {
public int Compare(object obj_x, object obj_y) {
String x = (String)obj_x;
String y = (String)obj_y;
if (x.Length < y.Length) {
return -1;
}
else if (x.Length > y.Length) {
return 1;
} else {
return x.CompareTo(y);
}
}
}
回傳 -1 表示 x < y, 回傳 1 表示 x > y, 回傳 0 表示 x = y. 有了 StringLengthThenAlphabetComparer class, 我們就可以用它來做自己的排序: Array.Sort(goodSuffixes, new StringLengthThenAlphabetComparer()), 有沒有很簡單?



底下附上其餘的原始碼:
using System;
using System.Collections;
using System.Collections.Generic;

public class TheLotteryBothDivs {
public double find(String[] goodSuffixes) {
Array.Sort(goodSuffixes,
new StringLengthThenAlphabetComparer());

var effective_suffixes = new List<String>();
for (int i = 0; i != goodSuffixes.Length; ++i) {
bool is_new_suffix = true;
foreach (var suffix in effective_suffixes) {
int pos = goodSuffixes[i].Length - suffix.Length;
if (goodSuffixes[i].Substring(pos) == suffix) {
is_new_suffix = false;
break;
}
}
if (is_new_suffix) {
effective_suffixes.Add(goodSuffixes[i]);
}
}

double probability = 0.0;
for (int i = 0; i != effective_suffixes.Count; ++i) {
probability += Math.Pow(0.1,
effective_suffixes[i].Length);
}

return probability;
}
}

class StringLengthThenAlphabetComparer : IComparer { ... }

2011年5月10日 星期二

Greedy Algorithm - Example

A greedy algorithm is any algorithm that follows the problem solving heuristic of making the locally optimal choice at each stage with the hope of finding the global optimum.

Example: (Single Round Match 502 Round 1 - Division II, Level One)

為了 make the locally optimal choice at each stage, 我先把 requiredTime array 由小排到大,C# 的語法就是
Array.Sort(requiredTime);
PS. Array class 在 System namespace 底下,使用前記得 using System 或是直接呼叫 System.Array.Sort()。



整個程式碼如下:
public class TheProgrammingContestDivTwo {
public int[] find(int T, int[] requiredTime) {
Array.Sort(requiredTime);

int elasped_time = 0;
int solved = 0;
int penalty = 0;
for (int i = 0; i != requiredTime.Length; ++i) {
if (elasped_time + requiredTime[i] <= T) {
elasped_time += requiredTime[i];
solved++;
penalty += elasped_time;
} else {
break;
}
}

return new int[] { solved, penalty };
}
}

我會避開的股票

Reference: Peter Lynch, One up on Wall Street.

Peter Lynch:要是我可以避開一種股票的話,肯定是熱門產業中的最熱門股票。現在熱門產業是什麼?平板電腦?智慧型手機?還是太陽能概念股?大家可以思考一下。這些熱門產業中的最熱門股票是什麼?是阿好嬸古早味紅茶冰嗎?

這些熱門股會快速上漲,漲到沒有任何價值衡量標準可以評價的地步 (紅茶冰預計報酬率 = 6.78,近七季存貨不斷增加,100.1Q存貨 = -59E,雖然股利發的很多,但現金股息殖利率低的嚇人),最後,等到只剩一廂情願的狂熱和稀薄的空氣在支撐股價時,它崩落速度也會一樣快。

當然,紅茶冰半價促銷的時候,就有長期投資的價值,只是現在價格太貴了。此外,仍要注意「應收票據及帳款淨額」及「存貨」有沒有換成「現金及約當現金」。

PS. 公開資訊觀測站也會連不上。錯誤 324 (net::ERR_EMPTY_RESPONSE): 伺服器已中斷連線,並且未傳送任何資料。

2011年5月9日 星期一

[C#] 使用 Visual Studio Unit Testing Framework

The Visual Studio Unit Testing Framework describes Microsoft's suite of unit testing tools as integrated into Visual Studio 2005 and later.

Example: (Member Single Round Match 505 Round 1 - Division II, Level One)

Step 1: Add a test.
using Microsoft.VisualStudio.TestTools.UnitTesting;
using AlgorithmMatch;

namespace AlgorithmMatchTest {

[TestClass]
public class SentenceCapitalizerInatorTest {
public TestContext TestContext { get; set; }

[TestMethod]
public void RunSanityTest() {
var Q = new SentenceCapitalizerInator();

{
var P = "hello programmer. welcome to topcoder.";
var A = "Hello programmer. Welcome to topcoder.";
Assert.AreEqual(A, Q.fixCaps(P), false);
}
}
}

} // namespace AlgorithmMatchTest

Step 2: Run all tests and see if the new one fails
The new test fails.

Step 3: Write some code
using System;
using System.Text;

namespace AlgorithmMatch {

public class SentenceCapitalizerInator {
public String fixCaps(String paragraph) {
return paragraph;
}
}

} // namespace AlgorithmMatch

Step 4: Run all tests and see if the new one fails.
Fails. We should implement fixCaps() method correctly.

Step 5: Write some code
using System;
using System.Text;

namespace AlgorithmMatch {

public class SentenceCapitalizerInator {
public String fixCaps(String paragraph) {
var result = new StringBuilder();
bool is_began = true;
foreach (char c in paragraph) {
if (is_began && char.IsLetter(c)) {
result.Append(char.ToUpper(c));
is_began = false;
}
else if (c == '.') {
result.Append(c);
is_began = true;
} else {
result.Append(c);
}
}
return result.ToString();
}
}

} // namespace AlgorithmMatch

Step 6: Run the automated tests and see them succeed.
Passed.

Step 7: Repeat.
We may add more tests from system test dataset.

[SQL] Logical Query Processing Phases

Sample query:
SELECT C.customerid, COUNT(O.orderid) AS numorders
FROM dbo.Customers AS C
LEFT OUTER JOIN dbo.Orders AS O
ON C.customerid = O.customerid
WHERE C.city = 'Madrid'
GROUP BY C.customerid
HAVING COUNT(O.orderid) < 3
ORDER BY numorders;

Processing phases
  1. FROM phase
  2. WHERE phase
  3. GROUP BY phase
  4. HAVING phase
  5. SELECT phase
  6. ORDER BY phase

FROM phase
The FROM phase identifies the table or tables that need to be queried. This phase involves three subphases in a JOIN: (1) cartesian product, (2) ON filter, and (3) add outer rows.

WHERE phase
The main difference between the ON filter and in the WHERE filter is that ON is applied before adding outer rows (3), while WHERE is applied afterwards.

GROUP BY phase
A query that contains a GROUP BY clause will generate one row per group.

HAVING phase
The HAVING filter is the only filter that applies to the grouped data.

SELECT phase
SELECT phase constructs the table that will eventually be returned to the caller. This phase involves three subphases: (1) evaluate expressions, (2) apply DISTINCT clause, (3) apply TOP option.

ORDER BY phase
The rows from the previous step are sorted according to the column list specified in the ORDER BY clause, returning the cursor.

Reference: Itzik Ben-Gan, Inside Microsoft® SQL Server® 2008: T-SQL Querying.

2011年5月8日 星期日

[C#] Process class

Process class provides access to local and remote processes and enables you to start and stop local system processes.

Example:
ProcessStartInfo start_info = new ProcessStartInfo() {
UseShellExecute = true,
WorkingDirectory = working_directory,
FileName = file_name,
Arguments = arguments
};

Process process = new Process() { StartInfo = start_info };
process.Start();

2011年5月6日 星期五

「開曼群島」兩三事

總體經濟及政經環境變動

Cayman Islands 為英屬殖民地,位於加勒比海,英文為其主要官方語言。該地政治穩定,雖沿習英國法律制度,實際卻享有高度自主權,自行立法及負責島上之財經事務。

Cayman Islands 主要經濟收入來自金融服務業及旅遊業,其金融服務業之興起主要係因政局穩定、無外匯限制及不收直接稅,Cayman Islands 與 Samoa、BVI、Bermuda 及 Mauritiu 等地同為著名之免稅天堂,亦因此使其成為重要之境外金融中心。其中 Cayman Islands 之法律簡明嚴謹,且政府能隨時修訂法律,確保其在金融、保險、商業等方面之優勢地位,使 Cayman Islands 現為僅次於紐約、倫敦、東京、香港之世界第五大金融中心。



外匯管制及租稅法令

Cayman Islands 使用之貨幣為開曼元,並採固定匯率制。該地無外匯管制或其他貨幣限制。

租稅規定方面,若為 exempted company,依據 Cayman Islands 稅務豁免法之規定,exempted company 於成立後 20 年內無頇對其任何業務所得利潤、收入或增值徵稅繳納相關稅額。

抽籤資訊 - 百年好和

新聞:
○○董事長鄭○○宣布,○○訂5月18日,以每股32元掛牌上市,○○今年將推動多項擴建廠計畫,全力投入3C電子套件周邊產品產業。

公司是第一上市櫃股票,需簽署風險預告書才能交易買賣,這表示申購股票是有風險的。為了減低風險,只好上公開資訊觀測站下載公開說明書仔細研究。

「財務概況」顯示:「流動資產」及「流動負債」成長快速,主因是
  • 應收帳款 (非關係人): 主要係3C成品週邊配件的電子書封套及平板電腦保護套於99年度下半年營業額大幅成長,故相關的應收款增加所致。
  • 存貨: 主要係配合高單價電子書封套及平板電腦護套等3C成品週邊配件業務營業額成長,故增加相關備料所致。

民98年生產「黏扣帶」,民99年金融海嘯後轉型,轉生產「3C成品週邊配件」,公司銷量及銷值均有所成長。公司方向正確,但還是要注意「應收帳款」能不能拿回現金,這科目很容易灌水。

此外:
  • 股本佔股東權益66%,公司未創造夠多的盈餘。
  • 速動比率最近四年皆小於1。
  • ROE = 12.32%,每股淨值依擬上市股數198,483仟股計算 = 13.43,合理價位為 11.0~16.5,目前承銷價格32元,抽到立刻貴到。

公開說明書頁數很多,內容很棒,讓我可以知道產業概況及公司概況,但財務資訊不太透明,雖然如此,我仍可推出合理價位。

結論就是:承銷價格太貴,先忍一忍吧。

打房新政策

新聞消息:
「奢侈稅」6月1日才上路,卻已出現房價沒降,交易冷清的副作用。為讓房市健全發展,讓想買房民眾買得起房子,內政部將「青年安心成家方案」與「整合住宅補貼方案」貸款年限,由20年延長為30年,符合條件的民眾即可申請購屋及租金補貼;財政部也放寬「青年安心購屋優惠方案」,總額度無上限,民眾可同時申貸內政部200萬元和財政部500萬元貸款,總計最高700萬元。

這招真的太高了,大家趕快學起來,這正是股市的養套殺
先拉抬股價做出漂亮的線型,再放出利多消息讓散戶跳進來,初期投資人都會賺錢,在高檔震盪時出貨套給散戶,通常散戶短套捨不得賣都要等反彈,主力再做空急殺狠賺一筆。

真的太暗黑了,實在不得不佩服政府的智慧!我希望大家多多中計,讓沉重的房貸壓垮青年,房子拼命被法拍,房價崩盤建商倒光光,這樣我才有機會撿便宜,哈哈!

我真的壞透了。

巴菲特指標 (2011.5.6)

巴菲特指標 = 170%,大盤陷入高檔盤整。

2011年5月5日 星期四

已報名參加「2011 渣打.台北101國際登高賽」

突然想到是端午連假,拼了。

競賽地點:臺北101金融大樓 1樓~91樓 共2046階

報到時間:6/3-4 09:00~17:00逾時不候
活動日期:2011年6月5日
集合時間:09:30
起跑時間:10:00
集合地點:台北101大樓1樓 (信義路入口)

菁英組成績門檻為16分33秒04內,看來我要好好練習爬樓梯了。

2011年5月4日 星期三

公司分析 - 美麗四寶之一

很接近我的好球帶,持續觀察中。當然,我很在意巴菲特指標,除非預期報酬率有15%,否則不輕易出手。

1. K
  • ROE = 20.98% (年化)
  • PBR = 2.08
  • K = 10.08
  • 合理價位 = 110.5 ~ 73.7

2. ROE細部邏輯關聯分析
  • 判斷穩健型高成長。
  • 公司採取穩紮穩打的營運策略,採取業務擴充同時兼顧公司財務的穩健發展經營方針。
  • 具長期緩步上漲的潛力。

3. 財務結構
  • 自有資本比率自民97逐漸拉高至67.57%,長期負債佔總資產15%。
  • 連續十年發放股利,連續十年自由現金流量為正。

4. 營收分析
  • 3月平均線與12月平均線同處於上升軌道,但3月平均線頓化,上升仰角約等於12月平均線。
  • YoY趨勢向下。
  • 無特別操作策略。

5. 長期投資
  • 長期投資比率約25%。
  • 標的多為集團關係企業,暫時令人放心。

Peter Lynch: 高價投資一家非常成功的企業,這是最令人覺得喪氣的悲劇,因為公司雖然賺大錢,你卻繼續賠錢。投資第一法則:不要賠錢。第二法則:不要忘掉第一法則。我一定做的到!真的!我可以的!

2011年5月3日 星期二

公司分析更新 - 電子零組件業

電源供應器大廠,原本在我的好球帶,但現在不在我的好球帶,畢竟我不是 Frank Thomas。言歸正傳,我的分析如下:

1. K
  • ROE = 24.45%
  • PBR = 2.73
  • K = 8.95
  • 合理價位 = 26.8 ~ 40.3

2. 不穩定因子
  • ROE
  • 月營收與YoY
  • 三大獲利能力
  • CCC

今年現金股利3.5元發的不錯,今天跌停殺的有點莫名其妙,但公司不在我的好球帶,我只好再等幾球嘍。

2011年5月2日 星期一

[C#] 好用的 class: PerformanceCounter

目的:
  • We always measure the performance of our code (applications, services, drivers, etc.) in the field in real time or in a testing environment.
  • We can diagnose problems and fix them in the future.
  • PerformanceCounter enables us to publish, capture, and analyze the performance data of running code.

詳細細節在 C# Corner,有興趣的請自行翻閱.

未來想要朝聖的幾座山

1. 百岳
郡大山、西巒大山、南橫三星、奇萊南峰、南華山、玉山主峰、合歡群峰 (不含西峰)

2. 中級山
北插天山、南插天山、卡保山、逐鹿山、塔曼山、拉拉山

3. 郊山
七星山、大屯山 (主、南、西峰)、峰頭尖、中央尖、黃帝殿 (東、西峰)、獅仔頭山、大桶山、五寮尖、金面山

將來比較想朝聖七星山 (想看大小霸)、北插天山、塔曼山、黃帝殿、奇萊南峰和南華山,希望台灣天氣好一點,這樣我才有機會出門朝聖。

2011年5月1日 星期日

[C/C++] Addition of data-structure sentinel

The accidental addition of a data-structure sentinel can cause serious programming logic problems.

例子:
char *foo;
foo = malloc(sizeof(char)*4);
foo[0] = 'a';
foo[1] = 'a';
foo[2] = 0;
foo[3] = 'c';
printf("%c %c %c %c %c \n",foo[0],foo[1],foo[2],foo[3]);
printf("%s\n",foo);

解決方案就是 encapsulating the user from interacting with data sentinels, 例如使用 std::string class.

巴菲特指標 (2011.4.29)

跟上週一樣,170%。

Fortune: Buffett's metric says it's time to buy. 裡頭有一張圖表,值得大家細看:


回頭看台灣市場。「雲端合夥企業」近期不會投資公司,但不代表暫停研究公司,正所謂養兵千日用在一時,現在乖乖等待良機就對了。

說穿了,巴菲特指標就是科斯托蘭尼雞蛋,巴菲特只是將科斯托蘭尼雞蛋「數據化」罷了,也就是說,數據雖然有參考性,但不可過份拘泥,這樣才能掌握市場心理面。

應收帳款過多公司 - 已下市公司

公司是台灣知名老牌家電公司,民93開始轉型投入 LCD/TV 營銷。


1. 應收帳款變化
民97    964,733 ( 8%) (第三次重編)
民96 11,167,063 (31%)
民95 10,153,696 (30%) (長期借款增加)
民94 6,547,411 (25%) (長期借款增加)
民93 2,681,811 (13%)
民92 1,433,094 ( 8%)
自有資本比率偏低,連續五年無法創造自由現金流量。投資人若長期持有公司股票,可能無法分配到任何股利。


2. 合併現金流量表
          營業活動      投資活動      融資活動
------------------------------------------
民96 (1,714,113) (742,505) 2,320,979
民95 (1,269,069) (477,939) 2,176,100
民94 (2,772,243) (647,905) 3,830,813
民93 (1,279,475) (1,055,303) 2,156,392
民92 (477,169) (237,817) 1,040,982
本業趨緩且投資積極。公司本業營運已無法產生現金流入,這將使盈餘品質持續惡化。此外,持續性的高資本支出加上對外融資,將使公司的財務結構持續走弱,將使股東權益更趨低落,本業若無法面對產業景氣的波動風險,股東投資的本金可能血本無歸。


3. 結局
97/07/31公司向銀行借款之保證本票發生跳票 50,000,000元。民99年流動資產3,899,187仟元小於流動負債27,581,695仟元,已有流動性不足之虞,且股東權益已呈負值20,094,501仟元。

下次看到應收帳款過多的公司,千萬要小心。