2014年3月24日星期一

[]BmiUI - androidbmi - 設計使用者介面 - BMI (Body Mass Index) Calculator App on Android platform - Google Project Hosting

本文自动转发自我的博客: http://www.haofengjing.org/2549.html

視圖(View)

軟體設計的過程中,常常會遇到需要頻繁修改使用者介面的情境。改著改著程式設計師們就累積起了一些經驗,也歸納出了許多應對之道。如著名的 MVC(Model-View-Controller) 模式。Google Android 為我們考慮了介面修改問題。Android 為了單純化介面修改方式,採用了目前比較流行的解決方案--即將介面描述部份的程式碼,抽取到程式外部的 XML 描述文件中。

我們在前面的過程裡已經學到,如何在 Android 應用程式中替換 TextView 介面元件所顯示的純文字內容。那麼...這個經驗能不能直接用到 BMI 應用程式的設計上呢?

我們先回過頭來思考, 要實現基本的BMI計算功能,在螢幕上至少需要哪些介面元件,以供使用者輸入數值和查看結果?

為了輸入 BMI 程式所需的身高體重值,大致上我們需要兩個 TextView 元件用來提示填入身高體重數字,另外也需要兩個文字輸入欄位用來填入身高體重數字。我們還需要一個按鈕來開始計算,而計算完也需要一個 TextView 元件來顯示計算結果。於是初版的 BMI 應用程式介面的樣子就浮現出來了。

查閱文件

話說回來,我們從哪得知各種可用的介面元件呢?其中一個方法是查閱文件。

Android 文件網站上找到各種可用介面元件列表。

http://developer.android.com/guide/tutorials/views/index.html

例如我們想查看 EditText 的內容,我們可以點進 EditText 連結查看其內容。 http://developer.android.com/reference/android/widget/EditText.html

你會看到一個詳細地驚人的網頁。

這邊舉其中常用到的 EditText 介面元件為例。EditText 介面元件的作用就是提供一個文字輸入欄位。EditText 繼承自另一個叫 TextView 的介面元件,TextView 介面元件的作用是提供文字顯示,所以 EditText 介面元件也擁有所有 TextView 介面元件的特性。 此外,文件中你也可以查找到EditText 欄位的一些特殊屬性,如 「android:numeric="integer"」(僅允許輸入整數數字)、「android:phoneNumber="true"」(僅允許輸入電話號碼),或「android:autoLink="all"」(自動將文字轉成超連結)。 例如要限制 EditText 中只允許輸入數字的話,我們可以在 XML 描述檔中,透過將EditText 的參數「android:numeric」 指定為 「true」,以限制使用者只能在 EditText 文字欄位中輸入數字。

離線文件

當你處於沒有網路連接的情況下時,也可以找到 Android 文件參考。 在下載了 android-sdk 後,將之解壓縮,你可以在「android-sdk/docs」 目錄中 (android_sdk/docs/reference/view-gallery.html) ,找到一份與線上文件相同的文件參考。

開始設計

我們從實例來開始,定義一個基本 BMI 程式所需的身高(Height)輸入欄位,就會用到 EditText,與 TextView 介面元件,其描述如下:

1  <TextView  2     android:layout_width="fill_parent"  3     android:layout_height="wrap_content"  4     android:text="身高 (cm)"  5     />  6  <EditText android:id="@+id/height"  7     android:layout_width="fill_parent"  8     android:layout_height="wrap_content"  9     android:numeric="integer"  10    android:text=""  11    />

可以看到 EditText 介面元件描述的基本的組成與 TextView 介面元件相似,都用到了「android:layout_width」與「android:layout_height」屬性。 另外,指定的另外兩個屬性「android:numeric」、「android:text」則是 EditText 介面元件的特別屬性。「android:text」屬性是繼承自 TextView 介面元件的屬性。

    android:numeric="integer"      android:text=""

將 「android:numeric」 指定為 「integer」,可以限制使用者只能在 EditText 文字欄位中輸入整數數字。「android:text」屬性則是指定 EditText介面元件預設顯示的文字(數字)。

我們再來看看 Button (按鈕)介面元件

         <Buttonandroid:id="@+id/submit"              android:layout_width="fill_parent"              android:layout_height="wrap_content"              android:text="計算 BMI 值"              />

Button 介面元件同樣有 「android:layout_width」與「android:layout_height」屬性,另外一個「android:text」屬性則用來顯示按鈕上的文字。

整合

我們這就從文件中挑出我們需要的 TextView(文字檢視)、EditText(編輯文字)、Button(按鈕) 三種介面元件,照前面的設計擺進 LinearLayout (線性版面配置)元件中。

