比特幣火速挖礦指南

比特幣最近滿流行的,聽說中國的大媽都在挖礦,我就來快速跟大家講一下如何挖吧!

首先需要一個比特幣錢包, 還沒有挖礦, 也沒有買賣, 要錢包做什麼? 主要是為了取得自己的地址, 打開錢包的收受方就會看到地址了. 他長得像一個 1 開頭的 32 bit 的十六進位的值, 不過除了阿拉伯數字還有英文的大小寫.

光是錢包就有很多選擇, 我安裝了號稱比較慢的 BitCoin-QT [6], 真的很慢~~~, 落後 75 個星期是什麼概念? 看來這東西不能用, 只要獲取地址就好.

其次需要一個挖礦機, 理論上什麼軟硬體都能挖礦. 新聞還報出了世芯電子出的挖礦機, 總之專屬的硬體一定是比一般的電腦好, GPU 又比 CPU 好.據說 Nvidia 的 CUDA 有比較好的加速, 

有了挖礦機之後還要去找礦池.

有沒有一次搞定的方法呢? 網站上 [1] 推薦使用 GUIMiner [2].顧名思義, 它是有 GUI 的挖礦機, 上面有個 server list (服務器), 從這裡就可以選要去哪個礦池 (server) 挖礦, 不同的 server 有不同的抽成規則, 總之, 為了好玩的話, 可以選一個抽成比較少的 [3][4].

選好 server 之後, 當然要去註冊啊!於是我就點了右邊的網站 http://mining.bitcoin.cz, 註冊需要定一個帳號和密碼, 還要用一個有效的 email address 去 active 這個帳號. 此時, 網站就會給您另外一個帳號和密碼, 這個是挖礦專用的, 要填在用戶名和密碼哪兩欄. 因為軟體已經偵測到我的顯卡 – CUDA 核心比 GTX760 多兩個的 GTX660 TI, 所以大致上就算 OK 了?

不! 我本來很開心地去點 “開始採礦", 想知道會發生什麼事? 結果底下跑出一行 bug 訊息: “ValueError: need more than 1 value to unpack”, 原來是我少了一個參數! 哪一個呢?原來我要在礦池登錄我的地址. 用申請帳號的那個 username 和 password 登入之後, 要在 My Account 的下面輸入 BitCoin Address! 剛剛從錢包裡抄來的地址, 在此正式派上用場! 附帶一提, 錢包裡的地址不用真的去抄寫, 它可以用 copy 的, 不然可累死了.

好了! 這次我真的可以採礦了! 軟體右下角的 “已停止" 會變成 “XX Mhash/s", 也就是每秒做多少 M  個 HASH. 我的顯卡跑起來大概是 98 個 M.

不過身為搞了好幾年演算法的人,怎麼能和大陸大媽做一樣的事呢? 當然是要研究一下採礦軟體怎麼寫? 以及開一個礦池來抽別人的成囉! 哈! 這個 BFGMiner 的網站 [5] 就是有提供 open source 的.只不過有 source code 的部分僅限於 OpenCL 的 CL 檔.

另外, 大家應該會想知道挖礦能不能回本吧, 網路上也有計算機 [7] 可以算. 重要的因素有三個, 一個是現在採礦的難度有多高, 這個 Difficulty Factor 會一直上升. 第二就是採礦的能力有多大, 我就填了我剛剛測到的 98MH/s. 然後就是匯率, 以現在的匯率來說,採一天是 0.08 美元, 也就是 2.4 元台幣左右. 換言之, 不是專業的採礦機是很難賺回電費的!

[REF]

1. 比特幣挖礦詳細圖文教程 

2. http://guiminer.org/

3. [Bitcoin礦池] 礦池Pool簡介 (中文)

4. Comparison of mining pools (英文)

5. http://bfgminer.org/

6. 下載 BitCoin-QT 錢包 Download Bitcoin-Qt

7. Bitcoin Mining Calculator

終於搞定 WDS

