[閒聊] 我破千了

Written on 6:04 下午 by Yu Lai

就在昨天,
那個倒數的Flash總算跑出正確的3位數了。
也就是正式進入破千的日子了。XD

[閒聊] 一些符號的英文名稱對應

Written on 4:17 下午 by Yu Lai

plus sign (+) 加號

minus sign (-) 減號

forward slash (/) 斜線

backslash (\) 反斜線

percent symbol (%) 百分號

exclamation point symbol (!) 驚嘆號

underscore (_) 底線

equal sign (=) 等號

decimal points (.) 點

semicolon (;) 分號

increment (++) operators 遞增

decrement (--) operators 遞減

( ) Parenthesis 小括號

{ } Braces 大括號

[ ] Brackets 中括號

, Comma 逗號

[技術] 在C中動態配置2維陣列

Written on 5:04 下午 by Yu Lai

在網路上找到的,就記錄下來筆記一下囉。

在C中動態配置一[m][n]的二維陣列
有下列幾種作法

(ㄧ)

int **Array, *pData;
int m,n,i;
Array = (int**)malloc(m*sizeof(int *));
pData = (int*)malloc(m*n*sizeof(int));
for(i = 0; i < m; i++, pData += n)
Array[i] = pData;

只需做兩次malloc,free只要free Array和Array[0]就可以了

(二)
int i;
int **Array;
Array = (int **)malloc(m*sizeof(void *));
for (i = 0; i < m; i++)
Array[i] = (int *)malloc(n*sizeof(int *));

這樣子的配置方式要做很多次的malloc,,並容易造成記憶體碎片化(memory fragment)

(三)
int i;
int **Array, *pData;
Array = (int **)malloc(m*sizeof(int *)+m*n*sizeof(int));
for (i = 0, pData = (int *)(Array+m); i < m; i++, pData += n)
Array[i]=pData;

這樣是最簡便的寫法 只要mallocㄧ次完成,free只要free Array即可

[投資] 權值股

Written on 12:02 上午 by Yu Lai

臺灣證券交易所發行量加權股價指數前50大成分股暨市值比重
排行

證券名稱

市值佔 大盤比重

排行

證券名稱

市值佔 大盤比重
1 2330 台積電 7.984%
2 2317 鴻海 6.193%
3 6505 台塑化 4.372%
4 1303 南亞 3.195%
5 2882 國泰金 3.056%
6 1301 臺塑 2.540%
7 2002 中鋼 2.437%
8 2409 友達 2.419%
9 1326 臺化 2.235%
10 2454 聯發科 2.136%
11 2357 華碩 1.760%
12 2498 宏達電 1.673%
13 3009 奇美電 1.505%
14 3481 群創 1.470%
15 2303 聯電 1.298%
16 2308 台達電 1.139%
17 2881 富邦金 1.083%
18 2886 兆豐金 1.075%
19 3045 台灣大 1.060%
20 2354 鴻準 0.976%
21 2891 中信金 0.945%
22 2325 矽品 0.872%
23 2311 日月光 0.863%
24 2885 元大金 0.857%
25 1402 遠紡 0.831%
26 2382 廣達 0.780%
27 4904 遠傳 0.774%
28 1216 統一 0.761%
29 2353 宏碁 0.744%
30 1101 台泥 0.712%
31 2892 第一金 0.711%
32 2883 開發金 0.684%
33 2324 仁寶 0.669%
34 8046 南電 0.666%
35 1102 亞泥 0.632%
36 2880 華南金 0.620%
37 2301 光寶科 0.601%
38 2888 新光金 0.546%
39 5854 合庫 0.536%
40 2474 可成 0.499%
41 2475 華映 0.465%
42 2603 長榮 0.435%
43 2347 聯強 0.428%
44 2890 永豐金 0.420%
45 2408 南科 0.419%
46 3474 華亞科 0.418%
47 2448 晶電 0.417%
48 2801 彰銀 0.416%
49 3231 緯創 0.406%
50 1722 台肥 0.380%

[閒聊] 小改版

Written on 11:22 上午 by Yu Lai

在看了王小明的征服藍星,
我也加了點新東東在右邊囉。XD
就當做是些資料的統計吧。 *^^*

[技術] 802.3ad

Written on 6:49 下午 by Yu Lai

Ref: 酷學園 & PCDVD

NTEL 叫 LINK AGGREGATION
CISCO 叫 FAST ETHERCHANNEL
3COM 叫 PORT TRUNKING
現在國際標準叫 IEEE802.3ad
白話一點叫併頻寬或頻寬聚集
一般用在解決伺服器網路瓶頸或交換器與交換器連接

從硬體的角度來看

INTEL 伺服器等級的網路卡可以設定以下3個模式

1.AFT(Adapter Fault Tolerance)(希望沒有拼錯好像怪怪的)
假設有兩張網卡時一張是PRIMARY另一張是STANDBY
這時候流量只在PRIMARY上跑
當PRIMARY掛掉時STANDBY會自動啟用接手變成PRIMARY
如果原來PRIMARY恢復時會自動變成STANDBY
(因為大家ALB和ALA都包含AFT,所以基本上沒人會單獨設AFT運作)

2.ALB(Adapter Load Balance)
假設將兩張網路卡設成ALB時
進來流量為100M出去流量為200M
這時候無論接往何種交換器或集線器都可支援
同時間ALB包含容錯功能如果一張網卡故障另一張依然運作
現在INTEL可以做到8張網卡併頻寬