完整的「main.xml」介面描述檔如下:

    <?xml version="1.0" encoding="utf-8"?>      <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"          android:orientation="vertical"          android:layout_width="fill_parent"          android:layout_height="fill_parent"          >          <TextView              android:layout_width="fill_parent"              android:layout_height="wrap_content"              android:text="身高 (cm)"              />          <EditTextandroid:id="@+id/height"              android:layout_width="fill_parent"              android:layout_height="wrap_content"              android:numeric="integer"              android:text=""              />          <TextView              android:layout_width="fill_parent"              android:layout_height="wrap_content"              android:text="體重 (kg)"              />           <EditTextandroid:id="@+id/weight"              android:layout_width="fill_parent"              android:layout_height="wrap_content"              android:numeric="integer"              android:text=""              />           <Buttonandroid:id="@+id/submit"              android:layout_width="fill_parent"              android:layout_height="wrap_content"              android:text="計算 BMI 值"              />           <TextViewandroid:id="@+id/result"              android:layout_width="fill_parent"              android:layout_height="wrap_content"              android:text=""              />               <TextViewandroid:id="@+id/suggest"                   android:layout_width="fill_parent"                   android:layout_height="wrap_content"                   android:text=""                 />      </LinearLayout>

我們可以啟動模擬器檢視執行結果。或是在頁面標籤下選擇「Layout」標籤,來預覽頁面配置。

啟動模擬器之後,模擬器畫面上出現了兩個輸入欄位。欄位上方分別標示著「身高 (cm)」、「體重 (kg)」。在兩個輸入欄位下方,是一個標示著「計算 BMI 值」的按鈕。 當你在欄位中試著輸入文字或數字(你可以直接用電腦鍵盤輸入,或按著模擬器上的虛擬鍵盤輸入)時,你也會發現,正 XML 描述檔的描述中對兩個 EditText 欄位所規定的,欄位中只能輸入數字。

我們在上面XML描述檔中定義的最後兩個 TextView 介面元件,由於並未替這兩個介面元件指定「android:text」屬性,所以在螢幕上並未顯示。這兩個介面元件在後面章節中會派上用場。

革命的路還長

高興了沒多久,你發現按下"計算 BMI 值" 按鈕後,應用程式完全沒反應。

這是正常的,因為我們還沒處理從介面輸入取得身高體重、將數值導入 BMI 計算方式、將結果輸出到螢幕上...等等 BMI 應用程式的關鍵內容。 不過在進入了解程式流程之前,我們還有一個「android:id」屬性尚未解釋哩。 接著我們將透過講解「android:id」屬性,來進一步了解 Android UI。

視覺化的介面開發工具

目前的 ADT 版本提供了預覽介面的功能,但尚未提供方便地視覺化拖拉介面元件的開發工具。以後也許 ADT 會加入完整的 GUI 拖拉設計工具。

但在 ADT 加入完整的 GUI 拖拉設計工具之前,已經有人寫出來了對應 Android 的 GUI 拖拉設計工具,可供使用。

DroidDraw - Android GUI 拖拉設計工具 http://code.google.com/p/droiddraw/


[]ReadSource - androidbmi - 建立一個 Android 程式 - BMI (Body Mass Index) Calculator App on Android platform - Google Project Hosting

本文自动转发自我的博客: http://www.haofengjing.org/2547.html

在前幾章我們已經學到怎麼開啟現有的專案,也導覽過了整個模擬器的設定流程。 現在我們從設計一個簡單實用的身高體重指數計算(BMI)應用程式開始,學習設計一個 Android 應用程式所需的基礎。

維基百科上這麼介紹 BMI 身高體重指數:

身高體重指數(又稱身體質量指數,英文為BodyMassIndex,簡稱BMI)是一個計算值。  ...當我們需要比較及分析一個人的體重對於不同高度的人所帶來的健康影響時,  BMI值是一個中立而可靠的指標。

簡而言之,我們要設計的程式就是允許輸入身高體重,按下「計算 BMI」鍵後就在螢幕上顯示 BMI 值,並彈出「你應該節食囉」、或「你應該多吃點」...等健康建議。健康建議的判斷: 只要 BMI 值超過 「25」 時就算偏胖、BMI 值低於 「20」 就算偏瘦。 判斷寫得很簡單。畢竟我們要學習的關鍵知識,不是在於 BMI 值的算法或健康建議的內容,而是在於 Android 程式的運作方式。

參考資源 http://zh.wikipedia.org/wiki/身高體重指數

我們這就先從建立一個新的程式專案開始吧。

建立新程式專案

首先,我們照前面章節的教學,建立一個新的程式專案。並將新專案名稱命名為 BMI。 在「內容」欄裡,我們選擇「在工作區域中建立新專案」(Create new project in workspace)。 這時,如果在"選擇欄"取消掉勾選「使用預設目錄」(Use default location) 選項,我們就可以切換儲存專案的資料夾。 大部分的時候我們並不需去改動這個選項,而是直接使用預設的資料夾。

前面章節中都是開啟現有的專案,因此那些專案屬性 (Properties) 等內容都被自動填寫好了。這章中要從無到有新建一個專案,因此我們必須自行填寫專案相關的屬性。

在此對"New Android Project" 對話框中出現的這些欄位作些簡單的說明:

名稱 描述
Project Name 包含這個項目的資料夾的名稱
Application Name 顯示在應用程式上的標題
Package Name 套件(Package)名稱,JAVA 的習慣是用套件名稱來區分不同的類別(class)。依照專案的不同,我們會起不同的路徑名稱。
Create Activity 使否建立這個是項目的主要類別,勾選後可以指定這個類別的名稱。這個類別是一個 Activity 類別的子類別。我們可以在「Activity」中啟動程式和控制程式流程,或是根據需要控制螢幕、界面。
Build Target 選擇用來編譯專案的 SDK 版本。 當選定了 Build Target 後,開發工具會在 Min SDK Version 欄位中自動填入對應的值
Min SDK Version 本應用程式所支援的最低 SDK 版本代號。