因為我的房間在四樓的關係, 所以 VDSL 當然也就裝在這裡.如果一樓要用網路, 就用 10 Mbps 的電力線橋接器接上小 AP 來使用.不過十年前的產品除了速度慢之外, 性能也不穩定. 即便是後來有 200 Mbps, 500 Mbps 的替代品, 還是偶爾需要 reset, 插拔一下. 最近天氣變冷, 不知怎麼搞得就再度故障了, 一回家就聽到老婆大人抱怨連連. 嗯, 不買 iPad 給她可能就沒有這個問題了…哈!

為了解決問題,一年前我買過號稱適用於 100 坪空間的 “穿牆王" AP – Tenda W309R 作為後援. 它有 7 dBi 的雙天線. 由於它並沒有功率調整的選項, 我就假設它已經輸出最大功率了. 此時, 我的 Mac Book Pro 在二樓還是可以收到訊號, 但是 new iPad 就不行.後來我想說, 是不是把天線反轉向下就可以? 結果也沒有比較好. 我想可能是指向性天線的關係, 在垂直方向確實可以收到訊號, 但是往下三層地板再換個房間就不太夠力了.

其實我真正想要搞定的一直是 WDS (Wireless Distribution System), 因為它可以不受電力線或網路線的限制, 我愛佈置兩台或三台都可以, 也不必追求大功率, 理論上應該比較健康. 自從知道有這項技術之後, 我也試著做了些設定. 但每次把第二台 AP 的 WDS 打開之後, 就再也找不到它了. 這次再度遇到電力線當機修不好, 我只好再研究一下別人是怎麼做得. 或許是因為這項技術愈來愈成熟, 隨便 Google 都可以找到一大堆教學, 這次再設不好就豬頭了.

歷次失敗的經驗很多, 其實我至少有 5 台 AP, 7 枝天線可以組合. 前天晚上試了很久, 證明不同廠商的 AP 真的很難連得起來. 想想乾脆再上網買一台 Tenda W309R 算了! 結果看到已經有 W309R+ 了,  差別在於天線換成 9dBi. 半夜下單之後, 昨天下班回家就收到一大盒產品. 我想可能是天線比較長吧? 光看外盒大小好像買了個 5 公升熱水瓶. 由於前天晚上已經 Google 了很多, 大概知道先前的問題所在, 我的作法大致是這樣:

1. 準備好兩台 AP, 一台連外稱為 AP1, 一台對內稱為 AP2.  連外的 AP1 要有 WAN, 我是讓它去撥接中華電信. AP2 就不必有  WAN 了.  如果有 FW 更新的話, 先把兩台 AP 都升級.

2. 拿條短 Ehternet 線連到 AP2 的 LAN port, 我是以固定 IP 有線的方式去連. 這麼做的原因是, 稍後 AP2 要換 SSID, 並且關掉 HDCP, 這麼做可以保持偵錯的方便性.

3. 由於 AP1 早就已經存在了, LAN IP 也設好 192.168.1.1, 因此我就把 AP2 的 LAN IP 設為 192.168.1.2.

4. 把 AP2 的網路加密方式設成和 AP1 一樣, 例如同樣是 WPA 或 WEP, 密碼 (金鑰) 也設成一樣.

5. 把 AP2 的 無線 Channel 設成和 AP1 一樣. AP1 如果是 autodetect, 就先連上 AP1 去改, 建議設為 1, 6, 或 11. 這樣以後要做 P2P 和 AP mode 互切的時候, 比較方便. P2P 的 social channel 就只支援 1/6/11 三個頻道.

6. 讓 AP2 去 scan wireless AP, 並且把 AP1 的 Mac address 存在來. 如果 AP2 沒有這個功能, 要先去連 AP1 偷看. 把 AP2 成為 WDS mode. 當然, 也把 AP2 的 Mac address 先拷貝一份起來.

7. 把 AP2 的 DHCP 關掉, 有些網站上說, 兩台 AP 的 SSID 不需要一樣. 但是這對 Tenda W309R 不適用, 總之把 AP2 的 SSID 設成和 AP1 一樣.

8. 拔掉網路線, 用無線去連 AP1, 把 AP2 的 Mac address 貼給 AP1, 把 AP1 設為 WDS. 並且把 AP2 用到的 IP address 從 DHCP 的範圍中扣除, 例如指定從 192.168.1.3 開始.