3.ALA(Adapter Link Aggregation)
假設將兩張網路卡設成ALA時
進來流量為200M出去流量為200M
這時候需接往支援LINK AGGREGATION的交換器
同時間ALA包含容錯功能如果一張網卡故障另一張依然運作
現在INTEL可以做到8張網卡併頻寬

Intel 的 teaming 叫做 ians Intel(R) Advanced Network Services

intel 分成

1、Adapter Fault Tolerance (AFT)
2、Switch Fault Tolerance (SFT)
3、Adaptive Load Balancing (ALB)
4、Intel Link Aggregation, Cisco*'s Fast EtherChannel* Technology or static 802.3ad (FEC or FEC/LA/802.3ad: static)

intel pro 若只使用 windows 系統提供的驅動程式的話 , 其 teaming mode 只能支援到 RLB , 若要完全使用其他 teaming mode (LA , Cisco FEC ..)的功能 , 除了需要有支援 802.3ad 規格的 switch 配合外 , 還需要安裝 Intel ANS !!

在使用2張 INTEL SERVER ADAPTER 以上時
正常來說會選 ALB 或 ALA
不管選 ALB 或 ALA 這時 AFT 是一定有作用

當你的交換器是一般或早期的請選 ALB
這時主網卡跑雙工其他子網卡跑單工
系統以主網卡為主
假設四張的話就是進去 100 出來 400

當你的交換器支援 FAST ETHERCHANNEL 或 LINK AGGREGATION 或 802.3ad
這時可以啟用 ALA
所有網卡都跑全雙工
系統以代表所有實體網卡的虛擬網卡為主
假設有四張時就是進去 400 出來 400

[技術] Wireshark抓vlan tag資訊整理

Written on 11:05 上午 by Yu Lai

使用Wireshark時居然發生抓不到VLAN的資訊,
上網找了一下果然是有問題的。
以下為找到的ref: http://blog.rogerz.cn/archives/553

某一些網卡驅動默認會在接收封包的時候過濾vlan tag,使得用wireshark抓到的封包中不含vlan tag,此時需要通過修改註冊表讓驅動保留vlan tag。

對於Intel PRO/1000或PRO/100網卡,需要將註冊表HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\00xx下(以DriverDesc來判定xx值為何)的MonitorModeEnabled改為1,如果不存在則新建這麼一個dword鍵。

對於Broadcom Giga網卡,需要在註冊表裡增加一項PreserveVlanInfoInRxPacket=1,類型為string。位置與TxCoalescingTicks相同,後者可以在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet下搜索到。

修改後需要重啟機器讓它生效。這個修改辦法是在UniCA User Manual中看到的,較新的網卡驅動裡都支持這個設置,原文如下:

Intel PRO/1000 or PRO/100 Ethernet controller which are used in e.g. IBM Notebooks (T40 series and others) do not forward VLAN tags to the upper layers; By default, Intel adapters strip the VLAN tag before passing it up the stack. If you need to see the tag you need to use these driver versions: PRO/100 6.x or 7.x or later base driver, PRO/1000 7.2.17.803 (plain 7.2.17 does not have this feature). To enable, you must go into the registry and either add a registry dword and value (for e100) or change the value of the registry key (for e1000). The registry dword is MonitorModeEnabled (for both). It should be placed at HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class{4D36E972-E325-11CE-BFC1-08002BE10318}\00xx where xx is the instance of the network adapter that you need to see tags on. (Check by opening and viewing the name of the adapter). It should be set to read: MonitorModeEnabled= 1. Note: ControlSet001 may need to be CurrentControlSet or another 00x number

For Broadcom 570x Gigabit adapters (for example in Dell systems); Add a registry key under HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet to cause the driver not to strip the 802.1Q VLAN header. In order to set that key, you need to find the right instance of the driver in Registry Editor and set that key for it.

* Run the Registry Editor (regedt32).
* Search for 「TxCoalescingTicks」 under "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet" and ensure this is the only instance that you have.
* Right-click on the instance number (eg. 0008) and add a new string value.
* Enter 「PreserveVlanInfoInRxPacket」 and give it the value 「1〞.
* Save and Reboot
* You may need to install a recent driver (version 8.27) to make this setting effective

[技術] Linux MTD Driver Reference

Written on 9:52 上午 by Yu Lai

以下是幾個有關MTD的Reference,記錄下來當成筆記一下。

MTD NAND Driver Programming Interface
Thomas Gleixner
http://www.linux-mtd.infradead.org/tech/mtdnand/book1.html

HOW TO USE MTD/JFFS2 UNDER µClinux
Patrice KADIONIK, Professor Assistant at the ENSEIRB School of Electrical Engineering, Telecommunication, and Computer Science
http://uuu.enseirb.fr/~kadionik/embedded/uclinux/mtd/howto_mtd.html

Find your Root File System with MTD
http://www.ucdot.org/article.pl?sid=03/01/11/1049210&mode=thread

[技術] Interrupted system calls

Written on 2:41 下午 by Yu Lai

這是最近寫程式遇到的,沒想到使用好好的UNIX Socket API居然會有爆走的時候。
在Survey了老半天,總算知道問題點所在。以下是看完The Linux GCC HOWTO的心得。