我們在欄位中分別填入以下的值:

名稱
Project Name BMI
Application Name BMI
Package Name com.demo.android.bmi
Create Activity Bmi
Min SDK Version 4

填好值後按下「Finish」 按鈕,就建立好新專案了。

注意 Package Name 的設定,必須至少由兩個部分所構成,例如:com.android。「Activity Name」是指定用來產生預設 java 程式碼的文件名稱,與文件中預設 Activity 類別 (class) 的名稱。依照 java 語言的命名習慣,「Activity Name」最好採用開頭大寫的形式。

回到 Eclipse 主畫面,我們注意到在左側 Package Explorer 視窗中已順利新增加了一個 BMI 目錄。

程式專案架構

乍看之下,Android 插件已幫我們建立了不少檔案。 檢視新建立的 BMI 檔案夾中的內容,我們可以將一個 Android 應用程式基本的檔案結構歸納成如下:

我們來看看 Android 應用程式的基本檔案結構,以及各自所負責的內容。

src/ 原始碼(source)目錄

src 目錄中包含了一個 Android 應用程式中所需的各個程式碼檔案。這些檔案被包在對應 package 的子目錄下。(如本章的 BMI 例子中,子目錄指的就是 /src/com/demo/android/bmi/)

src 目錄中比較關鍵的程式有:

1. Bmi.java 這個檔案的檔名會隨著你在建立一個新的程式專案畫面中所填入「Create Activity」欄位值的不同而改變。這是新程式專案中的主要程式區塊。我們開發 Android 程式的多數時間,都是在 src 目錄下和 Android 打交道。

gen/ 自動生成(Generate)目錄

gen 目錄中存放所有自動生成的檔案。

gen 目錄中最關鍵的程式就是 R.java 檔。

1. R.java 這個檔是自動產生的。會由 ADT 插件自動根據你放入 res 目錄的 XML 描述文件、圖像等資源,同步更新修改 'R.java' 這個中介檔案。所有的 Android 程式中都會有以 R.java 為名的這個檔案,你完全不需要,也應避免手工修改 R.java 這個檔案。

R.java 中自動產生的 「R」 類別就像是個字典一樣,包含了使用者介面、圖像、字串等各式的資源與相應的編號(id)。Android 應用程式中很多時候會需要透過 R 類別調用資源。 編譯時編譯器也會查看這個資源列表,沒有使用到的資源就不會編譯進去,為手機應用程式節省不必要佔用的空間。

res/ 資源(Resource)目錄

「res」 目錄中存放所有程式中用到的資源檔案。"資源檔案"指的是資料檔案,或編譯時會被轉換成程式一部分的 XML 描述檔。Android 針對放在 「res」 目錄下的不同子目錄的資源,會有各自不同處理方式。因此我們寫程式時,最好能搞清楚各目錄下分別可放置的內容。

res/ 中的程式:

3. layout/ 版面配置(layout)目錄 「layout」目錄包含所有使用 XML 格式的介面描述檔。「layout」 中的 XML 介面描述檔就像寫網頁時用到的 HTML 檔案一樣,用來描述螢幕上的版面編排與使用的介面元件。XML 介面描述檔描述的內容可以是整張螢幕,也可以只描述一部分的介面(例如描述用來產生對話框的介面元件)。

雖然你也能直接通過 Java 來建立使用者介面,不過透過 XML 描述檔來建立使用者介面相對更簡單,架構也更清晰,以後維護時更容易釐清問題。要使用這些介面元件,應透過 「R.java」 檔中自動產生的 「R」 類別來調用。

4. values/ 參數值(value)目錄 「values」 目錄包含所有使用 XML 格式的參數值描述檔,可以在此添加一些額外的資源如字串(很常用)、顏色、風格等。使用時也是透過 「R」 類別來調用。

Android 功能清單

5. AndroidManifest.xml

AndroidManifest.xml」 是 Android 程式的功能清單,應用程式在這裡列出該程式所提供的功能。當應用程式開啟時,會提供諸如內容提供者(ContentProvider)、處理的資料類型、實際運行的類別、跨應用程式的資訊等等訊息。 你可以在此指定你的應用程式會使用到的服務(諸如電話功能、網路功能、GPS功能等)。 當你新增一個頁面行為類別 (Activity) 時,你也需要先在此註冊這個新增的 Activity 類別後,才能順利調用。

參考資料

Android 應用程式的檔案組織方式與用途 http://developer.android.com/guide/appendix/faq/commontasks.html#filelist


[]AndroidUI 描述使用者介面

本文自动转发自我的博客: http://www.haofengjing.org/2545.html
將一份創意落實到可執行的應用程式,背後需要的是從閱讀與寫作程式碼中累積的經驗,並有堅持理念、直到完成的耐心。

表達使用者介面

我們可以先用前幾章教的方法設定並執行模擬器,看看模擬器運作後的結果。

我們看到一個文字欄位,上面有一串文字 「Hello World, Bmi!」。這就是 Android 預設程式架構的範例囉。

