mvc數字貨幣
㈠ 數字貨幣交易所系統比較成熟的軟體有啥特點
使用區塊鏈技術,區塊鏈技術現在很多人都在研究,但是真正用在數字貨幣上的還是很少。
SSM (SpringMVC Spring Mybatis)開發框架
單組至少6台伺服器運行(無上限)
Restful設計風格
冷熱存儲設計
支持7000+高並發等等技術特點這些還是很重要的,互融雲可以
目前市面上常見的是在原有的軟體基礎上改的,數字貨幣的交易對安全性能的要求較高,所以區塊鏈技術得運用還是最重要的。
㈡ angularjs filter怎麼顯示數字和顏色
一,內置的過濾器
1,uppercase,lowercase大小轉換
?
1
2
{{ "lower cap string" | uppercase }} //結果:LOWER CAP STRING
{{ "TANK is GOOD" | lowercase }} //結果:tank is good
|這里的豎線是一種管道功能,如果對linux比較熟悉的話,這塊的|根linux的管道功能,基本是一樣的
2,json格式化
?
1
{{ {foo: "bar", baz: 23} | json }} //結果:{ "foo": "bar", "baz": 23 }
注意:bza沒格式前是沒有雙引號的,格式化後就轉換成了json數據了。
3,date格式化
?
1
2
3
{{ 1304375948024 | date }} //結果:May 3, 2011
{{ 1304375948024 | date:"MM/dd/yyyy @ h:mma" }} //結果:05/03/2011 @ 6:39AM
{{ 1304375948024 | date:"yyyy-MM-dd hh:mm:ss" }} //結果:2011-05-03 06:39:08
4,number格式化
?
1
2
{{ 1.234567 | number:1 }} //結果:1.2
{{ 1234567 | number }} //結果:1,234,567
5,currency貨幣格式化
?
1
2
{{ 250 | currency }} //結果:$250.00
{{ 250 | currency:"RMB ¥ " }} //結果:RMB ¥ 250.00
6,filter查找
?
1
2
3
4
5
6
7
8
9
10
11
12
13
{{ [{"age": 20,"id": 10,"name": "iphone"},
{"age": 12,"id": 11,"name": "sunm xing"},
{"age": 44,"id": 12,"name": "test abc"}
] | filter:'s'}} //查找含有有s的行
//上例結果:[{"age":12,"id":11,"name":"sunm xing"},{"age":44,"id":12,"name":"test abc"}]
{{ [{"age": 20,"id": 10,"name": "iphone"},
{"age": 12,"id": 11,"name": "sunm xing"},
{"age": 44,"id": 12,"name": "test abc"}
] | filter:{'name':'iphone'} }} //查找name為iphone的行
//上例結果:[{"age":20,"id":10,"name":"iphone"}]
7,limitTo字元串,對像的截取
?
1
2
3
4
5
6
7
{{ "i love tank" | limitTo:6 }} //結果:i love
{{ "i love tank" | limitTo:-4 }} //結果:tank
{{ [{"age": 20,"id": 10,"name": "iphone"},
{"age": 12,"id": 11,"name": "sunm xing"},
{"age": 44,"id": 12,"name": "test abc"}
] | limitTo:1 }} //結果:[{"age":20,"id":10,"name":"iphone"}]
8,orderBy對像排序
?
1
2
3
4
5
6
7
8
9
{{ [{"age": 20,"id": 10,"name": "iphone"},
{"age": 12,"id": 11,"name": "sunm xing"},
{"age": 44,"id": 12,"name": "test abc"}
] | orderBy:'id':true }} //根id降序排
{{ [{"age": 20,"id": 10,"name": "iphone"},
{"age": 12,"id": 11,"name": "sunm xing"},
{"age": 44,"id": 12,"name": "test abc"}
] | orderBy:'id' }} //根據id升序排
二,自定filter功能
我找了一個基本angularjs的mvc框架,phonecat,自定義filter也是在這基礎寫的,這個框架挺好用的。
1,filters.js添加一個mole
?
1
2
3
4
5
angular.mole('tanktest', []).filter('tankreplace', function() {
return function(input) {
return input.replace(/tank/, "=====")
};
});
2,app.js中載入這個mole
?
1
2
3
4
5
6
var phonecatApp = angular.mole('phonecatApp', [
'ngRoute',
'phonecatControllers',
'facebookControllers',
'tanktest'
]);
3,html中調用
?
1
{{ "TANK is GOOD" | lowercase |tankreplace}} //結果:===== is good
注意:| lowercase |tankreplace管道命令可以有多個
三、filter的兩種使用方法
1. 在模板中使用filter
我們可以直接在{{}}中使用filter,跟在表達式後面用 | 分割,語法如下:
?
1
{{ expression | filter }}
也可以多個filter連用,上一個filter的輸出將作為下一個filter的輸入(怪不得這貨長的跟管道一個樣。。)
?
1
{{ expression | filter1 | filter2 | ... }}
filter可以接收參數,參數用 : 進行分割,如下:
?
1
{{ expression | filter:argument1:argument2:... }}
除了對{{}}中的數據進行格式化,我們還可以在指令中使用filter,例如先對數組array進行過濾處理,然後再循環輸出:
?
1
<span ng-repeat="a in array | filter ">
2. 在controller和service中使用filter
我們的js代碼中也可以使用過濾器,方式就是我們熟悉的依賴注入,例如我要在controller中使用currency過濾器,只需將它注入到該controller中即可,代碼如下:
?
1
2
3
app.controller('testC',function($scope,currencyFilter){
$scope.num = currencyFilter(123534);
}
在模板中使用{{num}}就可以直接輸出$123,534.00了!在服務中使用filter也是同樣的道理。
此時你可能會有疑惑,如果我要在controller中使用多個filter,難道要一個一個注入嗎,這豈不太費勁了?小兄弟莫著急~ng提供了一個$filter服務可以來調用所需的filter,你只需注入一個$filter就夠了,使用方法如下:
?
1
2
3
4
app.controller('testC',function($scope,$filter){
$scope.num = $filter('currency')(123534);
$scope.date = $filter('date')(new Date());
}
可以達到同樣的效果。好處是你可以方便使用不同的filter了。
㈢ nvelocity解析什麼出錯
一、NVelocity介紹
1.1 Velocity是什麼
nVelocity是一個基於.NET的模板引擎(template engine)。它允許任何人僅僅簡單的使用模板語言(template language)來引用由.NET代碼定義的對象。
當nVelocity 應用於web開發時,界面設計人員可以和.NET程序開發人員同步開發一個遵循MVC架構的web站點,也就是說,頁面設計人員可以只關注頁面的顯示效果,而由.NET程序開發人員關注業務邏輯編碼。nVelocity將.NET代碼從web頁面中分離出來,這樣為web站點的長期維護提供了便利,同時也為我們在aspx之外又提供了一種可選的方案。
nVelocity的能力遠不止web站點開發這個領域,例如,它可以從模板(template)產生SQL和PostScript、XML,它也可以被當作一個獨立工具來產生源代碼和報告,或者作為其他系統的集成組件使用。nVelocity也可以為很多web開發架構提供模板服務(template service)。我們的系統就提供一個模板服務的方式允許一個web應用以一個真正的MVC模型進行開發。
1.2 nVelocity能為我們作什麼?
1.1 VTL (nVelocity template language)
VTL意味著提供最簡單、最容易並且最整潔的方式合並頁面動態內容。 VTL 使用references來在站點內嵌套動態內容,一個變數就是一種類型的reference。變數是某種類型的reference,它可以指向.NET代碼中的定義,或者從當前頁面內定義的VTL statement得到值。下面是一個VTL statement的例子,它可以被嵌套到 HTML代碼中:
#set ( $a = 「Velocity」 )
和所有的VTL statement一樣,這個statement以#字元開始並且包含一個directive:set。當一個在線用戶請求你的頁面時,nVelocity Template Engine將查詢整個頁面以便發現所有#字元,然後確定哪些是VTL statement,哪些不需要VTL 作任何事情。
#字元後緊跟一個directive:set時,這個set directive使用一個表達式(使用括弧封閉)將一個值設置給變數。變數被列在左邊,而它的值被列在右邊,最後他們之間使用=號分割。
在上面的例子中,變數是$a,而它的值是Velocity。和其他的references一樣以$字元開始,而值總是以雙引號封閉。Velocity中僅有String可以被賦值給變數。
記住以下的規則:
使用$字元開始的references用於得到什麼;使用#字元開始的directives用於作些什麼
1.2 Hello nVelocity World
一旦某個變數被分配了一個值,那麼你就可以在HTML文件的任何地方引用它。在下面的例子中,一個值被分配給$foo變數,並在其後被引用。
#set ( $foo = 「nVelocity」 )
Hello $foo World!
上面的實現結果是在頁面上列印「Hello nVelocity World!」
為了使包含VTL directives的statement更具有可讀性,我們鼓勵你在新行開始一個VTL statement,盡管你不是必須這么作。Set directive將在後面詳細描述。
1.1 注釋
單行注釋:
## This is a single line comment.
多行注釋:
#*
Thus begins a multi-line comment. Online visitors won』t
see this text because the Velocity Template Engine will ignore it.
*#
文檔格式:
#**
This is a VTL comment block and may be used to store such information as the document author
and versioning information:
@version 5
@author
*#
1.2 References
在VTL中有三種類型的references:變數(variables)、屬性(properties)、方法 (methods)。作為一個使用VTL的頁面設計者,你和你的工程師必須就references的名稱達成共識,以便你可以在你的template中使用它們。
VTL中一切reference可以作為一個String對象處理。如果有一個對象$foo是一個Integer對象,那麼Velocity將調用它的toString()方法將這個對象轉型為String類型。
1.2.1 變數格式要求同.NET。
1.1.1 屬性例子:
$customer.Address
$purchase.Total
$customer.Address有兩種含義。它可以表示:查找hashtable對象customer中以Address為關鍵字的值;也可以表示調用customer對象的Address()方法。當你的頁面被請求時,Velocity將確定以上兩種方式選用那種,然後返回適當的值。
1.1.2 方法一個方法就是被定義在.NET中的一段代碼,並且它有完成某些有用工作的能力,例如一個執行計算和判斷條件是否成立、滿足等。方法是一個由$開始並跟隨VTL標識符組成的References,一般還包括一個VTL方法體。例如:
$customer.Address()
$purchase.Total()
$page.setTitle( 「My Home Page」 )
$person.setAttributes( [「Strange」, 「Weird」, 「Excited」] )
前兩個例子$customer.Address()和$purchase.Total()看起來挺想上面的屬性$customer.Address 和 $purchase.Total。如果你覺得他們之間有某種聯系的話,那你是正確的。
VTL屬性可以作為VTL方法的縮寫。$customer.Address屬性和使用$customer.Address()方法具有相同的效果。如果可能的話使用屬性的方式是比較合理的。屬性和方法的不同點在於你能夠給一個方法指定一個參數列表。
1.1.1 正式reference標記reference的正式格式如下:
${mudSlinger}變數
${customer.Address}屬性
${purchase.Total()}方法
非正式格式更見常用,但是有時還是使用正是格式比較適合。例如:你希望通過一個變數$vice來動態的組織一個字元串。
Jack is a $vicemaniac.
本來變數是$vice現在卻變成了$vicemaniac,這樣Veloctiy就不知道您到底要什麼了。所以,應該使用正是格式書寫
Jack is a ${vice}maniac
現在Velocity知道變數是$vice而不是$vicemaniac。
1.1.2 Quiet reference notation
例如:
<input type=」text」 name=」email」 value=」$email」 />
當頁面的form被初始載入時,變數$email還沒有值,這時你肯定是希望它能夠顯示一個空白來代替輸出」$email」這樣的欄位。那麼使用quiet reference notation就比較合適。
<input type=」text」 name=」email」 value=」$!email」/>
這樣文本框的初始值就不會是email而是空值了。
正式和quiet格式的reference notation也可一同使用,像下面這樣:
<input type=」text」 name=」email」 value=」$!{email}」/>
1.1.1 Getting literal
nVelocity使用特殊字元$和#來幫助它工作,所以如果要在template里使用這些特殊字元要格外小心。本節將討論$字元。
在VTL中使用$2.5這樣的貨幣標識是沒有問題得的,VTL不會將它錯認為是一個reference,因為VTL中的reference總是以一個大寫或者小寫的字母開始。
VTL中使用「/」作為轉義字元。
注意:VTL中未被定義的變數將被認為是一個字元串,所以以下例子:
#set( $foo = 「gibbous」 )
$moon = $foo
的輸出結果是:
$moon = gibbous
1.1.1 賦值#set
#set directive被用於設置一個reference的值。例如:
#set ( $primate = 「monkey」 )
#set ( $customer.Behavior = $primate )
賦值左側的(LHS)必須是一個變數或者屬性reference。右側(RHS)可以是以下類型中一種:
變數reference
字元串
屬性reference
方法reference
數字
ArrayList
下面是應用各種類型的RHS的例子:
#set ( $monkey = $bill ) ##變數reference
#set ( $monkeyFriend = 「monica」 ) ##字元串
#set ( $monkeyBlame = $whitehouse.Leak ) ##屬性reference
#set ( $monkeyPlan = $spindoctor.weave($web) ) ##方法reference
#set ( $monkeyNumber = 123 ) ##數字
#set ( $monkeySay = [「Not」, $my, 「fault」] ) ##ArrayList
注意:最後一個例子的取值方法為:$monkeySay.get_item(0)
RHS也可以是一個簡單的算術表達式:
#set ( $value = $foo + 1 )
#set ( $value = $bar -1 ) (減號前必須有空格)
#set ( $value = $foo * $bar )
#set ( $value = $foo / $bar )
#set ( $value = $foo % $bar )
如果你的RHS是一個null,VTL的處理將比較特殊:它將指向一個已經存在的reference,這對初學者來講可能是比較費解的。例如:
#set ( $resut = $query.criteria(「name」) )
結果是$result
#set ( $resut = $query.criteria(「address」) )
結果是$result
如果$query.criteria(「name」)返回一個「bill」,而$query.criteria(「address」)返回的是null,則顯示的結果如下:
結果是bill
看看下面的例子:
#set( $criteria = ["name", "address"] )
#foreach( $criterion in $criteria )
#set( $result = $query.criteria($criterion) )
#if( $result )
Query was successful
#end
#end
在上面的例子中,程序將不能智能的根據$result的值決定查詢是否成功。在$result被#set後(added to the context),它不能被設置回null(removed from the context)。列印的結果將顯示兩次查詢結果都成功了,但是實際上有一個查詢是失敗的。
為了解決以上問題我們可以通過預先定義的方式:
#set( $criteria = [「name」, 「address」] )
#foreach( $criterion in $criteria )
#set( $result = false )
#set( $result = $query.criteria( $criterion ) )
#if( $result )
Query was successful
#end
#end
1.1.1 字元串
當你使用#set directive,字元串封閉在一對雙引號內。
#set ( $directoryRoot = 「www」 )
#set ( $templateName = 「index.vm」 )
#set ( $template = 「$directoryRoot/$tempateName」 )
$template
上面這段代碼的輸出結果為:www/index.vm
但是,當字元串被封裝在單引號內時,它將不被解析:
#set ( $foo = 「bar」 )
$foo
#set ( $blargh = 『$foo' )
結果:
bar
$foo
1.1.2 條件語句
if/elseif/else
當一個web頁面被生成時使用Velocity的#if directrive,如果條件成立的話可以在頁面內嵌入文字。例如:
#if ( $foo )
<strong>nVelocity!</strong>
#end
上例中的條件語句將在以下兩種條件下成立:
$foo是一個boolean型的變數,且它的值為true
$foo變數的值不為null
這里需要注意一點:Velocity context僅僅能夠包含對象,所以當我們說「boolean」時實際上代表的時一個Boolean對象。即便某個方法返回的是一個boolean值,Velocity也會利用內省機制將它轉換為一個Boolean的相同值。
如果條件成立,那麼#if和#end之間的內容將被顯示。
#elseif和#else元素可以同#if一同使用。例如:
#if( $foo < 10 )
<strong> Go North </strong>
#elseif( $foo == 10 )
<strong> Go East </strong>
#elseif( $foo == 6 )
<strong> Go South </strong>
#else
<strong> Go West </strong>
#end
注意這里的nVelocity的數字是作為Integer來比較的――其他類型的對象將使得條件為false,它使用「==」來比較兩個值,而且nVelocity要求等號兩邊的值類型相同。
二、NVelocity標簽語詳解
1. 變數
(1) 變數的定義:
#set($name = "hello") 說明:velocity中變數是弱類型的。
當使用#set 指令時,括在雙引號中的字面字元串將解析和重新解釋,如下所示:
#set($directoryRoot = "www" )
#set($templateName = "index.vm" )
#set($template = "$directoryRoot/$templateName" )
$template
輸出將會是:www/index.vm
註:在velocity中使用$2.5這樣的貨幣標識是沒有問題得的,因為velocity中的變數總是以一個大寫或者小寫的字母開始的。
(2) 變數規范的寫法
${name} ,也可以寫成:$name。提倡用前面的寫法。
(3) 變數的賦值:
$name="hello"
賦值的左邊必須是一個變數或者是屬性引用。右邊可以是下面六種類型之一:
變數引用,字面字元串,屬性引用,方法引用,字面數字,數組列表。
#set( $monkeySay = ["Not", $my, "fault"] ) ## ArrayList
通過索引取值方法:$monkeySay.get_item(0)
2. 循環
例子:
#set( $list = ["pine", "oak", "maple"])
#foreach ($element in $list)
$element index is $velocityCount
This is $element.<br>
#end
輸出的結果為:
1 pine is 1.
2 oak is 2.
3 maple is 3.
代碼
提示:velocity中大小寫敏感,不支持屬性為漢字 如:$dtdataList.張三。
Velocity還特別提供了得到循環次數的方法,$velocityCount變數的名字是Velocity默認的名字。
這樣可以通過$velocityCount%2==0 判斷奇數偶數行。
each($data in $datas)
#before
this before</br> #before--數據的開始處
#odd
$data is odd</br>#odd--數據的奇數處
#even
$data is even</br>#even--數據的偶數處
#each
$data is even</br>#each--可以循環美行數據
#between
this is between</br>每行數據的間隔處,如:1-2之間,2-3之間。
#after
after</br>--#after數據的結束處
#end
3. 條件語句
#if (condition)
#elseif (condition)
#else
#end
4. 語句的嵌套
#foreach ($element in $list)
## inner foreach 內循環
#foreach ($element in $list)
This is $element. $velocityCount <br>inner<br>
#end
## inner foreach 內循環結束
## outer foreach
This is $element.
$velocityCount <br>outer<br>
#end
語句中也可以嵌套其他的語句,如#if…#else…#end等。
5. 關系和邏輯操作符
Velocity 也具有邏輯AND, OR 和 NOT 操作符。
如
## example for AND
#if($foo && $bar)
<strong> This AND that</strong>
#end
## example for OR
#if($foo || $bar)
<strong> This OR that</strong>
#end
## example for NOT
#if(!$foo)
<strong> This NOTthat</strong>
#end
例子中#if() 指令僅在$foo 和$bar 斗為真的時候才為真。如果$foo 為假,則表達式也為假;並且 $bar 將不被求值。如果 $foo 為真,Velocity 模板引擎將繼續檢查$bar的值,如果 $bar 為真,則整個表達式為真。並且輸出This AND that 。如果 $bar 為假,將沒有輸出因為整個表達式為假。
6.Velocity 中的宏
Velocity中的宏我們可以理解為函數。
①宏的定義
#macro(宏的名稱 $參數1 $參數2 …)
語句體(即函數體)
#end
②宏的調用
#宏的名稱($參數1 $參數2 …)
說明:參數之間用空格隔開。
7.#stop
停止執行模板引擎並返回,把它應用於debug是很有幫助的。
8.#include與#parse
#include和#parse的作用都是引入本地文件, 為了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目錄下。
區別:
(1) 與#include不同的是,#parse只能指定單個對象。而#include可以有多個
如果您需要引入多個文件,可以用逗號分隔就行:
#include ("template/one.gif" "template/two.txt" "template/three.htm" )
在括弧內可以是文件名,但是更多的時候是使用變數的:
#set($seasonalstock ="template/test.htm")
#include ("template/greetings.txt" $seasonalstock)(注意中間沒有分隔符)
(2) #include被引入文件的內容將不會通過模板引擎解析;
而#parse引入的文件內容Velocity將解析其中的velocity語法並移交給模板,意思就是說相當與把引入的文件到文件中。
#parse是可以遞歸調用的,例如:如果dofoo.vm包含如下行:
Count down.<br>
#set ($count = 8)
#parse ("parsefoo.vm")
<br>All done with dofoo.vm!
那麼在parsefoo.vm模板中,你可以包含如下VTL:
$count
#set($count = $count - 1)
#if ( $count > 0 )<br>
#parse( "parsefoo.vm" )
#else
<br>All done with parsefoo.vm!
#end的顯示結果為:
Count down.
8
7
6
5
4
3
2
1
0
All done with parsefoo.vm!
All done with dofoo.vm!
注意:在vm中使用#parse來嵌套另外一個vm時的變數共享問題。如:
->a.vm 里嵌套 b.vm;
->a.vm 里定義了變數 $param;
->b.vm 里可以直接使用$param,無任何限制。
但需要特別注意的是,如果b.vm里同時定義有變數$param,則b.vm里將使用b.vm里定義的值。
9.轉義字元'/'的使用
如果reference被定義,兩個』/』意味著輸出一個』/』,如果未被定義,剛按原樣輸出。如:
#set($email = "foo" )
$email
/$email
//$email
///$email
輸出:
foo
$email
/foo
/$email
如果$email 未定義
$email
/$email
//$email
///$email
輸出:
$email
/$email
//$email
//$email
11.內置對象
Velocity內置了一些對象,在vm模版里可以直接調用,列舉如下:
$request、$response、$session,目前還不清楚怎麼調用。
12. 方法調用
代碼
public class Tool
{
public string ConvertToString(string source)
{
return html + "_convert";
}
public static string C2()
{
return "test" + "_c2";
}
}
vc.Put("toolobj", tool);
調用方法:
$toolobj.ConvertHtml("123456");
$toolobj.C2();
多參數方法調用public static string SomeMethod(params String[] args)
{
return String.Join('-', args);
}
調用方法:$instance.SomeMethod('arg1', 'arg2')
㈣ angularjs filter怎麼顯示數字和顏色
一,內置的過濾器
1,uppercase,lowercase大小轉換
?
1
2
{{ "lower cap string" | uppercase }} //結果:LOWER CAP STRING
{{ "TANK is GOOD" | lowercase }} //結果:tank is good
|這里的豎線是一種管道功能,如果對linux比較熟悉的話,這塊的|根linux的管道功能,基本是一樣的
2,json格式化
?
1
{{ {foo: "bar", baz: 23} | json }} //結果:{ "foo": "bar", "baz": 23 }
注意:bza沒格式前是沒有雙引號的,格式化後就轉換成了json數據了。
3,date格式化
?
1
2
3
{{ 1304375948024 | date }} //結果:May 3, 2011
{{ 1304375948024 | date:"MM/dd/yyyy @ h:mma" }} //結果:05/03/2011 @ 6:39AM
{{ 1304375948024 | date:"yyyy-MM-dd hh:mm:ss" }} //結果:2011-05-03 06:39:08
4,number格式化
?
1
2
{{ 1.234567 | number:1 }} //結果:1.2
{{ 1234567 | number }} //結果:1,234,567
5,currency貨幣格式化
?
1
2
{{ 250 | currency }} //結果:$250.00
{{ 250 | currency:"RMB ¥ " }} //結果:RMB ¥ 250.00
6,filter查找
?
1
2
3
4
5
6
7
8
9
10
11
12
13
{{ [{"age": 20,"id": 10,"name": "iphone"},
{"age": 12,"id": 11,"name": "sunm xing"},
{"age": 44,"id": 12,"name": "test abc"}
] | filter:'s'}} //查找含有有s的行
//上例結果:[{"age":12,"id":11,"name":"sunm xing"},{"age":44,"id":12,"name":"test abc"}]
{{ [{"age": 20,"id": 10,"name": "iphone"},
{"age": 12,"id": 11,"name": "sunm xing"},
{"age": 44,"id": 12,"name": "test abc"}
] | filter:{'name':'iphone'} }} //查找name為iphone的行
//上例結果:[{"age":20,"id":10,"name":"iphone"}]
7,limitTo字元串,對像的截取
?
1
2
3
4
5
6
7
{{ "i love tank" | limitTo:6 }} //結果:i love
{{ "i love tank" | limitTo:-4 }} //結果:tank
{{ [{"age": 20,"id": 10,"name": "iphone"},
{"age": 12,"id": 11,"name": "sunm xing"},
{"age": 44,"id": 12,"name": "test abc"}
] | limitTo:1 }} //結果:[{"age":20,"id":10,"name":"iphone"}]
8,orderBy對像排序
?
1
2
3
4
5
6
7
8
9
{{ [{"age": 20,"id": 10,"name": "iphone"},
{"age": 12,"id": 11,"name": "sunm xing"},
{"age": 44,"id": 12,"name": "test abc"}
] | orderBy:'id':true }} //根id降序排
{{ [{"age": 20,"id": 10,"name": "iphone"},
{"age": 12,"id": 11,"name": "sunm xing"},
{"age": 44,"id": 12,"name": "test abc"}
] | orderBy:'id' }} //根據id升序排
二,自定filter功能
我找了一個基本angularjs的mvc框架,phonecat,自定義filter也是在這基礎寫的,這個框架挺好用的。
1,filters.js添加一個mole
?
1
2
3
4
5
angular.mole('tanktest', []).filter('tankreplace', function() {
return function(input) {
return input.replace(/tank/, "=====")
};
});
2,app.js中載入這個mole
?
1
2
3
4
5
6
var phonecatApp = angular.mole('phonecatApp', [
'ngRoute',
'phonecatControllers',
'facebookControllers',
'tanktest'
]);
3,html中調用
?
1
{{ "TANK is GOOD" | lowercase |tankreplace}} //結果:===== is good
注意:| lowercase |tankreplace管道命令可以有多個
三、filter的兩種使用方法
1. 在模板中使用filter
我們可以直接在{{}}中使用filter,跟在表達式後面用 | 分割,語法如下:
?
1
{{ expression | filter }}
也可以多個filter連用,上一個filter的輸出將作為下一個filter的輸入(怪不得這貨長的跟管道一個樣。。)
?
1
{{ expression | filter1 | filter2 | ... }}
filter可以接收參數,參數用 : 進行分割,如下:
?
1
{{ expression | filter:argument1:argument2:... }}
除了對{{}}中的數據進行格式化,我們還可以在指令中使用filter,例如先對數組array進行過濾處理,然後再循環輸出:
?
1
<span ng-repeat="a in array | filter ">
2. 在controller和service中使用filter
我們的js代碼中也可以使用過濾器,方式就是我們熟悉的依賴注入,例如我要在controller中使用currency過濾器,只需將它注入到該controller中即可,代碼如下:
?
1
2
3
app.controller('testC',function($scope,currencyFilter){
$scope.num = currencyFilter(123534);
}
在模板中使用{{num}}就可以直接輸出$123,534.00了!在服務中使用filter也是同樣的道理。
此時你可能會有疑惑,如果我要在controller中使用多個filter,難道要一個一個注入嗎,這豈不太費勁了看小兄弟莫著急~ng提供了一個$filter服務可以來調用所需的filter,你只需注入一個$filter就夠了,使用方法如下:
?
1
2
3
4
app.controller('testC',function($scope,$filter){
$scope.num = $filter('currency')(123534);
$scope.date = $filter('date')(new Date());
}
可以達到同樣的效果。好處是你可以方便使用不同的filter了。
㈤ filter過濾器需要調用嗎
在AngularJS的世界裡,filter提供了一種格式化數據的方法,Angular也提供給我們了很多內建的過濾器,並且建立自定義過濾器也是相當的簡單
在HTML的模板綁定{{}}中,我們使用 | 來調用過濾器,比如,我們想讓字元串全部大寫字元顯示:
{{ name | uppercase }}
當然了,我們也可以在JavaScript中使用$filter服務來調用過濾器,還拿字元串大寫來舉例:
app.controller('DemoController', ['$scope', '$filter', function($scope, $filter) { $scope.name = $filter('lowercase')('Ari'); }]);
如何傳遞參數到filter呢?只需要把參數放在filter之後,中間加個冒號(如果有多個參數要傳遞,在每個參數後加上冒號)比如,數字過濾器可以幫助我們限制數字的位數,如果想顯示兩位小數,加上number:2就可以了
{{ 123.456789 | number:2 }}
filter過濾器主要用來過濾一個數組數據並返回一個包含子數組數據的新數組。
比如,在客戶端搜索時,我們可以快速的從數組中過濾出我們想要的結果。
這個filter方法接收一個string,object,或者function參數用來選擇/移除數組元素。
下滿我們具體來看:
一,內置的過濾器
1,uppercase,lowercase大小轉換
{{ "lower cap string" | uppercase }} //結果:LOWER CAP STRING {{ "TANK is GOOD" | lowercase }} //結果:tank is good
|這里的豎線是一種管道功能,如果對linux比較熟悉的話,這塊的|根linux的管道功能,基本是一樣的2,json格式化
{{ {foo: "bar", baz: 23} | json }} //結果:{ "foo": "bar", "baz": 23 }
注意:bza沒格式前是沒有雙引號的,格式化後就轉換成了json數據了。
3,date格式化
mysql時間戳 ng-bind="message.time * 1000 | date:'yyyy-mm-dd'"
{{ 1304375948024 | date:'medium'}} //May 03, 2011 06:39:08 PM {{ 1304375948024 | date }} //結果:May 3, 2011 {{ 1304375948024 | date:"MM/dd/yyyy @ h:mma" }} //結果:05/03/2011 @ 6:39AM {{ 1304375948024 | date:"yyyy-MM-dd hh:mm:ss" }} //結果:2011-05-03 06:39:08
4,number格式化
{{ 1.234567 | number:1 }} //結果:1.2 {{ 1234567 | number }} //結果:1,234,567
5,currency貨幣格式化
{{ 250 | currency }} //結果:$250.00 {{ 250 | currency:"RMB ¥ " }} //結果:RMB ¥ 250.00
6,filter查找 只能查value,不能查key
{{ [{"age": 20,"id": 10,"name": "iphone"}, {"age": 12,"id": 11,"name": "sunm xing"}, {"age": 44,"id": 12,"name": "test abc"} ] | filter:'s'}} //查找含有有s的行 //上例結果:[{"age":12,"id":11,"name":"sunm xing"},{"age":44,"id":12,"name":"test abc"}] {{ [{"age": 20,"id": 10,"name": "iphone"}, {"age": 12,"id": 11,"name": "sunm xing"}, {"age": 44,"id": 12,"name": "test abc"} ] | filter:{'name':'ip'} }} //查找name like ip的行 //上例結果:[{"age":20,"id":10,"name":"iphone"}] $filter('number')(30000, 2); var jsonString = $filter('json')({"age":12,"id":11,"name":"sunm xing"},{"age":44,"id":12,"name":"test abc"}])
7,limitTo字元串,對像的截取
{{ "i love tank" | limitTo:6 }} //結果:i love {{ "i love tank" | limitTo:-4 }} //結果:tank {{ [{"age": 20,"id": 10,"name": "iphone"}, {"age": 12,"id": 11,"name": "sunm xing"}, {"age": 44,"id": 12,"name": "test abc"} ] | limitTo:1 }} //結果:[{"age":20,"id":10,"name":"iphone"}]
8,orderBy對像排序
{{ [{"age": 20,"id": 10,"name": "iphone"}, {"age": 12,"id": 11,"name": "sunm xing"}, {"age": 44,"id": 12,"name": "test abc"} ] | orderBy:'id':true }} //根id降序排 {{ [{"age": 20,"id": 10,"name": "iphone"}, {"age": 12,"id": 11,"name": "sunm xing"}, {"age": 44,"id": 12,"name": "test abc"} ] | orderBy:'id' }} //根據id升序排 {{ [{"age": 20,"id": 10,"name": "iphone"}, {"age": 12,"id": 11,"name": "sunm xing"}, {"age": 44,"id": 12,"name": "test abc"} ] | orderBy:['-age','name'] }}
二,自定filter功能
filter的自定義方式也很簡單,使用mole的filter方法,返回一個函數,該函數接收輸入值,並返回處理後的結果。
app.filter('過濾器名稱',function(){ return function(需要過濾的對象,過濾器參數1,過濾器參數2,...){ //...做一些事情 return 處理後的對象; } });
我找了一個基本angularjs的mvc框架,phonecat,自定義filter也是在這基礎寫的,這個框架挺好用的。
filters.js添加一個mole
angular.mole('tanktest', []).filter('tankreplace', function() { return function(input) { return input.replace(/tank/, "=====") }; });
html中調用
{{ "TANK is GOOD" | lowercase |tankreplace}} //結果:===== is good
注意:| lowercase |tankreplace管道命令可以有多個
yourApp.filter('orderObjectBy', function() { return function(items, field, reverse) { var filtered = []; angular.forEach(items, function(item) { filtered.push(item); }); filtered.sort(function (a, b) { return (a[field] > b[field] ? 1 : -1); }); if(reverse) filtered.reverse(); return filtered; }; });
該過濾器將對象轉換成標準的數組並把它通過您指定欄位排序。您可以使用orderObjectBy過濾器酷似ORDERBY,包括欄位名後一個布爾值,以指定的順序是否應該得到扭轉。換句話說,假的是升序,真正的下降。html調用
<li ng-repeat="item in items | orderObjectBy:'color':true">{{ item.color }}</li>
排序搜索
<input type="text" ng-model="search" class="form-control" placeholder="Search"> <thead> <tr> <!-- ng-class="{dropup:true}" --> <th ng-click="changeOrder('id')" ng-class="{dropup: order === ''}"> 產品編號 <span ng-class="{orderColor: orderType === 'id'}" class="caret"></span> </th> <th ng-click="changeOrder('name')" ng-class="{dropup: order === ''}"> 產品名稱 <span ng-class="{orderColor: orderType === 'name'}" class="caret"></span> </th> <th ng-click="changeOrder('price')" ng-class="{dropup: order === ''}"> 產品價格 <span ng-class="{orderColor: orderType === 'price'}" class="caret"></span> </th> </tr> </thead> <tbody> <tr ng-repeat="item in proctData | filter: search | orderBy:order + orderType"> <td>{{item.id}}</td> <td>{{item.name}}</td> <td>{{item.price | currency: '¥'}}</td> </tr> </tbody>
angularjs
//默認排序欄位 $scope.orderType = 'id'; $scope.order = '-'; $scope.changeOrder = function(type) { console.log(type); $scope.orderType = type; if ($scope.order === '') { $scope.order = '-'; }else{ $scope.order = ''; } }
㈥ 目前互聯網的技術發展現狀和趨勢如何
給樓主看下之前關注過的一個東西:
諸如社會網路的超速發展,RSS成為主流,企業的消費化(consumerization),以及可讀寫Web(read/write Web)的持續增長等等。
在本文中,我們將放眼2007,展望那些對我們來說很重要的互聯網發展趨勢。
RSS,結構化數據
明年RSS將成為耀眼的主流--不僅僅是集成到微軟的新操作系統Vista中,還會集成到Yahoo Mail的beta版本(Ajax版)中,而且,我們還期待Google的RSS試驗2007年可以帶來更多東西,特別是Google Base,使用了一種RSS變種GData。一些新的有趣的(如果還不夠創新的話)服務會在RSS之上建立--例如Techmeme RSS Ad-delivery。
與此相關,結構化數據將成為明年的大趨勢--看看我們9月的文章Google的結構化數據行動吧。特別需要關注的是微格式(microformat),一種Web社區的結構化數據開放式標准,將開始應用。不過,Google似乎在打造它自己的結構化數據標准,忽視了微格式。盡管微軟和雅虎已經開始支持微格式,是不是已經足以抵禦Google了呢?
Widget在2006的爆發增長在2007會繼續,這要歸功於博客和象MySpace這樣的社會網路。MyBlogLog是一個很好的例子,我們期待著更多電子商務和多媒體的widget。
企業級應用
Web辦公軟體繼續發展。特別要關注Google和微軟在這一領域的爭斗。那些創業公司(Zoho, Zimbra, ThinkFree等)將繼續創新,可能會有被大互聯網公司收購的事情發生。
企業消費化趨勢開始滲透到企業IT系統中,主要是基於Web的辦公軟體和一些更加協同的系統。虛擬工作模式(團隊和辦公室)以較低的成本帶來很高的生產力,會變得極其流行,例如SKY-click。盡管會有更多爭議產生(比如敏感信息的泄露),企業博客將繼續蓬勃發展。
Web技術發展
豐富互聯網應用(Rich Internet Apps)將成為2007的一個主流(是我們06年關注的Web/桌面混合應用的一個延伸)。特別要關注Adobe的Apollo平台,微軟也會發展Windows Presentation Foundation,還有Laszlo的開源系統OpenLaszlo平台。明年的趨勢是將桌面和Web結合起來的平台,提供單純基於瀏覽器的應用所不能達到的功能。
另一方面,Google會繼續發展基於瀏覽器的應用。Ajax已經證明有局限性,那下一個Web新技術將會是什麼?所以,2007年請關注一下使用向量圖(VML/SVG)和Ajax的「豐富互聯網應用」吧。
語義Web產品將在2007出現。毫無疑問,語義Web正浮出水面,瞧瞧RadarNetworks和Metaweb這樣的公司吧,他們可以基於HTML生成RDF數據。
亞馬遜Web服務是06年的一個驚喜,我們期待亞馬遜明年有更大動作,為Web/Amazon基於Web服務的操作系統打下良好基礎。其它公司,比如Google,會開發類似亞馬遜的Web服務集合,比如亞馬遜的S3-EC2服務。如果Google跟進了,微軟肯定也不會落後。
搜索和網路廣告
明年的網路廣告市場會有一些振盪。AdSense會遭遇強勁競爭,主要來自MSN AdCenter和雅虎的廣告平台。
伴隨著網路廣告指標CPC/PPC,廣告主迫切需要更好的、更健壯的網路廣告模型,起碼比CPA要更有效。所以,敬請關注2007年這一領域的變化吧!
2007年將是搜索2.0之年,垂直搜索引擎將迅速發展。Google也絕不會袖手旁觀,Google Code和Google Health就是兩個回應。而且,Google正向一個更加「基於意思的搜索引擎」大踏步邁進。例如,在Google上搜一個公司的名字,第一個搜索結果不僅僅是公司網站,還包括一些從它的網站上提取的語義內容。Google的測試搜索網站SearchMash頁面的右側區域,顯示了Google在謀劃更多功能。
微軟 vs Google
微軟的Windows Live服務明年將有大發展,這要歸功於Vista,還有Live服務完成beta測試,以及收編了MSN的相關部分(例如Windows Live Mail收編了Hotmail)。
WebOS/GoogleOS:為了反擊Vista和Windows Live的進攻,Google會推出GoogleOS的一些雛形。當然,會不會這樣是有爭議的。一種設想是如果Vista的預設服務Live.com給Google帶來壓力,一個Google優化的Linux就會出現。
開源桌面(Open Source Desktop)會在07年有大的發展。Red Hat和Novell會有新版本發布。採用三維效果、KDE4(Plasma)和AIGLX-Xgl和Beryl-Compiz技術後,Linux桌面會變得更加好玩。不過,它們能和Vista以及將來的Web操作系統競爭嗎?還搞不清楚。
瀏覽器
第二次瀏覽器大戰:2007,IE7和FireFox(以及Flock, Opera和Maxthon)的競爭更加激烈。也許還會出來一個G-Browser?一些奇怪的事情已經發生了,Google也許會繼續拿FireFox作為一個掩護?這種情況恐怕是最有可能的,Google不想為操作系統和瀏覽器過多分神,這對Nasdaq投資者來說可不是件好事。
明年Webkit會有增長。Adobe的Apollo將基於Webkit,讓開發者能保證和Safari以及其它瀏覽器的兼容性。Linux/KDE的Konqueror瀏覽器會放棄它的KHTML引擎以支持WebKit。所以,07年Safari的兼容性會有極大提高。
多媒體
互聯網電視將迎來茁壯成長的2007,比如象Brightcove這樣的產品,以及Google在YouTube和Google Video上的開發。交互電視(iTV等)也會有更多發展。值得關注的是Venice Project(Skype創辦人搞的),它承諾要在世界的各個角落提供免費電視。
IPTV的大規模應用以及Bittorrent都是網路視頻領域的重要組成部分。
P2P:隨著Azureus和BitTorrent拿到了VC,2007年P2P領域大約有3000萬美元投資。所以,明年肯定是P2P的好日子,它會更容易得到,也許會出現基於Web的P2P界面。Bittorrent已經成為具備網路連接的軟體的主要部分。例如,一種類似Venice Project的IPTV客戶端DemocracyPlayer,內置了一個Bittorrent客戶端。Bittorrent明年會內置到更多新的應用中。
虛擬世界:SecondLife將成為市場營銷、推廣和社交的重要平台,用戶和企業在不斷開發它的新用途。SecondLife肯定會推廣到全球。你現在美國絕大多數超市裡都可以看到哈寶(Habbo)和SecondLife的卡,這一趨勢很快會發展到世界其它地方。簡而言之,虛擬世界在 2007年會成為內嵌到真實世界的一個部分。
虛擬貨幣:Paypal提供了一個途徑,SecondLife LindeX和微軟點數也在積極探索這條路。
消費類應用
在線房地產市場07年將迅速增長。
人們繼續尋找顛覆性的商業模式!換句話說,就是免費互聯網應用還需要找到商業模式。:-)
盡管社會網路2006年發展很快,但07年一個普通用戶在網上耗費的時間可能對她/他的社會生活產生負面影響。社會網路有沒有可能證實是反社會的?;-) 與此同時,社會網路可能會變得更加開放,數據可移植的功能將出現。MySpace大概不會對此感興趣。參考上面有關widget的內容。
世界各地的互聯網
世界各地的互聯網應用情況將被美國主流媒體所關注(也許這只是一種美好的願望)。特別是中國已經是一個很熱的市場了,但正如Keith Teare所觀察到的,中國的互聯網發展還處在初級階段,總體收入並不高。
OLPC:OLPC是One Laptop Per Child(每個孩子一台筆記本電腦)的縮寫,這個項目會產生很大影響,可能會促進瘦客戶端電腦(需要互聯網和Web應用)的應用,以及Linux的普及。上面提到的Web辦公軟體可能在買不起微軟Office的非傳統市場找到一片天地。
寬頻繼續增長:例如法國的Fiber Connections。全世界讓互聯網加速的步驟可能都差不多,寬頻革命創造了Web 2.0,Google和Web應用。所以,跟隨這個趨勢是非常值得的!
移動應用
VoIP要火起來了。Skype及其一堆競爭對手很有可能顛覆傳統電信行業。
移動互聯網將是2007的一件大事。當然,對中國、韓國和日本來說肯定是這樣,不過對美國和其它一些「落後」地區,比如紐西蘭和澳大利亞,可能也會迎來移動互聯網的蓬勃發展。線上/線下結合的移動技術如Smartpox,可能會在西方國家流行起來(它已經在亞洲國家流行了)。
行動電話07年將成為更大的開發和廣告平台(jajah mobile等)。
還需關注發展中的Webphone市場,比如傳聞中的蘋果iPhone和GooglePhone等。
感謝移動互聯網專家Rudy De Waele,以下是2007年移動互聯網的十大趨勢:
1. 費率逐漸變得更加低廉。
2. 手機上會出現更多用戶生成的內容(UGC),用戶可以在手機上使用Web/Mobile 2.0的服務,例如Podcast、RSS等更多用戶生成內容的上傳和使用。
3. 已成為大型媒體的年輕人社會網路(Big Media Youth Networks)將進入手機——包括MySpace、YouTube、MTV以及很多公司。用戶上傳照片、視頻,可以直接通過手機創建和消費內容,和朋友分享(包括移動轉發功能)。
4. 移動搜索——主要公司會在移動市場中謹慎地定位(注意和電信運營商和設備製造商的一些交易)。
5. 移動廣告——市場增長很快(關注一下AdMob每天的廣告瀏覽量)。
6. QR代碼將進入零售市場。
7. 移動圖像識別將應用到混合營銷中。
8. 手機內存卡的交換——交換音樂/視頻文件。
9. 城市裡的多網路熱點——促進了隨時隨地的移動下載和通過WiFi/WiMax/藍牙/NFC等訪問互聯網(全部內置和即時可用)。
10. 「聰明客戶端」的發展——在移動設備上將內容和應用功能結合起來。
小結
瞧!我們做了這么多預測,當然這里只是說個大概。我們很想知道你自己對2007互聯網發展的預測。我們是不是忽略了什麼?
㈦ 大數據時代發展歷程是什麼
大數據技術發展史:大數據的前世今生
今天我們常說的大數據技術,其實起源於Google在2004年前後發表的三篇論文,也就是我們經常聽到的「三駕馬車」,分別是分布式文件系統GFS、大數據分布式計算框架MapRece和NoSQL資料庫系統BigTable。
你知道,搜索引擎主要就做兩件事情,一個是網頁抓取,一個是索引構建,而在這個過程中,有大量的數據需要存儲和計算。這「三駕馬車」其實就是用來解決這個問題的,你從介紹中也能看出來,一個文件系統、一個計算框架、一個資料庫系統。
現在你聽到分布式、大數據之類的詞,肯定一點兒也不陌生。但你要知道,在2004年那會兒,整個互聯網還處於懵懂時代,Google發布的論文實在是讓業界為之一振,大家恍然大悟,原來還可以這么玩。
因為那個時間段,大多數公司的關注點其實還是聚焦在單機上,在思考如何提升單機的性能,尋找更貴更好的伺服器。而Google的思路是部署一個大規模的伺服器集群,通過分布式的方式將海量數據存儲在這個集群上,然後利用集群上的所有機器進行數據計算。 這樣,Google其實不需要買很多很貴的伺服器,它只要把這些普通的機器組織到一起,就非常厲害了。
當時的天才程序員,也是Lucene開源項目的創始人Doug Cutting正在開發開源搜索引擎Nutch,閱讀了Google的論文後,他非常興奮,緊接著就根據論文原理初步實現了類似GFS和MapRece的功能。
兩年後的2006年,Doug Cutting將這些大數據相關的功能從Nutch中分離了出來,然後啟動了一個獨立的項目專門開發維護大數據技術,這就是後來赫赫有名的Hadoop,主要包括Hadoop分布式文件系統HDFS和大數據計算引擎MapRece。
當我們回顧軟體開發的歷史,包括我們自己開發的軟體,你會發現,有的軟體在開發出來以後無人問津或者寥寥數人使用,這樣的軟體其實在所有開發出來的軟體中佔大多數。而有的軟體則可能會開創一個行業,每年創造數百億美元的價值,創造百萬計的就業崗位,這些軟體曾經是Windows、Linux、Java,而現在這個名單要加上Hadoop的名字。
如果有時間,你可以簡單瀏覽下Hadoop的代碼,這個純用Java編寫的軟體其實並沒有什麼高深的技術難點,使用的也都是一些最基礎的編程技巧,也沒有什麼出奇之處,但是它卻給社會帶來巨大的影響,甚至帶動一場深刻的科技革命,推動了人工智慧的發展與進步。
我覺得,我們在做軟體開發的時候,也可以多思考一下,我們所開發軟體的價值點在哪裡?真正需要使用軟體實現價值的地方在哪裡?你應該關注業務、理解業務,有價值導向,用自己的技術為公司創造真正的價值,進而實現自己的人生價值。而不是整天埋頭在需求說明文檔里,做一個沒有思考的代碼機器人。
Hadoop發布之後,Yahoo很快就用了起來。大概又過了一年到了2007年,網路和阿里巴巴也開始使用Hadoop進行大數據存儲與計算。
2008年,Hadoop正式成為Apache的頂級項目,後來Doug Cutting本人也成為了Apache基金會的主席。自此,Hadoop作為軟體開發領域的一顆明星冉冉升起。
同年,專門運營Hadoop的商業公司Cloudera成立,Hadoop得到進一步的商業支持。
這個時候,Yahoo的一些人覺得用MapRece進行大數據編程太麻煩了,於是便開發了Pig。Pig是一種腳本語言,使用類SQL的語法,開發者可以用Pig腳本描述要對大數據集上進行的操作,Pig經過編譯後會生成MapRece程序,然後在Hadoop上運行。
編寫Pig腳本雖然比直接MapRece編程容易,但是依然需要學習新的腳本語法。於是Facebook又發布了Hive。Hive支持使用SQL語法來進行大數據計算,比如說你可以寫個Select語句進行數據查詢,然後Hive會把SQL語句轉化成MapRece的計算程序。
這樣,熟悉資料庫的數據分析師和工程師便可以無門檻地使用大數據進行數據分析和處理了。Hive出現後極大程度地降低了Hadoop的使用難度,迅速得到開發者和企業的追捧。據說,2011年的時候,Facebook大數據平台上運行的作業90%都來源於Hive。
隨後,眾多Hadoop周邊產品開始出現,大數據生態體系逐漸形成,其中包括:專門將關系資料庫中的數據導入導出到Hadoop平台的Sqoop;針對大規模日誌進行分布式收集、聚合和傳輸的Flume;MapRece工作流調度引擎Oozie等。
在Hadoop早期,MapRece既是一個執行引擎,又是一個資源調度框架,伺服器集群的資源調度管理由MapRece自己完成。但是這樣不利於資源復用,也使得MapRece非常臃腫。於是一個新項目啟動了,將MapRece執行引擎和資源調度分離開來,這就是Yarn。2012年,Yarn成為一個獨立的項目開始運營,隨後被各類大數據產品支持,成為大數據平台上最主流的資源調度系統。
同樣是在2012年,UC伯克利AMP實驗室(Algorithms、Machine和People的縮寫)開發的Spark開始嶄露頭角。當時AMP實驗室的馬鐵博士發現使用MapRece進行機器學習計算的時候性能非常差,因為機器學習演算法通常需要進行很多次的迭代計算,而MapRece每執行一次Map和Rece計算都需要重新啟動一次作業,帶來大量的無謂消耗。還有一點就是MapRece主要使用磁碟作為存儲介質,而2012年的時候,內存已經突破容量和成本限制,成為數據運行過程中主要的存儲介質。Spark一經推出,立即受到業界的追捧,並逐步替代MapRece在企業應用中的地位。
一般說來,像MapRece、Spark這類計算框架處理的業務場景都被稱作批處理計算,因為它們通常針對以「天」為單位產生的數據進行一次計算,然後得到需要的結果,這中間計算需要花費的時間大概是幾十分鍾甚至更長的時間。因為計算的數據是非在線得到的實時數據,而是歷史數據,所以這類計算也被稱為大數據離線計算。
而在大數據領域,還有另外一類應用場景,它們需要對實時產生的大量數據進行即時計算,比如對於遍布城市的監控攝像頭進行人臉識別和嫌犯追蹤。這類計算稱為大數據流計算,相應地,有Storm、Flink、Spark Streaming等流計算框架來滿足此類大數據應用的場景。 流式計算要處理的數據是實時在線產生的數據,所以這類計算也被稱為大數據實時計算。
在典型的大數據的業務場景下,數據業務最通用的做法是,採用批處理的技術處理歷史全量數據,採用流式計算處理實時新增數據。而像Flink這樣的計算引擎,可以同時支持流式計算和批處理計算。
除了大數據批處理和流處理,NoSQL系統處理的主要也是大規模海量數據的存儲與訪問,所以也被歸為大數據技術。 NoSQL曾經在2011年左右非常火爆,涌現出HBase、Cassandra等許多優秀的產品,其中HBase是從Hadoop中分離出來的、基於HDFS的NoSQL系統。
我們回顧軟體發展的歷史會發現,差不多類似功能的軟體,它們出現的時間都非常接近,比如Linux和Windows都是在90年代初出現,Java開發中的各類MVC框架也基本都是同期出現,Android和iOS也是前腳後腳問世。2011年前後,各種NoSQL資料庫也是層出不群,我也是在那個時候參與開發了阿里巴巴自己的NoSQL系統。
事物發展有自己的潮流和規律,當你身處潮流之中的時候,要緊緊抓住潮流的機會,想辦法脫穎而出,即使沒有成功,也會更加洞悉時代的脈搏,收獲珍貴的知識和經驗。而如果潮流已經退去,這個時候再去往這個方向上努力,只會收獲迷茫與壓抑,對時代、對自己都沒有什麼幫助。
但是時代的浪潮猶如海灘上的浪花,總是一浪接著一浪,只要你站在海邊,身處這個行業之中,下一個浪潮很快又會到來。你需要敏感而又深刻地去觀察,略去那些浮躁的泡沫,抓住真正潮流的機會,奮力一搏,不管成敗,都不會遺憾。
正所謂在歷史前進的邏輯中前進,在時代發展的潮流中發展。通俗的說,就是要在風口中飛翔。
上面我講的這些基本上都可以歸類為大數據引擎或者大數據框架。而大數據處理的主要應用場景包括數據分析、數據挖掘與機器學習。數據分析主要使用Hive、Spark SQL等SQL引擎完成;數據挖掘與機器學習則有專門的機器學習框架TensorFlow、Mahout以及MLlib等,內置了主要的機器學習和數據挖掘演算法。
此外,大數據要存入分布式文件系統(HDFS),要有序調度MapRece和Spark作業執行,並能把執行結果寫入到各個應用系統的資料庫中,還需要有一個大數據平台整合所有這些大數據組件和企業應用系統。
圖中的所有這些框架、平台以及相關的演算法共同構成了大數據的技術體系,我將會在專欄後面逐個分析,幫你能夠對大數據技術原理和應用演算法構建起完整的知識體系,進可以專職從事大數據開發,退可以在自己的應用開發中更好地和大數據集成,掌控自己的項目。
希望對您有所幫助!~