雖然穿牆王的功力之差有目共睹, 不過為了相容性起見, 我還是多敗了一台. 網路上有個默片教學, 相信按圖施工也是可以保證成功.

https://www.youtube.com/watch?v=6jrzcnvBMZI

[REF]

1. 無線WDS與網路中繼比較心得

2. [無線] Tenda W309R沒有想像中好

PC 當機的原因

前幾天,我那堪稱身強體壯的電腦居然當機了!這個問題源自於那天陪女兒去光南買文具時,意外看到 NBA2K14 的海報,它才賣 880 NTD 耶…, 一時衝動我就“支持原版“了。(不想支持原版的,請找大陸同胞就對了。)誰知這個遊戲讓我一跑就當機,從此開啟了我為期兩週的修電腦夢魘。

新遊戲導致當機當然先懷疑軟體,上網 Google 了一下,確實有類似的災情。這些網站上的好心人, 除了教人檢查CPU、顯示卡、記憶體、電源供應器等硬體之外,聽起來最合理的解法, 就是更新顯示卡的驅動程式和安裝 visual C run time library.

雖然這些試過了都沒有效果,但是過程中還是學到很多東西。例如 Everest 現在可以測試 PC 效能, 有些人跟我一樣, 跑到 sinJulia, 畫面就不會動或是當機了. 也有人同樣是跑 Windows 體驗分數時出問題, 大約在跑 Direct 9 測試的時候當掉! (有人說先把 WinSAT 目錄清掉再跑, 但這對我也沒用.) 另外就是我跑 3D Mark 必當, 只是時間早晚而已! 有人和我一樣, 也有人跑一個禮拜沒事!

經過觀察, 我發現只要跑 WinSAT 或是 3D Mark 時, 電腦的風扇聲就會變大. 我想, 或許電腦在偷偷超頻吧? 或許這就是原因? 於是我到 BIOS 那邊去做各種設定, 此時我才知道華碩的 P8Z68 還真是愛偷跑, 光是在 BIOS 簡易設定裡把效能降到最低並沒有用, 每次重新開機必定至少偷跑個十幾 MHz. 即使把 Ai 超頻設為手動, 企圖禁止它偷跑; 由於設錯了其他東西, 它還是毫無人性地把 CPU 從 3.4 GHz 超到 4.4 GHz. 然後告訴我開不了機. 

原來把 memory clock rate 降低, 搭配 BCLK / PCIE 比例設高也不行. 嘗試了幾次後, 最後的結論是: Ai 仍舊設為手動, Memory 設為 1333MHz (雖然我買 1600 MHz), BCLK / PCIE = 100 (設太低也會開不了機), Turbo 倍頻設自動, 然後 CPU 就會乖乖地停在 3.4GHz 了.

畢竟中間當了那麼多次, 硬碟沒病也變有病了! 於是我把 C 槽備份後, 做了一個晚上的 check disk. 然後重灌一次 Win7. 雖然我先前都用得好好的, 但是有些小地方讓我不太滿意. 像是金山毒霸會導致 iPad 偵測不到 (disable 後就可以, 不用移除.), 而且它把別人的首頁綁架軟體關了, 自己卻占住了首頁! 這些雜七雜八的軟體 (快播, 金山…) 都會一直開 pop 視窗, 也讓人煩不勝煩. 乾脆就來個浴火重生吧!

果然, 經過鎖定 CPU 頻率, check disk 之後, Everest 可以順利跑完了. 重灌之後, 試玩了 NBA2K14 也沒再當機. 經過一番波折, 我大概歸納出以下的結論:

1. 跑 memtest86, 若是能跑完 1 個 pass (大概一個晚上),表示 memory 基本上沒問題.

2. 如果進到 BIOS, 或是看 Everest 的 5V, 12V 電壓大概也在 5V, 12V 附近, 那麼 power 也沒有問題.

3. 能跑完 3D Mark, 顯示卡大概也沒問題.

4. 確定電腦不會自行超頻, 設定完成後, 重新開機看一次有沒有變化.

5. 檢查硬碟很重要. 2TB 大小也是要花ㄧ個晚上, 但值得做!