會發生Interrupted system calls主要是POSIX的系統檢查信號的次數,比起一些舊版的Unix是要多那麼一點。依照此規範,在Linux裡會在下列系統呼叫(system calls)的執行期間執行signal handlers: select(), pause(), connect(),accept(), read() on terminals, sockets, pipes or files in /proc, write() on terminals, sockets, pipes or the line printer, open() on FIFOs, PTYs or serial lines,ioctl() on terminals, fcntl() with command F_SETLKW, wait4(), syslog(), any TCP or NFS operations。而就其它的作業系統而言,你需要注意的可能就是下面這些系統呼叫(system calls)了: creat(), close(), getmsg(), putmsg(), msgrcv(), msgsnd(), recv(), send(), wait(), waitpid(), wait3(), tcdrain(), sigpause(), semop() to this list.

而問題點在於在系統呼叫(system calls)期間,若有一信號(那支程式本身應準備好handler因應了)產生,handler就會被呼叫。當handler將控制權轉移回系統呼叫時,它會偵測出它已經產生中斷,而且傳回值會立刻設定成-1,errno設定成EINTR。程式並沒有想到會發生這種事,所以就會bottles out了。

有兩種修正的方法可以選擇:

(1) 對每個你自行安裝(install)的signal handler,都須在sigaction旗號加上SA_RESTART。例如,把下列的程式,

     signal (sig_nr, my_signal_handler);

改成
     signal (sig_nr, my_signal_handler);
{ struct sigaction sa;
sigaction (sig_nr, (struct sigaction *)0, &sa);
#ifdef SA_RESTART
sa.sa_flags |= SA_RESTART;
#endif
#ifdef SA_INTERRUPT
sa.sa_flags &= ~ SA_INTERRUPT;
#endif
sigaction (sig_nr, &sa, (struct sigaction *)0);
}

要注意的是,當這部份的變更大量應用到系統呼叫之後,呼叫read(), write(),ioctl(), select(), pause() 與 connect()時,你仍然得自行檢查(check for)EINTR。如方法二所示。

(2) 你自己得很明確地(explicitly)檢查EINTR:

這裡有兩個針對read()與ioctl()的例子。

原始的程式片段,使用read()。
   int result;