由於才剛開始實際接觸到 Android 應用程式,我們先從簡單的開始:這一節中,我們的目標是將 「Hello World, Bmi!」 換成別的文字。

那麼,「Hello World, Bmi!」,這串字串藏在哪裡呢?

先打開 「res/layout/main.xml」

    1  <?xml version="1.0" encoding="utf-8"?>      2  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      3     android:orientation="vertical"      4     android:layout_width="fill_parent"      5     android:layout_height="fill_parent"      6     >      7      <TextView       8          android:layout_width="fill_parent"      9          android:layout_height="wrap_content"      10        android:text="@string/hello"      11        />      12</LinearLayout>

原來「Hello World, Bmi!」字串就藏在「res/layout/main.xml」這個檔案的第 10 行中。我們只要簡單地將第 10 行修改成如下

android:text="Hello World, Bmi!"

再執行一次模擬器,就可以得到一個相似的應用程式,只是內文變成了我們剛剛修改的內容。

既然找到了「Hello World, Bmi!」字串,我們就試著將「android:text」屬性值從「Hello World, Bmi!」改成「哈囉,BMI」,然後執行看看吧。

android:text="哈囉,BMI"

結果發現 Android 模擬器中文嘛也通,字型也相當漂亮。

要開始學習 Android 應用程式確實很簡單吧?不過為了顯示「Hello World, Bmi」,也用到了許多程式碼。到底這些程式碼有什麼含意呢?

我們馬上來學習 「main.xml」這個 XML 介面描述檔的內涵吧。

Android 平台裡,使用者介面都是透過 ViewGroup 或 View 類別來顯示。ViewGroup 和 View 是 Android 平台上最基本的使用者介面表達單元。我們可以透過程式直接呼叫的方法,調用描繪使用者介面,將螢幕上顯示的介面元素,與構成應用程式主體的程式邏輯,混合在一起編寫。或是,也可以將介面顯示與程式邏輯分離,照著 Android 提供的這個較優雅的方式,使用 XML 描述檔,來描述介面元件的組織。

講解

我們看到的「Hello World, Bmi」就包含在「main.xml」 這個檔案中。 接著,我們就直接分部份來講解這個「main.xml」 檔案裡的內容:

第 1 行

    <?xml version="1.0" encoding="utf-8"?>

XML (Extensible Markup Language) 是一種標記描述語言,不管是語法還是看起來的樣子,都相當類似網頁所使用的 HTML 標記語言。XML 被廣泛地運用在 Java 程式的設定中。「main.xml」 文件裡,第一行是每個 XML 描述檔固定的開頭內容,用來指示這個文字檔案是以 XML格式描述的。

第 2, 6 與 12 行

    <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"></LinearLayout>

接著我們看到第一個標籤,與 HTML 網頁標籤相當類似。

    <LinearLayout></LinearLayout>

"線性版面配置"(LinearLayout)標籤,使用了兩個「LinearLayout」標籤,來表示一個介面元件的區塊。後頭的標籤前加上一個「/」符號來表示結束標籤。"線性版面配置" 所指的是包含在 「LinearLayout」 標籤中,所有元件的配置方式,是將一個接一個元件由上而下排隊排下來的意思。

     xmlns:android="http://schemas.android.com/apk/res/android"

xmlns 開頭的這串敘述,是用來宣告這個 XML 描述檔案的的名稱空間(NameSpace),後面接的URL(網址),表示這個描述檔案會參照到 Android 名稱空間提供的定義。 所有 Android 版面配置檔案的最外層標籤中,都必須包含這個屬性。

注意標籤需要兩兩對稱。一個標籤「

<linearlayout>
」在一串敘述的前頭,另一個標籤「
</linearlayout>
」在敘述的末尾。 如果你修改過的標籤沒有閉合(忘了加 <、/、> 等符號),Eclipse 畫面上也會出現小小的警示符號來提醒你。

第 3-5 行

    android:orientation="vertical"      android:layout_width="fill_parent"      android:layout_height="fill_parent"

這些包含在「

<linearlayout>
」標籤中的敘述被稱為「LinearLayout」標籤的「屬性」。Android 應用程式在 layout 目錄中的標籤,大多數的屬性前都有一個「android:」前綴。同一個介面元件的屬性之間,是以空白做區隔,因此事實上你也能將多個屬性寫在同一行。當然,將屬性排成多行更易於閱讀。我們應該保持這個好習慣。

介面元件都有許多共同的屬性,例如介面元件的長,寬度設定屬性。Android 介面元件的寬度、長度設定屬性分別叫做「android:layout_width」、「android:layout_height」。兩個都設定為 「fill_parent」參數值。「fill_parent」 如其名,所表達的的意思就是"填滿整個上層元件"。預設LinearLayout 介面元件就會佔滿整個螢幕空間。

介面元件彼此間也會有一些不同的屬性,例如 「LinearLayout」(線性版面配置) 標籤的「android:orientation」(版面走向) 屬性。在此填入 「vertical」 (垂直)屬性值,表示這個介面的版面配置方式是從上而下垂直地排列其內含的介面元件。

「android.view.ViewGroup」 是各種佈局配置(layout)元件的基礎類別。常見的實現有