以上分享自己當機的悲慘經驗, 希望大家都可以迅速地解決問題. 因為計劃趕不上變化, 本篇還有些插曲, 我另外再寫兩篇給大家參考.

Android 手機記憶體不足問題

有好一陣子, 手機都在抱怨記憶體不足的問題.  我用的 Galaxy Note 有 1GB DDR 和 16 GB FLASH.  如果是 DDR 不足, 可以用手機助手…等軟體把不用的 task 清掉, 這個問題較小. 比較大的問題是 NAND 切給 data 的空間不足, 這個就不是外插一張 SD 卡的問題了.

關於 data 的空間不足, 主要原因是 android  會把內建的 NAND 分成幾個 partitionm 像是 boot, system, data,cache…. 等等, 當然也有分更細的. 像是 [1] 説到的 9~10 個 partition. 總之, 使用者可以自由使用來安裝 APK 的空間沒有想像中得大.  即使內建的 NAND 還有很大的空間, 但是它未必能給 APP 安裝使用. 我的手機就只有 2GB 可以放自己安裝的 APP. 所以不只是我, 別人也會遇到這個問題, 常見的建議如下:

1. 不要安裝太多 APP.

2. 把 APP 安裝到外部 SD 卡上.

3. 到設定程式管理員那裡把 cache 清一清.

4. 把 datamedia 底下的多媒體檔案清掉.

5. 把佔用資源很多的 APP 清掉, 例如 Platinum 雖然是好物, 但是它自己也很肥.

6. root 後把用不到的韓國 APP 殺掉! 例如 reader hub…等等.

7. root 後把 datadalvik-cache 清掉.

8. root 後把 dalvik-cache 搬到 SD 卡. [4-6]

9. root 後把 NAND 重新 partition

經過身體力行之後, 發現 7 是最有用的. 因為我雖然把不用的 APP 移除了, 但 Android 把它們的 Dalik 檔案 (一堆 .dex) 都保留了下來. 當我把整個資料夾 500 多個檔案清空, 然後重新開機, 雖然 Android 又針對還存在的 APP 優化了一次, 我確多了 100MB 以上的空間出來. 那些下載檔案放不下的問題就沒有再出現了.

方法 8 雖然比 7 更好, 不過反應速度不知道會不會變慢? 我的外接 SD 是 class 10, 理論上可以應付. 等到 7 撐不住了再來用 8.

至於方法 9, 這招我是不敢用.

[ref]

1.Android/partitions

2. 2013-07-17 [Android] App怎麼使用最Smart?關於App使用與系統效能調校的8個小撇步!

3. [Android] 何謂 dalvik cache?

4. Mounts2SD – Storage & Memory

5. Moving Dalvik Cache to SD Card.

6. 小V精簡dalvik-cache, 增加空間

 

Smart pointer 小註解

Smart pointer 是為了解決要了記憶體沒有還 – 導致 memory leak, 或是記憶體已經還了還在用 – 導致當機的問題. 直覺上, 還個記憶體好像並非難事, 何必大費周章呢? 主要是由函數返回指標時, 我們不能確定要在外面還還是裡面? 例如 [2] 所說的, 不是我 new 的, 需要我 delete 嗎?

DataGenerator DataGen;
int* A = DataGen.GetData();
delete A; // Should do this?

為了解決這個問題, 我們需要比較聰明的指標. 在 C++11 和 Android 裡面, smart pointer 的定義略有不同. 在 C++ 的話, 可以分為 3 種, 分別是: 前者的 unique ptr, shared ptr, waek ptr . 而 Android 裡面分為 strong pointer 和 weak pointer 兩種. 它們的定義分別如下 [1-2]. 如果是 MFC, QT… 的話, 都還有定義別種的 smart pointer [5-6], 基本上大同小異.