while (len > 0) {
result = read(fd,buffer,len);
if (result <> 0) {
result = read(fd,buffer,len);
if (result < 0) { if (errno != EINTR) break; }
else { buffer += result; len -= result; }
}

原始的程式片段,使用ioctl()。
   int result;
result = ioctl(fd,cmd,addr);

修改成
   int result;
do { result = ioctl(fd,cmd,addr); }
while ((result == -1) && (errno == EINTR));

注意一點,有些版本的BSD Unix,其內定的行為(default behaviour)是重新執行系統呼叫。若要讓系統呼叫中斷,得使用SV_INTERRUPT或SA_INTERRUPT旗號。

另外補充一個由Richard Steven所提供給connect()的修改法。
   /* Start with fd just returned by socket(), blocking, SOCK_STREAM... */
while ( connect (fd, &name, namelen) == -1 && errno != EISCONN )
if ( errno != EINTR ) {
perror ("connect");
exit (EXIT_FAILURE);
}

[技術] 嵌入式linux下常見的文件系統

Written on 2:14 下午 by Yu Lai

嵌入式linux下常見的文件系統
• RomFS:只讀文件系統,可以放在ROM空間,也可以在系統的RAM中,嵌入式linux中常用來作根文件系統
• RamFS:利用VFS自身結構而形成的內存文件系統,使用系統的RAM空間
• JFFS/JFFS2:為Flash設計的日誌文件系統
• Yaffs:專門為Nand Flash設計
• proc:為Kernel和Module將Message發送給Process提供一種機制,可以查看系統Module裝載的信息
• devFS:設備文件系統

Linux上的Ext2fs
• 支持4 TB存儲、文件名稱最長1012字符
• 可選擇邏輯塊
• 快速符號鏈接
• Ext2不適合flash設備
• 是為象IDE 設備那樣的塊設備設計的,邏輯塊大小必須是512 byte、1 KB、2KB等
• 沒有提供對基於扇區的擦除/寫操作的良好管理
• 如果在一個扇區中擦除單個字節,必須將整個扇區複製到RAM,然後擦除,再重寫入
• 在出現電源故障時,Ext2fs 是不能防止崩潰的
• 文件系統不支持損耗平衡,縮短了flash的壽命

jffs/jffs2文件系統的優缺點
• 日誌文件系統
• 提供了更好的崩潰、掉電安全保護
• jffs2支持對flash的均勻磨損
• 在扇區級別上執行閃存擦除/寫/讀操作要比Ext2文件系統好
• 文件系統接近滿時,JFFS2 會大大放慢運行速度——垃圾收集

Nand上yaffs文件系統的優勢
• 專門為Nand flash設計的日誌文件系統
• jffs/jffs2不適合大容量的Nand flash
• jffs的日誌通過jffs_node建立在RAM中,佔用RAM空間:對於128MB的Nand大概需要4MB的空間來維護節點
• 啟動的時候需要掃瞄日誌節點,不適合大容量的Nand flash
• FAT系統沒有日誌編譯yaffs文件系統
• mtd的最新補丁升級?
• 接口更新,適合與yaffs
• 與原有的mtd驅動程序不兼容,需要重寫
• 如果使用舊mtd驅動需要定義Makefile中MTD_OLD = -DCONFIG_YAFFS_USE_OLD_MTD
• 參考文檔: yaffs-rootfs-howto
• 最新版的yaffs網站:
http://www.aleph1.co.uk/armlinux/projects/yaffs

使用yaffs文件系統
• 通過cat /proc/yaffs命令可以看到yaffs系統的相關信息
• mount -t yaffs /dev/mtdblock/0 /mnt/yaffs

[技術] malloc的效能

Written on 9:54 上午 by Yu Lai

轉載自強者學弟yuwen的個人板P_yuwen @ cd.twbbs.org

最近因為某些特殊需求,所以必須要使用rainbowtable來輔助,在FreeBSD的ports中有rainbowcrack可以使用,於是就裝了起來,順道測試一下之前抓到的幾個rainbowtable的效率。沒想到一執行rcrack就噴了 = =

只好苦命的來trace code,才發現一個白爛的問題,做這個ports的人在某個function內,因為找不到從linux對應的code,就直接把那段code拔掉 = = 所以return 值亂七八糟的,當然會噴segmentation fault!所以就自己補上那一小段code,本來以為這世界就會再度快樂的運轉。

當然事情不是那麼的簡單,跑沒多久又改噴bus error = = 經過再苦命的trace才找到bug,因為每個rainbowtable去跑一次需要allocate 1G的記憶體,而我拿來測的機器的記憶體只有1G,不過SWAP也有1.5G,不知道為啥就是不會成功。(謎! 板上有長輩知道嗎),所以又找了台有2G RAM的機器來測,發現一樣跑步起來,後來寫了個test code才發現似乎是FreeBSD的malloc的問題。同樣的code,在一樣只有1G的linux上面卻是可以成功。(FreeBSD的libc中的malloc是jemalloc,而linux上面的是ptmalloc2)

My test code:
unsigned char* a = (unsigned char *)malloc(sizeof(unsigned char)*1G);
if(a == NULL) printf("Damn\n");
else printf("Thanks God!\n");
Result:
FreeBSD 6.2-Stable + 1G RAM => Damn
FreeBSD 6.2-Stable + 3G RAM => Damn
Debian etch => Thanks God!

所以就開始尋找替代方案啦,幾個有名的malloc都拿來測試看看,包含下列幾種:
libumem(Sun的),libdlmalloc(FreeBSD開發者弄得),libtcmalloc (google出品)
結果不管換上哪一套,在本來的機器上都可以跑了!!!看來真的是malloc的問題。

解決問題後,就開始想測測看上面這幾套的效能,測試的code如下:
char a[65535];
跑 10 次
random填滿 a[65535], 每個malloc 1~64K
跑 1000000 次
random選一個a[x],如果不是null就free,如果null就
random malloc一塊 1~64K
end 跑
end 跑

結果: tcmalloc > dlmalloc >>>>>>>>>>>>>>>>>>> libumem ~= jemallo ~= ptmalloc
結論: 如果需要大量頻繁的malloc/free,每次都是small allocation的話,應該可以先試試看tcmalloc or dlmalloc

這又帶出一個想法,築夢每次晚間的load都非常重,看了一下code發現其實bbs會頻繁的malloc/free。也許cd.twbbs.org可以改用tcmalloc or dlmalloc看看,也許可以增加一點效率~(ptt是改用dietlibc的malloc)

--
可惜手邊沒有bbs的機器來測, 手好癢阿~ Orz

PS: 最後補一個相關的ref: http://plog.longwin.com.tw/news-unix/2007/03/29/mysql_tcmalloc_2007

[投資] 一些國家yahoo財經連結

Written on 4:40 下午 by Yu Lai

http://hk.finance.yahoo.com/ 香港
http://tw.finance.yahoo.com/ 台灣
http://cn.finance.yahoo.com/ 中國
http://finance.yahoo.com/ 美國
http://ca.finance.yahoo.com/ 加拿大
http://uk.finance.yahoo.com/ 英國
http://sg.finance.yahoo.com/ 新加坡
http://quote.yahoo.co.jp/ 日本
http://fr.finance.yahoo.com/ 法國
http://kr.finance.yahoo.com/ 韓國
http://au.finance.yahoo.com/ 紐澳
http://de.finance.yahoo.com/ 德國
http://it.finance.yahoo.com/ 義大利 nonono 維大力
http://es.finance.yahoo.com/ 西班牙
http://in.finance.yahoo.com/ 印度
http://mx.finance.yahoo.com/ 墨西哥
http://br.finance.yahoo.com/ 巴西
http://ar.finance.yahoo.com/ 阿根廷

[工具] 超好用網頁配色網站

Written on 11:03 上午 by Yu Lai

1、收錄了很多主題配色的方案
http://www.print100.com/hk/html/csi.aspx

2、選定你的主題色,輕輕一按就能幫你搭配合適的顏色,還能調節亮度與飽和度,非常專業喔
http://wellstyled.com/tools/colorscheme/index-en.html

3、只要輸入一個物品名稱(例如tree)就能產生相關顏色
http://colr.org/

4、選擇你的基調色,馬上給你16種配色
http://www.colorschemer.com/online.html

[閒聊] 直銷傳銷的十大謊言Ten Big Lies of Multilevel

Written on 1:27 上午 by Yu Lai

最近在新聞看到腦殘直銷的事,剛好又看到這篇文章,覺得還不錯,就轉來給大家看一下囉。

http://www.pjhuang.net/2007/04/ten-big-lies-of-multilevel-marketing.html

1.謊言:直銷傳銷提供比傳統的商業模式更好的機會賺取鉅額的金錢。
事實:幾乎對所有投入直銷傳銷的人而言,參與直銷傳銷計畫都有不好的財務結果,只有少於1%的人勉強能獲利,而能有相當獲利的人比例更低。

2.謊言:經由人際關係網路銷售是最流行與有效的銷售方式,消費者喜歡直銷傳銷的一對一經驗。
事實:個人零售已經過時,更不是未來的趨勢,網際網路才是未來趨勢。向朋友直接購買商品,往往讓消費者選擇變少,價格偏高,購買不方便,又和朋友有令人不習慣的商業關係。事實上,直銷傳銷靠的是不斷重複販賣一種可能賺錢的契約給下一個經銷商。

3.謊言:未來所有零售商品都會以直銷方式販售,零售商與百貨公司都會被直銷傳銷打敗而消失。
事實:直銷傳銷的祇佔所有零售量的不到1%,和正常零售量根本無法比較,而且這些銷量中,大半還是新會員加入時必須購買的額度。買產品的人多是為了買一個致富的彩票,除了你自己的銷售努力還有你下線的銷售努力,可以讓你致富。合法的直銷傳銷業就像合法的賭博業,只是你的勝率比賭博還低一點。投資股市也很像賭博,不過你的勝率可能高一點。

4.謊言:直銷傳銷將給你幸福快樂的人生,讓你可以成就所有你想完成的事。
事實:在直銷傳銷的招募會議中展示的往往是物質主義的極致,財富前100大公司的職員前景可能都比不上直銷傳銷所描繪的財富與奢華。但是這和一般人希望的幸福其實是衝突的,一般人多半只想在自己有天份與興趣的項目上獲得成就感。

5.謊言:直銷傳銷是神聖的運動。
事實:用貧窮感與心想事成的精神力來推廣直銷,把直銷傳銷比喻成傳教,甚至將銷售團隊自稱為團契,是對宗教的曲解,那些將希望與夢想建築在財富上的人,完全搞錯了宗教的意義。直銷傳銷團體所提供的歸屬感與支援,都是完全建立在購買的基礎之上,一旦你不再購買與招募新人,這個團體就什麼也沒了。

6.謊言:直銷傳銷很容易成功,你的親人與朋友是最自然的下線,他們將是你一生的顧客。
事實:想在家族與友情中獲取上商業利益,往往是不智的,直銷傳銷的出現,對社區與個人的生活都有很不好的影響,人就是不喜歡因情份的關係而買東西。想利用社交關係來獲利,往往會毀了你的社交生活。這我也在顧問的業務推廣上,發現有類似的現象,我的付費諮詢顧客,多來自家族與朋友圈之外。

7.謊言:你可以利用閒暇時間做直銷傳銷,它提供彈性與自由,每週幾小時就能賺得不錯的兼差收入,並且收入可能成長到可以辭去原本的工作,獲得財務自由。
事實:想從直銷傳銷賺錢需要投入很多時間,更需要人際關係技巧與堅持的毅力。此外,直銷傳銷模式比一般工作入侵更多你的生活與時間,每個人都可能是下線,每分鐘都在行銷。直銷傳銷模式以能幫助你財務獨立、財務自由為誘因,結果剛好相反,很多直銷人之所以如此沉迷與依賴直銷傳銷,是因為他們已經失去了所有其他正常的社交關係,只剩下直銷傳銷關係,讓他們對僅存的直銷傳銷關係,變得更為依賴。這是病態的人生,而非幸福的人生。

8.謊言:直銷傳銷是個正向積極、彼此支援的新商業模式,直銷傳銷模式彰顯了人道精神與個人自由。
事實:直銷傳銷的推廣者,往往是利用恐懼來招募新人,強調企業的冷酷無情,為別人工作是多麼的了無希望,其他工作都不能提供未來無限的收入,直銷傳銷被形容成你最後唯一快速輕鬆致富成功的機會。一個好的商業模式不該是需要憑藉預測別人的失敗與警告別人來招募。

9.謊言:直銷傳銷是擁有自己的事業最好的方式,讓你達到財富自由。
事實:參加直銷傳銷不是擁有自己的事業,創建直銷公司才是,多數參加直銷者,不能自由銷售其他公司的商品,而且公司可以很容易地中止參加直銷者的資格,下線也可能被無預警移除,參加直銷者必須嚴格遵守公司經營規則,只能複製公司設定的模式,既不獨立也不自由,參加直銷者不算是事業主,只是參與簽署複雜合約的一方,而且對這份合約,參加直銷者沒有任何置啄與修改的控制權利。

10.謊言:直銷傳銷不是老鼠會(pyramid scheme),而是真的有銷售商品。
事實:有銷售商品並不表示就一定不是老鼠會騙局,在美國的法律,區分老鼠會詐欺與合法的直銷傳銷行為,是需要法院判決的。而多數目前存在的直銷傳銷公司並不表示就一定合法,只是尚未被起訴與接受法院判決過。目前美國法院判決的原則是要有70%以上的商品銷售是賣給非經銷商的最終顧客,才是合法的直銷傳銷行為。而多數直銷傳銷公司只有18%的商品銷售是賣給非經銷商。

本文翻譯摘錄自http://www.mlmwatch.org/01General/10lies.html
是某天看了一篇提到MLM的文章後,想要研究MLM的獎勵制度設計理念時,搜尋的結果。讀來感覺提綱挈領,作者英文論理十分清楚,發覺過去沒有人中文翻譯過,所以試著摘譯,加上一點改寫。希望對尋找財富自由的人有參考的價值。

網路MLM直銷算不算是老鼠會騙局呢?首先要看參與網路MLM直銷者,是否需要先付出一筆錢購買這個獲利機會的契約?通常要,否則MLM就玩不起來了。而網路MLM直銷的商品或利潤有多少百分比來自非參與直銷者的貢獻。

網路MLM直銷就像一般直銷,可能會毀了你的網路社交生活,讓你的網路社交只剩下網路MLM直銷社群,相濡以沫。網路MLM直銷的優點是也許你能區別現實生活與網路生活,而繼續保有現實生活中的社交生活圈。

[技術] 主機板的叫聲

Written on 10:56 上午 by Yu Lai

1. AMI BIOS
 1短——記憶體重新整理失敗
 2短——記憶體ECC校驗錯誤
 3短——系統基本記憶體(第1個64K)檢查失敗
 4短——系統時鐘出錯
 5短——中央處理器(CPU)錯誤
 6短——鍵盤控制器錯誤
 7短——系統真實模式錯誤,不能切換到保護模式
 8短——顯示記憶體錯誤(顯示記憶體可能有所損壞)
 9短——ROM BIOS檢驗和錯誤
 1長3短——記憶體錯誤(記憶體損壞,請更換)
 1長8短——顯示測試錯誤(顯示器資料線鬆動或顯示卡沒插穩)
2. Award BIOS
 1短——系統正常啟動
 2短——一般錯誤,請進入CMOS SETUP重新設置不正確的選項
 1長1短——RAM或主機板出錯
 1長2短——顯示錯誤(顯示器或顯示卡)
 1長3短——鍵盤控制器錯誤
 1長9短——主機板FlashRAM或EPROM錯誤(BIOS損壞)
 不斷地響(長聲)——記憶體沒插穩或損壞
 不停地響——電源、顯示器和顯示卡沒有連接好
 重複短響——電源故障
 無聲音無顯示——電源故障

3. Phoenix BIOS
 1短——系統正常啟動
 3短——系統加電自檢啟始化(POST)失敗
 1短1短2短——主機板錯誤(主機板損壞,請更換)
 1短1短3短——主機板電池沒電或CMOS損壞
 1短1短4短——ROM BIOS校驗出錯
 1短2短1短——系統實時時鐘有問題
 1短2短2短——DMA通道啟始化失敗
 1短2短3短——DMA通道頁寄存器出錯
 1短3短1短——記憶體通道重新整理錯誤(問題範圍為所有的記憶體)
 1短3短2短——基本記憶體出錯(記憶體損壞或RAS設置錯誤)
 1短3短3短——基本記憶體出錯(很可能是DIMM槽上的記憶體損壞)
 1短4短1短——基本記憶體某一地址出錯
 1短4短2短——系統基本記憶體(第1個64K)有奇偶校驗錯誤
 1短4短3短——EISA總線時序器錯誤
 1短4短4短——EISA NMI口錯誤
 2短1短1短——系統基本記憶體(第1個64K)檢查失敗
 3短1短1短——第1個DMA控制器或寄存器出錯
 3短1短2短——第2個DMA控制器或寄存器出錯
 3短1短3短——主中斷處理寄存器錯誤
 3短1短4短——副中斷處理寄存器錯誤
 3短2短4短——鍵盤時鐘有問題,在CMOS中重新設置成Not installed來跳過POST
 3短3短4短——顯示卡RAM出錯或無RAM,不屬於致命錯誤
 3短4短2短——顯示器資料線鬆了或顯示卡沒插穩或顯示卡損壞
 3短4短3短——未發現顯示卡的ROM BIOS
 4短2短1短——系統實時時鐘錯誤
 4短2短3短——鍵盤控制器(8042)中的Gate A20開關有錯,BIOS不能切換到保護模式
 4短2短4短——保護模式中斷錯誤
 4短3短1短——記憶體錯誤(記憶體損壞或RAS設置錯誤)
 4短3短3短——系統第二時鐘錯誤
 4短3短4短——實時時鐘錯誤
 4短4短1短——串行口(COM口、滑鼠口)故障
 4短4短2短——並行口(LPT口、列印口)錯誤
 4短4短3短——數學協處理器(8087、80287、80387、80487)出錯

[閒聊] 適合coding的字型(font)

Written on 10:28 下午 by Yu Lai

http://www.proggyfonts.com/

其實也算分享啦,用起來版面給人很整齊舒適的感覺,
字母和符號有特別設計過,置中、固定寬度,但是只有one size。
作者說專門設計給code listing,偶爾換換字型也不錯^__^。

[閒聊] 淺談兔子是怎樣吃掉狼的

Written on 12:25 上午 by Yu Lai

一隻兔子在山洞前寫文章,一隻狼走了過來,問:

“兔子啊,你在幹什麼?”

兔子答曰:“寫文章。”

狼問:“ 什麼題目?”

兔子答曰:“《淺談兔子是怎樣吃掉狼的》。”

狼哈哈大笑,表示不信,於是兔子把狼領進山洞。

過了一會,兔子獨自走出山洞,繼續寫文章。

一隻野豬走了過來,問:“兔子你在寫什麼?”

兔子答:“文章。”

野豬問:“題目是什麼?”

兔子答:“《淺談兔子是如何把野豬吃掉的》。”

野豬不信,於是同樣的事情發生。

最後,在山洞裡,一隻獅子在一堆白骨之間,

滿意的剔著牙讀著兔子交給它的文章:

題目是:“《一隻動物,能力大小關鍵要看你的老闆是誰》。



這隻兔子有次不小心告訴了他的一個兔子朋友,

這消息逐漸在森林中傳播;

獅子知道後非常生氣,他告訴兔子:

“如果這個星期沒有食物進洞,我就吃你。”

於是兔子繼續在洞口寫文章

一隻小鹿走過來,“兔子,你在幹什麼啊?”

兔子答:“寫文章”

小鹿問:“什麼題目?”

兔子答曰:“《淺談兔子是怎樣吃掉狼的》。”

“哈哈,這個事情全森林都知道啊,你別胡弄我了,

我是不會進洞的”

“我馬上要退休了,獅子說要找個人頂替我,

難道你不想這篇文章的兔子變成小鹿麼?”

小鹿想了想,終於忍不住誘惑,跟隨兔子走進洞裡。

過了一會,兔子獨自走出山洞,繼續寫文章

一隻小馬走過來,同樣是事情發生了。

最後,在山洞裡,一隻獅子在一堆白骨之間,

滿意的剔著牙讀著兔子交給它的文章:

題目是:《如何發展下線動物為老闆提供食物》



隨著時間的推移,獅子越長越大,

兔子的食物已遠遠不能填飽肚子。

一日,他告訴兔子:“我的食物量要加倍,例如:

原來4天一隻小鹿,現在要2天一隻,

如果一周之內改變不了局面,我就吃你。

於是,兔子離開洞口,跑進森林深處,他見到一隻狼

“你相信兔子能輕鬆吃掉狼嗎”

狼哈哈大笑,表示不信,於是兔子把狼領進山洞。

過了一會,兔子獨自走出山洞,繼續進入森林深處

這回他碰到一隻野豬----“你相信兔子能輕鬆吃掉野豬嗎”

野豬不信,於是同樣的事情發生了。

原來森林深處的動物並不知道兔子和獅子的故事

最後,在山洞裡,一隻獅子在一堆白骨之間,

滿意的剔著牙讀著兔子交給它的文章

題目是:《如何實現由坐商到行商的轉型為老闆提供更多的食物》



時間飛快,轉眼之間,兔子在森林裡的名氣越來越大

因為大家都知道它有一個很厲害的老闆

這只小兔開始橫行霸道,欺上欺下,沒有動物敢惹牠

兔子時時想起和烏龜賽跑的羞辱

牠找到烏龜說:“ 三天之內,見我老闆!”揚長而去

烏龜難過的哭了

這時卻碰到了一位獵人,烏龜把這事告訴了他

獵人哈哈大笑

於是森林裡發生了一件重大事情

獵人披著獅子皮和烏龜一起在吃兔子火鍋

地下丟了半張紙片歪歪扭扭的寫著:

《山外青山樓外樓,強中還有強中手啊》!!



在很長一段時間裡森林裡恢復了往日的寧靜,

兔子吃狼的故事似乎快要被大家忘記了

不過一隻年輕的老虎在聽說了這個故事後,

被激發了靈感於是他抓住了一隻羚羊,對羚羊說,

如果你可以像以前的兔子那樣為我帶來食物那我就不吃你。

於是,羚羊無奈的答應了老虎,而老虎也悠然自得的進了山洞。

可是三天過去了,也沒有見羚羊領一隻動物進洞。

他實在憋不住了,想出來看看情況。

羚羊早已不在了,他異常憤怒。

正在他暴跳如雷的時候突然發現了羚羊寫的一篇文章

題目是:《想要做好老闆先要懂得怎樣留住員工》

[技術] Linux具名管線(FIFOs)編程

Written on 8:39 下午 by Yu Lai

From: http://blog.csdn.net/lcrystal623/archive/2007/03/16/1531201.aspx

具名管線可以用於任何兩個程序間通信,因為有名字可引用。注意管道都是單向的,因此雙方通信需要兩個管道。

下面分別是這兩個程式代碼,同樣是Lucy先運行,然後是Peter。

fifoLucy.c

#include <sys/types.h>
#include <sys/stat.h>

#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
char write_fifo_name[] = "lucy";
char read_fifo_name[] = "peter";
int write_fd, read_fd;
char buf[256];
int len;
struct stat stat_buf;

int ret = mkfifo(write_fifo_name, S_IRUSR | S_IWUSR);
if( ret == -1)
{
printf("Fail to create FIFO %s: %s",write_fifo_name,strerror(errno));
exit(-1);
}

write_fd = open(write_fifo_name, O_WRONLY);
if(write_fd == -1)
{
printf("Fail to open FIFO %s: %s",write_fifo_name,strerror(errno));
exit(-1);
}

while((read_fd = open(read_fifo_name,O_RDONLY)) == -1)
{
sleep(1);
}

while(1)
{
printf("Lucy: ");
fgets(buf, 256, stdin);
buf[strlen(buf)-1] = '\0';
if(strncmp(buf,"quit", 4) == 0)
{
close(write_fd);
unlink(write_fifo_name);
close(read_fd);
exit(0);
}
write(write_fd, buf, strlen(buf));
len = read(read_fd, buf, 256);
if( len > 0)
{
buf[len] = '\0';
printf("Peter: %s\n", buf);
}
}
}
fifoPeter.c
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>

