<dfn id="hx5t3"><strike id="hx5t3"><em id="hx5t3"></em></strike></dfn>

    <thead id="hx5t3"></thead><nobr id="hx5t3"><font id="hx5t3"><rp id="hx5t3"></rp></font></nobr>

    <listing id="hx5t3"></listing>

    <var id="hx5t3"></var>
    <big id="hx5t3"></big>

      
      

      <output id="hx5t3"><ruby id="hx5t3"></ruby></output>
      <menuitem id="hx5t3"><dfn id="hx5t3"></dfn></menuitem>

      <big id="hx5t3"></big>

        有明

        有明 查看完整檔案

        杭州編輯河海大學  |  計算機科學與技術 編輯  |  填寫所在公司/組織 youmingdot.com 編輯
        編輯

        支持一下杭州本土網站。

        Laravel - 藝術家成長之路系列講座

        SF | 有明的技術交流群,歡迎大家加入交流分布式、服務化、設計模式、算法、Laravel、Docker、Swoole。QQ 群:666093315,進群還有講座優惠福利

        個人動態

        有明 贊了文章 · 2020-09-04

        阿里云體驗實驗室 教你如何《快速搭建Docker環境》

        體驗平臺簡介

        面向開發者和中小企業打造的一站式、全云端的開發平臺,打開瀏覽器就可以開發、調試、上線,所測即所得,并結合無服務器的模式,重新定義云原生時代的研發工作方法論。旨在降低開發者上手成本和中小企業的啟動成本、運營成本、以及突發流量帶來的運維風險。

        教程介紹

        本教程介紹如何快速搭建Docker環境,并使用Docker部署一個Nginx服務。

        場景體驗

        場景內容選自 阿里云體驗實驗室
        阿里云體驗實驗室 提供一臺配置了CentOS 7.7的ECS實例(云服務器)。通過本教程的操作,您可以基于ECS實例搭建Hadoop偽分布式環境。

        阿里云 場景免費資源
        https://developer.aliyun.com/adc/scenario/9fd79b8711984e309f20d82bc65a26fa

        背景知識

        容器技術
        容器是一個允許我們在資源隔離的過程中,運行應用程序和其依賴項的 、輕量的 、操作系統級別的虛擬化技術, 運行應用程序所需的所有必要組件都打包為單個鏡像,這個鏡像是可以重復使用的。當鏡像運行時,它是運行在獨立的環境中,并不會和其他的應用共享主機操作系統的內存、CPU或磁盤。這保證了容器內的進程不會影響到容器外的任何進程。

        Docker
        Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的Linux機器或Windows機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。

        Docker底層用的Linux的cgroup和namespace這兩項技術來實現應用隔離,一個完整的Docker有以下幾個部分組成:

        Docker Client客戶端
        Docker Daemon守護進程
        Docker Image鏡像
        Docker Container容器

        步驟一:安裝Docker CE

        Docker有兩個分支版本:Docker CE和Docker EE,即社區版和企業版。

        本教程基于CentOS 7安裝Docker CE。
        1.安裝Docker的依賴庫。

        yum install -y yum-utils device-mapper-persistent-data lvm2
        

        2.添加Docker CE的軟件源信息。

        yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        

        3.安裝Docker CE。

        yum makecache fast
        yum -y install docker-ce

        4.啟動Docker服務。

        systemctl start docker
        

        步驟二:配置阿里云鏡像倉庫(鏡像加速)

        Docker的默認官方遠程倉庫是hub.docker.com,由于網絡原因,下載一個Docker官方鏡像可能會需要很長的時間,甚至下載失敗。為此,阿里云容器鏡像服務ACR提供了官方的鏡像站點,從而加速官方鏡像的下載。下面介紹如何使用阿里云鏡像倉庫。
        1.使用體驗平臺提供的阿里云子賬號登錄容器鏡像服務控制臺。
        在這里插入圖片描述
        2.單擊鏡像中心 > 鏡像加速器,可以看到阿里云為您提供了一個專屬的鏡像加速地址。
        在這里插入圖片描述
        3.配置Docker的自定義鏡像倉庫地址。請將下面命令中的鏡像倉庫地址https://kqh8**.mirror.aliyuncs.com替換為阿里云為您提供的專屬鏡像加速地址。

        tee /etc/docker/daemon.json <<-'EOF'
        {
          "registry-mirrors": ["https://kqh8****.mirror.aliyuncs.com"]
        }
        EOF

        4.重新加載服務配置文件。

        systemctl daemon-reload
        

        5.重啟Docker服務。

        systemctl restart docker
        

        步驟三:使用Docker安裝Nginx服務

        1.查看Docker鏡像倉庫中Nginx的可用版本。

        docker search nginx
        

        命令輸出如下所示:
        在這里插入圖片描述
        2.拉取最新版的Nginx鏡像。

        docker pull nginx:latest
        

        命令輸出如下所示:
        在這里插入圖片描述
        3.查看本地鏡像。

        docker images
        

        命令輸出如下所示:
        在這里插入圖片描述

        4.運行容器。

        docker run --name nginx-test -p 8080:80 -d nginx
        

        命令參數說明:

        --name nginx-test:容器名稱。
        -p 8080:80: 端口進行映射,將本地8080端口映射到容器內部的80端口。
        -d nginx: 設置容器在后臺一直運行。
        

        命令輸出如下所示:
        在這里插入圖片描述
        5.在瀏覽器地址欄輸入http://&lt;ECS公網IP地址>:8080訪問Nginx服務。
        在這里插入圖片描述

        以上就是【快速搭建Docker環境】 的所有教程了

        更多體驗場景請至開發者實驗室:https://developer.aliyun.com/adc/labs/

        查看原文

        贊 2 收藏 2 評論 0

        有明 關注了用戶 · 2020-09-04

        阿里云體驗實驗室 @bainana

        阿里云開發者實驗室提供免費云資源和豐富的場景化實踐,旨在幫助開發者在學習應用技術,了解阿里云產品的特性。

        關注 3

        有明 回答了問題 · 2020-07-20

        解決try catch 什么時候用

        阿里巴巴 Java 開發手冊里有段話:(僅供參考)

        【強制】異常不要用來做流程控制,條件控制。
        說明:異常設計的初衷是解決程序運行中的各種意外情況,且異常的處理效率比條件判斷方式要低很多。

        用異常做流程控制,是件很爽的事情,因為它看清來更清晰、簡單。但是它也有壞處,異常的創建意味著棧信息的收集等一系列有關的操作,這對于正常的業務來說除了拖累性能沒有其他作用。

        那到底該不該用異常處理業務邏輯呢?個人覺得,這是可取的。正如剛才說的,異常的優勢就是清晰、簡單,讓我們的程序更好看,更容易明白。至于性能之類的,我想應該交給框架、語言去優化。

        另外,自己不處理的異常,丟出去很優雅,也很符合原則。為什么你會覺得不好呢……

        關注 6 回答 4

        有明 回答了問題 · 2018-12-31

        解決消息隊列和消息中間件的區別是什么?

        如果真的進行細分,可以認為消息隊列是消息中間件的一部分,消息中間件是消息隊列的超集。

        嚴格來說,消息隊列指的就是能夠提供消息排隊消費功能的軟件程序。

        而消息中間件,可以理解為在消息隊列的基礎增加了一些延遲發送、分布式事務等功能的軟件程序。

        關注 4 回答 3

        有明 評論了文章 · 2018-12-06

        mysql自增id超大問題查詢

        引言

        小A正在balabala寫代碼呢,DBA小B突然發來了一條消息,“快看看你的用戶特定信息表T,里面的主鍵,也就是自增id,都到16億了,這才多久,在這樣下去過不了多久主鍵就要超出范圍了,插入就會失敗,balabala......”

        我記得沒有這么多,最多1k多萬,count了下,果然是1100萬。原來運維是通過auto_increment那個值看的,就是說,表中有大量的刪除插入操作,但是我大部分情況都是更新的,怎么會這樣?
        圖片描述

        問題排查

        這張表是一個簡單的接口服務在使用,每天大數據會統計一大批信息,然后推送給小A,小A將信息更新到數據庫中,如果是新數據就插入,舊數據就更新之前的數據,對外接口就只有查詢了。

        很快,小A就排查了一遍自己的代碼,沒有刪除的地方,也沒有主動插入、更新id的地方,怎么會這樣呢?難道是小B的原因,也不太可能,DBA那邊兒管理很多表,有問題的話早爆出來了,但問題在我這里哪里也沒頭緒。

        小A又仔細觀察了這1000多萬已有的數據,將插入時間、id作為主要觀察字段,很快,發現了個問題,每天第一條插入的數據總是比前一天多1000多萬,有時候遞增的多,有時候遞增的少,小A又將矛頭指向了DBA小B,將問題又給小B描述了一遍。

        小B問了小A,“你是是不是用了REPLACE INTO ...語句”,這是怎么回事呢,原來REPLACE INTO ...會對主鍵有影響。

        REPLACE INTO ...對主鍵的影響

        假設有一張表t1:

        CREATE TABLE `t1` (
          `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID,自增',
          `uid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '用戶uid',
          `name` varchar(20) NOT NULL DEFAULT '' COMMENT '用戶昵稱',
          PRIMARY KEY (`id`),
          UNIQUE KEY `u_idx_uid` (`uid`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='測試replace into';

        如果新建這張表,執行下面的語句,最后的數據記錄如何呢?

        insert into t1 values(NULL, 100, "test1"),(NULL, 101, "test2");
        replace into t1 values(NULL, 100, "test3");

        圖片描述

        原來,REPLACE INTO ...每次插入的時候如果唯一索引對應的數據已經存在,會刪除原數據,然后重新插入新的數據,這也就導致id會增大,但實際預期可能是更新那條數據。

        小A說:“我知道replace是這樣,所有既沒有用它”,但還是又排查了一遍,確實不是自己的問題,沒有使用REPLACE INTO ...,

        小A又雙叒叕仔細的排查了一遍,還是沒發現問題,就讓小B查下binlog日志,看看是不是有什么奇怪的地方,查了之后還是沒發現問題,確實存在跳躍的情況,但并沒有實質性的問題。

        下圖中@1的值對應的是自增主鍵id,用(@2, @3)作為唯一索引

        圖片描述

        后來過了很久,小B給小A指了個方向,小A開始懷疑自己的插入更新語句INSERT ... ON DUPLICATE KEY UPDATE ...了,查了許久,果然是這里除了問題。

        INSERT ... ON DUPLICATE KEY UPDATE ...對主鍵的影響

        這個語句跟REPLACE INTO ...類似,不過他并不會變更該條記錄的主鍵,還是上面t1這張表,我們執行下面的語句,執行完結果是什么呢?

        insert into t1 values(NULL, 100, "test4") on duplicate key update name = values(name);

        圖片描述

        沒錯,跟小A預想的一樣,主鍵并沒有增加,而且name字段已經更新為想要的了,但是執行結果有條提示,引起了小A的注意

        No errors; 2 rows affected, taking 10.7ms

        明明更新了一條數據,為什么這里的影響記錄條數是2呢?小A,又看了下目前表中的auto_increment

        CREATE TABLE `t1` (
          `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID,自增',
          `uid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '用戶uid',
          `name` varchar(20) NOT NULL DEFAULT '' COMMENT '用戶昵稱',
          PRIMARY KEY (`id`),
          UNIQUE KEY `u_idx_uid` (`uid`)
        ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='測試replace into';

        竟然是5`,這里本應該是4的。

        也就是說,上面的語句,會跟REPLACE INTO ...類似的會將自增ID加1,但實際記錄沒有加,這是為什么呢?

        查了資料之后,小A得知,原來,mysql主鍵自增有個參數innodb_autoinc_lock_mode,他有三種可能只0,1,2,mysql5.1之后加入的,默認值是1,之前的版本可以看做都是0。

        可以使用下面的語句看當前是哪種模式

        select @@innodb_autoinc_lock_mode;

        小A使用的數據庫默認值也是1,當做簡單插入(可以確定插入行數)的時候,直接將auto_increment加1,而不會去鎖表,這也就提高了性能。當插入的語句類似insert into select ...這種復雜語句的時候,提前不知道插入的行數,這個時候就要要鎖表(一個名為AUTO_INC的特殊表鎖)了,這樣auto_increment才是準確的,等待語句結束的時候才釋放鎖。還有一種稱為Mixed-mode inserts的插入,比如INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d'),其中一部分明確指定了自增主鍵值,一部分未指定,還有我們這里討論的INSERT ... ON DUPLICATE KEY UPDATE ...也屬于這種,這個時候會分析語句,然后按盡可能多的情況去分配auto_incrementid,這個要怎么理解呢,我看下面這個例子:

        truncate table t1;
        insert into t1 values(NULL, 100, "test1"),(NULL, 101, "test2"),(NULL, 102, "test2"),(NULL, 103, "test2"),(NULL, 104, "test2"),(NULL, 105, "test2");
        
        -- 此時數據表下一個自增id是7
        
        delete from t1 where id in (2,3,4);
        
        -- 此時數據表只剩1,5,6了,自增id還是7
        
        insert into t1 values(2, 106, "test1"),(NULL, 107, "test2"),(3, 108, "test2");
        
        -- 這里的自增id是多少呢?

        上面的例子執行完之后表的下一個自增id是10,你理解對了嗎,因為最后一條執行的是一個Mixed-mode inserts語句,innoDB會分析語句,然后分配三個id,此時下一個id就是10了,但分配的三個id并不一定都使用。此處@總是遲到 多謝指出,看官方文檔理解錯了

        模式0的話就是不管什么情況都是加上表鎖,等語句執行完成的時候在釋放,如果真的添加了記錄,將auto_increment加1。

        至于模式2,什么情況都不加AUTO_INC鎖,存在安全問題,當binlog格式設置為Statement模式的時候,從庫同步的時候,執行結果可能跟主庫不一致,問題很大。因為可能有一個復雜插入,還在執行呢,另外一個插入就來了,恢復的時候是一條條來執行的,就不能重現這種并發問題,導致記錄id可能對不上。

        至此,id跳躍的問題算是分析完了,由于innodb_autoinc_lock_mode值是1,INSERT ... ON DUPLICATE KEY UPDATE ...是簡單的語句,預先就可以計算出影響的行數,所以不管是否更新,這里都將auto_increment加1(多行的話大于1)。

        如果將innodb_autoinc_lock_mode值改為0,再次執行INSERT ... ON DUPLICATE KEY UPDATE ...的話,你會發現auto_increment并沒有增加,因為這種模式直接加了AUTO_INC鎖,執行完語句的時候釋放,發現沒有增加行數的話,不會增加自增id的。

        INSERT ... ON DUPLICATE KEY UPDATE ...影響的行數是1為什么返回2?

        為什么會這樣呢,按理說影響行數就是1啊,看看官方文檔的說明

        With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if the row is inserted as a new row, 2 if an existing row is updated, and 0 if an existing row is set to its current values

        官方明確說明了,插入影響1行,更新影響2行,0的話就是存在且更新前后值一樣。是不是很不好理解?

        其實,你要這樣想就好了,這是為了區分到底是插入了還是更新了,返回1表示插入成功,2表示更新成功。

        解決方案

        innodb_autoinc_lock_mode設置為0肯定可以解決問題,但這樣的話,插入的并發性可能會受很大影響,因此小A自己想著DBA也不會同意。經過考慮,目前準備了兩種較為可能的解決方案:

        修改業務邏輯

        修改業務邏輯,將INSERT ... ON DUPLICATE KEY UPDATE ...語句拆開,先去查詢,然后去更新,這樣就可以保證主鍵不會不受控制的增大,但增加了復雜性,原來的一次請求可能變為兩次,先查詢有沒有,然后去更新。

        刪除表的自增主鍵

        刪除自增主鍵,讓唯一索引來做主鍵,這樣子基本不用做什么變動,只要確定目前的自增主鍵沒有實際的用處即可,這樣的話,插入刪除的時候可能會影響效率,但對于查詢多的情況來說,小A比較兩種之后更愿意選擇后者。

        結語

        其實INSERT ... ON DUPLICATE KEY UPDATE ...這個影響行數是2的,小A很早就發現了,只是沒有保持好奇心,不以為然罷了,沒有深究其中的問題,這深究就起來會帶出來一大串新知識,挺好,看來小A還是要對外界保持好奇心,保持敏感,這樣才會有進步。

        查看原文

        有明 回答了問題 · 2018-12-02

        解決PHP閉包函數的問題

        因為你上面的代碼用了兩個 = function () {},定義了兩個嵌套的閉包。倆閉包對兩個括號,這不是很合理么。

        關注 5 回答 5

        有明 評論了文章 · 2018-12-02

        對 SegmentFault 社區提問標準的一些解釋

        有心的用戶應該發現最近 SegmentFault 問答的審核趨向嚴格,甚至一些已經正常展示的問題都會因質量問題提示作者修改。隨著社區用戶的增長,新進入用戶的習慣正逐漸沖擊著之前社區形成的默契,我們的問答質量出現了一定程度的下降。這對整個社區的運營提出了挑戰,我們不希望發生劣幣驅逐良幣的狀況,因此有必要在這個問題上達成新的共識。

        應該說 SegmentFault 的提問一直都是有具體的標準的(http://www.tvxinternet.com/faq#...),但是在具體理解的時候每個人都會產生偏差,為了盡量縮小這個偏差,我們約定如下幾個提問的原則:

        1. 回答者優先
        2. 考慮后來者

        回答者優先

        當你理解了回答者優先的原則,就會自然而然地理解我們的運營規范,甚至你都不需要時刻記住這些規范,因為它們只是保證這一原則的最低要求。

        什么是回答者優先?簡而言之,就是你在提問的時候要優先考慮回答者能否清晰準確地知曉你要表達的意思,我們在審核的時候也是以這一條標準做為最優先的準則。提問者怎么判斷呢?很簡單,把自己置于回答者的位子上去審視一下你的問題,看看做為回答者的你是否可以通過這些表述知曉題意。

        以這條原則為出發點,我們會對存在以下情況的問題說不:

        1. 問題表述過于簡略,往往就一句話甚至一個標題的。(舉例:標題是“如何實現一個淘寶一樣的網站?”,內容是:“如題”)
        2. 問題中完全沒有自己的觀點,也就是傳說中的伸手黨。伸手黨的存在主要有兩大害處,第一,你沒有說出已經嘗試過哪些方法,沒有盡量為回答者排除錯誤情況,會大大降低回答者的答題效率。第二,你的付出過少,無法達到回答者的心里預期,會大大影響回答者的答題積極性。用通俗的話說就是,你自己都不重視自己的事情,其他人又憑什么去幫你呢?
        3. 問題的排版過于混亂。從語法上講,我們并不認為 Markdown 語法比你手上要寫的任何編程語言語法更加復雜。而混亂的排版至少表明你并不重視這個問題,也不重視回答者的感受。很多人沒有把代碼用 Markdown 包裹起來,我們也視為排版混亂。
        4. 沒有代碼或者用圖片代替了代碼。這是一個最近比較突出的問題,代碼勝千言,準確簡短的描述配上必要的代碼,比你說一大堆廢話要好得多,我們已經看到了無數可愛的回答者在問題下方的評論中呼喚代碼。與不貼代碼相比,用代碼截圖來代替代碼走入了另一個誤區,讓我們還是站在回答者的角度,當你面對上百行沒頭沒尾的代碼時,怎么去調試它們呢?你想讓回答者浪費自己寶貴的時間,照著你們的圖片一個字一個字的敲進去么?所以,當你要這么做的時候,想一想本章的標題“回答者優先”。在這里,還有一個比較特殊的情況,就是錯誤信息算不算代碼,可不可以用截圖代替?在這里,給出明確的答復:算。大部分的錯誤信息,包括瀏覽器的出錯,c, java等預編譯語言的運行時錯誤,都是一個簡單的文本,你可以直接用鼠標選中復制,用 Markdown 的代碼塊語法包裹后附加到問題里。這樣可以大大方便回答者定位錯誤。

        考慮后來者

        考慮后來者可以說是我們創建這個社區的一大目的,我們之所以讓大家的問題可以公開討論,就是為了降低在開發領域的信息不對稱,讓后來者少走彎路。為了做到這一點,我們提倡大家:

        1. 標題應該直接地表達問題的中心思想,如果你是因為運行時拋出某些錯誤而提問,你可以直接寫“為什么JAVA運行時拋出xxxx異常?”。而不要寫什么“一個關于JAVA的問題?”,請問做為一個后來者,我能從你的標題里獲得什么重要的信息呢?如果這則問題被搜索引擎索引了,后來者遇到同類問題是怎么搜索的呢?大家想想你們搜問題,是不是喜歡把錯誤信息直接丟到搜索框里,那么怎樣才算一個有用的問題就不言而喻了。
        2. 不要用圖片代替代碼,不要用圖片代替代碼,不要用圖片代替代碼!圖片里的內容不能被任何搜索引擎檢索到,你的問題會變成信息海洋里的垃圾沉沒水底,這不是我們做為社區所提倡的。
        3. 用好標簽。標簽的作用在于更好地組織內容,這也是為了方便后來者。所以首先不要濫用,你的標簽一定要跟問題相關。其次,標簽不是用來描述問題的,不要自己創造一些描述性的語言做為標簽。通常選擇標簽就選擇這個問題所涉及到的技術就可以了,而且盡量至少使用一個大的語言標簽,比如“php, java, c, javascript” 等等。

        一些措施

        俗話說“用霹靂手段,顯菩薩心腸”,我們的菩薩心腸在上面已經告訴大家了。為了保證這些目的能夠達到,我們將采取一系列措施。除了在審核時我們會嚴格按照標準來執行之外,我們還鼓勵大家共同維護社區的秩序。大家可以通過評論來提醒一些違規的內容,或者使用舉報和建議關閉功能。

        我們針對把代碼截圖到圖片里的行為,專門開發了自動掃描機器人,它會最大程度地去監控這一行為,一旦發現這一情況會提醒你修改問題。如果在一小時內沒有修改的話,這個問題會被提交人工審核后處理。注意:機器人可能存在誤判行為,如果你確定你的內容沒有存在這種情況,請放心交給我們人工審核即可,我們會及時處理。

        寫在最后

        當我們在6年前創立 SegmentFault 的時候,愿景是做一個高質量的中文技術問答社區。當然現在 SegmentFault 上承載的不止有問答的內容,但它依然是整個社區重要的組成部分。經常有人向我們抱怨國內技術社區的討論氛圍,思想浮躁,問題質量差,伸手黨盛行等等。當我們體量比較小的時候,我們總是以提高素質還需要時間之類的理由來安慰自己或者他人。而當我們逐漸成長為國內技術問答領域一支重要力量之后,我們已經無法逃避肩上的責任,因此我們希望帶領整個社區一起進步,共同打造一個屬于我們自己的技術家園。

        更多閱讀

        查看原文

        有明 回答了問題 · 2018-09-26

        解決求助:docker啟動nginx mime.types 和 fastcgi_params 報錯

        先檢查一下你的掛載配置,有時候有的朋友喜歡把整個 nginx 配置目錄掛載到 /etc/nginx 里。殊不知你只在這個目錄里加了 nginx.conf ,但容器中 /etc/nginx 目錄下面還有很多其他的文件,你直接掛載整個目錄進去,其他的文件便會隨著目錄的掛載而消失,自然讀取配置會出現問題。

        解決這個問題的方法有兩種:

        1. 把目錄掛載改為文件掛載,只掛載 nginx.conf ,也就是 -v ~/nginx/nginx.conf:/etc/nginx/nginx.conf
        2. 是把容器中 /etc/nginx 目錄中的其他內容也拷貝到要掛載的目錄里,隨著目錄一起掛載進去

        關注 4 回答 3

        認證與成就

        • SegmentFault 講師
        • 獲得 1361 次點贊
        • 獲得 39 枚徽章 獲得 1 枚金徽章, 獲得 15 枚銀徽章, 獲得 23 枚銅徽章

        擅長技能
        編輯

        開源項目 & 著作
        編輯

        (??? )
        暫時沒有

        注冊于 2015-09-04
        個人主頁被 24k 人瀏覽

        一本到在线是免费观看_亚洲2020天天堂在线观看_国产欧美亚洲精品第一页_最好看的2018中文字幕