pointer 定義
unique_ptr 確保一份資源(被配置出來的記憶體空間)只會被一個 unique_ptr 物件管理的 smart pointer;當 unique_ptr 物件消失時,就會自動釋放資源。
shared_ptr 可以有多個 shared_ptr 共用一份資源的 smart pointer,內部會記錄這份資源被使用的次數(reference counter),只要還有 shared_ptr 物件的存在、資源就不會釋放;只有當所有使用這份資源的 shared_ptr 物件都消失的時候,資源才會被自動釋放。
weak_ptr 搭配 shared_ptr 使用的 smart pointer,和 shared_ptr 的不同點在於 weak_ptr 不會影響資源被使用的次數,也就是說的 weak_ptr 存在與否不代表資源會不會被釋放掉。
strong pointer 等同於 C++ 11 的 shared pointer
weak pointer 弱指針只能指一個 object, 所以沒有 counter. 它只是提供一個地址, 甚至還不能調用 object 的 member function 或是 variable.

強指針 (strong pointer = sp) 和一般的 shared_ptr 一樣, 透過 counter 來記錄有多少 “人" 引用這個 object?如果每個人都用完了, counter 歸零之後就可以被 free.  [1,4]  而弱指針 (weak pointer = wp) 並不理會還有沒有人用, 只要自己用完就可以 delete 了. 當然, 只有在同時也沒有強指針指到它才會被 delete. 參考 [5] 的例子.

ref1, ref2, ref5 都是強指針 sp, ref3 是弱指針 wp. ref4 是 promote 過後的弱指針. 弱指針也不永遠是扶不起的阿斗, 它可以用 promote function 升級為強指針  (寫到這邊, 電視上正在演 “見龍卸甲", 劉德華救阿斗耶…).

// 先定義 class, Android 用的是 frameworksbaseincludeutilsRefBase.h

namespace android {

class RefTest : public RefBase {
public:
    RefTest(int32_t id) : mID(id) {
        printf(“RefTest ctor: %dn", mID);
    }
    virtual ~RefTest() {
        printf(“RefTest dtor: %dn", mID);
    }
    int32_t id() const {
        return mID;
    }
private:
    int32_t mID;
};
// 測試 strong pointer 的函數

int strong_pointer() {

    sp<RefTest> ref1 = new RefTest(1);
    sp<RefTest> ref5;
    {
        sp<RefTest> ref2 = new RefTest(2);
        ref5 = ref2; // comment this out and check when the destructor of ref2 is called,
                          // ref5 又參考了 ref2
    }
    wp<RefTest> ref3 = ref1; // 弱指針也可以指向強指針, 但強指針不能指向弱指針.
    sp<RefTest> ref4 = ref3.promote(); // 弱指針可以 promote 為強指針
    if (ref4 == NULL) {
        printf(“RefTest object is destroyedn“); // 強指針和弱指針都沒有人用, 就可以回收了. 但還不會發生.
    } else {
        printf(“RefTest object %d is still aroundn", // 此時還有人用
            ref4->id());
    }
    ref4 = NULL; // ref4 清掉, ref3 是弱指針不用管, ref1 還在用
    ref1 = NULL; // comment this out to check to check change in prints
                         // ref1 也不用了.
    ref4 = ref3.promote(); // ref1 清掉, ref4 清掉, 所以 ref4 這次應該 NULL 了.
    if (ref4 == NULL) {
        printf(“RefTest object is destroyedn");
    } else {
        printf(“RefTest object %d is still aroundn",
            ref4->id()); // 清掉了
    }
    printf(“Before return n");
    return 0;
} 
強指標的觀念帶有 counter, 似乎已經相當完備; 為什麼有強指針以後, 還要有弱指針? 甚至要那麼麻煩地去升級弱指針呢? 其實弱指針並不像它的名字那樣一無事處, 它也具有立刻把記憶體立即釋放掉的優勢. 在 “IOS5 ARC 完全手冊" [9] 的文件裡面, 它把弱指針的用途做了說明.
這次的 reference 特別多, 因此本來想簡單寫完, 不料化簡為繁, 又化繁為簡, 前後竟然跨了四天.

[ref]

1. Android智能指针使用方法介绍

2. 避免 memory leak:C++11 Smart Pointer

3. What are strong pointers and weak pointers

4. android smart pointer – [1] 的原文

5. Smart Pointers to boost your code

6. dhav’s blog

7. QT smart point 智能指针

8. C++内存管理

9. ios 5 arc完全指南