int main(void)
{
char write_fifo_name[] = "peter";
char read_fifo_name[] = "lucy";
int write_fd, read_fd;
char buf[256];
int len;

int ret = mkfifo(write_fifo_name, S_IRUSR | S_IWUSR);
if( ret == -1)
{
printf("Fail to create FIFO %s: %s",write_fifo_name,strerror(errno));
exit(-1);
}

while((read_fd = open(read_fifo_name, O_RDONLY)) == -1)
{
sleep(1);
}

write_fd = open(write_fifo_name, O_WRONLY);
if(write_fd == -1)
{
printf("Fail to open FIFO %s: %s", write_fifo_name, strerror(errno));
exit(-1);
}

while(1)
{
len = read(read_fd, buf, 256);
if(len > 0)
{
buf[len] = '\0';
printf("Lucy: %s\n",buf);
}
printf("Peter: ");
fgets(buf, 256, stdin);
buf[strlen(buf)-1] = '\0';
if(strncmp(buf,"quit", 4) == 0)
{
close(write_fd);
unlink(write_fifo_name);
close(read_fd);
exit(0);
}
write(write_fd, buf, strlen(buf));
}
}

[技術] Linux Semaphores PV操作程式

Written on 8:36 下午 by Yu Lai

From: http://blog.csdn.net/lcrystal623/archive/2007/03/16/1531189.aspx