LinearLayout(線性版面配置)、FrameLayout(框架版面配置)、TableLayout(表格版面配置)、AbsoluteLayout(絕對位置版面配置)、RelativeLayout(相對位置版面配置)等。

雖然有這麼多種版面配置方式可以選用,但大多數的應用程式並不需特地去改變預設的 LinearLayout 的配置,只要專注在其中填入需要的介面元件即可。所以從第 7 行之後的內容才是一般應用程式開發時較常修改之處。

第 7 和 11 行

    <TextView          />

TextView (文字檢視)是我們看到的第一個熟悉的介面元件。其作用是顯示文字到螢幕上。你可能注意到這個標籤結尾使用了 「/>」 符號。 「/>」符號表示這個XML敘述中沒有內文,亦即此介面元件描述中不再包含其他介面元件,也表示這個介面元件就是這個螢幕中最小的組成單元了。

第 8-10 行

    android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:text="Hello World, bmi"

我們來看看 TextView 介面元件中包含了哪些屬性。

「android: layout_width」和「android:layout_height」我們剛剛已經學過了,分別代表寬度跟長度。「android: layout_width」 的 「fill_parent」 參數值表示寬度填滿整個上層介面元件(即 LinearLayout 介面元件)。「android:layout_height」則是用上一個新的參數值「wrap_content」(包住內容),亦即隨著文字欄位行數的不同而改變這個介面元件的高度。最後的 「android:text」 屬性則是 TextView 介面元件的主要屬性,亦即文字欄位中顯示的文字內容。至於「@string/hello 」這段字串所代表的意義,馬上會接著在後面章節說明。我們現在已知道是:只要將「android:text」屬性內容替換成我們想要文字,在預覽畫面或在模擬器中就會顯示對應的文字。

將以上的 XML 描述綜合起來,我們就可以得知「main.xml」 想表達的介面。


2014年3月23日星期日

[]mgpyh教你如何买美股 MGPYH 买个便宜货

本文自动转发自我的博客: http://www.haofengjing.org/2543.html

无论是老牌股票Google、Apple还是近期新秀Tesla,或者你看好360~,大洋彼岸的童鞋看到这些股票相对"稳健"的收益,各种心动。

在我国外汇管制下,每位公民个人结汇和境内个人购汇年度总额分别为每人每年等值5万美元,对于大多数童鞋来说,足够了。

作为境内居民,炒股票得从一些支持国内居民投资的券商入手,通过填写W8BEN(免除资本利得税),完成美股交易。

目前支持的券商比较多,比如ETRADE(无中文)、IB盈透证券、firstrade、FIDELITY富达投资、SCHWAB嘉信理财等,他们的费率参考下图。部分券商比如Scottrade等还需要地址证明信息,可以查看这里

所以咱们炒美股,三步走:1、在线开户 2、邮寄身份信息以及W8BEN表格3、转账到券商。
  1. ######在线开户

如上所述开户方面,可以选择的余地非常多,比如Firstrade开户链接,按照步骤走,10分钟肯定可以完成。

大致步骤是a:填写必要信息,设定2次四位数PIN密码,一般网上填表完成以后的第二个工作日,Firstrade的客服人员就会发Email给你通知你。

  1. ######在线邮件身份信息,以及快递W8BEN表格

主要内容包括:电子交易合约书(Online Service Agreement)邮件确认;以及护照扫描件等,没有护照的童鞋就洗洗睡吧。

W-8BEN表格:该表格特别重要,需要打印出来签上姓名和日期后原件寄给券商(EMS、顺丰都有国际件服务,UPS之类亦可),其他文件则可只发扫描件给券商。

同时,一定要和护照上的亲笔签名保持一致,日期顺序也请按表格上的提示正确填写,一般为月/日/年)

  1. ######转账到券商

目前主要的方法有开设招商银行的香港一卡通用以转账;或者使用工商银行的亚洲账户;以及光大银行、中国邮政储蓄都有相关汇款服务,想省事,就选择前面两家吧。

其他有用信息
  • 美股交易时间,以东部时间为例,上午9:30-下午4:00,美国从每年4月到11月初采用夏令时,这段时间其交易时间为北京时间晚9:30-次日凌晨4:00,而在11月初到4月初,采用冬令时,则交易时间为北京时间晚10:30-次日凌晨5:00,交易是熬夜的节奏。

  • 部分券商在较少资金时候有T+N的限制,不能立刻卖出,美股瞬息万变,风险其实不小,如果长期做价值投资,比如某人的可口可乐神话,倒是可以一看。

  • 一些美股的分析观察,可以参考雪球

  • 另外,如果认为公司规模大很重要,又没准备投资除指数外的其他基金,在scottrade开户即可。而firstrade则一直做华人生意,有中文客服,公司规模比如斯科特。

  • 知乎等网站亦有类似的讨论,如果本文看不懂,可以参考他们。


2014年3月22日星期六

[]whatsapp深度使用Erlang有感 | 系统技术非业余研究

本文自动转发自我的博客: http://www.haofengjing.org/2534.html

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: whatsapp深度使用Erlang有感

这么多年过去了,社区还在讨论erlang是不是小众语言,各种怀疑的时候,whatsapp已经把erlang用到了极致。

logo-text-ver-color

