辽阳剐什教育咨询有限公司

新聞中心

02-01
2018
div css布局中CSS圖片大小自動(dòng)按比例等比例縮小圖片不變形解決技巧
div css布局中對(duì)于圖片列表或圖片排版時(shí),圖片不是固定寬度高度大小,但圖片占位是固定寬度高度,這個(gè)時(shí)候如果使用CSS固定死圖片大?。▽挾?高度),這個(gè)時(shí)候如果圖片相對(duì)于這個(gè)位置不是等比例大小,那么這張圖片就會(huì)變形,讓圖片變的不清晰,這個(gè)時(shí)候想讓圖片不變形又按比例縮放,如何解決?CSS圖片縮小不變形,圖片自動(dòng)縮小,圖片按比例等比例縮小不變形解決。解決方法有兩種:第一種,讓圖片和布局寬度高度成等比例,這樣CSS設(shè)置死寬度和高度,圖片也是等比例縮小,圖片也不會(huì)變形。比如淘寶,要求店鋪主上傳產(chǎn)品封面圖片是正方形的,為什么,因?yàn)閳D片寶貝展示列表都是正方形的排版布局,這樣要求上傳合適正方形寶貝封面圖片,也是讓圖片不變形。所以有條件的情況下,大家將首頁、圖片列表頁的布局寬度高度保持一致,上傳圖片時(shí)候?qū)D片先進(jìn)行處理為布局寬度高度時(shí)等比例放大尺寸的。第二種,使用CSS max-width和max-height實(shí)現(xiàn)圖片自動(dòng)等比例縮小很簡單我們要使用到max-width和max-height,這樣即可設(shè)置對(duì)象圖片最大寬度和最大高度,這樣圖片就會(huì)等比例縮放圖片,然圖片相對(duì)不變形清晰。以下通過實(shí)例對(duì)比方法讓大家掌握CSS控制圖片縮小不變形技巧。一、原始描述 這里有個(gè)div,CSS寬度和CSS高度方便為300px和100px同時(shí)設(shè)置1px黑色邊框,里面放了一張圖片(圖片原始寬度650px為高度為406px)。并通過CSS固定死圖片寬度高度。1、HTML源代碼:<!DOCTYPE html>  <html>  <head>  <meta charset="utf-8" />  <title>圖片縮小不變形實(shí)例 www.divcss.com</title>  <style>  .divcss{ border:1px solid #000; width:300px; height:100px}  .divcss img{width:300px; height:100px}  </style>  </head>    <body>  <div class="divcss">  <img src="img.jpg" />  </div>  </body>  </html>2、CSS固定死圖片寬度高度實(shí)例截圖原始圖片展示:原始圖片截圖css固定寬度高度后變形的圖片截圖3、小結(jié),通過CSS固定對(duì)象內(nèi)圖片高度寬度,這樣圖片如果不是等比例縮小,那么圖片就變形了。二、CSS解決圖片縮小不變形實(shí)例使用max-width:300px或max-height:100px,即可解決圖片比例縮小。但這樣存在一個(gè)問題,如果按照寬度縮放,但圖片過高會(huì)超出溢出盒子,這個(gè)時(shí)候需要對(duì)父級(jí)使用overflow:hidden隱藏超出圖片內(nèi)容。但是使用max-width或max-height,IE6不支持,我們需要設(shè)置個(gè)width:expression(this.width > 300 ? "300px" : this.width);或者h(yuǎn)eight:e-xpression(this.height>100?"100px":this.height);。解決IE6支持max-heightdiv css解決IE6支持max-width一般情況下只需要設(shè)置好寬度限制,比如這里只設(shè)置最大寬度為300px(max-width:300px),然后對(duì)父級(jí)使用overflow:hidden隱藏溢出圖片,同時(shí)為了兼容IE6我們?cè)O(shè)置個(gè)width:expression(this.width > 300 ? "300px" : this.width);解決即可。1、具體解決DIV+CSS實(shí)例代碼如下:<!DOCTYPE html>  <html>  <head>  <meta charset="utf-8" />  <title>圖片縮小不變形實(shí)例 www.divcss.com</title>  <style>  .divcss{ border:1px solid #000; width:300px; height:100px;overflow:hidden}  .divcss img{max-width:300px;_width:expression(this.width > 300 ? "300px" : this.width);}  </style>  </head>    <body>  <div class="divcss">  <img src="img.jpg" />  </div>  </body>  </html>2、瀏覽器測試效果截圖css圖片縮小等比例縮小后不變形截圖3、缺點(diǎn)介紹,如果使用此方法,兼容各大瀏覽器不變形,但圖片不是完整顯示的。
01-31
2018
webrtc中rtcp反饋與碼率控制模塊分析
0. 參考文檔1 google congestion control1. 簡介webrtc的帶寬估計(jì)分為兩部分,一部分為發(fā)送端根據(jù)rtcp反饋信息進(jìn)行反饋,另一部分為接收端根據(jù)收到的rtp數(shù)據(jù)進(jìn)行相應(yīng)的碼率估計(jì)[1]。 本文先分析發(fā)送端根據(jù)rtcp反饋信息進(jìn)行碼率調(diào)整的部分代碼。具體計(jì)算公式: 2. 代碼結(jié)構(gòu)2.1 類關(guān)系rtp_stream_receiver中有一個(gè)繼承自抽象類RtpRtcp的ModuleRtpRtcpImpl,ModuleRtpRtcpImpl中有一個(gè)rtcp_receiver。當(dāng)有RTCP包到來時(shí),逐層處理至rtcp_receiver,當(dāng)包是rtcp receiver report包,則會(huì)將包解析,然后在ModuleRtpRtcpImpl中再次調(diào)用rtcp_receiver中的TriggerCallbacksFromRTCPPacket函數(shù),觸發(fā)對(duì)應(yīng)rtcp的一些事件,反饋觸發(fā)的主要是_cbRtcpBandwidthObserver的觀察者(RtcpBandwidthObserverImpl),這個(gè)觀察者收到對(duì)應(yīng)的report block之后會(huì)計(jì)算成帶寬估計(jì)所需要的參數(shù),并調(diào)用屬主bitratecontrolImpl類對(duì)帶寬進(jìn)行估計(jì),這里會(huì)調(diào)用SendSideBandwidthEstimation中的UpdateReceiverBlock進(jìn)行實(shí)際的帶寬評(píng)估。2.2 調(diào)用關(guān)系圖3. 代碼分析3.1 HandleReportBlock這個(gè)函數(shù)中最主要的部分就是RTT的計(jì)算,webrtc中對(duì)于RTT平滑的因子是一個(gè)線性增長的因子。/* 這個(gè)函數(shù)根據(jù)對(duì)應(yīng)的report block生成了一個(gè)新的RTCPReportBlockInformation結(jié)構(gòu)體,  * 并計(jì)算出對(duì)應(yīng)的RTT,多report block在調(diào)用點(diǎn)處執(zhí)行循環(huán)。  */ void RTCPReceiver::HandleReportBlock(     const RTCPUtility::RTCPPacket& rtcpPacket,     RTCPPacketInformation& rtcpPacketInformation,     uint32_t remoteSSRC)     EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver) {   // This will be called once per report block in the RTCP packet.   // We filter out all report blocks that are not for us.   // Each packet has max 31 RR blocks.   //   // We can calc RTT if we send a send report and get a report block back.   // |rtcpPacket.ReportBlockItem.SSRC| is the SSRC identifier of the source to   // which the information in this reception report block pertains.   // Filter out all report blocks that are not for us.   if (registered_ssrcs_.find(rtcpPacket.ReportBlockItem.SSRC) ==       registered_ssrcs_.end()) {     // This block is not for us ignore it.     return;   }   RTCPReportBlockInformation* reportBlock =       CreateOrGetReportBlockInformation(remoteSSRC,                                         rtcpPacket.ReportBlockItem.SSRC);   if (reportBlock == NULL) {     LOG(LS_WARNING) << "Failed to CreateReportBlockInformation("                     << remoteSSRC << ")";     return;   }   // 用于RTCP超時(shí)的計(jì)算。   _lastReceivedRrMs = _clock->TimeInMilliseconds();   // 其他字段的拷貝。   const RTCPPacketReportBlockItem& rb = rtcpPacket.ReportBlockItem;   reportBlock->remoteReceiveBlock.remoteSSRC = remoteSSRC;   reportBlock->remoteReceiveBlock.sourceSSRC = rb.SSRC;   reportBlock->remoteReceiveBlock.fractionLost = rb.FractionLost;   reportBlock->remoteReceiveBlock.cumulativeLost =       rb.CumulativeNumOfPacketsLost;   if (rb.ExtendedHighestSequenceNumber >       reportBlock->remoteReceiveBlock.extendedHighSeqNum) {     // We have successfully delivered new RTP packets to the remote side after     // the last RR was sent from the remote side.     _lastIncreasedSequenceNumberMs = _lastReceivedRrMs;   }   reportBlock->remoteReceiveBlock.extendedHighSeqNum =       rb.ExtendedHighestSequenceNumber;   reportBlock->remoteReceiveBlock.jitter = rb.Jitter;   reportBlock->remoteReceiveBlock.delaySinceLastSR = rb.DelayLastSR;   reportBlock->remoteReceiveBlock.lastSR = rb.LastSR;   if (rtcpPacket.ReportBlockItem.Jitter > reportBlock->remoteMaxJitter) {     reportBlock->remoteMaxJitter = rtcpPacket.ReportBlockItem.Jitter;   }   int64_t rtt = 0;   uint32_t send_time = rtcpPacket.ReportBlockItem.LastSR;   // RFC3550, section 6.4.1, LSR field discription states:   // If no SR has been received yet, the field is set to zero.   // Receiver rtp_rtcp module is not expected to calculate rtt using   // Sender Reports even if it accidentally can.   if (!receiver_only_ && send_time != 0) {     // 當(dāng)RR在SR之前發(fā)送,send_time為0.     // delay計(jì)算:     // Send SR                                                       Receive RR     //  |                          delay in RR                           |     //  |                        ||                         |     //  ||             ||     //     // RTT = total_time - delay_in_RR     //     = receiver_rr_time - send_sr_time - delay_in_RR     // 即使中間幾個(gè)SR丟包,但是如果RTT本身是平滑的,那么RTT不會(huì)受到這幾個(gè)丟包的影響     // 因?yàn)镾R->RR之間的delay可以精確計(jì)算。     uint32_t delay = rtcpPacket.ReportBlockItem.DelayLastSR;     // Local NTP time.     uint32_t receive_time = CompactNtp(NtpTime(*_clock));     // RTT in 1/(2^16) seconds.     uint32_t rtt_ntp = receive_time - delay - send_time;     // Convert to 1/1000 seconds (milliseconds).     rtt = CompactNtpRttToMs(rtt_ntp);     if (rtt > reportBlock->maxRTT) {       // Store max RTT.       reportBlock->maxRTT = rtt;     }     if (reportBlock->minRTT == 0) {       // First RTT.       reportBlock->minRTT = rtt;     } else if (rtt < reportBlock->minRTT) {       // Store min RTT.       reportBlock->minRTT = rtt;     }     // Store last RTT.     reportBlock->RTT = rtt;     // store average RTT     // RTT的平滑計(jì)算。     // 如果這個(gè)塊是在CreateOrGetReportBlockInformation新生成的,     // 則權(quán)重會(huì)從0開始隨著受到的report逐漸遞增。     // srtt(i) = i/(i+1)*srtt(i-1) + 1/(i+1)*rtt + 0.5     if (reportBlock->numAverageCalcs != 0) {       float ac = static_cast(reportBlock->numAverageCalcs);       float newAverage =           ((ac / (ac + 1)) * reportBlock->avgRTT) + ((1 / (ac + 1)) * rtt);       reportBlock->avgRTT = static_cast(newAverage + 0.5f);     } else {       // First RTT.       reportBlock->avgRTT = rtt;     }     reportBlock->numAverageCalcs++;   }   TRACE_COUNTER_ID1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR_RTT", rb.SSRC,                     rtt);   // 添加回rtcpPacketInformation,在ModuleRtpRtcpImpl中會(huì)使用這個(gè)進(jìn)行事件回調(diào)。   rtcpPacketInformation.AddReportInfo(*reportBlock); }3.2 UpdateMinHistory這個(gè)函數(shù)主要用于更新變量min_bitrate_history_,這個(gè)變量將會(huì)作用于上升區(qū)間,用來作為基數(shù),這里簡單描述下。// Updates history of min bitrates. // After this method returns min_bitrate_history_.front().second contains the // min bitrate used during last kBweIncreaseIntervalMs. // 主要結(jié)合這個(gè)函數(shù)解釋下變量min_bitrate_history_ // 這個(gè)變量的兩個(gè)維度,front記錄的是離當(dāng)前最遠(yuǎn)的時(shí)間, // 每個(gè)速率都是按照時(shí)間先后順序逐漸push到尾部。 // 因此更新的時(shí)候,需要先將超時(shí)的元素從列表頭剔除。 // 后一個(gè)維度是最小速率值, // 在相同的時(shí)間區(qū)間內(nèi),保留最小的速率值。 // |-------Interval 1---------|----------Interval 2------| // |                          |                          | // |--t1 < t2 < t3 < t4 < t5--|--t1 < t2 < t3 < t4 < t5--| // 這樣的操作較為簡單,不用在每次插入元素時(shí)去判斷對(duì)應(yīng)的時(shí)間區(qū)域,再找到對(duì)應(yīng)時(shí)間區(qū)間的最小值,用部分冗余的內(nèi)存換取操作的快捷。 void SendSideBandwidthEstimation::UpdateMinHistory(int64_t now_ms) {   // Remove old data points from history.   // Since history precision is in ms, add one so it is able to increase   // bitrate if it is off by as little as 0.5ms.   while (!min_bitrate_history_.empty() &&          now_ms - min_bitrate_history_.front().first + 1 >              kBweIncreaseIntervalMs) {     min_bitrate_history_.pop_front();   }   // Typical minimum sliding-window algorithm: Pop values higher than current   // bitrate before pushing it.   while (!min_bitrate_history_.empty() &&          bitrate_ <= min_bitrate_history_.back().second) {     min_bitrate_history_.pop_back();   }   min_bitrate_history_.push_back(std::make_pair(now_ms, bitrate_)); }3.3 UpdateEstimate函數(shù)UpdateReceiverBlock會(huì)根據(jù)當(dāng)前的report block對(duì)當(dāng)前帶寬估計(jì)的一些變量進(jìn)行相應(yīng)的賦值,此外,只有當(dāng)傳輸包的數(shù)量達(dá)到一定數(shù)量才會(huì)再次觸發(fā)帶寬估計(jì)的調(diào)整。函數(shù)UpdateEstimate是主要用于帶寬估計(jì)的函數(shù)。void SendSideBandwidthEstimation::UpdateEstimate(int64_t now_ms) {   // We trust the REMB and/or delay-based estimate during the first 2 seconds if   // we haven't had any packet loss reported, to allow startup bitrate probing.   if (last_fraction_loss_ == 0 && IsInStartPhase(now_ms)) {     uint32_t prev_bitrate = bitrate_;     // bwe_incoming_是remb更新的值,如果當(dāng)前無丟包且在啟動(dòng)階段,直接使用remb的值。     if (bwe_incoming_ > bitrate_)       bitrate_ = CapBitrateToThresholds(now_ms, bwe_incoming_);       ...     }   }   UpdateMinHistory(now_ms);   // Only start updating bitrate when receiving receiver blocks.   // TODO(pbos): Handle the case when no receiver report is received for a very   // long time.   if (time_last_receiver_block_ms_ != -1) {     if (last_fraction_loss_ <= 5) {       // Loss < 2%: Increase rate by 8% of the min bitrate in the last       // kBweIncreaseIntervalMs.       // Note that by remembering the bitrate over the last second one can       // rampup up one second faster than if only allowed to start ramping       // at 8% per second rate now. E.g.:       //   If sending a constant 100kbps it can rampup immediatly to 108kbps       //   whenever a receiver report is received with lower packet loss.       //   If instead one would do: bitrate_ *= 1.08^(delta time), it would       //   take over one second since the lower packet loss to achieve 108kbps.         //TODO:tjl       // 這里與公式有一定不同:       // 1. 系數(shù)不同,且附帶一定的修正值(向上取整加1kbps)       // 2. 取的是上一個(gè)時(shí)間間隔之內(nèi)最小值,比較平滑。       bitrate_ = static_cast(           min_bitrate_history_.front().second * 1.08 + 0.5);       // Add 1 kbps extra, just to make sure that we do not get stuck       // (gives a little extra increase at low rates, negligible at higher       // rates).       bitrate_ += 1000;       event_log_->LogBwePacketLossEvent(           bitrate_, last_fraction_loss_,           expected_packets_since_last_loss_update_);     } else if (last_fraction_loss_  10%: Limit the rate decreases to once a kBweDecreaseIntervalMs +       // rtt.       if (!has_decreased_since_last_fraction_loss_ &&           (now_ms - time_last_decrease_ms_) >=               (kBweDecreaseIntervalMs + last_round_trip_time_ms_)) {         time_last_decrease_ms_ = now_ms;         // Reduce rate:         //   newRate = rate * (1 - 0.5*lossRate);         //   where packetLoss = 256*lossRate;           //TODO:tjl         // 當(dāng)從未開始降低窗口值,且距離上一次衰減的時(shí)間差大于衰減周期加上rtt。         // 其實(shí)當(dāng)前貌似只有這個(gè)case下會(huì)對(duì)這兩個(gè)變量賦值。         // 這里的last_fraction_loss_是一次統(tǒng)計(jì)間隔(一定包數(shù))之間的總丟包率。         // 丟包率的單位是1/256,因此這里是(1 - 丟包率/2) * 當(dāng)前速率         // 與公式相同。         bitrate_ = static_cast(             (bitrate_ * static_cast(512 - last_fraction_loss_)) /             512.0);         has_decreased_since_last_fraction_loss_ = true;       }       event_log_->LogBwePacketLossEvent(           bitrate_, last_fraction_loss_,           expected_packets_since_last_loss_update_);     }   }   // 在有效范圍內(nèi)修正。   bitrate_ = CapBitrateToThresholds(now_ms, bitrate_); }
01-31
2018
成為Java頂尖程序員 ,看這11本書就夠了
以下是我推薦給Java開發(fā)者們的一些值得一看的好書。但是這些書里面并沒有Java基礎(chǔ)、Java教程之類的書,不是我不推薦,而是離我自己學(xué)習(xí) Java基礎(chǔ)技術(shù)也過去好幾年了,我學(xué)習(xí)的時(shí)候看的什么也忘了,所以我不能不負(fù)責(zé)任地推薦一些我自己都沒有看過的書給大家。“學(xué)習(xí)的最好途徑就是看書“,這是我自己學(xué)習(xí)并且小有了一定的積累之后的第一體會(huì)。個(gè)人認(rèn)為看書有兩點(diǎn)好處:1.能出版出來的書一定是經(jīng)過反復(fù)的思考、雕琢和審核的,因此從專業(yè)性的角度來說,一本好書的價(jià)值遠(yuǎn)超其他資料2.對(duì)著書上的代碼自己敲的時(shí)候方便“看完書之后再次提升自我的最好途徑是看一些相關(guān)的好博文“,我個(gè)人認(rèn)為這是學(xué)習(xí)的第二步,因?yàn)橐槐緯泻脦装夙?,好的博文是自己看書學(xué)習(xí)之后的一些總結(jié)和提煉,對(duì)于梳理學(xué)習(xí)的內(nèi)容很有好處,當(dāng)然這里不是說自己的學(xué)習(xí)方法,就不再扯下去了。很多程序員們往往有看書的沖動(dòng),但不知道看哪些書,下面我就給各位Java程序猿們推薦一些好書(每本書的作者會(huì)加粗標(biāo)紅),其中絕大多數(shù)都是我自己平時(shí)在看的書,也算是我對(duì)于平時(shí)讀的書做一個(gè)小總結(jié)和讀后感吧。首先推薦的不是一本書,而是一個(gè)博客,也是我們博客園另外一位博友java_my_life。目前市面上講解設(shè)計(jì)模式的書很多,雖然我前面講了看書是最好的,但是對(duì)設(shè)計(jì)模式感興趣的朋友們,我推薦的是這個(gè)博客。這位博友的設(shè)計(jì)模式講得非常非常好,我認(rèn)為90%的內(nèi)容都是沒有問題且很值得學(xué)習(xí)的,其講解設(shè)計(jì)模式的大體路線是:1、隨便開篇點(diǎn)明該設(shè)計(jì)模式的定義2、圖文并茂講解該設(shè)計(jì)模式中的結(jié)構(gòu)3、以詳細(xì)的代碼形式寫一下該種設(shè)計(jì)模式的實(shí)現(xiàn)4、補(bǔ)充內(nèi)容5、講解該設(shè)計(jì)模式的優(yōu)缺點(diǎn)對(duì)于一個(gè)設(shè)計(jì)模式我們關(guān)注、學(xué)習(xí)的知識(shí)點(diǎn),不就是上面這些嗎?不 過我要重點(diǎn)提醒一下網(wǎng)友們,同一種設(shè)計(jì)模式的寫法有多種,并不是說只有按某種寫法來寫才是這種設(shè)計(jì)模式。比方說適配器模式,我們關(guān)注適配器模式一定要關(guān)注 的是什么是適配器模式不是怎么寫適配器模式,不要認(rèn)為某段代碼不是按照適配器模式的寫法寫下來的它就不是適配器模式了,記住這一點(diǎn),你在學(xué)習(xí)設(shè)計(jì)模式的時(shí) 候一定會(huì)對(duì)代碼中用到的設(shè)計(jì)模式有更深入的理解?!渡钊肜斫釰ava虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》如果你不滿足于做一個(gè)只會(huì)寫if…else…的Java程序員,而是希望更進(jìn)一步,我隨便舉幾個(gè)例子吧:1、了解Java代碼的底層運(yùn)行機(jī)制2、定位性能問題3、對(duì)整個(gè)系統(tǒng)進(jìn)行性能調(diào)優(yōu)4、解決各種奇奇怪怪的線上線下問題5、更加高級(jí)別的,為自己的項(xiàng)目量身定做一款適合自己項(xiàng)目的虛擬機(jī)那 么Java虛擬機(jī)是你必學(xué)的一門技術(shù)?!渡钊肜斫釰ava虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》作者是周志明,這本書可以說是國內(nèi)寫得最好的有關(guān)Java虛 擬機(jī)的書籍,近半年,前前后后這本書我起碼看了有5遍。國內(nèi)寫虛擬機(jī)的書除了這本,其實(shí)還有一些其他的,我也買過,不過粗略看下來,很多內(nèi)容也是《深入理 解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》此書里面的。另外值得一提的是,《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》這本 書,有電子版的,網(wǎng)上搜一下就能下載到了。不過建議有興趣的朋友還是去買書看,電子版本下載到的一般是比較老的版本,相比最新修訂版的《深入理解Java 虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》,有很多作者新補(bǔ)充的知識(shí)點(diǎn)是沒有的?!禜otSpot實(shí)戰(zhàn)》所有的Java虛擬機(jī)都是遵循著Java虛擬機(jī)規(guī)范來的,市面上的Java虛擬機(jī)幾十款,《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》一書里面講的虛擬機(jī)并不針對(duì)某種特定的虛擬機(jī),而是從Java虛擬機(jī)規(guī)范的角度來講解Java虛擬機(jī)。我們平時(shí)使用的乃至商用的大多數(shù)Java虛擬機(jī)都是Sun公司的HotSpot,大家cmd進(jìn)入命令行,使用”java -version”命令就可以看到了。如果希望在Java虛擬機(jī)規(guī)范的基礎(chǔ)上更加深入地去理解虛擬機(jī)的一些細(xì)節(jié)是怎么實(shí)現(xiàn)的,就可以看一下《HotSpot實(shí)戰(zhàn)》一書,作者是陳濤。不過由于HotSpot的源碼都是C/C++寫的,所以要求讀者有非常好的C/C++基礎(chǔ),如果對(duì)這兩門語言不是很熟悉的朋友,看這本書可能對(duì)你幫助不是很大。最后提一句,如果有興趣的朋友,不妨先去網(wǎng)上下載一個(gè)openJDK,HotSpot的源碼就在里面?!禞ava并發(fā)編程實(shí)戰(zhàn)》這本書常常被列入Java程序員必讀十大書籍排行榜前幾位,不過個(gè)人不是很推薦這本書?!禞ava并發(fā)編程實(shí)戰(zhàn)》作者是Brian Goetz,怎么說呢,這本書前前后后我也看了兩遍左右,個(gè)人感受是:1、文字多代碼少2、講解多實(shí)踐少我 覺得這可能就是老外寫書的特點(diǎn)吧,因?yàn)镴ava是北美國家(加拿大、美國)開發(fā)和維護(hù)的,所以老外對(duì)Java方方面面的理論知識(shí)體系都掌握得是非常清楚和 透徹的。翻開這本書看,多線程什么用、什么是死鎖、什么是競爭、什么是線程安全等等,方方面面的知識(shí)點(diǎn)都用大量的文字篇幅講解,不免讓人感覺十分枯燥,也 難讓讀者有實(shí)質(zhì)性的進(jìn)步。我這本書看了兩遍也屬于一目十行意思,有興趣的地方就重點(diǎn)看一下。無論如何,作為一本常常位于Jva程序員必讀十大書籍排行榜前幾名的書,還是一定要推薦給大家的?!秊ava多線程編程核心技術(shù)》《Java多線程編程核心技術(shù)》作者高洪巖。想要學(xué)習(xí)多線程的朋友,這本書是我大力推薦的,我的個(gè)人博客里面二十多篇的多線程博文都是基于此書,并且在這本書的基礎(chǔ)上進(jìn)行提煉和總結(jié)而寫出來的。此書和《Java并發(fā)編程實(shí)戰(zhàn)》 相反,這本書的特點(diǎn)是大篇幅的代碼+小篇幅的精講解,可能這和中國人寫的書比較偏向?qū)嵱弥髁x的風(fēng)格有關(guān)。本書關(guān)于線程安全、synchronized、 Reentrant、Timer等等都用詳細(xì)的代碼進(jìn)行了講解,而且每個(gè)大知識(shí)點(diǎn)下的多個(gè)小知識(shí)點(diǎn)都會(huì)詳細(xì)講解到,非常有實(shí)踐價(jià)值。有興趣的朋友們,我相信只要你們跟著這本書里面的代碼敲、運(yùn)行、思考,三步走,對(duì)于多線程的使用與理解一定會(huì)進(jìn)幾大步。不 過這本書的缺點(diǎn)就是對(duì)于Java并發(fā)包下的一些類像CountDownLatch、Semphore、CyclicBarrier、Future、 Callable等都沒有講到,重點(diǎn)的CAS和AQS也沒有觸及,重點(diǎn)類的實(shí)現(xiàn)原理也沒有提。當(dāng)然,這很深入了,在學(xué)習(xí)了這本書之后如果能再去對(duì)這些知識(shí) 進(jìn)行一些學(xué)習(xí)、研究的話,你一定會(huì)慢慢成長為一個(gè)很厲害的多線程高手?!禘ffective Java中文版》這是唯一一本我沒有買的書。初識(shí)這本書,是在我的博文Java代碼優(yōu)化(長期更新)里面,底下評(píng)論的時(shí)候有朋友提到了這本書,當(dāng)時(shí)我說要去買,不過這兩個(gè)月一直都沒時(shí)間去逛書店,甚是遺憾,之后肯定會(huì)找時(shí)間去買這本書的。《Effective  Java中文版》的作者是Joshua   Bloch,這個(gè)人就很厲害了,他是谷歌的首席架構(gòu)師,屬于超級(jí)技術(shù)大牛級(jí)別了吧,呵呵。由于沒有看過這本書,所以我不好發(fā)表評(píng)論,但是從這本書的知名度 以及其作者的來頭來看(多提一句,這本書也是Java之父James Gosling博士推崇的一本書),我相信這一定是一本值得一看的好書。好 的代碼是每個(gè)Java程序員都應(yīng)該去追求的,不是說我今天寫一段好代碼相比寫一段爛代碼對(duì)性能會(huì)有多大的提升,更多的應(yīng)該是提升了代碼的可讀性以及可以規(guī) 避許多潛在的、未知的問題,避免代碼上線之后出問題而花時(shí)間去維護(hù)—-無論從時(shí)間成本、人力成本還是風(fēng)險(xiǎn)成本來說,這都是非常高的?!渡钊敕治鯦ava Web技術(shù)內(nèi)幕》《深入分析Java Web技術(shù)內(nèi)幕》,作者許令波,淘寶工程師。這本書我用一個(gè)字概括就是:全。真的非常全,HTTP、DNS、CDN、靜態(tài)化、Jetty、Tomcat、Servlet、Spring、MyBatis等等,什么都有,涉及知識(shí)面非常廣,但又不像專門精講某個(gè)知識(shí)點(diǎn)的書籍一樣講得非常深入,感覺這本書就是盡量去用短的篇幅講清楚一些Java Web使用到的技術(shù)的內(nèi)幕,讓讀者對(duì)這些知識(shí)點(diǎn)的技術(shù)內(nèi)幕有一個(gè)理性的認(rèn)識(shí)。不過,盡管每個(gè)知識(shí)點(diǎn)的篇幅都不多,但是重點(diǎn)都基本講到了,是一本讓人真正有收獲的書。如果想進(jìn)一步了解這些技術(shù)的技術(shù)內(nèi)幕,就要自己去買相關(guān)書籍或者自己上網(wǎng)查資料了,有種拋磚引玉,或者說師傅領(lǐng)進(jìn)門、修行在個(gè)人的感覺?!洞笮途W(wǎng)站技術(shù)架構(gòu) 核心原理與案例分析》一個(gè)字評(píng)價(jià)這本書,屌;兩個(gè)字評(píng)價(jià)這本書,很屌;三個(gè)字評(píng)價(jià)這本書,非常屌。呵呵,好了,再說下去可能別人以為我是水軍了?!洞笮途W(wǎng)站技術(shù)架構(gòu) 核心原理與案例分析》的作者是李智慧,原阿里巴巴技術(shù)專家。Java 的大多數(shù)應(yīng)用都是用在Web上的,現(xiàn)在只要稍微大型一點(diǎn)的Web應(yīng)用,都一定是一個(gè)分布式系統(tǒng),那么一個(gè)分布式系統(tǒng)用到了哪些技術(shù)?一個(gè)大型網(wǎng)站是如何從 一個(gè)小型網(wǎng)站成長起來的?如何保證你的網(wǎng)站安全?分布式系統(tǒng)使用到了緩存,有哪些緩存?緩存的使用有哪些值得注意的事項(xiàng)?關(guān) 于分布式的知識(shí)點(diǎn),都在這本書里面有體現(xiàn),只有你想不到,沒有他寫不到,而且寫得非常易懂,基本屬于看一兩遍,再記一些筆記就知道是怎么一回事兒了。多看 幾遍,對(duì)分布式的理解一定會(huì)加深不少。而且里面不僅僅是分布式的知識(shí),還非常接地氣地寫了如何做一個(gè)好的架構(gòu)師,其實(shí)我認(rèn)為這不僅僅是寫給想做架構(gòu)師的讀 者看的,就是給讀者一些建議,如何更好地提出意見、如何更讓別人關(guān)注你的聲音、如何看到他人的優(yōu)點(diǎn),入木三分,讓人獲益匪淺?!洞笮途W(wǎng)站系統(tǒng)與Java中間件實(shí)踐》《大型網(wǎng)站系統(tǒng)與Java中間件實(shí)踐》作者曾憲杰,是淘寶的技術(shù)總監(jiān),算起來應(yīng)該在阿里有至少P8的級(jí)別了吧。這本書的部分內(nèi)容和上面一本李智慧的《大型網(wǎng)站技術(shù)架構(gòu) 核心原理與案例分析》有所重合,像分布式系統(tǒng)的演化、CDN、CAP理論和BASE理論等等,這也更說明這些都是分布式系統(tǒng)或者說是一個(gè)大型網(wǎng)站重點(diǎn)關(guān)注的內(nèi)容,當(dāng)作一次再學(xué)習(xí)也不錯(cuò)。本書要突出的重點(diǎn)是中間件三個(gè)字,中間件是分布式系統(tǒng)中一個(gè)非常重要的東西,其最重要的作用應(yīng)該就是解耦,降低模塊與模塊之間的強(qiáng)依賴,不同的模塊之間的依賴度降低,便可以各自獨(dú)立地開發(fā)自己的功能,這也可以說是軟件工程發(fā)展的目標(biāo)和驅(qū)動(dòng)力。因此,本書有一部分的內(nèi)容就是基于中間件,詳細(xì)講解了中間件與JMS的各種知識(shí),適合對(duì)分布式系統(tǒng)比較熟悉并且想要往中間件方面有一定研究的讀者?!稄腜axos到ZooKeeper 分布式一致性原理與實(shí)踐》《從Paxos到ZooKeeper 分布式一致性原理與實(shí)踐》,作者倪超,阿里巴巴工程師。這本書是我最近在研讀的一本書,和上面的《大型網(wǎng)站系統(tǒng)與Java中間件實(shí)踐》一樣,屬于分布式組件的范疇,屬于有些深入的內(nèi)容,當(dāng)然也是我自己的個(gè)人興趣。當(dāng)然,如果有志向做一個(gè)出色的大型網(wǎng)站架構(gòu)師、公司的技術(shù)總監(jiān)之類,這些知識(shí)當(dāng)然是必須掌握的。本書從分布式系統(tǒng)基本理論開始講起,講到Paxos算法,最后慢慢引入到Zookeeper,循序漸進(jìn)。當(dāng)然,更多的我目前還不方便發(fā)表什么看法,因?yàn)檫@本書的第二張Paxos算法我都還沒有弄懂(Paxos算法確實(shí)有些難以理解和不太易懂),接下來的章節(jié)還沒有看下去。如果網(wǎng)友們所在的公司在使用Zookeeper,并且你又對(duì)Zookeeper感興趣想要研究一下它的原理的,這本書將是不二之選。《MySQL5.6從零開始學(xué)》《MySQL5.6從零開始學(xué)》,作者劉增杰和李坤。作為一名Java程序員,我認(rèn)為我們千萬不要覺得數(shù)據(jù)庫是DBA的事情,數(shù)據(jù)庫對(duì)一個(gè)Java程序員來說也是必須掌握的一門知識(shí),豐富的數(shù)據(jù)庫性能優(yōu)化經(jīng)驗(yàn)是一個(gè)頂尖程序員必備技能。目前主流的數(shù)據(jù)庫有Oracle和MySQL,當(dāng)然推薦大家的是MySQL,主要原因我認(rèn)為有兩點(diǎn):1、MySQL相比Oracle更輕量級(jí)、更小、安裝和卸載更方便,SQL其實(shí)都是差不多的,如果想學(xué)數(shù)據(jù)庫,學(xué)MySQL就可以了,在家里面可以自己方便地研究,如果你的公司使用Oracle,只要再用對(duì)比學(xué)習(xí)法,關(guān)注一下Oracle和MySQL的差別即可2、隨著2009年阿里巴巴去IOE的運(yùn)動(dòng)的進(jìn)行,目前國內(nèi)的很多互聯(lián)網(wǎng)公司都會(huì)選擇MySQL作為它們使用的數(shù)據(jù)庫,因?yàn)镸ySQL免費(fèi),所以既省錢又不需要出了問題就依賴甲骨文公司MySQL學(xué)習(xí)我推薦的是這本我自己學(xué)習(xí)看的《MySQL5.6從零開始學(xué)》,我是覺得挺好的這本書,書里面的知識(shí)點(diǎn)很細(xì)致、很全面,讀者選擇書籍的標(biāo)準(zhǔn)大多不就是這兩點(diǎn)嗎?《Spring源碼深度解析》《Spring源碼深度解析》,作者郝佳。Spring 這個(gè)框架做得太好了,功能太強(qiáng)大了,以至于很多開發(fā)者都只知Spring,不知什么是工廠、什么是單例、什么是代理(我面試別人的真實(shí)體會(huì))。這種功能強(qiáng) 大的框架內(nèi)部一定是很復(fù)雜的實(shí)現(xiàn),這就導(dǎo)致一旦你的程序使用Spring,出了問題,可能是Error、可能是Exception、可能是程序運(yùn)行結(jié)果不 是你的預(yù)期的,出現(xiàn)諸如此類問題的時(shí)候,將會(huì)讓你感到困惑,除了上網(wǎng)查資料或者問別人似乎沒有更好的解決辦法。研讀Spring的源代碼不失為一種很好的學(xué)習(xí)方法,我個(gè)人認(rèn)為這有很多好處:1、理解框架內(nèi)部的實(shí)現(xiàn)之后,可以主動(dòng)去解決問題,而不需要依賴別人2、Spring框架內(nèi)部實(shí)現(xiàn)用到了很多設(shè)計(jì)模式,很好的代碼設(shè)計(jì)思路,這將會(huì)對(duì)你寫代碼、對(duì)你理解設(shè)計(jì)模式有很大的提高3、研究Spring框架將會(huì)大大增強(qiáng)你讀代碼的能力,我相信只要你能研究清楚Spring內(nèi)部是如何實(shí)現(xiàn)的,其他任何一個(gè)框架的源代碼都難不倒你總而言之,我認(rèn)為讀代碼的能力是一個(gè)普通的程序員和一個(gè)好的程序員之間最大的差別之一,前者只會(huì)把別人寫好的東西拿來用,后者不僅能用好,還清楚知道別人寫好的東西底層是如何實(shí)現(xiàn)的,在出現(xiàn)問題的時(shí)候可以輕松解決。Spring源代碼,個(gè)人推薦《Spring源碼深度解析》一書,真要研究透并且寫清楚Spring源代碼,恐怕三四本書都不夠,作者在近400頁的篇幅中盡量去講解Spring源代碼是如何實(shí)現(xiàn)的,殊為不易,盡管無法講得完全,但是相信作者的講解配合上讀者自己的研究,一定可以對(duì)Spring的實(shí)現(xiàn)有更深度的理解。后記以 上就是我推薦給Java開發(fā)者們的一些值得一看的好書。但是這些書里面并沒有Java基礎(chǔ)、Java教程之類的書,不是我不推薦,而是離我自己學(xué)習(xí) Java基礎(chǔ)技術(shù)也過去好幾年了,我學(xué)習(xí)的時(shí)候看的什么也忘了,所以我不能不負(fù)責(zé)任地推薦一些我自己都沒有看過的書給大家。對(duì)于Java基礎(chǔ)知識(shí)的學(xué)習(xí), 我提兩點(diǎn)建議吧:1、多寫多敲代碼,好的代碼與扎實(shí)的基礎(chǔ)知識(shí)一定是實(shí)踐出來的2、可以去尚學(xué)堂下載一下馬士兵的視頻來學(xué)習(xí)一下Java基礎(chǔ),還挺不錯(cuò)的,如果尚學(xué)堂官網(wǎng)上下載不了可以底下回復(fù),我的電腦里有最后,每一位讀到這里的網(wǎng)友,感謝你們能耐心地看完。希望在成為一名更優(yōu)秀的Java程序員的道路上,我們可以一起學(xué)習(xí)、一起進(jìn)步。
01-31
2018
盤點(diǎn)那些曾經(jīng)讓程序員目瞪口呆的Bug都有什么?
盤點(diǎn)那些曾經(jīng)讓程序員目瞪口呆的Bug都有什么?程序員一生與bug奮戰(zhàn),可謂是殺敵無數(shù),見怪不怪了!在某知識(shí)社交平臺(tái)中,一個(gè)“有哪些讓程序員目瞪口呆的bug”的話題引來了6700多萬的閱讀,可見程序員們對(duì)這個(gè)話題的敏感度有多高。本文,筆者特意精選了部分優(yōu)質(zhì)答案供廣大程序員參考!作者:佚名來源:IT168程序員一生與bug奮戰(zhàn),可謂是殺敵無數(shù),見怪不怪了!在某知識(shí)社交平臺(tái)中,一個(gè)“有哪些讓程序員目瞪口呆的bug”的話題引來了6700多萬的閱讀,可見程序員們對(duì)這個(gè)話題的敏感度有多高。本文,筆者特意精選了部分優(yōu)質(zhì)答案供廣大程序員參考!1、麻省理工“只能發(fā)500英里的郵件”該bug發(fā)生于麻省理工,當(dāng)時(shí)其系統(tǒng)管理員接到統(tǒng)計(jì)系主任的求助電話,主任在電話中說:“咱們的郵件系統(tǒng)無法發(fā)送距離500英里以外的地方,準(zhǔn)確地說好像是520英里?!贝藭r(shí)的系統(tǒng)管理員內(nèi)心是“毫無波瀾”的,嗯!然后,他開始了漫長且苦逼的測試,最后發(fā)現(xiàn)郵件服務(wù)器操作系統(tǒng)(SunOS)被人更新了,因?yàn)椴僮飨到y(tǒng)發(fā)行版往往配備舊軟件,因此郵件軟件實(shí)際上是被降級(jí)了(Sendmail 8 -> Sendmail 5) ,最后的結(jié)果是:Sendmail 5試圖解析Sendmail 8的配置文件。所以,為什么一定是500英里呢?且看大神講解:2、int mian()這其實(shí)是一個(gè)書寫上的錯(cuò)誤,之所以會(huì)放在本文中,是因?yàn)楹芏喑绦騿T的職業(yè)生涯中都有過寫!錯(cuò)!的經(jīng)歷!main和mian傻傻看不出來!3、醫(yī)院急診科的程序bug一位程序員為醫(yī)院急診科設(shè)計(jì)了一套應(yīng)用程序,畢竟是為急診病人服務(wù),所以程序員在實(shí)驗(yàn)室內(nèi)認(rèn)真地測試無數(shù)遍,直至確定沒有問題,才讓醫(yī)院部署使用。但是,醫(yī)院方面卻總是出現(xiàn)問題,一拿到實(shí)驗(yàn)室就沒問題。該名程序員于是深入醫(yī)院調(diào)查,最后發(fā)現(xiàn)是醫(yī)院的X光射線導(dǎo)致電腦內(nèi)存丟失了幾個(gè)bit信息,進(jìn)而讓程序出現(xiàn)問題!4、谷歌的 Google Arts & Culture APP谷歌推出的Google Arts&Culture APP是一個(gè)可以將普通人的照片與藝術(shù)照進(jìn)行對(duì)比,匹配出與用戶上傳的照片最相像的一張藝術(shù)畫,運(yùn)行效果是這樣的:圖片上也會(huì)給出匹配度,但偏偏有些人的照片上傳后,給出來的藝術(shù)畫讓人哭笑不得,比如:5、硬件開光的必要性某數(shù)據(jù)中心的火災(zāi)報(bào)警器因損壞,而在沒有發(fā)生火災(zāi)的情況下響起。詭異的是,數(shù)據(jù)中心內(nèi)確實(shí)出現(xiàn)了大面積的磁盤損壞和讀寫性能下降!經(jīng)排查,因?yàn)閳?bào)警器聲音太大影響了磁頭的運(yùn)動(dòng)!網(wǎng)友吐槽:看來給硬盤開光很有必要啊!6、某外資通信設(shè)備商的逆天bug(實(shí)在太長,給各位上圖)7、足以讓數(shù)據(jù)庫瞬間崩潰的bug愿望:在百萬量級(jí)的數(shù)據(jù)庫里實(shí)現(xiàn)快速自我交叉匹配查詢。手段:建立臨時(shí)表提速。Bug:條件里忘記添加”a.id=b.prio”結(jié)果:臨時(shí)表從預(yù)計(jì)的幾千條達(dá)到了上億條,數(shù)據(jù)庫崩潰?。。。?、足以讓系統(tǒng)癱瘓的bug9、程序員都能看懂的bug(反正筆者沒看懂,看懂的麻煩解釋一下)if (object == null) {object.doSomething();} else {object.doSomethingElse();}10、據(jù)傳,iPhone手機(jī)日歷上的bug11、購買微軟Office套件visio不可使用outlook郵箱注冊(cè)網(wǎng)友爆料,自己在購買正版Office套件visio時(shí),當(dāng)他在注冊(cè)頁面輸入微軟的outlook郵箱,系統(tǒng)居然提示系統(tǒng)中沒有outlook.com!12、集群宿主機(jī)已售內(nèi)存為負(fù)值?13、比較弱智的bug某網(wǎng)友:讓我目瞪口呆的BUG是update不加where...14、人類歷史上第一個(gè)程序BUG
01-29
2018
爬蟲需謹(jǐn)慎,你不知道的爬蟲與反爬蟲套路!
面試的時(shí)候,因?yàn)殡p方爬蟲理念或者反爬蟲理念不同,也很可能互不認(rèn)可,影響自己的求職之路。本來程序員就有“文人相輕”的傾向,何況理念真的大不同。爬蟲與反爬蟲,是一個(gè)很不陽光的行業(yè)。這里說的不陽光,有兩個(gè)含義。第一是,這個(gè)行業(yè)是隱藏在地下的,一般很少被曝光出來。很多公司對(duì)外都不會(huì)宣稱自己有爬蟲團(tuán)隊(duì),甚至隱瞞自己有反爬蟲團(tuán)隊(duì)的事實(shí)。這可能是出于公司戰(zhàn)略角度來看的,與技術(shù)無關(guān)。第二是,這個(gè)行業(yè)并不是一個(gè)很積極向上的行業(yè)。很多人在這個(gè)行業(yè)摸爬滾打了多年,積攢了大量的經(jīng)驗(yàn),但是悲哀的發(fā)現(xiàn),這些經(jīng)驗(yàn)很難兌換成閃光的簡歷。面試的時(shí)候,因?yàn)殡p方爬蟲理念或者反爬蟲理念不同,也很可能互不認(rèn)可,影響自己的求職之路。本來程序員就有“文人相輕”的傾向,何況理念真的大不同。然而這就是程序員的宿命。不管這個(gè)行業(yè)有多么的不陽光,依然無法阻擋大量的人進(jìn)入這個(gè)行業(yè),因?yàn)橛泄镜男枨?。那么,公司到底有什么樣的需求,?dǎo)致了我們真的需要爬蟲/反爬蟲呢?反爬蟲很好理解,有了爬蟲我們自然要反爬蟲。對(duì)于程序員來說,哪怕僅僅是出于“我就是要證明我技術(shù)比你好”的目的,也會(huì)去做。對(duì)于公司來說,意義更加重大,最少,也能降低服務(wù)器負(fù)載,光憑這一點(diǎn),反爬蟲就有充足的生存價(jià)值。那么爬蟲呢?最早的爬蟲起源于搜索引擎。搜索引擎是善意的爬蟲,可以檢索你的一切信息,并提供給其他用戶訪問。為此他們還專門定義了 robots.txt 文件,作為君子協(xié)定,這是一個(gè)雙贏的局面。然而事情很快被一些人破壞了,爬蟲很快就變的不再“君子”了。后來有了“大數(shù)據(jù)”,無數(shù)的媒體鼓吹大數(shù)據(jù)是未來的趨勢,吸引了一批又一批的炮灰去創(chuàng)辦大數(shù)據(jù)公司。這些人手頭根本沒有大數(shù)據(jù),他們的數(shù)據(jù)只要用一個(gè) U 盤就可以裝的下,怎么好意思叫大數(shù)據(jù)呢?這么點(diǎn)數(shù)據(jù)根本忽悠不了投資者,于是他們開始寫爬蟲,拼命地爬取各個(gè)公司的數(shù)據(jù)。很快他們的數(shù)據(jù),就無法用一個(gè) U 盤裝下了。這個(gè)時(shí)候終于可以休息休息,然后出去吹噓融資啦。然而可悲的是,大容量 U 盤不斷地在發(fā)布,他們總是在拼命地追趕存儲(chǔ)增加的速度。以上是爬蟲與反爬蟲的歷史,下面通過四個(gè)方面深入談下爬蟲與反爬蟲:爬蟲反爬蟲運(yùn)行現(xiàn)狀爬蟲反爬蟲技術(shù)現(xiàn)狀爬蟲反爬蟲套路現(xiàn)狀爬蟲反爬蟲的未來爬蟲反爬蟲運(yùn)行現(xiàn)狀電子商務(wù)行業(yè)的爬蟲與反爬蟲更有趣一些,最初的爬蟲需求來源于比價(jià)。這是某些電商網(wǎng)站的核心業(yè)務(wù),大家買商品的時(shí)候,是一個(gè)價(jià)格敏感型用戶的話,很可能用過網(wǎng)上的比價(jià)功能(真心很好用啊)。毫無懸念,他們會(huì)使用爬蟲技術(shù)來爬取所有相關(guān)電商的價(jià)格。他們的爬蟲還是比較溫柔的,對(duì)大家的服務(wù)器不會(huì)造成太大的壓力。然而,這并不意味著大家喜歡被他爬取,畢竟這對(duì)其他電商是不利的,于是需要通過技術(shù)手段來做反爬蟲。按照技術(shù)人員的想法,對(duì)方用技術(shù)懟過來,我們就要用技術(shù)懟回去,不能慫啊。這個(gè)想法是很好的,但是實(shí)際應(yīng)用起來根本不是這么回事。誠然,技術(shù)是很重要的,但是實(shí)際操作上,更重要的是套路。誰的套路更深,誰就能玩弄對(duì)方于鼓掌之中。誰的套路不行,有再好的技術(shù),也只能被耍的團(tuán)團(tuán)轉(zhuǎn)。這個(gè)雖然有點(diǎn)傷技術(shù)人員的自尊,然而,我們也不是第一天被傷自尊了。大家應(yīng)該早就習(xí)慣了吧。真實(shí)世界的爬蟲比例大家應(yīng)該聽過一句話吧,大概意思是說,整個(gè)互聯(lián)網(wǎng)上大概有 50% 以上的流量其實(shí)是爬蟲。第一次聽這句話的時(shí)候,我還不是很相信,我覺得這個(gè)說法實(shí)在是太夸張了。怎么可能爬蟲比人還多呢? 爬蟲畢竟只是個(gè)輔助而已?,F(xiàn)在做了這么久的反爬蟲,我依然覺得這句話太夸張了。50%?你在逗我?就這么少的量?舉個(gè)例子,某公司,某個(gè)頁面的接口,每分鐘訪問量是 1.2 萬左右,這里面有多少是正常用戶呢?50%?60%?還是?正確答案是:500 以下。也就是說,一個(gè)單獨(dú)的頁面,12000 的訪問量里,有 500 是正常用戶,其余是爬蟲。注意,統(tǒng)計(jì)爬蟲的時(shí)候,考慮到你不可能識(shí)別出所有的爬蟲,因此,這 500 個(gè)用戶里面,其實(shí)還隱藏著一些爬蟲。那么爬蟲率大概是:(12000-500)/12000=95.8%。這個(gè)數(shù)字你猜到了嗎?這么大的爬蟲量,這么少的用戶量,大家到底是在干什么?是什么原因?qū)е铝嗣髅魇前偃思?jí)別的生意,卻需要萬級(jí)別的爬蟲來做輔助? 95% 以上,19 保 1?答案可能會(huì)相當(dāng)令人噴飯,這些爬蟲大部分是由于決策失誤導(dǎo)致的??扌Σ坏玫臎Q策思路舉個(gè)例子,這個(gè)世界存在 3 家公司,售賣相同的電商產(chǎn)品,三家公司的名字分別是 A,B,C。這個(gè)時(shí)候,客戶去 A 公司查詢了下某商品的價(jià)格,看了下發(fā)現(xiàn)價(jià)格不好,于是他不打算買了,他對(duì)整個(gè)行業(yè)的訂單貢獻(xiàn)為 0。然而 A 公司的后臺(tái)會(huì)檢測到,我們有個(gè)客戶流失了,原因是他來查詢了一個(gè)商品,這個(gè)商品我們的價(jià)格不好,沒關(guān)系,我去爬爬別人試試。于是他分別爬取了 B 公司和 C 公司,B 公司的后臺(tái)檢測到有人來查詢價(jià)格,但是呢,最終沒有下單。他會(huì)認(rèn)為,嗯,我們流失了一個(gè)客戶。怎么辦呢?我可以爬爬看,別人什么價(jià)格。于是他爬取了 A 和 C,C 公司的后臺(tái)檢測到有人來查詢價(jià)格。。。。。過了一段時(shí)間,三家公司的服務(wù)器分別報(bào)警,訪問量過高。三家公司的 CTO 也很納悶,沒有生成任何訂單啊,怎么訪問量這么高?一定是其他兩家禽獸寫的爬蟲沒有限制好頻率。媽的,老子要報(bào)仇!于是分別做反爬蟲,不讓對(duì)方抓自己的數(shù)據(jù)。然后進(jìn)一步強(qiáng)化自己的爬蟲團(tuán)隊(duì)抓別人的數(shù)據(jù)。一定要做到:寧叫我抓天下人,休叫天下人抓我。然后,做反爬蟲的就要加班天天研究如何攔截爬蟲,做爬蟲的被攔截了,就要天天研究如何破解反爬蟲策略。大家就這么把資源全都浪費(fèi)在沒用的地方了,直到大家合并了,才會(huì)心平氣和的坐下來談?wù)?,都少抓點(diǎn)。最近國內(nèi)的公司有大量的合并,我猜這種“心平氣和”應(yīng)該不少吧?爬蟲反爬蟲技術(shù)現(xiàn)狀下面我們談?wù)劊老x和反爬蟲分別都是怎么做的。為 Python 平反首先是爬蟲,爬蟲教程你到處都可以搜的到,大部分是 Python 寫的。我曾經(jīng)在一篇文章提到過:用 Python 寫的爬蟲是最薄弱的,因?yàn)樘焐⒉贿m合破解反爬蟲邏輯,因?yàn)榉磁老x都是用 JavaScript 來處理。然而慢慢的,我發(fā)現(xiàn)這個(gè)理解有點(diǎn)問題(當(dāng)然我如果說我當(dāng)時(shí)是出于工作需要而有意黑 Python,你們信嗎。。。)。Python 的確不適合寫反爬蟲邏輯,但是 Python 是一門膠水語言,他適合捆綁任何一種框架。而反爬蟲策略經(jīng)常會(huì)變化的翻天覆地,需要對(duì)代碼進(jìn)行大刀闊斧的重構(gòu),甚至重寫。這種情況下,Python 不失為一種合適的解決方案?!∨e個(gè)例子,你之前是用 selenium 爬取對(duì)方的站點(diǎn),后來你發(fā)現(xiàn)自己被封了,而且封鎖方式十分隱蔽,完全搞不清到底是如何封的,你會(huì)怎么辦?你會(huì)跟蹤 selenium 的源碼來找到出錯(cuò)的地方嗎?你不會(huì),你只會(huì)換個(gè)框架,用另一種方式來爬取,然后你就把兩個(gè)框架都淺嘗輒止地用了下,一個(gè)都沒有深入研究過。因?yàn)闆]等你研究好,也許人家又換方式了,你不得不再找個(gè)框架來爬取。畢竟,老板等著明天早上開會(huì)要數(shù)據(jù)呢。老板一般都是早上八九點(diǎn)開會(huì),所以你七點(diǎn)之前必須搞定。等你厭倦了,打算換個(gè)工作的時(shí)候,簡歷上又只能寫“了解 n 個(gè)框架的使用”,僅此而已?!∵@就是爬蟲工程師的宿命,爬蟲工程師比外包還可憐。外包雖然不容易積累技術(shù),但是好歹有正常上下班時(shí)間,爬蟲工程師連這個(gè)權(quán)利都沒有。 然而反爬蟲工程師就不可憐了嗎?也不是的,反爬蟲有個(gè)天生的死穴,就是:誤傷率?!o法繞開的誤傷率我們首先談?wù)?,面?duì)對(duì)方的爬蟲,你的第一反應(yīng)是什么?如果限定時(shí)間的話,大部分人給我的答案都是:封殺對(duì)方的 IP。然而,問題就出在,IP 不是每人一個(gè)的,大的公司有出口 IP,ISP 有的時(shí)候會(huì)劫持流量讓你們走代理,有的人天生喜歡掛代理,有的人為了翻墻 24 小時(shí)掛 VPN。最坑的是,現(xiàn)在是移動(dòng)互聯(lián)網(wǎng)時(shí)代,你如果封了一個(gè) IP?不好意思,這是中國聯(lián)通的 4G 網(wǎng)絡(luò),5 分鐘之前還是別人,5 分鐘之后就換人了哦!因此,封 IP 的誤傷指數(shù)最高,并且,效果又是最差的,因?yàn)楝F(xiàn)在即使是最菜的新手,也知道用代理池了。你們可以去淘寶看下,幾十萬的代理價(jià)值多少錢?我們就不談到處都有的免費(fèi)代理了。也有人說:我可以掃描對(duì)方端口,如果開放了代理端口,那就意味著是個(gè)代理,我就可以封殺了呀。 事實(shí)是殘酷的,我曾經(jīng)封殺過一個(gè) IP,因?yàn)樗_放了一個(gè)代理端口,而且是個(gè)很小眾的代理端口。不出一天就有人來報(bào)事件,說我們一個(gè)分公司被攔截了,我一查 IP,還真是我封的 IP。我就很郁悶地問他們 IT,開這個(gè)端口干什么?他說做郵件服務(wù)器啊。我說為啥要用這么奇怪的端口?他說,這不是怕別人猜出來么?我就隨便取了個(gè)。掃描端口的進(jìn)階版,還有一種方式,就是去訂單庫查找這個(gè) IP 是否下過訂單,如果沒有,那么就是安全的;如果有,那就不安全,有很多網(wǎng)站會(huì)使用這個(gè)方法。然而這只是一種自欺欺人的辦法而已,只需要下一單,就可以永久洗白自己的 IP,天下還有比這更便宜的生意嗎?因此,封 IP,以及封 IP 的進(jìn)階版:掃描端口再封 IP,都是沒用的。根本不要考慮從 IP 下手,因?yàn)閷?duì)手會(huì)用大量的時(shí)間考慮如何躲避 IP 封鎖,你干嘛和人家硬碰呢?這沒有任何意義。那么,下一步你會(huì)考慮到什么?很多站點(diǎn)的工程師會(huì)考慮:既然沒辦法阻止對(duì)方,那我就讓它變的不可讀吧。我會(huì)用圖片來渲染關(guān)鍵信息,比如價(jià)格。這樣,人眼可見,機(jī)器識(shí)別不出來。 這個(gè)想法曾經(jīng)是正確的,然而,坑爹的技術(shù)發(fā)展,帶給我們一個(gè)坑爹的技術(shù),叫機(jī)器學(xué)習(xí)。順便帶動(dòng)了一個(gè)行業(yè)的迅猛發(fā)展,叫 OCR。很快,識(shí)別圖像就不再是任何難題了,甚至連人眼都很難識(shí)別的驗(yàn)證碼,有的 OCR 都能搞定,比我肉眼識(shí)別率都高。更何況,現(xiàn)在有了打碼平臺(tái),用資本都可以搞定,都不需要技術(shù)。那么,下一步你會(huì)考慮什么?這個(gè)時(shí)候,后端工程師已經(jīng)沒有太多的辦法可以搞了?!〔贿^后端搞不定的事情,一般都推給前端啊,前端從來都是后端搞不定問題時(shí)的背鍋俠。多少年來我們都是這么過來的,前端工程師這個(gè)時(shí)候就要勇敢地站出來了:“都不要得瑟了,來比比誰的前端知識(shí)牛逼,你牛逼我就讓你爬。”我不知道這篇文章的讀者里有多少前端工程師,我只是想順便提一下:你們以后將會(huì)是更加搶手的人才。前端工程師的逆襲我們知道,一個(gè)數(shù)據(jù)要顯示到前端,不僅僅是后端輸出就完事了,前端要做大量的事情,比如取到 json 之后,至少要用 template 轉(zhuǎn)成 html 吧?這已經(jīng)是步驟最少最簡單的了,然后你總要用 css 渲染下吧? 這也不是什么難事。等等,你還記得自己第一次做這個(gè)事情的時(shí)候的經(jīng)歷嗎?真的,不是什么難事嗎?有沒有經(jīng)歷過,一個(gè) html 標(biāo)簽拼錯(cuò),或者沒有閉合,導(dǎo)致頁面錯(cuò)亂?一個(gè) css 沒弄好,導(dǎo)致整個(gè)頁面都不知道飄到哪去了?這些事情,你是不是很想讓別人再經(jīng)歷一次?這件事情充分說明了:讓一個(gè)資深的前端工程師來把事情搞復(fù)雜一點(diǎn),對(duì)方如果配備了資深前端工程師來破解,也需要耗費(fèi) 3 倍以上的時(shí)間。畢竟是讀別人的代碼,別人寫代碼用了一分鐘,你總是要讀兩分鐘,然后罵一分鐘吧?這已經(jīng)算很少的了。如果對(duì)方?jīng)]有配備前端工程師。。。那么經(jīng)過一段時(shí)間,他們會(huì)成長為前端工程師。之后,由于前端工程師的待遇比爬蟲工程師稍好一些,他們很快會(huì)離職做前端,既緩解了前端人才缺口,又可以讓對(duì)方缺人,重招。而他們一般是招后端做爬蟲,這些人需要再接受一次折磨,再次成長為前端工程師,這不是很好的事情嗎?所以,如果你手下的爬蟲工程師離職率很高,請(qǐng)仔細(xì)思考下,是不是自己的招聘方向有問題。那么前端最坑爹的技術(shù)是什么呢?前端最坑爹的,也是最強(qiáng)大的,就是我們的:JavaScript。JavaScript 有大量的花樣可以玩,毫不夸張的說,一周換一個(gè) feature(Bug)給對(duì)方學(xué)習(xí),一年不帶重樣的。這個(gè)時(shí)候你就相當(dāng)于一個(gè)面試官,對(duì)方要通過你的面試才行。舉個(gè)例子,在 Array.prototyp e里,有沒有 map ???什么時(shí)候有?。磕阏f你是 xx 瀏覽器,那你這個(gè)應(yīng)該是有還是應(yīng)該沒有啊?你說這個(gè)可以有?。靠墒沁@個(gè)真沒有啊。那[]能不能在 string 里面獲取字符?。磕膫€(gè)瀏覽器可以哪個(gè)不行???咦!你為什么支持 WebKit 前綴???等等,剛剛你還支持怎么現(xiàn)在不支持了???你聲明的不對(duì)啊。這些對(duì)于前端都是簡單的知識(shí),已經(jīng)習(xí)以為常了,但是對(duì)于后端來說簡直就是噩夢。然而,前端人員自己作死,研究出了一個(gè)東西,叫:Nodejs?;?V8,秒殺所有的 js 運(yùn)行。不過 Nodejs 實(shí)現(xiàn)了大量的 feature,都是瀏覽器不存在的,你隨隨便便訪問一些東西(比如你為什么會(huì)支持 process.exit),都會(huì)把 node 坑的好慘好慘。而且瀏覽器里的 js,你拉到后臺(tái)用 Nodejs 跑,你是不是想到了什么安全漏洞?這個(gè)是不是叫,代碼與數(shù)據(jù)混合?如果他在 js 里跑點(diǎn)惡心的代碼,瀏覽器不支持但是 node 支持怎么辦?還好,爬蟲工程師還有 phantomjs。但是,你怎么沒有定位?。?哈哈,你終于模擬出了定位。但是不對(duì)啊,根據(jù)我當(dāng)前設(shè)置的安全策略你現(xiàn)在不應(yīng)該能定位?。磕闶窃趺炊ǔ鰜淼??連 phantomjs 的作者自己都維護(hù)不下去了,你真的愿意繼續(xù)用嗎?當(dāng)然了,最終,所有的反爬蟲策略都逃不脫被破解的命運(yùn)。但是這需要時(shí)間,反爬蟲需要做的就是頻繁發(fā)布,拖垮對(duì)方。如果對(duì)方兩天可以破解你的系統(tǒng),你就一天一發(fā)布,那么你就是安全的。這個(gè)系統(tǒng)甚至可以改名叫做“每天一道反爬題,輕輕松松學(xué)前端”。誤傷,還是誤傷這又回到了我們開始提到的“誤傷率”的問題了。我們知道,發(fā)布越頻繁,出問題的概率越高。那么,如何在頻繁發(fā)布的情況下,還能做到少出問題呢?此外還有一個(gè)問題,我們寫了大量的“不可讀代碼”給對(duì)方,的確能給對(duì)方造成大量的壓力,但是,這些代碼我們自己也要維護(hù)啊。如果有一天忽然說,沒人爬我們了,你們把代碼下線掉吧。這個(gè)時(shí)候?qū)懘a的人已經(jīng)不在了,你們?cè)趺粗廊绾蜗戮€這些代碼呢?這兩個(gè)問題我暫時(shí)不能公布我們的做法,但是大家都是聰明人,應(yīng)該都是有自己的方案的,軟件行業(yè)之所以忙的不得了,無非就是在折騰兩件事,一個(gè)是如何將代碼拆分開,一個(gè)是如何將代碼合并起來。關(guān)于誤傷率,我只提一個(gè)小的 tip:你可以只開啟反爬蟲,但是不攔截,先放著,發(fā)統(tǒng)計(jì)信息給自己,相當(dāng)于模擬演練。等統(tǒng)計(jì)的差不多了,發(fā)現(xiàn)真的開啟了也不會(huì)有什么問題,那就開啟攔截或者開啟造假。這里就引發(fā)了一個(gè)問題,往往一個(gè)公司的各個(gè)頻道,爬取難度是不一樣的。原因就是,誤傷檢測這種東西與業(yè)務(wù)相關(guān),公司的基礎(chǔ)部門很難做出通用的,只能各個(gè)部門自己做,甚至有的部門做了有的沒做。因此引發(fā)了爬蟲界一個(gè)奇葩的通用做法:如果 PC 頁面爬不到,就去 H5 試試,如果 H5 很麻煩,就去 PC 碰碰運(yùn)氣。爬蟲反爬蟲套路現(xiàn)狀那么一旦有發(fā)現(xiàn)對(duì)方數(shù)據(jù)造假怎么辦?早期的時(shí)候,大家都是要抽查數(shù)據(jù),通過數(shù)據(jù)來檢測對(duì)方是否有造假,這個(gè)需要人工核對(duì),成本非常高??墒悄且呀?jīng)是洪荒時(shí)代的事情了。如果你們公司還在通過這種方式來檢測,說明你們的技術(shù)還比較落伍。之前我們的競爭對(duì)手是這么干的:他們會(huì)抓取我們兩次,一次是他們解密出來 key 之后,用正經(jīng)方式來抓取,這次的結(jié)果定為 A。一次是不帶 key,直接來抓,這次的結(jié)果定為 B。根據(jù)前文描述,我們可以知道,B 一定是錯(cuò)誤的。那么如果 A 與 B 相等,說明自己中招了,這個(gè)時(shí)候會(huì)停掉爬蟲,重新破解。不要回應(yīng)所以之前有一篇關(guān)于爬蟲的文章,說如何破解我們的。一直有人要我回復(fù)下,我一直覺得沒什么可以回復(fù)的。第一,反爬蟲被破解了是正常的。這個(gè)世界上有個(gè)萬能的爬蟲手段,叫“人肉爬蟲”。假設(shè)我們就是有錢,在印度開個(gè)分公司,每天雇便宜的勞動(dòng)力用鼠標(biāo)直接來點(diǎn),你能拿我怎么辦?第二,我們真正關(guān)心的是后續(xù)的這些套路。而我讀了那篇文章,發(fā)現(xiàn)只是調(diào)用了selenium并且拿到了結(jié)果,就認(rèn)為自己成功了。我相信你讀到這里,應(yīng)該已經(jīng)明白為什么我不愿意回復(fù)了。我們最重要的是工作,而不是誰打誰的臉。大家如果經(jīng)常混技術(shù)社區(qū)就會(huì)發(fā)現(xiàn),每天熱衷于打別人臉的,一般技術(shù)都不是很好。當(dāng)然這并不代表我們技術(shù)天下第一什么的,我們每天面對(duì)大量的爬蟲,還是遇到過很多高手的。就如同武俠小說里一樣,高手一般都比較低調(diào),他們默默地拿走數(shù)據(jù),很難被發(fā)現(xiàn),而且頻率極低,不會(huì)影響我們的考評(píng)。你們應(yīng)該明白,這是智商與情商兼具的高手了。我們還碰到拉走我們 js,砍掉無用的部分直接解出 key,相當(dāng)高效不拖泥帶水的爬蟲,一點(diǎn)廢請(qǐng)求都沒有(相比某些爬蟲教程,總是教你多訪問,寫沒用的 url 免得被發(fā)現(xiàn),真的不知道高到哪里去了。這樣做除了會(huì)導(dǎo)致機(jī)器報(bào)警,導(dǎo)致對(duì)方加班封鎖以外,對(duì)你自己沒有任何好處)。而我們能發(fā)現(xiàn)這一點(diǎn)僅僅是是因?yàn)樗驼{(diào)地寫了一篇博客,通篇只介紹技術(shù),沒有提任何沒用的東西。這里我只是順便發(fā)了點(diǎn)小牢騷,就是希望后續(xù)不要總是有人讓我回應(yīng)一些關(guān)于爬蟲的文章。線下我認(rèn)識(shí)很多爬蟲工程師,水平真的很好,也真的很低調(diào)(不然你以為我是怎么知道如何對(duì)付爬蟲的。。。),大家都是一起混的,不會(huì)產(chǎn)生“一定要互相打臉”的情緒。進(jìn)化早期我們和競爭對(duì)手打的時(shí)候,雙方的技術(shù)都比較初級(jí)。后來慢慢的,爬蟲在升級(jí),反爬蟲也在升級(jí),這個(gè)我們稱為“進(jìn)化”。我們?cè)?jīng)給對(duì)方放過水,來試圖拖慢他們的進(jìn)化速度,然而,效果不是特別理想。爬蟲是否進(jìn)化,取決于爬蟲工程師自己的 KPI,而不是反爬蟲的進(jìn)化速度。后期打到白熱化的時(shí)候,用的技術(shù)越來越匪夷所思。舉個(gè)例子,很多人會(huì)提,做反爬蟲會(huì)用到 canvas 指紋,并認(rèn)為是最高境界。其實(shí)這個(gè)對(duì)于反爬蟲來說也只是個(gè)輔助,canvas 指紋的含義是,因?yàn)椴煌布?duì) canvas 支持不同,因此你只要畫一個(gè)很復(fù)雜的 canvas,那么得出的 image,總是存在像素級(jí)別的誤差??紤]到爬蟲代碼都是統(tǒng)一的,就算起 selenium,也是 Ghost 的,因此指紋一般都是一致的,因此繞過幾率非常低。但是!這個(gè)東西天生有兩個(gè)缺陷。第一是,無法驗(yàn)證合法性。當(dāng)然了,你可以用非對(duì)稱加密來保證合法,但是這個(gè)并不靠譜。其次,canvas 的沖突概率非常高,遠(yuǎn)遠(yuǎn)不是作者宣稱的那樣,沖突率極低。也許在國外沖突是比較低,因?yàn)閲獾恼Z言比較多。但是國內(nèi)公司通常是 IT 統(tǒng)一裝機(jī),無論是軟件還是硬件都驚人的一致。我們測試 canvas 指紋的時(shí)候,在攜程內(nèi)部隨便找了 20 多臺(tái)機(jī)器,得出的指紋都完全一樣,一丁點(diǎn)差別都沒有。因此,有些“高級(jí)技巧”一點(diǎn)都不實(shí)用。法律途徑此外就是大家可能都考慮過的:爬蟲違法嗎?能起訴對(duì)方讓對(duì)方不爬嗎?法務(wù)給的答案到是很干脆,可以,前提是證據(jù)。遺憾的是,這個(gè)世界上大部分的爬蟲爬取數(shù)據(jù)是不會(huì)公布到自己網(wǎng)站的,只是用于自己的數(shù)據(jù)分析。因此,即使有一些關(guān)于爬蟲的官司做為先例,并且已經(jīng)打完了,依然對(duì)我們沒有任何幫助。反爬蟲,在對(duì)方足夠低調(diào)的情況下,注定還是個(gè)技術(shù)活。搞事情,立 Flag到了后來,我們已經(jīng)不再局限于打打技術(shù)了,反爬蟲的代碼里我們經(jīng)常埋點(diǎn)小彩蛋給對(duì)方,比如寫點(diǎn)注釋給對(duì)方。雙方通過互相交戰(zhàn),頻繁發(fā)布,居然聊的挺 high 的。比如問問對(duì)方,北京房價(jià)是不是很高啊?對(duì)方回應(yīng),歐巴,我可是憑本事吃飯哦。繼續(xù)問,搖到號(hào)了嗎?諸如此類等等。這樣的事情你來我往的,很容易動(dòng)搖對(duì)方的軍心,還是很有作用的。試想一下,如果你的爬蟲工程師在大年三十還苦逼加班的時(shí)候,看到對(duì)方留言說自己拿到了 n 個(gè)月的年終獎(jiǎng),你覺得你的工程師,離辭職還遠(yuǎn)嗎?最后,我們終于搞出了大動(dòng)作,覺得一定可以坑對(duì)方很久了。我們還特意去一家小火鍋店吃了一頓,慶祝一下,準(zhǔn)備明天上線。大家都知道,一般立 Flag 的下場都比較慘的,兩個(gè)小時(shí)的自助火鍋,我們剛吃五分鐘,就得到了我們投資競爭對(duì)手的消息。后面的一個(gè)多小時(shí),團(tuán)隊(duì)氣氛都很尷尬,誰也說不出什么話。我們組有個(gè)實(shí)習(xí)生,后來鼓足勇氣問了我一個(gè)問題:“我還能留下來嗎?”畢竟,大部分情況下,技術(shù)還是要屈服于資本的力量。爬蟲反爬蟲的未來與競爭對(duì)手和解之后,我們?nèi)グ菰L對(duì)方,大家坐在了一起。之前網(wǎng)上自稱妹子的,一個(gè)個(gè)都是五大三粗的漢子,這讓我們相當(dāng)絕望。在場唯一的一個(gè)妹子還是我們自己帶過去的(就是上面提到的實(shí)習(xí)生),感覺套路了這么久,最終還是被對(duì)方套路了。好在,吃的喝的都很好,大家玩的還是比較 high 的。后續(xù)就是和平年代啦,大家不打仗了,反爬蟲的邏輯扔在那做個(gè)防御,然后就開放白名單允許對(duì)方爬取了。群里經(jīng)常叫的就是:xxx 你怎么頻率這么高,xxx 你為什么這個(gè)接口沒給我開放,為什么我爬的東西不對(duì)我靠你是不是把我封了啊,諸如此類的。和平年代的反爬蟲比戰(zhàn)爭年代還難做,因?yàn)閼?zhàn)爭年代,誤傷率只要不是太高,公司就可以接受。和平年代大家不能搞事情,誤傷率稍稍多一點(diǎn),就會(huì)有人叫:好好的不賺錢,瞎搞什么搞。此外,戰(zhàn)爭年代只要不攔截用戶,就不算誤傷。和平年代還要考慮白名單,攔截了合作伙伴也是誤傷,因此各方面會(huì)更保守一些。不過,總體來說還是和平年代比較 happy,畢竟,誰會(huì)喜歡沒事加班玩呢。然而和平持續(xù)的不是很久,很快就有了新的競爭對(duì)手選擇爬蟲來與我們打,畢竟,這是一個(gè)利益驅(qū)使的世界。只要有大量的利潤,資本家就會(huì)殺人放火,這不是我們這些技術(shù)人員可以決定的,我們希望天下無蟲,但是我們又有什么權(quán)利呢。好在,這樣可以催生更多的職位,順便提高大家的身價(jià),也算是個(gè)好事情吧。
01-26
2018
Facebook如何運(yùn)用機(jī)器學(xué)習(xí)進(jìn)行億級(jí)用戶數(shù)據(jù)處理
2017年末,F(xiàn)acebook應(yīng)用機(jī)器學(xué)習(xí)組發(fā)布最新論文,對(duì)整個(gè)Facebook的機(jī)器學(xué)習(xí)軟硬件架構(gòu)進(jìn)行了介紹??v覽全文,我們也可以從中對(duì)Facebook各產(chǎn)品的機(jī)器學(xué)習(xí)策略一窺究竟。論文中涉及到機(jī)器學(xué)習(xí)在全球規(guī)模(上億級(jí)數(shù)據(jù)處理)上的全新挑戰(zhàn),并給出了Facebook的應(yīng)對(duì)策略和解決思路,對(duì)相關(guān)行業(yè)和研究極其有意義。摘要機(jī)器學(xué)習(xí)在Facebook的眾多產(chǎn)品和服務(wù)中都有著舉足輕重的地位。 本文將詳細(xì)介紹Facebook在機(jī)器學(xué)習(xí)方面的軟硬件基礎(chǔ)架構(gòu),如何來滿足其全球規(guī)模的運(yùn)算需求。Facebook的機(jī)器學(xué)習(xí)需求極其繁雜:需要運(yùn)行大量不同的機(jī)器學(xué)習(xí)模型。這種復(fù)雜性已經(jīng)深深刻在Facebook系統(tǒng)堆棧的所有層面上。此外,F(xiàn)acebook存儲(chǔ)的所有數(shù)據(jù),有相當(dāng)大一部分會(huì)流經(jīng)機(jī)器學(xué)習(xí)管道,這樣的數(shù)據(jù)載荷為Facebook的分布式高性能訓(xùn)練流帶來巨大的壓力。計(jì)算需求也非常緊張,在保持用于訓(xùn)練的GPU/CPU平臺(tái)的同時(shí)平衡出大量CPU容量用于實(shí)時(shí)推理,也帶來了異常緊張的。這些問題及其他難題的解決,仍有待我們?cè)诳缭綑C(jī)器學(xué)習(xí)算法、軟件和硬件設(shè)計(jì)上持久而不懈的努力。引言Facebook的使命是“為人類構(gòu)建社交關(guān)系賦能,讓世界聯(lián)系更加緊密”。截至2017年12月,F(xiàn)acebook已經(jīng)連接了全球超過20億的人口。同時(shí),過去幾年來,機(jī)器學(xué)習(xí)同樣在這樣一種全球尺度的實(shí)際問題上進(jìn)行著一場革命,包括在機(jī)器學(xué)習(xí)算法創(chuàng)新方面的良性循環(huán),用于模型訓(xùn)練的海量數(shù)據(jù)以及高性能計(jì)算機(jī)體系結(jié)構(gòu)的進(jìn)步。在Facebook上,機(jī)器學(xué)習(xí)幾乎在提升用戶體驗(yàn)的所有層面都發(fā)揮著關(guān)鍵作用,包括諸如新聞推送語音和文本翻譯以及照片和實(shí)時(shí)視頻分類的排名等服務(wù)。Facebook在這些服務(wù)中用到了各種各樣的機(jī)器學(xué)習(xí)算法,包括支持向量機(jī),梯度boosted決策樹和許多類型的神經(jīng)網(wǎng)絡(luò)。本文將介紹Facebook的數(shù)據(jù)中心架構(gòu)支持機(jī)器學(xué)習(xí)需求的幾個(gè)重要層面。其架構(gòu)包括了內(nèi)部的“ML-as-a-Service”流,開源機(jī)器學(xué)習(xí)框架,和分布式訓(xùn)練算法。從硬件角度來看,F(xiàn)acebook利用了大量的CPU和GPU平臺(tái)來訓(xùn)練模型,以便在所需的服務(wù)延遲時(shí)間內(nèi)支持模型的訓(xùn)練頻率。對(duì)于機(jī)器學(xué)習(xí)推理過程,F(xiàn)acebook主要依靠CPU來處理所有主要的服務(wù),而其中神經(jīng)網(wǎng)絡(luò)排名服務(wù)(比如新聞推送)占據(jù)著所有計(jì)算負(fù)載的大頭。Facebook所存儲(chǔ)的海量數(shù)據(jù)中,有一大部分要流經(jīng)機(jī)器學(xué)習(xí)管道,并且為了提高模型質(zhì)量,這一部分的數(shù)據(jù)量還在隨著時(shí)間推移不斷增加。提供機(jī)器學(xué)習(xí)服務(wù)所需的大量數(shù)據(jù)成為了Facebook的數(shù)據(jù)中心將要在全球規(guī)模上面臨的挑戰(zhàn)。目前已有的可被用來向模型高效地提供數(shù)據(jù)的技術(shù)有,數(shù)據(jù)反饋和訓(xùn)練的解耦操作,數(shù)據(jù)/計(jì)算協(xié)同定位和網(wǎng)絡(luò)優(yōu)化。與此同時(shí),F(xiàn)acebook公司這樣大的計(jì)算和數(shù)據(jù)規(guī)模自身還帶來了一個(gè)獨(dú)特的機(jī)會(huì)。在每天的負(fù)載周期內(nèi),非高峰期都會(huì)空閑出大量可以用來進(jìn)行分布式訓(xùn)練算法的CPU。Facebook的計(jì)算集群(fleet)涉及到數(shù)十個(gè)數(shù)據(jù)中心,這樣大的規(guī)模還提供了一種容災(zāi)能力。及時(shí)交付新的機(jī)器學(xué)習(xí)模型對(duì)于Facebook業(yè)務(wù)的運(yùn)營是非常重要的,為了保證這一點(diǎn),容災(zāi)規(guī)劃也至關(guān)重要。展望未來,F(xiàn)acebook希望看到其現(xiàn)有的和新的服務(wù)中的機(jī)器學(xué)習(xí)使用頻率快速增長。當(dāng)然,這種增長也將為負(fù)責(zé)這些服務(wù)架構(gòu)的團(tuán)隊(duì)在全球規(guī)模的拓展性上帶來更加嚴(yán)峻的挑戰(zhàn)。盡管在現(xiàn)有平臺(tái)上優(yōu)化基礎(chǔ)架構(gòu)對(duì)公司是一個(gè)重大的機(jī)遇,但我們?nèi)匀辉诜e極評(píng)估和摸索新的硬件解決方案,同時(shí)保持對(duì)于算法創(chuàng)新的關(guān)注。本文(Facebook對(duì)機(jī)器學(xué)習(xí)的看法)的主要內(nèi)容包括:機(jī)器學(xué)習(xí)正在被廣泛應(yīng)用在Facebook幾乎所有的服務(wù),而計(jì)算機(jī)視覺只占資源需求的一小部分。Facebook所需的大量機(jī)器學(xué)習(xí)算法極其繁雜,包括但不限于神經(jīng)網(wǎng)絡(luò)我們的機(jī)器學(xué)習(xí)管道正在處理海量的數(shù)據(jù),而這會(huì)帶來計(jì)算節(jié)點(diǎn)之外的工程和效率方面的挑戰(zhàn)。Facebook目前的推理過程主要依靠CPU,訓(xùn)練過程則是同時(shí)依靠CPU和GPU。但是從性能功耗比的角度來看,應(yīng)當(dāng)不斷對(duì)新的硬件解決方案進(jìn)行摸索和評(píng)估。全球用戶用來使用Facebook的設(shè)備每天都可達(dá)數(shù)億臺(tái),而這會(huì)就會(huì)提供大量可以用于機(jī)器學(xué)習(xí)任務(wù)的機(jī)器,例如用來進(jìn)行大規(guī)模的分布式訓(xùn)練。Facebook的機(jī)器學(xué)習(xí)機(jī)器學(xué)習(xí)(ML)是指利用一系列輸入來建立一個(gè)可調(diào)模型,并利用該模型創(chuàng)建一種表示,預(yù)測或其他形式的有用信號(hào)的應(yīng)用實(shí)例。????圖1. Facebook的機(jī)器學(xué)習(xí)流程和架構(gòu)示例圖1所示的流程由以下步驟組成,交替執(zhí)行:建立模型的訓(xùn)練階段。這個(gè)階段通常離線運(yùn)行。在應(yīng)用中運(yùn)行訓(xùn)練模型的推理階段,并進(jìn)行(一組)實(shí)時(shí)預(yù)測。這個(gè)階段是在線執(zhí)行的。模型進(jìn)行訓(xùn)練的頻率要比推理少得多——推理的時(shí)間規(guī)模雖然在不斷變化,但一般在幾天左右。訓(xùn)練也需要相當(dāng)長的時(shí)間來完成,通常是幾個(gè)小時(shí)或幾天。同時(shí),根據(jù)產(chǎn)品實(shí)際需求不同,在線推理階段每天可能運(yùn)行達(dá)數(shù)十萬次,而且一般需要實(shí)時(shí)進(jìn)行。在某些情況下,特別是對(duì)于推薦系統(tǒng),還需要以這樣連續(xù)的方式在線進(jìn)行額外的訓(xùn)練。在Facebook,機(jī)器學(xué)習(xí)的一個(gè)顯著特征就是有可用于模型訓(xùn)練的海量數(shù)據(jù)。這個(gè)數(shù)據(jù)的規(guī)模會(huì)帶來很多涉及到整個(gè)機(jī)器學(xué)習(xí)架構(gòu)的影響。使用機(jī)器學(xué)習(xí)的主要服務(wù)消息推送消息推送排名算法能夠使用戶在每次訪問Facebook時(shí),最先看到對(duì)他們來講最重要的事情。一般模型會(huì)通過訓(xùn)練來確定影響內(nèi)容排序的各種用戶和環(huán)境因素。之后,當(dāng)用戶訪問Facebook時(shí),該模型會(huì)從數(shù)千個(gè)候選中生成一個(gè)最佳推送,它是一個(gè)圖像和其他內(nèi)容的個(gè)性化集合,以及所選內(nèi)容的最佳排序。廣告廣告系統(tǒng)利用機(jī)器學(xué)習(xí)來確定向特定用戶顯示什么樣的廣告。通過對(duì)廣告模型進(jìn)行訓(xùn)練,我們可以了解用戶特征,用戶上下文,以前的互動(dòng)和廣告屬性,進(jìn)而學(xué)習(xí)預(yù)測用戶在網(wǎng)站上最可能點(diǎn)擊的廣告。之后,當(dāng)用戶訪問Facebook時(shí),我們將輸入傳遞進(jìn)訓(xùn)練好的模型運(yùn)行,就能立馬確定要顯示哪些廣告。搜索搜索會(huì)針對(duì)各種垂直類型(例如,視頻,照片,人物,活動(dòng)等)啟動(dòng)一系列特定的子搜索進(jìn)程。分類器層在各類垂直類型的搜索之前運(yùn)行,以預(yù)測要搜索的是垂直類型中的哪一個(gè),否則這樣的垂直類型搜索將是無效的。分類器本身和各種垂直搜索都包含一個(gè)訓(xùn)練的離線階段,和一個(gè)運(yùn)行模型并執(zhí)行分類和搜索功能的在線階段。SigmaSigma是一個(gè)分類和異常檢測通用框架,用于監(jiān)測各種內(nèi)部應(yīng)用,包括站點(diǎn)的完整性,垃圾郵件檢測,支付,注冊(cè),未經(jīng)授權(quán)的員工訪問以及事件推薦。Sigma包含了在生產(chǎn)中每天都要運(yùn)行的數(shù)百個(gè)不同的模型,并且每個(gè)模型都會(huì)被訓(xùn)練來檢測異?;蚋话愕胤诸悆?nèi)容。LumosLumos能夠從圖像及其內(nèi)容中提取出高級(jí)屬性和映射關(guān)系,使算法能夠自動(dòng)理解它們。這些數(shù)據(jù)可以用作其他產(chǎn)品和服務(wù)的輸入,比如通過文本的形式。FacerFacer是Facebook的人臉檢測和識(shí)別框架。給定一張圖像,它首先會(huì)尋找該圖像中所有的人臉。然后通過運(yùn)行針對(duì)特定用戶的人臉識(shí)別算法,來確定圖中的人臉是否是該用戶的好友。Facebook通過該服務(wù)為用戶推薦想要在照片中標(biāo)記的好友。語言翻譯語言翻譯是涉及Facebook內(nèi)容的國際化交流的服務(wù)。Facebook支持超過45種語言之間的源語言或目標(biāo)語言翻譯,這意味著Facebook支持2000多個(gè)翻譯方向,比如英語到西班牙語,阿拉伯語到英語。通過這2000多個(gè)翻譯通道,F(xiàn)acebook每天提供4.5B字的翻譯服務(wù),通過翻譯用戶的消息推送,F(xiàn)acebook每天可為全球6億人減輕語言障礙。目前,每種語言對(duì)方向都有其自己的模型,但是我們也正在考慮多語言模型[6]。語音識(shí)別語音識(shí)別是將音頻流轉(zhuǎn)換成文本的服務(wù)。它可以為視頻自動(dòng)填補(bǔ)字幕。目前,大部分流媒體都是英文的,但在未來其他語言的識(shí)別也將得到支持。另外,非語言的音頻文件也可以用類似的系統(tǒng)(更簡單的模型)來檢測。除了上面提到的主要產(chǎn)品之外,還有更多的長尾服務(wù)也利用了各種形式的機(jī)器學(xué)習(xí)。 Facebook產(chǎn)品和服務(wù)的長尾數(shù)量達(dá)數(shù)百個(gè)。機(jī)器學(xué)習(xí)模型所有基于機(jī)器學(xué)習(xí)的服務(wù)都使用“特征”(或輸入)來產(chǎn)生量化的輸出。Facebook使用的機(jī)器學(xué)習(xí)算法包括Logistic回歸(LR),支持向量機(jī)(SVM),梯度提升決策樹(GBDT)和深度神經(jīng)網(wǎng)絡(luò)(DNN)。LR和SVM在訓(xùn)練和預(yù)測方面非常有效。GBDT可以通過增加計(jì)算資源來提高準(zhǔn)確性。DNN是最具表達(dá)力的,能夠提供最高的準(zhǔn)確性,但利用的資源也是最多的(在計(jì)算量上,至少比LR和SVM等線性模型高出一個(gè)數(shù)量級(jí))。這三種模型的自由參數(shù)都在變得越來越多,必須通過使用帶標(biāo)簽的輸入示例來優(yōu)化預(yù)測的準(zhǔn)確性。在深度神經(jīng)網(wǎng)絡(luò)中,有三類經(jīng)常使用的網(wǎng)絡(luò):多層感知器(MLP),卷積神經(jīng)網(wǎng)絡(luò)(CNN)和遞歸神經(jīng)網(wǎng)絡(luò)(RNN / LSTM)。MLP網(wǎng)絡(luò)通常運(yùn)行在結(jié)構(gòu)化輸入特征(通常是排名)上,RNN / LSTM網(wǎng)絡(luò)一般用來處理時(shí)域的數(shù)據(jù),即用作序列處理器(通常是語言處理),相對(duì)的CNNs則是一種處理用來空間數(shù)據(jù)的工具(通常是圖像處理)。表I顯示了這些機(jī)器學(xué)習(xí)模型類型和產(chǎn)品/服務(wù)之間的映射關(guān)系。????表1 利用機(jī)器學(xué)習(xí)算法的產(chǎn)品或服務(wù)Facebook中的ML-as-a-Service為了簡化在產(chǎn)品中應(yīng)用機(jī)器學(xué)習(xí)的任務(wù),我們構(gòu)建了一些內(nèi)部平臺(tái)和工具包,包括FBLearner,Caffe2和PyTorch。FBLearner是三種工具(FBLearner Feature Store,F(xiàn)BLearner Flow,F(xiàn)BLearner Predictor)的套裝,其中每種工具分別負(fù)責(zé)機(jī)器學(xué)習(xí)管道上不同的部分。正如前面圖1顯示的那樣,它利用了一種內(nèi)部作業(yè)調(diào)度程序在GPU和CPU的共享資源池上分配資源和調(diào)度作業(yè)。Facebook大多數(shù)機(jī)器學(xué)習(xí)模型的訓(xùn)練過程都是在FBLearner平臺(tái)上進(jìn)行的。這些工具和平臺(tái)被設(shè)計(jì)來幫助機(jī)器學(xué)習(xí)工程師提高效率,從而能夠?qū)W⒂谒惴▌?chuàng)新。FBLearner Feature Store。任何機(jī)器學(xué)習(xí)建模任務(wù)的起點(diǎn)是收集和生成特征。 FBLearner Feature Store本質(zhì)上是一系列特征生成器的目錄,其特征生成器可以用于訓(xùn)練和實(shí)時(shí)預(yù)測,當(dāng)然它也可以作為多個(gè)團(tuán)隊(duì)可以用來共享和尋找特征的公共空間(market place)。這樣以個(gè)特征列表對(duì)于剛開始使用機(jī)器學(xué)習(xí)的團(tuán)隊(duì)來說是一個(gè)很好的平臺(tái),同時(shí)也有助于在現(xiàn)有模型中應(yīng)用新特征。FBLearner Flow是Facebook用于訓(xùn)練模型的機(jī)器學(xué)習(xí)平臺(tái)。Flow是一個(gè)管道管理系統(tǒng),它會(huì)執(zhí)行一個(gè)可以描述模型訓(xùn)練和/或評(píng)估所需步驟及其所需資源的工作流程(workflow)。這個(gè)工作流程由離散單元或操作符(operators)構(gòu)成,每個(gè)單元都有輸入和輸出。操作符之間的連接會(huì)通過跟蹤一個(gè)操作符到下一個(gè)操作符的數(shù)據(jù)流自動(dòng)推理,F(xiàn)low則通過處理調(diào)度和資源管理來執(zhí)行工作流程。Flow還擁有一個(gè)可以用于實(shí)驗(yàn)管理的工具和一個(gè)簡單的用戶界面,這個(gè)界面可以跟蹤每個(gè)workflow或?qū)嶒?yàn)生成的所有構(gòu)件和指標(biāo),從而方便對(duì)比和管理這些實(shí)驗(yàn)。FBLearner Predictor是Facebook內(nèi)部的推理引擎,它可以使用在Flow中訓(xùn)練的模型來提供實(shí)時(shí)的預(yù)測。Predictor可以用作多租戶服務(wù),也可以用作集成在特定產(chǎn)品的后端服務(wù)中的庫。Facebook的很多產(chǎn)品團(tuán)隊(duì)都在使用Predictor,而其中許多團(tuán)隊(duì)都需要低延遲解決方案。Flow和Predictor之間的直接集成還有助于運(yùn)行在線的實(shí)驗(yàn)以及在生產(chǎn)中管理多個(gè)版本的模型。深度學(xué)習(xí)框架我們?cè)贔acebook上利用了兩種截然不同的協(xié)同框架來進(jìn)行深度學(xué)習(xí):針對(duì)研究優(yōu)化的PyTorch和針對(duì)生產(chǎn)優(yōu)化的Caffe2。Caffe2是Facebook的內(nèi)部生產(chǎn)框架,它用于訓(xùn)練和部署大規(guī)模的機(jī)器學(xué)習(xí)模型。Caffe2專注于產(chǎn)品所需的幾個(gè)關(guān)鍵特性:性能,跨平臺(tái)支持和基本的機(jī)器學(xué)習(xí)算法,如卷積神經(jīng)網(wǎng)絡(luò)(CNN),遞歸神經(jīng)網(wǎng)絡(luò)(RNN)和多層感知器(MLP)。這些網(wǎng)絡(luò)都具有稀疏或密集的連接以及高達(dá)數(shù)百億的參數(shù)。該框架的設(shè)計(jì)采用模塊化方法,在所有后端實(shí)現(xiàn)(CPU,GPU和加速器)之間共享統(tǒng)一的圖表示。為了在不同平臺(tái)上實(shí)現(xiàn)最佳的運(yùn)行時(shí)間,Caffe2還抽象了包括cuDNN,MKL和Meta在內(nèi)的第三方庫。PyTorch是Facebook在AI研究領(lǐng)域的首選框架。它的前端注重靈活性、調(diào)試以及動(dòng)態(tài)神經(jīng)網(wǎng)絡(luò),能夠快速進(jìn)行實(shí)驗(yàn)。由于依賴于Python來執(zhí)行,它并沒有針對(duì)生產(chǎn)和移動(dòng)端部署進(jìn)行優(yōu)化。當(dāng)研究項(xiàng)目產(chǎn)生了有價(jià)值的結(jié)果時(shí),模型就需要轉(zhuǎn)移到生產(chǎn)上。過去,在生產(chǎn)環(huán)境中,我們通過使用其他框架重寫產(chǎn)品環(huán)境的訓(xùn)練管道來完成模型轉(zhuǎn)移。最近Facebook開始構(gòu)建ONNX工具鏈來簡化這個(gè)轉(zhuǎn)移過程。比如,動(dòng)態(tài)神經(jīng)網(wǎng)絡(luò)雖然被用于尖端的人工智能研究,但這些模型需要更長的時(shí)間才能被應(yīng)用于產(chǎn)品中。通過解耦框架,我們避免了的為滿足性能而設(shè)計(jì)更復(fù)雜的執(zhí)行引擎(比如Caffe2)的需求。此外,相比模型速度,研究人員在進(jìn)行研究時(shí)更看重其靈活性。舉個(gè)栗子,在模型探索階段,性能下降30%是可以容忍的,尤其是在它具有易測驗(yàn)和模型可視化的優(yōu)點(diǎn)時(shí)。但是相同的方法并不適合于生產(chǎn)。這種取舍原則在PyTorch和Caffe2的框架設(shè)計(jì)中也可以看到,PyTorch提供了良好的默認(rèn)參數(shù)和合理的性能,而Caffe2可以選擇使用異步圖執(zhí)行,量化權(quán)重和多個(gè)專用后端等特性來達(dá)到最佳性能。雖然FBLearner平臺(tái)本身不限制使用什么框架,無論是Caffe2,TensorFlow,PyTorch還是其他的框架都可以,但我們的AI軟件平臺(tái)(AI Software Platform)團(tuán)隊(duì)為了讓FBLearner能夠很好地與Caffe2集成還是進(jìn)行了特定優(yōu)化。總的來說,分離研究和生產(chǎn)框架(分別是PyTorch和Caffe2)使我們能夠在兩邊靈活運(yùn)作,減少約束數(shù)量的同時(shí)還能增加新特性。ONNX. 深度學(xué)習(xí)工具生態(tài)系統(tǒng)在整個(gè)行業(yè)還處于初級(jí)階段。 對(duì)于不同的問題子集,不同的工具有著不同的優(yōu)勢,并且在靈活性,性能和支持平臺(tái)方面有著不同的折衷,這就跟我們之前對(duì)PyTorch和Caffe2所描述的權(quán)衡一樣。 因此,在不同的框架或平臺(tái)之間交換訓(xùn)練模型的需求很大。 為了彌補(bǔ)這個(gè)缺陷,2017年末,F(xiàn)acebook與幾個(gè)合作伙伴共同推出了開放式神經(jīng)網(wǎng)絡(luò)交換(Open Neural Network Exchange , ONNX)。ONNX是一種以標(biāo)準(zhǔn)方式表示深度學(xué)習(xí)模型的格式,以便在不同的框架和供應(yīng)商優(yōu)化庫之間實(shí)現(xiàn)互操作。同時(shí),它能滿足在不同的框架或平臺(tái)之間交換訓(xùn)練好的模型的需求。ONNX被設(shè)計(jì)為一種開放的規(guī)范,允許框架作者和硬件供應(yīng)商為其做出貢獻(xiàn),并擁有框架和庫之間的各種轉(zhuǎn)換器。Facebook正在努力使ONNX成為所有這些工具之間的協(xié)作伙伴,而不是一種具有排他性的官方標(biāo)準(zhǔn)。在Facebook內(nèi)部,ONNX是我們將研究模型從PyTorch環(huán)境轉(zhuǎn)移到Caffe2中的高性能生產(chǎn)環(huán)境的主要手段,它可以實(shí)現(xiàn)對(duì)模型的自動(dòng)捕捉和固定部分的轉(zhuǎn)換。在Facebook內(nèi)部,ONNX是我們將研究模型從PyTorch環(huán)境轉(zhuǎn)移到Caffe2中的高性能生產(chǎn)環(huán)境的主要手段。 ONNX提供了自動(dòng)捕捉和轉(zhuǎn)換模型的靜態(tài)部分的能力。 我們有一個(gè)額外的工具鏈,通過將它們映射到Caffe2中的控制流原函數(shù)或者以C ++作為自定義操作符重新實(shí)現(xiàn)它們,會(huì)有助于將模型從Python轉(zhuǎn)移到動(dòng)態(tài)圖。機(jī)器學(xué)習(xí)的資源需求鑒于機(jī)器學(xué)習(xí)在訓(xùn)練和推理(inference)的階段的資源要求、頻率和持續(xù)時(shí)長不同,我們將分別討論這兩個(gè)階段的細(xì)節(jié)和資源應(yīng)用。Facebook硬件資源概況Facebook的基礎(chǔ)架構(gòu)部門(Facebook Infrastructure)很早之前就開始為主要軟件服務(wù)構(gòu)建的高效平臺(tái),包括針對(duì)每種主要工作負(fù)載的資源要求定制的服務(wù)器、存儲(chǔ)以及網(wǎng)絡(luò)支持。????圖2 基于CPU的計(jì)算服務(wù)器。單插槽服務(wù)器底座上有4個(gè)Monolake服務(wù)器卡,雙插槽服務(wù)器底座還一個(gè)雙插槽服務(wù)器,因此在2U機(jī)箱中共有三個(gè)雙插槽服務(wù)器。所以在2U形式的組合中共有12個(gè)服務(wù)器。當(dāng)前Facebook提供約八種主要的計(jì)算和存儲(chǔ)架構(gòu),對(duì)應(yīng)八種主要服務(wù)。這些主要架構(gòu)類型足以滿足Facebook主要服務(wù)的資源要求。例如,圖2中展示了一個(gè)可以容納三個(gè)計(jì)算Sleds模塊的2U機(jī)架,這些模塊可支持兩種服務(wù)器類型。其中一種Sled模塊是單插槽CPU服務(wù)器(1xCPU),多用于Web層——一種主要看重吞吐量的無狀態(tài)服務(wù),因此可以使用能效更高的CPU(Broadwell-D處理器);它的DRAM(32GB)以及主板硬盤或閃存較少。另一種Sled模塊是較大的雙插槽CPU服務(wù)器(2x高功率Broadwell-EP或Skylake SP CPU),它配有大量的DRAM ,常用于涉及大量計(jì)算和存儲(chǔ)的服務(wù)。??圖3. 搭載8個(gè)GPU的Big Basin GPU服務(wù)器(3U機(jī)架)由于我們訓(xùn)練的神經(jīng)網(wǎng)絡(luò)越來越大,并且越來越深,我們開發(fā)出了Big Basin GPU服務(wù)器(如圖3所示),這是我們2017年最新的GPU服務(wù)器。最初的Big Basin GPU服務(wù)器配置了八個(gè)互相連接的NVIDIA Tesla P100 GPU加速器,它使用NVIDIA NVLink形成了一個(gè)八CPU混合立方網(wǎng)格,后來,這種設(shè)計(jì)經(jīng)過改進(jìn)之后又應(yīng)用到了V100 GPU上。Big Basin是早前的Big Sur GPU的繼承者,后者是Facebook數(shù)據(jù)中心首個(gè)廣泛應(yīng)用的高性能AI計(jì)算平臺(tái),用于支持于2015年開發(fā)并通過開放計(jì)算項(xiàng)目(Open Compute Project)發(fā)布的NVIDIA M40 GPU。與Big Sur相比,V100 Big Basin每瓦電可實(shí)現(xiàn)的性能更高,這得益于單精度浮點(diǎn)運(yùn)算單元——每個(gè)GPU的運(yùn)算速度從7 teraflops(每秒萬億次浮點(diǎn)運(yùn)算)增加到了15.7 teraflops,以及可提供900GB/s的帶寬的高帶寬顯存(HBM2)。這種新的架構(gòu)還使得半精度運(yùn)算的速度快了一倍,進(jìn)一步提高了運(yùn)算吞吐量。由于Big Basin的運(yùn)算吞吐量更大,而且顯存也從12 GB增加到了16 GB,因此它可以用來訓(xùn)練比先前模型大30%的模型。高帶寬NVLink互連GPU通信還強(qiáng)化了分布式訓(xùn)練。在使用ResNet-50圖像分類模型進(jìn)行的測試中,Big Basin的運(yùn)算吞吐量比Big Sur要高出300%,借助它我們可以以更快的速度訓(xùn)練比以往更復(fù)雜的模型。Facebook通過開放計(jì)算項(xiàng)目(Open Compute Project)公布了所有這些計(jì)算服務(wù)器的設(shè)計(jì)以及幾種存儲(chǔ)平臺(tái)。離線訓(xùn)練的資源需求當(dāng)前,不同的產(chǎn)品會(huì)使用不同的計(jì)算資源來完成各自的離線訓(xùn)練步驟。有些產(chǎn)品(例如Lumos)在GPU上完成所有的訓(xùn)練。其他產(chǎn)品(例如Sigama)則在雙插槽 CPU計(jì)算服務(wù)器完成所有的訓(xùn)練。諸如Facer這樣的產(chǎn)品采用雙階段訓(xùn)練流程,先在GPU上以很小的頻率(幾個(gè)月一次)隊(duì)通用的面部檢測和識(shí)別模型進(jìn)行訓(xùn)練,然后在數(shù)千個(gè)1xCPU服務(wù)器上以很高的頻率對(duì)每個(gè)用戶的模型進(jìn)行特定訓(xùn)練。在本部分,我們將圍繞機(jī)器學(xué)習(xí)訓(xùn)練平臺(tái)、訓(xùn)練頻率和持續(xù)時(shí)長,具體介紹多種服務(wù)的細(xì)節(jié),并在表II中進(jìn)行了總結(jié)。另外,我們還討論了數(shù)據(jù)集的趨勢以及這些趨勢對(duì)計(jì)算、內(nèi)存、存儲(chǔ)和網(wǎng)絡(luò)架構(gòu)的意義。計(jì)算類型和相對(duì)數(shù)據(jù)來源的位置。離線訓(xùn)練既可以在CPU上完成,也可以在GPU上完成,這取決于服務(wù)本身。雖然在多數(shù)情況下,在GPU上訓(xùn)練出的模型在性能上要比在CPU上訓(xùn)練的模型好,但是CPU強(qiáng)大的現(xiàn)成運(yùn)算能力使得它成為了一個(gè)非常有用的平臺(tái)。這一點(diǎn)在每天的非高峰期中尤為明顯,因?yàn)樵谶@期間CPU資源本來就無法得到利用,后面的圖4會(huì)對(duì)此進(jìn)行說明。下面我們給出了服務(wù)和計(jì)算資源訓(xùn)練模型的對(duì)應(yīng)關(guān)系:在GPU上訓(xùn)練模型的服務(wù): Lumos、語音識(shí)別、語言翻譯在CPU上訓(xùn)練模型的服務(wù):News Feed、Sigma在GPU和CPU上訓(xùn)練模型的服務(wù):Facer (在GPU上每幾年訓(xùn)練一次的通用模型,此類模型較為穩(wěn)定;在1xCPU上訓(xùn)練的用戶特定的模型,此類模型可以用于處理新圖像數(shù)據(jù))、搜索(利用多個(gè)獨(dú)立的垂直搜索引擎,使用可以進(jìn)行預(yù)測的分類器啟動(dòng)最合適的垂直搜索引擎)。目前,GPU主要被用于離線訓(xùn)練,而不是向用戶提供實(shí)時(shí)數(shù)據(jù)。因?yàn)榇蠖鄶?shù)GPU架構(gòu)都針對(duì)運(yùn)算吞吐量進(jìn)行了優(yōu)化,以克服延遲劣勢。同時(shí)由于訓(xùn)練過程嚴(yán)重依賴從大型數(shù)據(jù)生成庫中獲取的數(shù)據(jù),考慮到性能和帶寬方面的原因,GPU必須靠近數(shù)據(jù)來源。由于訓(xùn)練模型所使用的數(shù)據(jù)量增長的相當(dāng)快,GPU是否靠近數(shù)據(jù)來源變得越來越重要。內(nèi)存、存儲(chǔ)和網(wǎng)絡(luò):從內(nèi)存儲(chǔ)器容量的角度看,CPU和GPU平臺(tái)都能為訓(xùn)練提供充足的存儲(chǔ)容量。即使對(duì)于Facer這樣的應(yīng)用,也可以在1xCPU上用32GB RAM訓(xùn)練用戶特定的SVM模型。如果可以盡可能地利用高效平臺(tái)以及多余的存儲(chǔ)容量,則平臺(tái)的總體訓(xùn)練效率會(huì)非常優(yōu)秀。表II 不同服務(wù)的離線訓(xùn)練的頻率、持續(xù)時(shí)長和資源機(jī)器學(xué)習(xí)系統(tǒng)依賴于使用實(shí)例數(shù)據(jù)的訓(xùn)練。Facebook 使用了機(jī)器學(xué)習(xí)數(shù)據(jù)管道中的大量數(shù)據(jù)。這使得計(jì)算資源趨向于靠近數(shù)據(jù)庫。隨著時(shí)間的推移,大多數(shù)服務(wù)會(huì)顯示出利用累積的用戶數(shù)據(jù)的趨勢,這將導(dǎo)致這些服務(wù)更加依賴Facebook的其他服務(wù),并且需要更大的網(wǎng)絡(luò)帶寬來獲取數(shù)據(jù)。因此,只有在數(shù)據(jù)源所在地或附近部署巨大的存儲(chǔ),以便從偏遠(yuǎn)的區(qū)域大規(guī)模轉(zhuǎn)移數(shù)據(jù),從而避免為了等待獲取更多樣本數(shù)據(jù)而關(guān)停訓(xùn)練管道。在部署訓(xùn)練機(jī)器的位置時(shí),我們也可以使用這種方法來避免訓(xùn)練機(jī)群給附近的存儲(chǔ)資源造成過大的壓力。不同的服務(wù)在離線訓(xùn)練期間使用的數(shù)據(jù)量有很大的差別。幾乎所有服務(wù)的訓(xùn)練數(shù)據(jù)集都呈現(xiàn)出持續(xù)增長甚至大幅增長的趨勢。例如,有些服務(wù)在ROI降低之前會(huì)使用數(shù)百萬行數(shù)據(jù),其他服務(wù)則使用數(shù)百億行數(shù)據(jù)(100多TB),并且只受到資源的限制。 擴(kuò)展(Scaling)考慮和分布式訓(xùn)練:訓(xùn)練神經(jīng)網(wǎng)絡(luò)的過程包含使用隨機(jī)梯度下降法(SGD)對(duì)參數(shù)權(quán)重進(jìn)行優(yōu)化。這種方法用于擬合神經(jīng)網(wǎng)絡(luò),通過評(píng)價(jià)標(biāo)記實(shí)例的小子集(即“batch” 或“mini-batch”)來迭代更新權(quán)重。在數(shù)據(jù)并行中,網(wǎng)絡(luò)會(huì)生成多個(gè)模型副本(并行實(shí)例),以并行的處理多批數(shù)據(jù)。當(dāng)使用一臺(tái)機(jī)器訓(xùn)練模型時(shí),模型越大或更深都會(huì)帶來更好的訓(xùn)練效果,準(zhǔn)確度也會(huì)更高,但是訓(xùn)練此類模型往往需要處理更多的樣本。當(dāng)使用一臺(tái)機(jī)器進(jìn)行訓(xùn)練時(shí),我們可以通過增加模型副本的數(shù)量并在多個(gè)GPU上執(zhí)行數(shù)據(jù)并行,來最大化訓(xùn)練效果。當(dāng)訓(xùn)練所需的數(shù)據(jù)量隨時(shí)間增加,硬件限制會(huì)導(dǎo)致總體訓(xùn)練延遲和收斂時(shí)間增加。不過,我們可以使用分布式訓(xùn)練來克服這些硬件限制,減少延遲。這個(gè)研究領(lǐng)域在Facebook和整個(gè)AI研究界相當(dāng)熱門。一種普遍的假設(shè)是,在不同機(jī)器上實(shí)現(xiàn)數(shù)據(jù)并行需要使用一種專門的互連機(jī)制。但是,在我們對(duì)分布式訓(xùn)練的研究中,我們發(fā)現(xiàn)基于以太網(wǎng)(Ethernet)的網(wǎng)絡(luò)就可以提供近似線性的擴(kuò)展能力。能否實(shí)現(xiàn)近似線性的擴(kuò)展,與模型的大小和網(wǎng)絡(luò)帶寬有密切的關(guān)系。如果網(wǎng)絡(luò)帶寬太小,執(zhí)行參數(shù)同步所花的時(shí)間比執(zhí)行梯度計(jì)算所花的時(shí)間還多,在不同機(jī)器上進(jìn)行數(shù)據(jù)并行所帶來的優(yōu)勢也會(huì)大打折扣。使用50G的以太網(wǎng)NIC,我們可以用Big Basin服務(wù)器擴(kuò)展視覺模型的訓(xùn)練,而且機(jī)器間的同步完全不會(huì)造成問題。在所有情況下,更新都需要使用同步(每個(gè)副本都看到相同狀態(tài)),一致性(每個(gè)副本生成正確更新)和性能(子線性縮放)的技術(shù)來與其他副本共享,這可能會(huì)影響訓(xùn)練質(zhì)量。 例如,翻譯服務(wù)目前就不能在不降低模型質(zhì)量的情況下進(jìn)行大批量的小批量(mini-batches)訓(xùn)練。相反,如果使用特定的超參數(shù)設(shè)置,我們就可以在非常大的mini-batch數(shù)據(jù)集上訓(xùn)練圖像分類模型,并且可以擴(kuò)展到256個(gè)以上的GPU上。實(shí)驗(yàn)證明,在Facebook的某個(gè)大型服務(wù)中,在5倍的機(jī)器上執(zhí)行數(shù)據(jù)并行可以實(shí)現(xiàn)4倍的訓(xùn)練效率(例如:訓(xùn)練一組訓(xùn)練時(shí)間超過4天的模型,以前總共可以訓(xùn)練100個(gè)不同模型的機(jī)器集群現(xiàn)在每天只能訓(xùn)練同樣的20個(gè)模型,訓(xùn)練效率降低了20%,但是潛在的工程進(jìn)度等待時(shí)間從4天減少到了1天)。如果模型變得超級(jí)大,這時(shí)候就可以使用并行訓(xùn)練,對(duì)模型的層進(jìn)行分組和分布,以優(yōu)化訓(xùn)練效率,各機(jī)器間可以傳遞激活單元。優(yōu)化可能與網(wǎng)絡(luò)帶寬、延遲或平衡內(nèi)部機(jī)器限制有關(guān)。這會(huì)增加模型的端對(duì)端延遲,因此,每一時(shí)步(time step)內(nèi)原始性能的增強(qiáng)通常與步長(step)質(zhì)量的下降有關(guān)。這可能會(huì)進(jìn)一步降低模型在每個(gè)步長的準(zhǔn)確度。各步長準(zhǔn)確度的下降最終會(huì)累積起來,這樣我們就可以得出并行處理的最佳步長數(shù)量。DNN模型本身的設(shè)計(jì)使得它只能在一臺(tái)機(jī)器上運(yùn)行,在推理階段,在機(jī)器間分割模型圖通常會(huì)導(dǎo)致機(jī)器與機(jī)器進(jìn)行大量的溝通。但是Facebook的主要服務(wù)會(huì)不斷地權(quán)衡擴(kuò)展模型的利與弊。這些考慮可以決定網(wǎng)絡(luò)容量需求的變化。表 III 在線推理服務(wù)的資源要求在線推理的資源需求在完成離線訓(xùn)練之后的線推理步驟中,我們需要將模型載入到機(jī)器中,使用實(shí)時(shí)輸入運(yùn)行模型來生成網(wǎng)站流量的實(shí)時(shí)結(jié)果。接下來我們將討論,一種實(shí)際應(yīng)用中的在線推理模型——廣告排名模型。這種模型可以篩選成千上萬條廣告,在消息推送中顯示排在1至5名的廣告。這個(gè)過程是通過對(duì)依次減小的廣告子集進(jìn)行逐步復(fù)雜的排名運(yùn)算循環(huán)(passes)來實(shí)現(xiàn)的。每一輪運(yùn)算都會(huì)用到類似于多層感知模型(MLP)的模型,這種模型包含稀疏嵌入層,每一輪運(yùn)算都會(huì)縮小廣告的數(shù)量。稀疏嵌入層需要大量的內(nèi)存,因此當(dāng)進(jìn)行到靠后的運(yùn)算時(shí),模型的超參數(shù)數(shù)量更多,它將在獨(dú)立于MLP運(yùn)算輪的一個(gè)服務(wù)器上運(yùn)行。從計(jì)算的角度上看,絕大多數(shù)在線推理都是在大量1xCPU(單插槽)或2xCPU(雙插槽)上運(yùn)行的。由于1xCPU對(duì)Facebook的服務(wù)而言性能更高,而且性價(jià)比更高,因此Facebook提倡盡可能使用1xCPU服務(wù)器訓(xùn)練模型。隨著高性能移動(dòng)硬件的誕生,F(xiàn)acebook甚至可以在用戶的移動(dòng)設(shè)備上直接運(yùn)行某些模型,來改進(jìn)延遲和降低通信成本。但是,某些需要大量計(jì)算和內(nèi)存資源的服務(wù)仍然需要使用2xCPU才能實(shí)現(xiàn)最佳性能。不同的產(chǎn)品在得出在線推理的結(jié)果時(shí)擁有不同的延遲要求。在某些情況下,得出的數(shù)據(jù)可能“十分優(yōu)秀” ,也可能會(huì)在向用戶返回初步快速評(píng)估后被重新輸入到模型中。例如,在某些情況中將某個(gè)內(nèi)容分類為合格是可以接受的,但是當(dāng)運(yùn)行更加復(fù)雜的模型時(shí)這個(gè)初步的分類結(jié)果就會(huì)被推翻。廣告排名和消息推送之類的模型配置有穩(wěn)定的SLA,可以向用戶推送合適的內(nèi)容。這些SLA決定著模型的復(fù)雜性和依賴性,因此如果擁有更加強(qiáng)大的計(jì)算能力,我們就可以訓(xùn)練出更加先進(jìn)的模型。機(jī)器學(xué)習(xí)數(shù)據(jù)計(jì)算除了資源需求外,在數(shù)據(jù)中心部署機(jī)器學(xué)習(xí)時(shí)還需要考慮一些重要的因素,包括對(duì)重要數(shù)據(jù)的需求以及面對(duì)自然災(zāi)害的可靠性。從獲取數(shù)據(jù)到模型Facebook公司的許多機(jī)器學(xué)習(xí)模型,成功的主要因素就是廣泛而高質(zhì)量的可用數(shù)據(jù)??焖偬幚聿⑦@些數(shù)據(jù)提供給機(jī)器學(xué)習(xí)模型的能力能夠確保我們部署快速有效的離線訓(xùn)練。對(duì)于復(fù)雜的機(jī)器學(xué)習(xí)應(yīng)用程序,如廣告和排名,每個(gè)訓(xùn)練任務(wù)所需的數(shù)據(jù)量都超過數(shù)百TB大小。此外,復(fù)雜的預(yù)處理邏輯的使用能確保數(shù)據(jù)被清理并歸一化,以便高效地遷移和更輕松地學(xué)習(xí)。這些操作對(duì)資源的要求非常高,特別對(duì)存儲(chǔ)量,網(wǎng)絡(luò)和CPU的需求。作為一個(gè)通用的解決方案,我們嘗試對(duì)訓(xùn)練工作量中的數(shù)據(jù)進(jìn)行解耦。這兩個(gè)工作量都有非常顯著的特點(diǎn)。一方面,它非常復(fù)雜,具有臨時(shí)的,依賴業(yè)務(wù)性的,且變化快等特點(diǎn)。另一方面,訓(xùn)練工作量通常是固定的(例如GEMM),穩(wěn)定的(核心業(yè)務(wù)相對(duì)較少),高度優(yōu)化,且更偏愛于“干凈”的環(huán)境下工作(例如,獨(dú)占高速緩存使用和最小線程爭奪)。為了優(yōu)化這兩者,我們?cè)谖锢砩蠈?duì)不同的機(jī)器的不同工作負(fù)載進(jìn)行隔離。數(shù)據(jù)處理機(jī)器,又名“readers”,從存儲(chǔ)器中讀取數(shù)據(jù),處理和壓縮它們,然后將結(jié)果反饋給一個(gè)叫做“trainers”的訓(xùn)練機(jī)器。另一方面,trainers只專注于快速有效地執(zhí)行任務(wù)。readers和trainers可以分布以便提供更靈活性和可擴(kuò)展性的應(yīng)用。此外,我們還優(yōu)化了不同工作負(fù)荷的機(jī)器配置。另一個(gè)重要的優(yōu)化指標(biāo)是網(wǎng)絡(luò)使用。訓(xùn)練過程產(chǎn)生的數(shù)據(jù)流量非常重要的,并且有時(shí)候會(huì)突然產(chǎn)生。如果沒有智能化處理的話,這很容易就會(huì)導(dǎo)致網(wǎng)絡(luò)設(shè)備的飽和,甚至干擾到其他服務(wù)。為了解決這些問題,我們采用壓縮優(yōu)化,調(diào)度算法,數(shù)據(jù)/計(jì)算布局等等操作。??利用規(guī)模作為一家為用戶提供服務(wù)的全球性公司,F(xiàn)acebook必須保持大量服務(wù)器的設(shè)計(jì)能夠滿足在任何時(shí)間段內(nèi)的峰值工作負(fù)載。如圖所示,由于用戶活動(dòng)的變化取決于日常負(fù)荷以及特殊事件(例如地區(qū)節(jié)假日)期間的峰值,因此大量的服務(wù)器在特定的時(shí)間段內(nèi)通常是閑置的。這就釋放了非高峰時(shí)段內(nèi)大量可用的計(jì)算資源。利用這些可能的異構(gòu)資源,以彈性方式合理分配給各種任務(wù)。這是Facebook目前正努力探索的一大機(jī)會(huì)。對(duì)于機(jī)器學(xué)習(xí)應(yīng)用程序,這提供了將可擴(kuò)展的分布式訓(xùn)練機(jī)制的優(yōu)勢應(yīng)用到大量的異構(gòu)資源(例如具有不同RAM分配的CPU和GPU平臺(tái))的機(jī)會(huì)。但是,這也會(huì)帶來一些挑戰(zhàn)。在這些低利用率的時(shí)期,大量可用的計(jì)算資源將從根本上導(dǎo)致分布式訓(xùn)練方法的不同。調(diào)度程序首先必須正確地平衡跨越異構(gòu)硬件的負(fù)載,這樣主機(jī)就不必為了同步性而等待其他進(jìn)程的執(zhí)行。當(dāng)訓(xùn)練跨越多個(gè)主機(jī)時(shí),調(diào)度程序還必須要考慮網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)和同步所需的成本。如果處理不當(dāng),機(jī)架內(nèi)或機(jī)架間同步所產(chǎn)生的流量可能會(huì)很大,這將極大地降低訓(xùn)練的速度和質(zhì)量。
01-23
2018
科技行業(yè)開始關(guān)注老年人需求 易用性最重要
現(xiàn)在科技已經(jīng)深入到人們生活中的每一個(gè)角落,目標(biāo)受眾不僅僅是接受新事物相對(duì)更快的年輕人,為老年人定制的科技產(chǎn)品也不少,比如通過GPS功能定位和調(diào)整音量的助聽器、能夠背著老人四處走動(dòng)的豐田機(jī)器人以及帶有追蹤報(bào)警功能的無線感應(yīng)器等等。但是老年人畢竟年歲已高,學(xué)習(xí)能力和接受新事物的能力不比年輕人,很多老年人還沒有或很難掌握年輕人認(rèn)為簡單至極的基本科技知識(shí)或技能,在這種情況下,老年人還愿意去使用這些高科技產(chǎn)品嗎?劍橋大學(xué)工程設(shè)計(jì)中心專為老年人設(shè)計(jì)產(chǎn)品的專家伊恩·霍斯金(Ian Hosking)相信,我們首先應(yīng)該普及最基本的科技知識(shí)。他說:“老年人中固然也有能夠深入了解并嫻熟使用科技的人,但是面對(duì)全新的科技產(chǎn)品時(shí)感到頭大如斗的人顯然更多。他們感覺這些新科技令人費(fèi)解?!蔽夷赣H可能就屬于后者。她現(xiàn)在已經(jīng)80多歲了,為了學(xué)習(xí)使用各種最新的科技產(chǎn)品比如二手電腦、Kindle和在線購物,她付出了大量的努力?,F(xiàn)在她想買一臺(tái)平板電腦,但是她擔(dān)心自己不會(huì)用。像她這樣的人不在少數(shù),據(jù)美國皮尤互聯(lián)網(wǎng)研究中心調(diào)查顯示,77%的老年人需要他人的幫助才能完成新設(shè)備的設(shè)置過程。Breezie專為老年人設(shè)計(jì)了一款標(biāo)準(zhǔn)三星Galaxy平板電腦的簡化界面。這個(gè)界面是可以定制的,用戶可以在界面上定制自己想要的功能設(shè)置和應(yīng)用,去掉了老年人可能永遠(yuǎn)也會(huì)用到的預(yù)裝應(yīng)用。另外還簡化了很多功能,比如有人想利用Skype聯(lián)系好友,現(xiàn)在只要在地址簿中點(diǎn)擊好友頭像就行了。公司創(chuàng)始人杰·卡茲米(Jeh Kazimi)稱,Breezie的開發(fā)靈感來自于他自己的母親。他說:“我曾經(jīng)看到她努力上網(wǎng)的情形,她感覺上網(wǎng)有些嚇人,也很復(fù)雜。我沒辦法找到能夠讓互聯(lián)網(wǎng)適合她使用的任何產(chǎn)品,因此我就自己來開發(fā)一款這樣的產(chǎn)品?!彼^續(xù)說:“我們的目標(biāo)是設(shè)計(jì)出一些能夠讓在線環(huán)境更容易被不懂科技的人所接受、并且不會(huì)對(duì)他們有所限制的軟件?!庇脩魝兛梢酝ㄟ^Breezie的支持服務(wù)允許親朋好友遠(yuǎn)程簽到、設(shè)置帳戶和添加新聯(lián)系人。去年,Breezie與Age UK合作發(fā)布了一款售價(jià)299英鎊、預(yù)裝了Breezie平臺(tái)的平板電腦。你可能認(rèn)為老年人也能像年輕人一樣去使用你認(rèn)為“簡單易用”的設(shè)備,但是實(shí)際上這并不容易。我自己經(jīng)常使用iPad,但我認(rèn)為我母親可能就無法學(xué)會(huì)使用這款設(shè)備。蘋果屏幕上的圖標(biāo)反應(yīng)時(shí)間是0.7秒,但是絕大多數(shù)年齡超過65歲的老年人的平均反應(yīng)時(shí)間大約是1秒。使用觸摸屏對(duì)于小孩子來說可能沒什么問題,但是對(duì)于老年人來說可能就大不一樣了。隨著年齡的增長,手指中神經(jīng)的敏感性大幅下降,這就意味著老年人“觸摸”時(shí)的力度會(huì)比較重。測試表明,如果一位老年人有輕微震顫,那么他在使用觸摸屏?xí)r的一次“觸摸”操作就會(huì)被設(shè)備解讀為“滑動(dòng)”。專為老年人設(shè)計(jì)智能手機(jī)的Emporia Telecom公司的發(fā)言人克里斯·比格內(nèi)爾(Chris Bignell)說:“正是這些細(xì)微的問題擊潰了老年人的信心,給他們帶來了極大的困擾?!盓mporia Telecom推出的手機(jī)預(yù)裝了一款應(yīng)用,這款應(yīng)用能夠指導(dǎo)用戶練習(xí)使用觸摸屏。它還推出了一款可定制的外接鍵盤,以滿足某些仍然想使用按鍵的用戶的需求。包括很多中國廠商在內(nèi)的、越來越多的科技公司在開發(fā)硬件時(shí)開始考慮老年人和殘疾人的需求,比如更大的按鍵、音量更高的揚(yáng)聲器、助聽兼容性和更長的電池續(xù)航時(shí)間等等。有些公司推出了精簡版移動(dòng)產(chǎn)品,就像Age UK推出的OwnFone那樣只能接電話和打電話的手機(jī),而另一些公司則從解決具體需求入手。Doro PhoneEasy的按鍵和按鍵上印刷的字體都很大,Binatone Speakeasy則配備了內(nèi)置應(yīng)急按鈕。但是對(duì)很多老年人來說,這些手機(jī)似乎都有些過時(shí)了,用這樣的手機(jī)會(huì)讓他們感覺有些丟人。霍斯金教授說:“他們?cè)诮鉀Q老齡化問題時(shí)缺乏通盤考慮,因?yàn)橥ǔD昙o(jì)比較大的人同時(shí)會(huì)有多項(xiàng)不便之處?!彪S著人口老齡化問題的日益嚴(yán)重,科技行業(yè)決不能對(duì)此視若罔聞。據(jù)估計(jì),到2030年的時(shí)候,19%的美國人將是年齡超過65歲的老年人,這跟目前美國人口中擁有iPhone的人口比例差不多。而到2050年的時(shí)候,退休人口將占到總?cè)丝跀?shù)的三分之一。蘋果也在想辦法解決這個(gè)問題,但是不會(huì)是從新硬件的角度來解決。它在上個(gè)月宣布,它將專門針對(duì)老年人設(shè)計(jì)一些“非常易用的”iPad應(yīng)用。美國推出了一項(xiàng)名為Speaking Exchange的服務(wù),它可以讓已經(jīng)退休、居住在養(yǎng)老院的老年人通過Skype與巴西正在學(xué)習(xí)英語的人連網(wǎng),相互溝通各取所需。老年人顯然期待與人交談,巴西的青少年則可以借此提高自己的英語水平。英國也有一款類似的服務(wù):Cloud Grannies,主要是讓已經(jīng)退休的老年人與印度的兒童連網(wǎng)交流。
01-23
2018
百度副總裁鄔學(xué)斌離職:曾負(fù)責(zé)智能駕駛汽車業(yè)務(wù)
1月23日消息,百度副總裁鄔學(xué)斌離職的消息今日得到官方證實(shí),根據(jù)百度官方回應(yīng),鄔學(xué)斌已提出離職申請(qǐng),并已得到批準(zhǔn)。今天一早的內(nèi)部會(huì)議上,百度集團(tuán)總裁、COO陸奇提到,“感謝學(xué)斌在百度的工作,對(duì)Apollo做出了重要貢獻(xiàn)。祝福學(xué)斌在未來一切順利?!标懫孢€邀請(qǐng)鄔學(xué)斌作為傳播大使繼續(xù)參與到Apollo的工作中來。鄔學(xué)斌則表示,自己在百度見證了Apollo平臺(tái)的誕生和快速發(fā)展,百度的經(jīng)歷也是自己人生中收獲最多,最有價(jià)值的時(shí)刻。鄔學(xué)斌還透露,離開百度是他職業(yè)生涯中最艱難的抉擇,并希望未來與百度Apollo一起圓自己的汽車夢。鄔學(xué)斌在百度主要負(fù)責(zé)智能駕駛汽車業(yè)務(wù)。在兩周前的美國2018CES大會(huì)上,百度Apollo完成了中美無人車隊(duì)直播,被媒體稱為“無人車大閱兵”。鄔學(xué)斌此前擔(dān)任北汽股份研究院院長、北汽股份副總裁,2016年9月離開北汽集團(tuán),正式加盟百度。有消息稱,離開百度后,鄔學(xué)斌下一站或是互聯(lián)網(wǎng)造車企業(yè)寶能汽車。
01-22
2018
王健林:我犯了個(gè)錯(cuò)誤,就是給了萬達(dá)網(wǎng)科太多的錢
“我曾經(jīng)犯的一個(gè)錯(cuò)誤,就是給了曲德君太多的錢,我跟一些企業(yè)家討論,他們說當(dāng)初網(wǎng)科少給點(diǎn)錢,定個(gè)投資上限就好了??磥礤X不能給得太多。”大連萬達(dá)集團(tuán)董事長王健林在集團(tuán)2017年會(huì)上說道?!拔以?jīng)犯的一個(gè)錯(cuò)誤,就是給了曲德君太多的錢”王健林表示,萬達(dá)集團(tuán)2018年計(jì)劃收入2479億元,增幅9%。值得一提的是,在王健林對(duì)萬達(dá)集團(tuán)2018年的工作計(jì)劃中,并沒有提到此前傳出要進(jìn)行業(yè)務(wù)整體轉(zhuǎn)型、暫停現(xiàn)有業(yè)務(wù)及出售和IBM合作萬達(dá)云項(xiàng)目的萬達(dá)網(wǎng)絡(luò)科技集團(tuán)。王健林稱,網(wǎng)科集團(tuán)暫不安排收入計(jì)劃,上半年內(nèi)因與世界級(jí)網(wǎng)絡(luò)巨頭戰(zhàn)略合作,待落地再安排。同時(shí),要成立新的網(wǎng)科公司。王健林強(qiáng)調(diào),要在戰(zhàn)略合作確定之后,再來確定網(wǎng)科集團(tuán)的業(yè)務(wù)目標(biāo)。關(guān)于網(wǎng)科集團(tuán),王健林承認(rèn)當(dāng)初的方向有偏差,而且燒了太多的錢。王健林說:“我曾經(jīng)犯的一個(gè)錯(cuò)誤,就是給了曲德君太多的錢,我跟一些企業(yè)家討論,他們說當(dāng)初網(wǎng)科少給點(diǎn)錢,定個(gè)投資上限就好了。看來錢不能給得太多。不是說網(wǎng)科沒有做出成績,這一次跟別人合作談判,使我和團(tuán)隊(duì)對(duì)網(wǎng)科有了全新認(rèn)識(shí),他們開發(fā)了一些有用的東西,只是這些東西有培育期,還不能馬上被資本市場接受。原來方向也有偏差,老想大規(guī)模來做,如果就為萬達(dá)廣場、旅游度假區(qū)研發(fā),可能早就整出名堂了?!蔽穆庙?xiàng)目每年增加1000億負(fù)債,十幾年才能收回投資在過去的一年中,王健林以438.44億元的價(jià)格將旗下13個(gè)文旅城項(xiàng)目賣給了融創(chuàng)中國(01918.HK),199.06億元將77家酒店出售給了廣東地產(chǎn)商富力地產(chǎn)(02777.HK)。由于萬達(dá)商業(yè)轉(zhuǎn)讓文旅項(xiàng)目、酒店資產(chǎn),使萬達(dá)集團(tuán)的資產(chǎn)、收入兩項(xiàng)指標(biāo)有所減少。萬達(dá)集團(tuán)2017年的收入為2273億元,其中商業(yè)地產(chǎn)收入為1125.4億元。而萬達(dá)在海外的項(xiàng)目也多次被傳出要找買家接手。此外,關(guān)于萬達(dá)資金鏈緊張,多家銀行停止對(duì)萬達(dá)貸款的市場傳言讓萬達(dá)經(jīng)歷了股債雙殺,外界關(guān)于萬達(dá)現(xiàn)如今的狀況也一直猜測不斷。“萬達(dá)過去幾年在海外投了一批項(xiàng)目,現(xiàn)在我們決定清償海外債務(wù),賣一半資產(chǎn)就能把全部債務(wù)清償,說明我們買和賣之間賺錢了?!蓖踅×衷谀陼?huì)上表示:“萬達(dá)賣酒店,我們搞酒店建設(shè)、管理的很多同志都說,賣了是不是太可惜?萬達(dá)酒店是建得不錯(cuò),成本也很低,但是酒店整體年平均回報(bào)率低于4%,全部酒店每年吃掉十幾個(gè)萬達(dá)廣場的凈利潤,所以,我們決定把重資產(chǎn)的文旅項(xiàng)目和酒店賣掉,做輕資產(chǎn)這種只賺不賠的買賣,絕對(duì)是上策。不管社會(huì)上理不理解,也可能有些內(nèi)部同志不理解,但是請(qǐng)大家三年以后再回頭來看我們的決定是否正確。”對(duì)于出售13個(gè)文旅項(xiàng)目的原因,王健林稱,“每個(gè)大型文化旅游項(xiàng)目需要七年、八年有息負(fù)債才能往下走,十幾年才能收回投資。萬達(dá)十幾個(gè)文旅項(xiàng)目疊加在一起,雖然通過銷售物業(yè)能回收大部分現(xiàn)金,但至少五到六年內(nèi),每年凈增1000億負(fù)債,壓力相當(dāng)大。現(xiàn)在全球和中國都在去杠桿、降負(fù)債,這樣加杠桿、逆勢而為是不科學(xué)的?!辈捎靡磺匈Y本手段降低負(fù)債,在全球絕不會(huì)出現(xiàn)任何信用違約王健林說,2017年是萬達(dá)集團(tuán)歷史上難忘的一年,萬達(dá)經(jīng)歷了風(fēng)波,承受了磨難?!稗D(zhuǎn)讓資產(chǎn)減債四百多億,回收現(xiàn)金近700億,加上我們手頭持有的現(xiàn)金,萬達(dá)經(jīng)營的安全性增加很多,就能承受風(fēng)波的沖擊。而且如果我們不轉(zhuǎn)讓這些資產(chǎn),就不能把有限的資金投入到我們最需要發(fā)展的萬達(dá)廣場上去,就不能保證每年50個(gè)以上萬達(dá)廣場開業(yè)的計(jì)劃。為了企業(yè)安全,為了保證核心產(chǎn)業(yè)發(fā)展,我們必須這樣做?!蓖踅×终f道。關(guān)于負(fù)債的問題,王健林表示:“萬達(dá)集團(tuán)將采用一切資本手段降低企業(yè)負(fù)債,包括出售非核心資產(chǎn)、保持控制權(quán)前提下的股權(quán)交易、合作管理別人的資產(chǎn)等等。萬達(dá)要逐步清償全部海外有息負(fù)債,萬達(dá)商業(yè)A股退市資金也有了可靠方案。同時(shí)計(jì)劃用兩到三年時(shí)間,將企業(yè)負(fù)債降到絕對(duì)安全的水平。今天我可以在這里負(fù)責(zé)任地說,萬達(dá)集團(tuán)在全球絕不會(huì)出現(xiàn)任何信用違約!萬達(dá)30年沒有出現(xiàn)一起信用違約,我們把信用看得比資產(chǎn)、利潤更重要。”以下為總結(jié)全文:萬達(dá)集團(tuán)2017年工作總結(jié)董事長 王健林2018年1月20日各位同仁,首先我代表集團(tuán)董事會(huì)對(duì)大家前來參加萬達(dá)集團(tuán)2017年年會(huì)表示熱烈歡迎!歡迎你們回家!2017年對(duì)萬達(dá)來說是非常難忘的一年,經(jīng)歷了風(fēng)波,也承受了一些磨難。在各級(jí)政府、各個(gè)方面的大力支持下,特別是萬達(dá)全體員工團(tuán)結(jié)奮斗,在比較困難的經(jīng)營條件下,我們較好地完成了2017年各項(xiàng)工作任務(wù),下面我對(duì)2017年工作進(jìn)行總結(jié)。一、去年工作主要成績(一)全面完成工作目標(biāo)2017年,萬達(dá)商業(yè)轉(zhuǎn)讓文旅項(xiàng)目和酒店資產(chǎn),受其影響,萬達(dá)集團(tuán)的資產(chǎn)、收入兩項(xiàng)指標(biāo)有所減少。萬達(dá)集團(tuán)以成本計(jì)資產(chǎn)7000億元,同比減少11.5%;其中國內(nèi)資產(chǎn)占比93%,國外資產(chǎn)占比7%。為什么專門提這個(gè)數(shù)據(jù)?去年有人說萬達(dá)把大量資產(chǎn)轉(zhuǎn)移到海外去了,數(shù)據(jù)證明完全不符合事實(shí)。2017年萬達(dá)集團(tuán)收入2273.7億元,完成計(jì)劃的113%,同比減少10.8%。減少是因?yàn)檗D(zhuǎn)讓的文旅項(xiàng)目收入沒有計(jì)算在內(nèi),加上2016年底我們把萬達(dá)旅業(yè)資產(chǎn)注入一個(gè)投資企業(yè),接近200億的旅游收入沒有計(jì)入今年報(bào)表。如果考慮旅游收入變化的影響,盡管2017年萬達(dá)集團(tuán)轉(zhuǎn)讓了大量資產(chǎn),收入同比只下降1.1%。凈利潤完成年目標(biāo)的114%,同比基本持平,說明收入含金量不錯(cuò)。其中:商業(yè)地產(chǎn)收入1125.4億元,完成年計(jì)劃的104.1%,同比減少21%;租金收入255.2億元,完成年計(jì)劃的101.4%,同比增長30.3%;新開店數(shù)占總開業(yè)店數(shù)的21%,其中還有24個(gè)輕資產(chǎn)項(xiàng)目萬達(dá)只分成部分租金,而總租金增長30.3%,說明老的開業(yè)店內(nèi)生租金增長比例至少兩位數(shù),也就是說萬達(dá)即使不開新店,租金也較高增長。租金收繳率101%,連續(xù)12年創(chuàng)造租金收繳率99.5%以上的世界行業(yè)紀(jì)錄。新開業(yè)廣場49個(gè),萬達(dá)茂1個(gè),萬達(dá)旅游小鎮(zhèn)1個(gè)。其中開業(yè)輕資產(chǎn)廣場24個(gè),這是一個(gè)很不錯(cuò)的成績;開業(yè)重資產(chǎn)廣場26個(gè),新增持有物業(yè)面積329.6萬平方米,扣除轉(zhuǎn)讓文旅項(xiàng)目、酒店減少的幾百萬平方米持有物業(yè)面積,萬達(dá)累計(jì)持有物業(yè)面積3151.1萬平方米。萬達(dá)仍然是世界規(guī)模最大的不動(dòng)產(chǎn)企業(yè)。萬達(dá)廣場總客流31.9億人次,同比增長28.1%。新開業(yè)店數(shù)增長21%,其中許多店下半年才開業(yè),而客流增長28.1%,這是一個(gè)有力的證據(jù),說明萬達(dá)廣場老店客流同比也在增長。房地產(chǎn)收入831.7億元,完成年計(jì)劃的104%,同比減少23.7%,主要因?yàn)檗D(zhuǎn)讓文旅項(xiàng)目減少房地產(chǎn)收入。文化集團(tuán)收入637.8億元,完成年計(jì)劃的100.1%,同比增長32.6%。這是扣減萬達(dá)旅業(yè)收入后同比計(jì)算。影視集團(tuán)收入532億元,完成年計(jì)劃98.5%,同比增長35.9%。2016年影視集團(tuán)計(jì)劃收入目標(biāo)為540億元。影視集團(tuán)有點(diǎn)遺憾,去年能完成凈利潤目標(biāo)的114%,但收入比目標(biāo)差1.5%,如果再稍微努力一點(diǎn)就好了,我說的是整個(gè)影視集團(tuán)含海外公司收入差一點(diǎn),不過國內(nèi)公司還是完成了年度目標(biāo)。體育集團(tuán)收入71.8億元,完成年計(jì)劃的104.3%,同比增長12.3%;文旅集團(tuán)收入19.5億元,完成年計(jì)劃的139.5%。寶貝王集團(tuán)收入14.4億元,完成年計(jì)劃的97%,同比增長176%。金融集團(tuán)收入321.2億元,完成年計(jì)劃的125.5%,這里我要特別提一句,金融集團(tuán)凈利潤完成年計(jì)劃的1961%,創(chuàng)萬達(dá)完成計(jì)劃指標(biāo)的歷史紀(jì)錄。網(wǎng)絡(luò)科技集團(tuán)收入58.6億元,完成年計(jì)劃的90.1%。集團(tuán)其它公司收入130.7億元,平均完成年計(jì)劃的106%。萬達(dá)集團(tuán)2017年如果把轉(zhuǎn)讓文旅項(xiàng)目的收入和注入其它公司的旅游收入算上,同比增長可以達(dá)到兩位數(shù)。(二)轉(zhuǎn)型發(fā)展成效顯著一百年來,全球大型房企無一例轉(zhuǎn)型成功,萬達(dá)已經(jīng)改寫商業(yè)歷史,成功轉(zhuǎn)型為服務(wù)型為主的企業(yè)。1、服務(wù)業(yè)收入占絕大多數(shù)。萬達(dá)集團(tuán)2017年收入中,服務(wù)業(yè)收入占比63.4%,同比提高8.4%。近幾年,萬達(dá)服務(wù)業(yè)收入每年都會(huì)大幅提高,今后還會(huì)繼續(xù)提高。服務(wù)業(yè)收入中,租金收入占比約18%,增速遠(yuǎn)高于萬達(dá)其它產(chǎn)業(yè),已經(jīng)連續(xù)多年平均實(shí)現(xiàn)超過30%的增長。租金是最長期、穩(wěn)定的現(xiàn)金流之一,而且利潤比例高,收入占比提高說明收入含金量增加。2、文化收入占比提高。2017年,萬達(dá)文化產(chǎn)業(yè)收入占萬達(dá)集團(tuán)收入比重升至28.1%,接近30%,已成為萬達(dá)另一個(gè)支柱產(chǎn)業(yè)。希望今年文化集團(tuán)努努力,看能不能超過30%。3、輕資產(chǎn)戰(zhàn)略超出預(yù)期。萬達(dá)轉(zhuǎn)型關(guān)鍵是萬達(dá)商業(yè)轉(zhuǎn)型,萬達(dá)商業(yè)轉(zhuǎn)型關(guān)鍵是從單一重資產(chǎn)企業(yè)轉(zhuǎn)為輕資產(chǎn)為主、輕重并存發(fā)展的企業(yè)。說萬達(dá)轉(zhuǎn)型就不再持有物業(yè),這完全錯(cuò)了,只是萬達(dá)不像以前百分之百自己持有。去年年會(huì),萬達(dá)商業(yè)正式提出萬達(dá)商業(yè)輕資產(chǎn)戰(zhàn)略。萬達(dá)輕資產(chǎn)分為兩類,一種叫做投資類,一種叫做合作類。投資類就是別人出錢,萬達(dá)幫別人找地、設(shè)計(jì)、建設(shè)、招商、竣工運(yùn)營后移交給別人,其中還有一個(gè)資本化程序。合作類就是萬達(dá)既不出錢,也不出地,覺得項(xiàng)目合適,跟別人簽合同,幫別人建設(shè),建成后租金三七分成,這是我們力推的模式。輕資產(chǎn)戰(zhàn)略提出一年之內(nèi),輕資產(chǎn)萬達(dá)廣場開業(yè)24個(gè),新發(fā)展輕資產(chǎn)萬達(dá)廣場47個(gè),其中合作類輕資產(chǎn)萬達(dá)廣場簽約37個(gè),遠(yuǎn)超年初發(fā)展25個(gè)輕資產(chǎn),其中投資類10個(gè)、合作類15個(gè)的目標(biāo),發(fā)展中心值得表揚(yáng)。當(dāng)然也不完全是發(fā)展中心功勞,相當(dāng)多項(xiàng)目是商管和項(xiàng)目系統(tǒng)幫助促成的。這47個(gè)廣場,萬達(dá)不出一分錢,收益相當(dāng)于投資持有16個(gè)廣場,16個(gè)廣場如果自己投資最少需要200億元。更重要的是,2017年北京、杭州、廣州、成都、天津、重慶等一線城市都有萬達(dá)輕資產(chǎn)項(xiàng)目開業(yè)或簽約,如果不是輕資產(chǎn),這些城市自己投資持有很難獲得項(xiàng)目,這說明萬達(dá)廣場品牌價(jià)值和投資者信任度。4、大幅降低企業(yè)負(fù)債。去年7月,萬達(dá)和融創(chuàng)、富力簽署了文旅項(xiàng)目、酒店資產(chǎn)轉(zhuǎn)讓協(xié)議,僅此一項(xiàng)協(xié)議就減債440億元,回收現(xiàn)金670億元,相當(dāng)于減債1100億元。對(duì)于這次轉(zhuǎn)讓,眾說紛紜,很多解讀,萬達(dá)賣資產(chǎn),是不是不行了,其實(shí)這是根本不理解商業(yè)的基本邏輯。第一、什么叫做生意?做生意用老百姓俗話說,叫做買賣。生意就是買和賣構(gòu)成的,世上沒有只買的生意,也沒有只賣的生意。買就說這個(gè)公司好,賣就說這個(gè)公司不好,這是根本不懂商業(yè)思維。其實(shí)不管買也好、賣也好,關(guān)鍵看買賣之間能否賺錢。所以對(duì)萬達(dá)的買買買和賣賣賣,關(guān)鍵看我們買的是什么價(jià)格,賣的是什么價(jià)格,萬達(dá)過去幾年在海外投了一批項(xiàng)目,現(xiàn)在我們決定清償海外債務(wù),賣一半資產(chǎn)就能把全部債務(wù)清償,說明我們買和賣之間賺錢了。第二、萬達(dá)廣場本身是非常重的資產(chǎn),過去萬達(dá)廣場全部自己持有,到2017年底開業(yè)236個(gè)廣場,210個(gè)是重資產(chǎn),按成本價(jià)計(jì)算都是幾千億規(guī)模。如果再持有文化旅游項(xiàng)目和酒店,重資產(chǎn)規(guī)模太大。文化旅游項(xiàng)目肯定可以收回投資的,經(jīng)過數(shù)學(xué)模型分析,每個(gè)大型文化旅游項(xiàng)目需要七年、八年有息負(fù)債才能往下走,十幾年才能收回投資。萬達(dá)十幾個(gè)文旅項(xiàng)目疊加在一起,雖然通過銷售物業(yè)能回收大部分現(xiàn)金,但至少五到六年內(nèi),每年凈增1000億負(fù)債,壓力相當(dāng)大?,F(xiàn)在全球和中國都在去杠桿、降負(fù)債,這樣加杠桿、逆勢而為是不科學(xué)的。第三、萬達(dá)已持有大量較高收益的萬達(dá)廣場物業(yè),沒有必要再去持有文旅項(xiàng)目物業(yè)。萬達(dá)賣酒店,我們搞酒店建設(shè)、管理的很多同志都說,賣了是不是太可惜?萬達(dá)酒店是建得不錯(cuò),成本也很低,但是酒店整體年平均回報(bào)率低于4%,全部酒店每年吃掉十幾個(gè)萬達(dá)廣場的凈利潤,所以,我們決定把重資產(chǎn)的文旅項(xiàng)目和酒店賣掉,做輕資產(chǎn)這種只賺不賠的買賣,絕對(duì)是上策。不管社會(huì)上理不理解,也可能有些內(nèi)部同志不理解,但是請(qǐng)大家三年以后再回頭來看我們的決定是否正確。第四、企業(yè)經(jīng)營安全第一。轉(zhuǎn)讓資產(chǎn)減債四百多億,回收現(xiàn)金近700億,加上我們手頭持有的現(xiàn)金,萬達(dá)經(jīng)營的安全性增加很多,就能承受風(fēng)波的沖擊。而且如果我們不轉(zhuǎn)讓這些資產(chǎn),就不能把有限的資金投入到我們最需要發(fā)展的萬達(dá)廣場上去,就不能保證每年50個(gè)以上萬達(dá)廣場開業(yè)的計(jì)劃。為了企業(yè)安全,為了保證核心產(chǎn)業(yè)發(fā)展,我們必須這樣做。(三)文化產(chǎn)業(yè)高速增長1、影視產(chǎn)業(yè)。影視集團(tuán)去年收入增長35%,新增影城199家,新增屏幕1585塊;累計(jì)開業(yè)影城1551家,屏幕數(shù)15932塊,全球市場占有率和影響力進(jìn)一步擴(kuò)大。特別是在英語片市場,萬達(dá)具有相當(dāng)話語權(quán)。萬達(dá)影城在中國并不都是開在萬達(dá)廣場,有一半左右開在非萬達(dá)物業(yè)里,但萬達(dá)影城單屏收入是國內(nèi)平均水平1.9倍,線上收入超9成,會(huì)員收入近9成,表明萬達(dá)電影收入非常穩(wěn)定的增長。萬達(dá)電影活躍會(huì)員突破1億,這是重大成績,也為長期穩(wěn)定增長打下基礎(chǔ)。萬達(dá)電影花了9年時(shí)間使會(huì)員人數(shù)突破1億。希望你們?cè)儆萌陼r(shí)間,看到2020年能不能把會(huì)員人數(shù)突破2億。2、體育產(chǎn)業(yè)。萬達(dá)體育收入兩位數(shù)增長,凈利潤增長更為可觀。在中國落地格力“中國杯”國際足球錦標(biāo)賽,這是中國唯一獲國際足聯(lián)批準(zhǔn)、每年定期舉辦的國際足球A級(jí)賽事。還落地格力“環(huán)廣西”公路自行車世界巡回賽,這是中國唯一的男子公路自行車世界巡回賽,首屆就有16支世界頂級(jí)車隊(duì)參賽。男子公路自行車俱樂部分多個(gè)級(jí)別,有國家級(jí)、州級(jí),世巡賽是最高級(jí)別。世巡賽級(jí)別的自行車隊(duì)只有18支,世巡賽有多站比賽,只有環(huán)法是十八支車隊(duì)都參加,其它如環(huán)意、環(huán)西都是十幾支車隊(duì)參加,“環(huán)廣西”第一年就有16支車隊(duì)參加,今年預(yù)計(jì)18支全部參賽。萬達(dá)體育還落地鐵人三項(xiàng)、搖滾馬拉松、小輪車世界錦標(biāo)賽等多項(xiàng)賽事。3、文旅產(chǎn)業(yè)。文旅產(chǎn)業(yè)去年表現(xiàn)良好,收入完成139%,凈利潤倍數(shù)遞增。更重要的是,文旅產(chǎn)業(yè)實(shí)現(xiàn)了輕資產(chǎn)品牌經(jīng)營的目標(biāo),由一個(gè)負(fù)債很重的企業(yè)轉(zhuǎn)變?yōu)橐粋€(gè)輕資產(chǎn)公司。酒店管理公司2017年首次實(shí)現(xiàn)公司整體盈利,新簽約委托管理高星級(jí)酒店10家。自從酒店管理公司班子調(diào)整以后,業(yè)績非常喜人,去年下半年酒店業(yè)績大幅增長,幾乎全部酒店都實(shí)現(xiàn)盈利,絕大多數(shù)酒店利潤實(shí)現(xiàn)比較快的增長,再次證明管理就是生產(chǎn)力。4、兒童產(chǎn)業(yè)。十年前萬達(dá)廣場就想引進(jìn)一個(gè)兒童娛樂綜合公司,到美國、歐洲、日本、韓國去找,找了五、六年都沒找到。全世界這種類型公司基本沒有,有那么一兩家,也不愿意到中國來。我們討論要不要自己干,但這意味著要進(jìn)入全新產(chǎn)業(yè),也猶豫來猶豫去。但萬達(dá)廣場要實(shí)現(xiàn)全客層經(jīng)營,光是年輕人喜歡不行,孩子也得喜歡。兒童意味著未來,所以下決心自己做,也是邊探索邊干。一開始公司定位搞兒童娛樂,名字就叫兒童娛樂連鎖公司,去年才改名叫寶貝王集團(tuán),定位為以自有IP傳播、衍生品銷售為主,集兒童教育、游樂、美食于一體的綜合性兒童產(chǎn)業(yè)公司。寶貝王集團(tuán)2017年開業(yè)寶貝王樂園60家,早教中心50家;整體實(shí)現(xiàn)盈利,比指標(biāo)提前一年。寶貝王不僅經(jīng)營好,很多先行指標(biāo)表現(xiàn)也非常好。如自有IP傳播上半年全網(wǎng)收視率48億人次,下半年飆升到150億人次,估計(jì)2018年數(shù)字會(huì)更加喜人。這意味著寶貝王定位方向是絕對(duì)準(zhǔn)確的。如果我們把寶貝王定位為一個(gè)游樂型公司,那就錯(cuò)了。(四)科技創(chuàng)新成果豐碩大家也許奇怪,萬達(dá)談什么科技創(chuàng)新,是不是附庸風(fēng)雅,實(shí)際隨著萬達(dá)轉(zhuǎn)型,文化旅游產(chǎn)業(yè)發(fā)展、線上線下融合,萬達(dá)連續(xù)幾年科技創(chuàng)新有所斬獲。1、慧云。去年慧云升級(jí)3.0版本,被國際權(quán)威機(jī)構(gòu)評(píng)為全球創(chuàng)新企業(yè)50強(qiáng),是亞洲唯一獲獎(jiǎng)企業(yè)。慧云系統(tǒng)有十幾個(gè)子系統(tǒng),其中智慧消防子系統(tǒng)被公安部消防局列為中國城市智慧消防試點(diǎn)單位。2、筑云。2016年筑云在萬達(dá)試行,去年正式實(shí)施,這是全球首款智慧工程管理軟件,被國際權(quán)威機(jī)構(gòu)評(píng)為全球數(shù)字化轉(zhuǎn)型大獎(jiǎng)。筑云可以對(duì)工程實(shí)施設(shè)計(jì)到竣工全過程的智能管控,改變工程建設(shè)行業(yè)控制成本憑經(jīng)驗(yàn)、隨意性大的問題。對(duì)還在快速推進(jìn)城市化、建筑體量天文數(shù)字的中國來說,如果筑云得到推廣,會(huì)在兩方面作出貢獻(xiàn),一是可以給中國節(jié)約數(shù)以百億、甚至千億計(jì)的建設(shè)成本。二是遏制腐敗,腐敗現(xiàn)象很多發(fā)生在工程建設(shè)領(lǐng)域,主要因?yàn)楣こ探ㄔO(shè)是非標(biāo)準(zhǔn)化的,東西南北都不一樣,地塊也都不同,加上施工很多個(gè)體作業(yè),工程智慧管控是一個(gè)大難題。筑云盡管還不完善,但萬達(dá)在這方面邁出了重要步伐。3、創(chuàng)新加速器。去年信息中心利用萬達(dá)海量線下場景作為開放平臺(tái),向全球高技術(shù)企業(yè)、科研機(jī)構(gòu)、擁有核心技術(shù)的個(gè)人免費(fèi)開放,可以到任何地方的萬達(dá)廣場做實(shí)驗(yàn),吸引科創(chuàng)企業(yè)、個(gè)人為萬達(dá)線上線下融合做貢獻(xiàn),我們對(duì)有前景的項(xiàng)目進(jìn)行投資孵化。首屆創(chuàng)新加速器活動(dòng)從300個(gè)項(xiàng)目中選出15個(gè)進(jìn)行孵化,涉及大數(shù)據(jù)分析、人工智能客服、樓宇節(jié)能黑科技、VR場景娛樂等。其中無人零售平臺(tái)已在北京、杭州的萬達(dá)廣場試運(yùn)行。我對(duì)創(chuàng)新加速器充滿期待,如果每年成功孵化一個(gè)兩個(gè),一屆一屆干下去,將是一個(gè)非常有前途的項(xiàng)目。關(guān)鍵是選出來如何跟進(jìn),使它走上正路,這是孵化最重要的環(huán)節(jié),這還不是信息中心能做的,需要更商業(yè)化的平臺(tái)來做。4、飛凡大、小千帆軟件。這是飛凡面向大中小型企業(yè)商戶,一站式解決線上、線下融合的管理軟件。簽約商戶6萬家,日交易額超5000萬元。還有“萬益通”APP,這是中國首款數(shù)字權(quán)益交換平臺(tái),可進(jìn)行積分、卡券和其它數(shù)字權(quán)益的交換,已有中石油、中石化、國家電網(wǎng)、海航、京東、順豐等300多家大型企業(yè)參加。希望“萬益通”數(shù)字交換平臺(tái)能發(fā)展更多企業(yè),爭取中國大型企業(yè)都能參加,讓他們的卡券在平臺(tái)上都可以互換,這樣平臺(tái)的價(jià)值就會(huì)更大。5、曲面內(nèi)顯LED動(dòng)感平臺(tái)。這是全球首款新型觀影科技設(shè)備,獲得國內(nèi)外知識(shí)產(chǎn)權(quán)。大家明年可以去廣州萬達(dá)城體驗(yàn)。2017年萬達(dá)集團(tuán)全球申報(bào)專利知識(shí)產(chǎn)權(quán)1278項(xiàng),取得專利知識(shí)產(chǎn)權(quán)802件,全集團(tuán)累計(jì)已獲國內(nèi)外專利知識(shí)產(chǎn)權(quán)5069件。(五)企業(yè)管理明顯進(jìn)步1、預(yù)算執(zhí)行到位。去年所有在建、竣工、開業(yè)項(xiàng)目,結(jié)算與預(yù)算做到完全一致。西雙版納國際度假區(qū)、南昌萬達(dá)城兩個(gè)超大文旅項(xiàng)目,時(shí)間跨度5年,超百億投資,由于我們的管理能力,加上與筑云軟件相結(jié)合,也做到預(yù)決算一致,這是萬達(dá)執(zhí)行力和科技管理的成果。2、投資回報(bào)提升。萬達(dá)廣場輕資產(chǎn)推出來后,有人說憑什么萬達(dá)一分錢不投分30%租金?光靠牌子響?肯定不是。只能解釋,別人分70%大于他自己干100%。萬達(dá)廣場輕資產(chǎn)標(biāo)準(zhǔn)模板、工程管理軟件研發(fā)成功和推行,使得萬達(dá)廣場投資回報(bào)平均達(dá)到2位數(shù),是行業(yè)平均水平的兩倍,這就可以解釋為什么萬達(dá)分30%租金還有那么多企業(yè)上門合作。3、嚴(yán)控管理費(fèi)用。搞地產(chǎn)成本大,管理成本超一點(diǎn)還可以消化,但轉(zhuǎn)型為服務(wù)管理企業(yè),一旦成本超支,商業(yè)模式就不成立。所以在嚴(yán)控管理費(fèi)用上,我們下了比較大的功夫,去年丁總帶領(lǐng)有關(guān)部門專題研討,優(yōu)化管理環(huán)節(jié),使萬達(dá)總部在業(yè)務(wù)規(guī)模擴(kuò)大的同時(shí)費(fèi)用不升反降,節(jié)省管理費(fèi)6.9億元。4、反腐卓有成效。審計(jì)中心去年查處263起違規(guī)事件,解除勞動(dòng)關(guān)系129人,司法立案三起,為企業(yè)挽回?fù)p失1.3億元。萬達(dá)審計(jì)有權(quán)威,在企業(yè)界也有耳聞。(六)帶頭履行社會(huì)責(zé)任1、精準(zhǔn)扶貧。去年7月3日,萬達(dá)捐建的貴州丹寨旅游小鎮(zhèn)開業(yè)。9月29日,丹寨萬達(dá)職業(yè)技術(shù)學(xué)院開學(xué)。由于商管、文旅等部門通力合作、精準(zhǔn)定位、針對(duì)性推廣,小鎮(zhèn)開業(yè)半年游客超過300萬人次。丹寨沒有名山大川,沒有獨(dú)特景點(diǎn),缺乏可以利用的優(yōu)質(zhì)旅游資源,完全是無中生有造了一個(gè)旅游小鎮(zhèn),就一躍成為貴州排名前3的景點(diǎn),帶動(dòng)丹寨縣2017年旅游收入翻了5倍。新增直接就業(yè)2000人,間接就業(yè)超萬人,帶動(dòng)1.6萬人脫貧。丹寨已逐步成為萬達(dá)精準(zhǔn)扶貧的新品牌。2、就業(yè)。2017年,萬達(dá)新創(chuàng)造服務(wù)業(yè)就業(yè)崗位19.5萬人,其中大學(xué)生8.4萬人,占當(dāng)年全國新增就業(yè)的1.5%,連續(xù)兩年萬達(dá)一家公司創(chuàng)造全國新增就業(yè)的1.5%,而且萬達(dá)創(chuàng)造的都是有尊嚴(yán)的就業(yè),在萬達(dá)廣場工作,風(fēng)吹不著,雨淋不著,收入還穩(wěn)定。3、捐贈(zèng)。2017年,不含實(shí)物,萬達(dá)現(xiàn)金捐贈(zèng)7.7億元。4、環(huán)保。2017年,萬達(dá)獲國家綠建標(biāo)識(shí)126項(xiàng),其中綠建設(shè)計(jì)標(biāo)識(shí)77項(xiàng),綠建運(yùn)行標(biāo)識(shí)49個(gè),連續(xù)多年綠建標(biāo)識(shí)獲得數(shù)量全國排名第一,每年綠建總數(shù)占全國三分之一到四分之一。5、義工。去年組織義工活動(dòng)2651次,10.76萬人次參加,中國沒有一家企業(yè)像萬達(dá)連續(xù)二十幾年持續(xù)組織義工活動(dòng),沒有獎(jiǎng)勵(lì)、沒有獎(jiǎng)金,完全是發(fā)自內(nèi)心。2017年企業(yè)取得很好成績,但也存在不少問題。比如少部分企業(yè)沒有完成年度目標(biāo)、腐敗現(xiàn)象依然嚴(yán)重,少部分高管本位主義,花錢大手大腳,線上線下融合不夠。因?yàn)闀r(shí)間關(guān)系,只點(diǎn)個(gè)題目,有待大家下力氣去解決。特別遺憾的是,去年因?yàn)橛袃扇齻€(gè)單位指標(biāo)沒完成,使萬達(dá)沒有實(shí)現(xiàn)滿堂紅。二、2018年主要工作安排(一)今年工作主要目標(biāo)2018年萬達(dá)集團(tuán)計(jì)劃收入2479億元。商業(yè)地產(chǎn)收入1245.4億元,其中商管公司總收入366.4億元,租金收入326.8億元;新開業(yè)萬達(dá)廣場50個(gè),萬達(dá)茂2個(gè);房地產(chǎn)收入879億元;新發(fā)展重資產(chǎn)萬達(dá)廣場7個(gè);輕資產(chǎn)萬達(dá)廣場50個(gè),其中合作類40個(gè),投資類10個(gè)。文化集團(tuán)收入733億元,其中影視集團(tuán)收入581億元;體育集團(tuán)收入94.3億元;文旅集團(tuán)收入30.7億元;寶貝王集團(tuán)收入26.4億元。金融集團(tuán)收入408億元。網(wǎng)科集團(tuán)暫不安排收入計(jì)劃,上半年內(nèi)因與世界級(jí)網(wǎng)絡(luò)巨頭戰(zhàn)略合作,待落地再安排。集團(tuán)其它收入92.8億元。(二)提升核心競爭優(yōu)勢1、加快萬達(dá)廣場發(fā)展速度。萬達(dá)廣場是萬達(dá)的核心資產(chǎn)、核心企業(yè)、核心優(yōu)勢。隨著中國城市化紅利的減少,而且現(xiàn)在特大城市都劃定了發(fā)展邊界,想在中國再造一個(gè)萬達(dá)已經(jīng)沒有可能。中國商業(yè)已進(jìn)入線上線下融合發(fā)展新階段,萬達(dá)廣場超大規(guī)模線下場景的價(jià)值巨大。一年前還不覺得,現(xiàn)在看萬達(dá)廣場超大規(guī)模、綜合性消費(fèi)場景的價(jià)值越來越凸顯。商業(yè)中心有競爭半徑,特別是在三四線城市,萬達(dá)廣場一旦落地,一定半徑里競爭對(duì)手很難再投資。舉個(gè)例子,我們?cè)诜鹕侥车?,一個(gè)區(qū)域里規(guī)劃了近10個(gè)大型城市綜合體。我們拿了地,調(diào)研發(fā)現(xiàn)周邊這么多項(xiàng)目,決定盡快開業(yè)。萬達(dá)廣場開業(yè)后,旁邊幾個(gè)項(xiàng)目到現(xiàn)在也沒有開業(yè)。因?yàn)槲覀儽容^火,同類競爭業(yè)態(tài)就不好布點(diǎn)了,這就像下圍棋一樣,占了先手。所以我們要加快萬達(dá)廣場全國布局,盡快多簽多建項(xiàng)目,更早將萬達(dá)廣場發(fā)展到千店規(guī)模,這就是萬達(dá)的護(hù)城河計(jì)劃。千店規(guī)模就意味這全國336個(gè)地級(jí)以上城市,萬達(dá)廣場能覆蓋90%,剩下10%左右的地級(jí)市因?yàn)槿丝诤拖M(fèi)不夠;主要縣級(jí)城市覆蓋30%,因?yàn)橹袊恍┛h人口較多,也具備較強(qiáng)消費(fèi)能力。萬達(dá)廣場建成全國網(wǎng)絡(luò)是什么概念?打個(gè)比方,假設(shè)300公里地鐵線每天可以運(yùn)載300萬人,600公里地鐵線就不是運(yùn)載600萬人,而是1000萬以上。因?yàn)橐坏┬纬删W(wǎng)絡(luò),容量就不是1加1等于2的關(guān)系,而是1加1大于2。1000個(gè)店我們能獲得的租金收入、廣告收入、線上線下融合的價(jià)值,絕不是現(xiàn)在的5倍。加快發(fā)展關(guān)鍵要加快輕資產(chǎn),從2018年開始萬達(dá)將每年提高萬達(dá)廣場開業(yè)數(shù)量。2、提升體驗(yàn)消費(fèi)占比。增加萬達(dá)廣場黏性最好的辦法就是增加體驗(yàn)業(yè)態(tài),這是重中之重的工作。體驗(yàn)消費(fèi)具有不可替代性,有人說美食也可以打包,但打包來的美食還有鮮味嗎?娛樂、健身、唱歌、觀影都要到現(xiàn)場體驗(yàn),不是網(wǎng)絡(luò)可以替代的。還要逐漸提升文化業(yè)態(tài)占比,社會(huì)發(fā)展到一定程度,人們對(duì)精神的追求就會(huì)大過對(duì)物質(zhì)追求。不然就不能理解,為什么文化的東西能傳承幾百幾千年,一本書、一部電影、一首歌曲、一部歌劇能廣為流傳。三年內(nèi)要將萬達(dá)廣場體驗(yàn)業(yè)提升到65%,五年力爭提升到70%。這不僅是商管的事,規(guī)劃設(shè)計(jì)部門也要?jiǎng)?chuàng)新。希望從2018年開始,每年評(píng)幾個(gè)創(chuàng)新廣場,主要看體驗(yàn)業(yè)態(tài)、文化業(yè)態(tài)、更有新意這些方面。3、配置優(yōu)秀管理人才。今后優(yōu)秀人才向商管傾斜,萬達(dá)學(xué)院培訓(xùn)也要向商管傾斜,形成風(fēng)氣。(三)持續(xù)不斷企業(yè)轉(zhuǎn)型企業(yè)轉(zhuǎn)型沒有終點(diǎn),這是企業(yè)管理永恒主題。不要以為企業(yè)轉(zhuǎn)型幾年就完成了,企業(yè)轉(zhuǎn)型沒有完成時(shí)。1、加快輕資產(chǎn)步伐。萬達(dá)品牌是非常管用的,要加快萬達(dá)廣場輕資產(chǎn)發(fā)展速度,每年不少于50個(gè),合作項(xiàng)目數(shù)量上不封頂。有人寫文章說商業(yè)中心建設(shè),一個(gè)企業(yè)一年建設(shè)50個(gè)是極限,他可能是以萬達(dá)作為分析條件。但萬達(dá)要突破這個(gè) “極限”。今年萬達(dá)輕資產(chǎn)租金分成超過10億元,以后可能每年以十億級(jí)別增加,可以看出輕資產(chǎn)的前景很好。萬達(dá)電影、寶貝王、文化旅游這些輕資產(chǎn)公司也要加快發(fā)展速度。2、形成新的支柱產(chǎn)業(yè)。萬達(dá)廣場是萬達(dá)集團(tuán)的核心產(chǎn)業(yè),我們還要發(fā)展新的核心企業(yè)和新的支柱產(chǎn)業(yè)。一是影視產(chǎn)業(yè)。要繼續(xù)保持高增長,補(bǔ)上內(nèi)容短板,實(shí)現(xiàn)影視的企業(yè)中長期目標(biāo)。二是體育產(chǎn)業(yè)。把精力放在自有IP賽事上,把中國區(qū)作為體育產(chǎn)業(yè)的增長極。三是文旅產(chǎn)業(yè)。要研究跨出萬達(dá)城,發(fā)展管理其它業(yè)主的大型文旅項(xiàng)目,酒管也是從管理萬達(dá)自己的酒店跨出來的。酒管盡早做到管理百家高星級(jí)酒店,今年新簽約15家高星級(jí)酒店委管合同。四是寶貝王集團(tuán)。寶貝王要把IP傳播、衍生品收入作為發(fā)展方向,去年寶貝王一下子火起來,原因就是有了一個(gè)IP,講故事吸引人。萬達(dá)城和迪士尼、環(huán)球的差距在什么地方?就是娛樂主題不是自己的故事。如果有故事,有IP,再來傳播,就完全不一樣。去年寶貝王衍生品凈利潤近億元,如果有一天寶貝王發(fā)展到幾十億、上百億衍生品收入,線下千店的場景,做人氣就可以了,實(shí)體店不盈利也可以。這就是發(fā)展模式。我相信,寶貝王有可能超過萬達(dá)電影,成為萬達(dá)集團(tuán)又一個(gè)新的核心企業(yè)。一是這個(gè)產(chǎn)業(yè)可以做大。中國兒童數(shù)量眾多,有3億,二胎政策后還會(huì)繼續(xù)擴(kuò)大。中國家長舍得為孩子花錢,特別是在教育方面。二是沒有競爭對(duì)手。中國沒有一個(gè)企業(yè)像寶貝王這樣把IP傳播和衍生品收入作為核心來考慮,光有資金玩不了,這就是高門檻。再加上我們占了先機(jī),到2020年開業(yè)800家店,誰能和我們競爭?三是企業(yè)高估值。寶貝王非傳統(tǒng)產(chǎn)業(yè),而且一開始就著手線上線下融合發(fā)展,以IP傳播、衍生品銷售、教育游樂為主要內(nèi)容,這種企業(yè)在國內(nèi)外估值都很高。四是成長性看好??戳藢氊愅醯?年測算,非常高興,希望你們把測算變成現(xiàn)實(shí)。3、繼續(xù)降低企業(yè)負(fù)債。萬達(dá)集團(tuán)將采用一切資本手段降低企業(yè)負(fù)債,包括出售非核心資產(chǎn)、保持控制權(quán)前提下的股權(quán)交易、合作管理別人的資產(chǎn)等等。萬達(dá)要逐步清償全部海外有息負(fù)債,萬達(dá)商業(yè)A股退市資金也有了可靠方案。同時(shí)計(jì)劃用兩到三年時(shí)間,將企業(yè)負(fù)債降到絕對(duì)安全的水平。今天我可以在這里負(fù)責(zé)任地說,萬達(dá)集團(tuán)在全球絕不會(huì)出現(xiàn)任何信用違約!萬達(dá)30年沒有出現(xiàn)一起信用違約,我們把信用看得比資產(chǎn)、利潤更重要。(四)線上線下融合發(fā)展實(shí)踐證明,今后很難區(qū)分線上線下企業(yè)了,四五年之前我和小馬哥還有一爭論,現(xiàn)在看我倆合二為一了,線上線下要融合。形勢比人強(qiáng),互聯(lián)網(wǎng)正走向物聯(lián)網(wǎng),這就是趨勢。1、關(guān)鍵是思想要融合。萬達(dá)所有系統(tǒng)領(lǐng)導(dǎo),關(guān)鍵是坐在第一排這些人,要認(rèn)識(shí)到融合發(fā)展是趨勢,不融合就要被淘汰。所有系統(tǒng)都要推出自己有用的應(yīng)用軟件,特別是商管、影視、寶貝王這些重點(diǎn)企業(yè)。要整合萬達(dá)商管、網(wǎng)科和信息中心的研究業(yè)務(wù),成立萬達(dá)新消費(fèi)研究院。這是一個(gè)重要舉措,研究方向不能光想著自己如何掌握消費(fèi)數(shù)據(jù),為自己服務(wù),一定要想著如何為商家增值,讓商家覺得有用。萬達(dá)有這么大規(guī)模、不同類型的消費(fèi)場景,理應(yīng)折騰點(diǎn)名堂出來。2、從實(shí)際效果出發(fā),不玩概念,不燒大錢。我曾經(jīng)犯的一個(gè)錯(cuò)誤,就是給了曲德君太多的錢,我跟一些企業(yè)家討論,他們說當(dāng)初網(wǎng)科少給點(diǎn)錢,定個(gè)投資上限就好了??磥礤X不能給得太多。不是說網(wǎng)科沒有做出成績,這一次跟別人合作談判,使我和團(tuán)隊(duì)對(duì)網(wǎng)科有了全新認(rèn)識(shí),他們開發(fā)了一些有用的東西,只是這些東西有培育期,還不能馬上被資本市場接受。原來方向也有偏差,老想大規(guī)模來做,如果就為萬達(dá)廣場、旅游度假區(qū)研發(fā),可能早就整出名堂了。3、自主研發(fā)。網(wǎng)上傳網(wǎng)科裁員6000人,網(wǎng)科總共就3000人,怎么可能裁掉6000人!曲德君你為什么也不出來辟辟謠?要強(qiáng)調(diào)自主研發(fā)。不論網(wǎng)科今年與誰合作,不管是以資本還是戰(zhàn)略方式合作,我們自己應(yīng)用軟件的研發(fā)都不能停止。為什么萬達(dá)要成立自己的研究院?我不相信別人會(huì)出大錢來做對(duì)我們有用的東西,就算能做出來,什么時(shí)候也不知道。所以我們寧可每年少花點(diǎn)錢,找?guī)讉€(gè)人,把有前景的研發(fā)項(xiàng)目繼續(xù)下去,研究線上線下融合應(yīng)用軟件,要繼續(xù)自己搞,這一點(diǎn)是非常明確的。4、開放式發(fā)展。要對(duì)所有科創(chuàng)企業(yè)、院校、研究機(jī)構(gòu)、個(gè)人開放萬達(dá)場景平臺(tái),要繼續(xù)啟動(dòng)第二屆創(chuàng)新加速器,希望一屆一屆地搞下去。很多人很短視,一年沒出成就,兩年沒出成就,就不弄了。如果當(dāng)初買了兩位馬哥的股票持有,到現(xiàn)在漲了多少錢了?科創(chuàng)類產(chǎn)品從研發(fā)到商業(yè)化有一個(gè)過程,要堅(jiān)持搞下去。(五)組織架構(gòu)適應(yīng)轉(zhuǎn)型為了適應(yīng)轉(zhuǎn)型,也為了資本市場需要,萬達(dá)擬對(duì)公司管理架構(gòu)進(jìn)行調(diào)整,主要是商業(yè)地產(chǎn)進(jìn)行架構(gòu)調(diào)整,當(dāng)然還需要提請(qǐng)董事會(huì)、股東會(huì)批準(zhǔn)以后,才能正式行動(dòng)。今天說的是我的一個(gè)建議。1、成立商管集團(tuán)。就是將原來商業(yè)地產(chǎn)更名,成為一個(gè)純粹的商業(yè)物業(yè)持有和運(yùn)營管理商,使公司戰(zhàn)略更清晰,商業(yè)模式更純粹,也為了使市場估值更高。如果有房地產(chǎn)開發(fā),還是歸在房地產(chǎn)企業(yè)里,但萬達(dá)商業(yè)租金利潤已經(jīng)大過開發(fā)利潤。將來商管就是收租金,利潤每年兩位數(shù)增長,在此基礎(chǔ)上,再通過線上線下融合做一些東西出來,這樣公司市場估值會(huì)更高。新的商管公司將是以輕資產(chǎn)為主、重資產(chǎn)持有為輔的企業(yè),我們做了公司模擬報(bào)表,負(fù)債率也非常低,可說是一個(gè)非常優(yōu)秀的公司。新的商管集團(tuán)將是萬達(dá)集團(tuán)核心企業(yè)。2、成立地產(chǎn)集團(tuán)。第一要負(fù)責(zé)消化商管集團(tuán)的地產(chǎn)業(yè)務(wù),原來商業(yè)地產(chǎn)還有一些房地產(chǎn)開發(fā)業(yè)務(wù),地產(chǎn)集團(tuán)要盡快幫助消化,但利潤歸商管。第二要開發(fā)萬達(dá)廣場重資產(chǎn),也不排除純粹搞一些住宅開發(fā)。這么多年萬達(dá)地產(chǎn)規(guī)劃、設(shè)計(jì)、開發(fā)、銷售一條龍,都是自有團(tuán)隊(duì),在市場上口碑頗好。第三也可以輸出品牌管理。地產(chǎn)集團(tuán)不求做大,主要看利潤。集團(tuán)給了新成立的地產(chǎn)集團(tuán)一個(gè)債務(wù)上限,這個(gè)上限是很低的,地產(chǎn)集團(tuán)就是在負(fù)債上限下考慮業(yè)務(wù)發(fā)展,不要求做多大規(guī)?!,F(xiàn)在中國房地產(chǎn),基本上負(fù)債和銷售額是對(duì)等的,銷售越多,負(fù)債越多。如果地產(chǎn)集團(tuán)朝這個(gè)路子走,就使集團(tuán)現(xiàn)在的降負(fù)債沒多大意義了。地產(chǎn)集團(tuán)的主要任務(wù)就是建萬達(dá)廣場,另外捎帶搞點(diǎn)業(yè)務(wù)就行。3、成立新網(wǎng)科公司。戰(zhàn)略合作者確定之后,再來確定業(yè)務(wù)目標(biāo)。點(diǎn)這一句話,是說給網(wǎng)科同志們聽的。(六)承擔(dān)企業(yè)社會(huì)責(zé)任1、精準(zhǔn)扶貧。繼續(xù)對(duì)丹寨扶貧投入,旅游小鎮(zhèn)開業(yè)一周年時(shí)大型實(shí)景演出要確保上演。2018年丹寨旅游小鎮(zhèn)要確保400萬,力爭500萬游客數(shù)量。按照國家旅游局的標(biāo)準(zhǔn),200萬就算旅游大縣,我們今年做到500萬,縣級(jí)旅游可能就名列前茅了?,F(xiàn)在丹寨旅游小鎮(zhèn)最大問題是過夜游客太少,許多游客去了以后最多吃頓飯,甚至有的人自己帶東西吃,把礦泉水一喝,瓶子一丟走了。當(dāng)然問題是一個(gè)個(gè)出來的,剛開始我們擔(dān)心游客不夠,說最多一年100萬,這100萬是養(yǎng)活小鎮(zhèn)最基本的游客量?,F(xiàn)在半年300萬游客,就要研究怎樣讓游客過夜,這樣收入才能增加,對(duì)丹寨的旅游拉動(dòng)才能更大。年會(huì)后要馬上下去好好研究增加過夜游客的措施,只要路子對(duì)頭,我們可以再投入。2、就業(yè)。今年新增18萬人,其中大學(xué)生8萬人。3、捐贈(zèng)。今年安排4億元。4、環(huán)保。今年獲國家綠建標(biāo)識(shí)100項(xiàng)。今年是萬達(dá)成立30周年,古人云“三十而立”。國際上有一個(gè)公認(rèn)標(biāo)準(zhǔn),10年以下是短壽企業(yè),10年到30年是中壽企業(yè),30年以上是長壽企業(yè),萬達(dá)正站在長壽企業(yè)的新起點(diǎn)上,所以今年對(duì)萬達(dá)而言是極其重要的一年。萬達(dá)要做百年企業(yè),又迎來了新的起點(diǎn),今年我們會(huì)在節(jié)儉前提下展開一系列有意義的慶?;顒?dòng),我也希望萬達(dá)全體同仁,特別是各個(gè)系統(tǒng)領(lǐng)導(dǎo),今年都能夠完成目標(biāo),實(shí)現(xiàn)滿堂紅。我希望在30年慶祝的時(shí)候,沒有哪個(gè)系統(tǒng)沒有完成目標(biāo),讓我們以實(shí)際行動(dòng)來慶祝萬達(dá)的30周年。讓我們?cè)邳h的十九大指引下,高舉習(xí)近平新時(shí)代中國特色社會(huì)主義思想的偉大旗幟,在新的一年里努力奮斗!最后,我要在這里向給予萬達(dá)支持的中國各級(jí)政府、合作企業(yè)、消費(fèi)者和萬達(dá)全體員工說一聲感謝!正是你們的支持,萬達(dá)才可能取得今天的成就。同時(shí)感謝哈爾濱萬達(dá)城全體員工、萬達(dá)文華酒店、萬達(dá)嘉華酒店、皇冠假日酒店全體員工為年會(huì)所做出的辛苦工作。春節(jié)即將來臨,我給在座各位,同時(shí)也通過你們給萬達(dá)企業(yè)員工提前拜一個(gè)年,祝大家新的一年里面工作順利!身體健康!萬事如意!謝謝大家!
01-22
2018
短視頻風(fēng)口下,360發(fā)布一分鐘快視頻APP
11月14日消息,360旗下快視頻APP在北京798尤倫斯藝術(shù)中心舉行的“超短超有料 質(zhì)在一分鐘”發(fā)布會(huì)。360創(chuàng)始人兼CEO周鴻祎的演講環(huán)節(jié),從原定1小時(shí),壓縮到了一分鐘。除了發(fā)布快視頻應(yīng)用之外,360還發(fā)布了“100億快基金”計(jì)劃,獎(jiǎng)勵(lì)視頻作者。“快視頻將自身定位為‘一分鐘超短視頻APP’,開創(chuàng)一個(gè)新的品類。”360集團(tuán)助理總裁謝軍樣表示,“我們通過超短時(shí)長、內(nèi)容有料、智能技術(shù)、閉環(huán)生態(tài)四個(gè)方面,打造一款超短超有料的視頻APP?!笨煲曨l提出了“一分鐘超短視頻”的戰(zhàn)略定位,第一條就是超短時(shí)長?!?0秒、15秒的視頻,代表為快手、奶糖等,以生活、自拍等為主。3-10分鐘區(qū)間,可以稱為短視頻,例如西瓜視頻。而20分鐘以上的則為完整版的影視劇、綜藝等,稱為長視頻,如愛奇藝等。而1-3分鐘的區(qū)間,我們將其定義為超短視頻?!敝x軍樣表示。而且,超短視頻內(nèi)容還要有品質(zhì)和有料;需要具備可傳播和擴(kuò)散的價(jià)值,能讓普通大眾欣賞;同時(shí)還有復(fù)用價(jià)值,流傳很久之后,還能重復(fù)欣賞。謝軍樣還首次公布了快視頻獨(dú)創(chuàng)的新一代智能探索引擎(QVD引擎),在興趣推薦的同時(shí),強(qiáng)化了情緒感知和自由探索,克服了推薦引擎“信息繭房”的弊端。除了智能探索等技術(shù)架構(gòu),在扶持原創(chuàng)作者生態(tài)方面,快視頻也發(fā)布了“100億快基金”計(jì)劃,獎(jiǎng)勵(lì)視頻作者。此外,360瀏覽器總經(jīng)理梁志輝還展示了視頻剪輯器----快剪輯。這款產(chǎn)品上線半年,每日活躍用戶數(shù)十萬,累計(jì)生成視頻數(shù)量近千萬。據(jù)了解,快剪輯不僅包括PC端,還首次推出了安卓和iOS等版本。
01-22
2018
網(wǎng)站長尾關(guān)鍵詞部局方法
  長尾關(guān)鍵詞布局非常重要---因?yàn)樯婕暗骄W(wǎng)站后期優(yōu)化效果。布局長尾詞的第一點(diǎn)是挖掘和篩選長尾詞,然后根據(jù)長尾詞的競爭度以及相關(guān)性布局在網(wǎng)站的欄目頁和內(nèi)頁。內(nèi)頁的長尾詞圍繞欄目頁的競爭度大一點(diǎn)的短詞來布局,不同欄目的長尾詞不能互相交叉以及重疊。   挖掘長尾關(guān)鍵詞:挖掘長尾關(guān)鍵詞的方法是利用百度相關(guān)搜索、百度下拉框以及百度知道、搜搜問問這些工具尋找用戶經(jīng)常搜索的長尾關(guān)鍵詞。也可以利用其它的一些工具,比如百度推廣助手,挖掘的長尾詞會(huì)更加精確;觀其站長工具、站長工具等。   挖掘好的關(guān)鍵詞放在電子表格里面,去除重復(fù)的以及明顯刷的長尾詞和不相關(guān)長尾詞。比如攻絲機(jī)一類的詞出現(xiàn)鋼管舞相關(guān)的長尾詞,那么公司級(jí)別相關(guān)的長尾詞必須去除,這樣的詞和關(guān)鍵詞本身毫無相關(guān)。   欄目頁和內(nèi)頁布局:在篩選關(guān)鍵詞時(shí)有短詞和長詞的區(qū)分、如果是短詞并且指數(shù)和競爭度比較大就作為欄目頁的關(guān)鍵詞,而長詞和指數(shù)小競爭度小的關(guān)鍵詞作為內(nèi)頁長尾詞排名。比如攻絲機(jī)廠家是一個(gè)長尾詞,但指數(shù)和競爭度相對(duì)比較大,所以作為欄目頁的長尾詞布局,而臥室攻絲機(jī)廠家指數(shù)和競爭度都比較小,所以作為內(nèi)頁長尾詞布局。   攻絲機(jī)長尾關(guān)鍵詞案例   攻絲機(jī)企業(yè)長尾關(guān)鍵詞布局案例,可供參考   問:SEO如何布局長尾關(guān)鍵詞?   請(qǐng)問如何給網(wǎng)站做長尾關(guān)鍵詞布局?關(guān)鍵詞可以挖掘出很多,但不知道怎么把這些關(guān)鍵詞使用上。   1、什么是長尾關(guān)鍵詞?   2006年的時(shí)候,營銷管理業(yè)界有一個(gè)新的理論,叫長尾理論。長尾理論不同于二八定律。長尾理論一出現(xiàn),就首先得到了SEO業(yè)內(nèi)的高度認(rèn)同。直接借用了長尾這個(gè)名詞來定義領(lǐng)域里面比較泛化而大量的關(guān)鍵詞,統(tǒng)稱為長尾關(guān)鍵詞。   2、長尾理論是互聯(lián)網(wǎng)時(shí)代的獨(dú)有現(xiàn)象   馬云之前有個(gè)理論,說我的產(chǎn)品規(guī)模要翻幾倍,增加一些服務(wù)器就好了。沃爾瑪要再建多少多少店面。因?yàn)閮?nèi)容和產(chǎn)品的數(shù)字化后,信息存儲(chǔ)方便。搜索引擎的出現(xiàn),讓長尾理論得以體現(xiàn)出來。所以,對(duì)網(wǎng)站來說也是內(nèi)容越多越好。內(nèi)容多,就意味著總會(huì)有一些內(nèi)容適合這類需求的用戶。   3、長尾關(guān)鍵詞等于做內(nèi)容   沒有內(nèi)容頁面來承載關(guān)鍵詞,那關(guān)鍵詞就無法部署,這是要解決關(guān)鍵詞落地的問題。關(guān)鍵詞是無法脫離內(nèi)容來談的。所以,做長尾關(guān)鍵詞,本質(zhì)上就是等于要做內(nèi)容。如果網(wǎng)站沒有幾個(gè)做內(nèi)容的策略方法,是很難把長尾關(guān)鍵詞策略部署到站內(nèi)去的。   4、布局長尾關(guān)鍵詞常見方法   做聚合,是做長尾關(guān)鍵詞策略的常用方法。但聚合的頁面質(zhì)量不好的話,也會(huì)影響長尾策略效果的發(fā)揮。長尾關(guān)鍵詞因?yàn)殛P(guān)鍵詞量大的原因,所以只能考慮那種能夠產(chǎn)生大量內(nèi)容的方法來布局長尾關(guān)鍵詞。   5、長尾關(guān)鍵詞的布局是SEO工作的核心   把長尾關(guān)鍵詞布局得當(dāng),可以說是SEO工作的最重要的核心一點(diǎn)之一了。這個(gè)問題要解決并不簡單。因?yàn)榻鉀Q的好,就等于網(wǎng)站能夠長期生產(chǎn)出高質(zhì)量的內(nèi)容。所以,這個(gè)問題如何解決的更好,是值得SEO人員好好思考的問題。   ?   我的觀點(diǎn):不做長尾策略,網(wǎng)站的SEO效果終歸有限。所以,如何部署長尾關(guān)鍵詞策略,就是每個(gè)網(wǎng)站要發(fā)展起來過程中必須要解決的問題:   篩選長尾詞的作用是找出有價(jià)值的長尾關(guān)鍵詞并且避免重復(fù),而做指數(shù)和競爭度分析是為了避免重復(fù)內(nèi)容出現(xiàn)。   1、禁止出現(xiàn)完全不相干和刷出來的長尾關(guān)鍵詞,有的SEO為了作弊會(huì)用工具刷長尾關(guān)鍵詞   2、很多站長舍不得意思相近的長尾詞,便把兩個(gè)差不多的長尾詞布局在站內(nèi),但是內(nèi)容還差不多,大量這樣的內(nèi)容會(huì)導(dǎo)致網(wǎng)站降權(quán)。因?yàn)樗阉饕娌粫?huì)把一個(gè)內(nèi)容重復(fù)的網(wǎng)站排名放在首頁的。   3、在做欄目分類時(shí),欄目下面內(nèi)頁的長尾詞一定是欄目關(guān)鍵詞的擴(kuò)展詞或者是相關(guān)長尾詞,站內(nèi)的長尾詞不能交叉顯示在網(wǎng)站的其他欄目。