多程序實現PV操作,子程序為生產者,倉庫可以容納5個物品,每次檢查倉庫是否滿,若不滿則執行P操作,生產一個物品放入倉庫。父程序檢驗倉庫是否空,若不空則消耗一個物品,執行V操作。sleep函數是隨即設置生產或消費所用時間。

程式主要目的是展示Semaphores的使用,以備以後參考。

#include <stdio.h>
#include <stdlib.h>

#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/types.h>

int main()
{
int semID,ret,num;
int sleepTime;
struct sembuf buf;

semID = semget(IPC_PRIVATE,1,0666);
if(semID < 0)
{
printf("建立Semaphores出錯\n");
exit(1);
}

if(fork() == 0)
{
while(1)
{
num = semctl(semID,0,GETVAL,NULL);
if(num < 5)
{
sleepTime = rand() % 5;
sleep(sleepTime);

buf.sem_num = 0;
buf.sem_op = 1;
buf.sem_flg = 0;

ret = semop(semID,&buf,1);
if(ret < 0)
{
printf("執行P操作失敗!\n");
exit(1);
}

num = semctl(semID,0,GETVAL,NULL);
printf("生產者生產了一個物品放入了倉庫...倉庫中現有物品%d個\n",num);
}
}
}
else
{
while(1)
{
num = semctl(semID,0,GETVAL,NULL);
if(num > 0)
{
sleepTime = rand() % 5;
sleep(sleepTime);

buf.sem_num = 0;
buf.sem_op = -1;
buf.sem_flg = 0;

ret = semop(semID,&buf,1);
if(ret < 0)
{
printf("執行V操作失敗!\n");
exit(1);
}

num = semctl(semID,0,GETVAL,NULL);
printf("消費者從倉庫中消耗了一個物品...倉庫中現有物品%d個\n",num);
}
}
}

return 0;
}