whatsapp是什么? 参见它的 官网

WhatsApp Messenger is a cross-platform mobile messaging app which allows you to exchange messages without having to pay for SMS.

更为搞笑的是 主要开发者Rick Reed(rr@whatsapp.com),之前在Yahoo!, SGI工作,有着深厚的系统性能的背景。

在2012年开发push服务器的时候:efsf2012-whatsapp-scaling

Joined WhatsApp in 2011,New to Erlang

完全是个新手。

在2013年开发多媒体支持系统的时候:reed-efsf2013-whatsapp

Joined server team at WhatsApp in 2011,No prior Erlang experience

2-3年后他已经是Erlang的最高级别的行家了。

从他的二篇ppt的内容来看, 他把erlang的特性发挥到了极致,利用到了它最好的vm、 集群基础设施、数据库mnesia, 消除了非常多的数据Scale、内存池和锁的问题, 提到的技术和修正点非常值得我们参考。

虽然大部分的解决方法我们在日常都差不多用过。但是他很系统的整理出来,用在商业系统了,这是个非常大的飞跃。

下面摘抄几个数据,希望能让继续怀疑erlang的人能重新思考下:

whatsapp后台架构以erlang为主: wa1 二百多万的长连接push服务器: wa4

whatsapp数据集mnesia的规模: wa2

生产系统的数据: wa3

每秒的消息数: wa6

媒体的报道:传Facebook与Whatsapp展开收购谈判: wa5

小结:任何系统开发到最后,都是依靠操作系统,硬件提供的能力,需要解决的问题都是一样的,没有捷径! hard working是必须的,依靠erlang团队做了大量的工作,这个为业务定制系统的工作可以变成轻松好多! 停止怀疑吧,加入这个阵营,收获不会少的。

祝玩得开心!


[]$190亿的背后 – WhatsApp架构分析笔记 | 行思錄 | Travel Coder

本文自动转发自我的博客: http://www.haofengjing.org/2531.html

就架构本身来看,WhatsApp (后简称WA, 哇……)的架构属于"实在是太简单了,没有太多分析的价值"。概括起来就是Erlang on FreeBSD through XMPP.

业务需求决定架构。WA用户从零增长到4.5亿月活的过程中基本没有遇到系统扩展性的问题「昨天宕机三个小时原因也不是系统性能的问题,而是路由器的问题」。一方面由于WA业务比较单一,另一方面也得益于对系统的持续优化。

WA的架构在发展过程中有两个比较有意思的阶段: 1. 从C200K到C2800K「C: 这里特指Connection」。 2. 多媒体处理系统升级与优化。

这两个阶段都是在Rick Reed牵头下完成的。这哥们是个比较有意思的人物:2011年从雅虎跳巢到WA「时机把握得真好!」,当他来到WA的时候,居然不知道Erlang是什么东东。然而,仅仅一年后就交出了一台服务器处理百万并发连接的答卷,两年后已经成为Erlang领域的顶尖专家。这哥们貌似很喜欢足球,两次系统优化都是足球夜激增的流量激发了他upgrade的念想:)。

从C200K到C2800K

优化前,一个节点的连接负载能力约为200K,并面临着用户连接增多时系统过载和失败等问题。系统优化的目标很明确:

  • 将一个节点连接负载能力提高到C1000K
  • 可应对软硬件错误/故障以及突发事件造成的连接激增

所采用的方法详见Rick Reed, Scaling to Millions of Simultaneous Connections, March 30 2012. 简单来说,就是把以前所有系统资源利用不合理以及有更高效解决方式的地方都fix了一遍,然后持续优化和改进。根据Rick Reed的数据,第一轮下来提高到了C1000K,第二轮下来提高到了C2000K,并成功顶住了C2800K的峰值。不过Rick Reed认为承受C3000K也是没有问题的。

一些启示:

  • Erlang拥有良好的SMP扩展性,并行优势很明显(24逻辑核上,>85%的利用率)
  • 系统的资源争用有时候会产生难以置信的内耗。从C200K到C2000K就是通过解决/优化资源争用问题完成的。
  • 对于使用频繁的函数,考虑使用更加高效的实现方式往往能收到"小处大为"的效果(WA中使用更加高效的cpu_timestamp,os:timestamp取代erlang:now。对于一个消息系统来说,这两个函数的优化很有意义)
  • 不要忘了客户端App的优化
  • 整个系统的性能取决于木桶最短的那根。很多时候,语言都很难成为最短的那根。当然,更没有必要因为WA是用Erlang构建的,你要把自己的系统转到Erlang上来。

多媒体处理系统升级与优化

最开始,系统是基于lighttpd + PHP. 为了让这个子系统具有更好的扩展性、稳定性以及用户体验,Rick对他进行了一次Erlang化改造。详细参见Rick Reed, March 21 2013。升级或的架构图如下图所示:

wa_mms

数据存储方面,垂直和水平都做了分片:

wa_db_sharding

新架构下的系统峰值性能:

  • 214M images in a day
  • 8.8K images/sec downloades
  • 29 Gb/sec output bandwidth

好啦,WA讲述的根本就不是Brian Acton屌丝逆袭的故事。它讲述的是Rick和Erlang的恋爱史。至此,移动端的IM布局基本也就不会发生大的变化了。在一次对Rick的采访中,有一个问题很有意思:

Mirko: Since you are working for the most used messaging system on the planet I have two non-technical questions. What is from your point of view the best thing introduced by digital communications? And on the other side, what do you miss from the "paper and pen" communication era?

Rick: Well we've come a long way from my first experience with digital communication, email on the arpanet. Today, I'm just a few taps on my smartphone away from instant communication with my family, friends, and coworkers, no matter where they are.

I think the downside is that because there are so many ways to communicate (phone, voicemail, email, messaging), you almost have to establish a mapping between each of the people and organisations in your life and how best to communicate with them. And if you get the mapping wrong, the mismatch between what you expect and they expect can cause all kinds of trouble.

小龙和企鹅看完会心一笑。


[]一周热点:领先Google 150年的数据可视化及WhatsApp架构解析-CSDN.NET

本文自动转发自我的博客: http://www.haofengjing.org/2529.html

大数据这一近年来才流行起来的技术,看似十分深奥,但是早在150年前人们就开始使用大数据分析赶走霍乱,利用"小猎犬号"超级计算机来基因测序解决了很多医学上的难题;不顾谷歌CEO阻拦,Facebook最终以190亿美元的天价收购了WhatsApp,Facebook真正看重还是WhatsApp会成为下一个10亿用户应用,IBM出手收购NoSQL数据库公司Cloudant……

1. 领先Google 150年的数据可视化和"不务正业"的超级计算机

谷歌应用数据分析流感疫情堪称经典,然而早在150年前,既有数据分析赶走霍乱的先例。Farr和Snow对霍乱有着完全不同的两套理论,而且证明的方法也完全不一样。Farr是一个沉迷于数据的统计学家,其大量的图表文档表明了霍乱和海拔有联系(他认为是瘴气的原因)。Snow是一名医生,他把注意力放在病人身上,其观察显示霍乱从胃部进入人体,这让他相信是摄取食物或水的问题,最后他把问题指向了公共水源。

基因科学其实也不仅是医学问题,超级计算机"小猎犬号"的加入让基因问题变成一个个"大数据"。这台超级计算机被命名为"小猎犬号"(很容易让人联想到达尔文在1831年那次著名的科学之旅),安置在伊利诺伊州Argonne国家实验室的理论与计算科学大厦,"小猎犬号"可应用于生物医学研究领域的计算、仿真和数据分析。

 

"小猎犬号"是Cray XE6超级计算机——它能够在短短2天内分析240个完整基因组

该团队指出,生产DNA序列成本的降低使整个基因组测序进度加快。但由于一次分析好几个基因组需要很大的计算量,这又带来了"计算瓶颈"的问题。而有了超级计算机以后不用再局限于一次只能观察一个基因组,它可以同时处理多个基因组。

2. 支撑4.5亿活跃用户的WhatsApp架构概览

不顾谷歌CEO阻拦,WhatsApp最终以190亿美元的价格花落Facebook。能获如此天价与其月4.5亿的活跃用户是分不开的,同样不可或缺的还有支撑每日数百亿消息的高可靠架构。

硬件:标准的面向用户服务器:

  • Dual Westmere Hex-core(24个逻辑CPU)
  • 100 GB RAM、SSD
  • Dual NIC(公共面向用户的网络、私有的后端 /分布)

产品

  • 聚焦消息传递。连接来自世界各地的用户,忽视他们的地理位置,无需支付高额费用,创始人Jan Koum还经常提起1992年在世界各地与家里人联系是多么的难。
  • 隐私。由Jan Koum制定,消息不会在服务器上储存,聊天记录也不会储存,目的就是不去了解用户隐私。不会保存用户姓名及性别,聊天记录只存储在电话上。

架构的其它详细信息请关注原文。

 

准确的说,190亿美元收购WhatsApp是为了它的4.5亿用户,为了它的日百万用户增加,为了它可能会有10亿用户的潜能——Facebook需要WhatsApp成为下一个10亿用户应用,当然只能成为它的一部分。同时,40美元一个用户的价格也并不离谱,特别是以股票充当大部分金额。Facebook曾今使用  30美元每用户的价格收购了Instagram,而  Twitter的每个用户更值110美元。  

3. 当DDoS跨入400Gbps时代,那些来自孩子们的攻击该如何应对!

从2013年3月的300Gbps到2014年2月的400Gbps,DDoS攻击以惊人的速度进入200-400Gbps时代;然而通过KrebsOnSecurity了解到,在DDoS服务租赁者中存在大量的年轻人,他们期望通过破坏别人的网站或服务以炫耀自己,而KrebsOnSecurity在这周也受到一位15岁男孩的攻击,他称自己为"Mr. Booter Master"。而通过KrebsOnSecurity网站选择的安全公司Prolexic Technologies得知,就是这个15岁的孩子发起了一个接近200Gbps的攻击。

通过该安全公司还得知,这次攻击仅仅持续了10分钟左右,与其说是破坏不如说是演习和验证。通过知情人士还得知,攻击者的目的在于通过这种方式向Darkode论坛管理员证明他可以为社区贡献更多:类似"Mr. Booter Master"这个年龄段的攻击者还有很多,他们通过各种各样的方式证明自己的实力,但是无可否认的是他们的目的只有一个——为了娱乐!

 