[技術] Linux Message Queue程式

Written on 8:23 下午 by Yu Lai

From: http://blog.csdn.net/lcrystal623/archive/2007/03/16/1531183.aspx

檔案msg為空檔案,可以為任何內容,這裡只是為了ftok函數使用。程式透過建立Message Queue,完成程序間通信,注意msgrcv的第四個參數為Message Type,他定義了從Queue中取得Message的Type。

下面是msgLucy.c,是建立Message Queue的

#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <sys/types.h>

#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>

#define PROJID 0xFF
#define LUCY 1
#define PETER 2

int mqid;

void terminate_handler(int signo)
{
msgctl(mqid,IPC_RMID,NULL);
exit(0);
}

int main()
{
char filenm[] = "msg";
key_t mqkey;
struct msgbuf
{
long mtype; /* message type, must be > 0 */
char mtext[256]; /* message data */
}msg;
int ret;

mqkey = ftok(filenm,PROJID);
if(mqkey == -1)
{
perror("ftok error: ");
exit(-1);
}

mqid = msgget(mqkey,IPC_CREAT | IPC_EXCL | 0666);
if(mqid == -1)
{
perror("msgget error: ");
exit(-1);
}

signal(SIGINT, terminate_handler);
signal(SIGTERM, terminate_handler);

while(1)
{
printf("Lucy: ");
fgets(msg.mtext, 256, stdin);
if (strncmp("quit", msg.mtext, 4) == 0)
{
msgctl(mqid,IPC_RMID,NULL);
exit(0);
}
msg.mtext[strlen(msg.mtext)-1] = '\0';
msg.mtype = LUCY;
msgsnd(mqid,&msg,strlen(msg.mtext) + 1,0);
msgrcv(mqid,&msg,256,PETER,0);
printf("Peter: %s\n", msg.mtext);
}
}
下面的是msgPeter,是和Lucy通信的,程式先執行Lucy,再執行Peter
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <sys/types.h>

#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <string.h>
#include <stdlib.h>

#define PROJID 0xFF
#define LUCY 1
#define PETER 2

int main()
{
char filenm[] = "msg";
int mqid;
key_t mqkey;
struct msgbuf
{
long mtype; /* message type, must be > 0 */
char mtext[256]; /* message data */
}msg;
int ret;

mqkey = ftok(filenm, PROJID);
if(mqkey == -1)
{
perror("ftok error: ");
exit(-1);
}

mqid = msgget(mqkey, 0);
if(mqid == -1)
{
perror("msgget error: ");
exit(-1);
}

while(1)
{
msgrcv(mqid,&msg,256,LUCY,0);
printf("Lucy: %s\n",msg.mtext);
printf("Peter: ");
fgets(msg.mtext,256,stdin);
if(strncmp("quit", msg.mtext, 4) == 0)
{
exit(0);
}
msg.mtext[strlen(msg.mtext)-1] = '\0';
msg.mtype = PETER;
msgsnd(mqid,&msg,strlen(msg.mtext) + 1,0);
}
}