从Arbor Networks得知,2013年NTP攻击得到了长足的发展,DDoS攻击已经步入200-400Gbps时代。需要注意的是,这点并不仅限于欧美等国家—— 2014春节期间,阿里云曾遭遇一场160Gbit/s DDoS攻击,虽然官方公布了这场博弈的结果,但是如果下方回帖网友使用的也是阿里云服务的话,情况似乎并不乐观。同时,不可否认的是,在200-400Gbps DDoS攻击数量级下,国内的防范之路还有很长一段要走。

4. 不差钱:30+收购案,170亿美元投资,IBM再度出手收购Cloudant

北京时间2月25消息:IBM宣布收购数据库即服务(DBaaS)供应商Cloudant,预计Cloudant的收购将在2014年第一季度完成。Cloudant一共只有大约60名员工,但却拥有2500多家客户,其中包括一些非常著名的公司比如三星、Adobe和诺基亚等。

此次收购案有助于夯实IBM在云计算领域的基础,但是Cloudant没有被直接投资者Rackspace收购的确让很多人大为不解,IBM的此番收购正好赶上Rackspace前CEO辞职不久,时间非常敏感。

 

 IBM CEO Ginny Rometty

这笔收购标志着IBM继续投资云计算和大数据。除了研究和开发的投资,公司在这个领域投资已经超过170亿美元,完成30个以上的收购。最初160亿美元是2015年的目标,公司已将预算提高到200亿美元。

IBM试图通过收购Cloudant利用全球移动设备用户。世界各地的移动电话用户每天产生5PB的数据,用户可以轻松地利用网络和设备访问这些数据,Cloudant帮助创建这些可扩展的应用程序

5. 英特尔至强E7 v2处理器:2倍性能提升,3倍内存容量,4倍I/O带宽

重塑数据中心一直是英特尔在服务器领域的远大目标,2014 年2月25日,为了进一步推动关键业务、数据分析等技术应用创新,英特尔在北京举办了主题为"洞察先机极智领航" 英特尔至强处理器 E7 v2产品发布会。

英特尔数据中心事业部副总裁兼数据中心市场部总经理 Shannon Poulin

本次发布会上,英特尔针对该创新产品在数据分析领域中的应用价值进行了详细解析。与RISC架构相比,英特尔至强E7 v2处理器能够将性能提升多至80%,并可将4年总体拥有成本降低80% 。此外,与前一代产品相比,E7 v2的性能、内存容量支持、 I/O 带宽及关键业务可靠性等方面都取得了重大突破:平均性能提升至2倍、3倍于上一代产品的内存容量支持、 高级RAS特性大幅度提升系统连续运行时间和可靠性。未来,全球各地的 21 家系统制造商,预计将会推出超过 40 个基于英特尔强至处理器 E7 v2 产品家族的平台 

6. AT&T联手IBM对抗AllSeen:"晚点和堵车"将成历史

电信巨头AT&T和IBM正在共同努力,利用物联网大潮,计划从城市和公用事业开始发力。AT&T拥有全球通信网,蓝色巨人拥有强大的软件技术来分析和可视化大量来自不同地方的传感器数据,当然它无与伦比的硬件技术也可以用来处理这些信息。

如果现在哪天上班不堵车,可能还真觉得不正常,你能想象在北京这样的大城市不堵车是什么情形吗?没有什么是做不到的,AT&T和IBM在物联网领域展开合作,并直接以城市的公用事业为发力点,打造智慧城市。此前IBM已经在都柏林和爱尔兰测试了公交车的准点到达技术,并取得不错的效果。

                

                                                  洛杉矶市中心的AT&T交换中心                    

AllSeen Alliance项目以开源项目 AllJoyn 为基础,后者首先由高通发起,其目标是让各种各样的设备、应用及服务都能通过各种在线或离线渠道(如WiFi、电线或以太网)进行连接。AllJoyn 不需要互联网连接,且设计为跨操作系统及平台连接。基于AllJoyn 框架的直接对等交互可极大丰富用户体验,用户将可以在目前享受到的基于云服务基础上进一步享受到附近物联网的好处。

7. 轻松搞定TB级数据,开源GraphLab突破人类图计算"极限值"

近日一家新公司的成立大大推动了开源项目GraphLab的发展,该公司由GraphLab的开发者组成,筹集资金为图数据集开发分析工具。GraphLab公司也将继续使用开源GraphLab"突破图计算的极限,努力创新"。 由于SFrames类似于Pandas(PyData)和R数据架构,数据科学家可以非常方便快速地使用它们,提高工作效率。

GraphLab的SFrame是一种趣味十足而低调神秘的工具,首次在Strata Santa Clara被揭开面纱。它基于磁盘,并通过二维表形式将GraphLab扩展到了表格数据。通过添加SFrame,用户可以利用GraphLab中许多处理图或表中数据的算法。更重要的是SFrame增加了GraphLab数据科学工作流的覆盖范围:它允许用户直接使用GraphLab对TB大小的数据集进行数据清洁或者创建新的功能,SFrame性能可以通过增加内核实现线性扩展。

更多云热点内容:特种作战,纽约极客企图建造