導航:首頁 > 源碼編譯 > test源碼學習

test源碼學習

發布時間:2022-06-26 08:13:01

源碼中分為main和test分別是什麼意思

In function 'int main()' 這種編譯提示是gcc/g++的一種問題描述格式,告訴你編譯問題出現在源代碼什麼位置,如你這里的問題就出在int main()函數中,接下來還應該有相應的錯誤(警告)描述,如有如下的源代碼test.c:

intmain()
{
printf("helloworld")
}
$g++test.c編譯程序
test.c:Infunction'intmain()':報告錯誤所在的位置
test.c:3:error:'printf'wasnotdeclaredinthisscope錯誤解釋:printf未聲明(缺少頭文件)
test.c:4:error:expected`;'before'}'token錯誤解釋:printf("helloworld")語句沒有以分號結尾,加上分號就可以了。

根據編譯器所提供的線索,可以方便的定位源程序出錯的地方,快速查找和解決程序語法錯誤。

❷ 如何學習sqlite源碼

先來說說sqlite的資料.
首先sqlite的資料其實是不多不少的.
不少的原因是因為這些資料確實能夠讓你明白sqlite的設計原理.
說它不多的原因是也就讓你明白其原理, 僅此而已.

sqlite的資料主要來自四個地方, 從簡到深依次為:
1.<>, 這是一本介紹sqlite"基本原理"的小書, 只有80頁左右, 介紹了sqlite的"後端"原理. 這本書在網路有下載, 純英文版的, 鏈接:inside sqlite_網路知道. 在上面的github上, 我們項目的同伴對這本書做了翻譯, 不過還沒完成, 建議直接掃原版.

2.官方文檔, 連接:SQLite Documentation. 但是裡面的文檔對於學習者來說也有輕重之分, 建議主要閱讀 "SQLite Technical/Design Documentation" 這一欄的技術文檔.

3.<<SQLite Database System: Design and Implementation>>. 這也是一本說sqlite的小書, 不到200頁. 這本書的內容其實和<<inside sqlite>>有重疊, 甚至不少地方的段落是直接復制過來的... 不過這本書比<<inside sqlite>>詳細很多, 也建議掃描一遍. 這本書我目前在做翻譯, 做了3,4,5,6四章的翻譯了. 不過是很粗翻譯, 不建議直接看...

4.源碼注釋. sqlite的源碼注釋非常詳細, 詳細到比上面兩本書說的還多... sqlite的每份.c代碼內的注釋差不多快比代碼還多了, 而且除了將基本架構外, 很多上述資料沒有提到的細節, 也在源碼注釋中被提了出來.

================================================================

接下來說一下本人推薦的學習方法~~

================================================================

下面是認真學習的方法, 如果想快速暴力的學習, 直接看下一段.

想要認真點學習的話.
應該先去看"Architecture of SQLite"這篇文檔, 該文檔詳細的介紹了sqlite的7層結構, 總體被分為了"前段", "中層VM", "後端".

看完arch.html那文過後, 你就知道"前端"主要做的是語法分析, "後端"主要實現了資料庫性質(ACID, 增刪查改).
個人建議從後端開始學習, 畢竟學習sqlite是學習怎麼實現資料庫.

後端的tree, pager, os三層, 其實都不難(起碼理解起來不難),
我建議OS->PAGER->TREE這樣邊學習, 邊寫demo.
簡要說一下我在學習這三層過程中遇到的一些點, 希望能幫到樓主.

OS:
os是很薄的一層, 主要是為了提高可移植性而被設計出來的.
學習這一層的方法很粗暴:看"The OS Backend (VFS) To SQLite", 然後去看源碼中的"test_demovfs.c".
主要搞清下面三個結構體.
sqlite3_vfs
sqlite3_io_methods
sqlite3_file
在我github中的demo1.1中, 有一個更簡單的demo, 可以參考看下裡面的os.c, os.h, unix_os.c三份代碼.

-------------------------------------------------

Pager:
Pager主要實現了三段功能: ACID, log, cache.
先說ACID:
ACID的這部分我只看了最最基本的方法, 然後選擇跳過的, sqlite實現ACID的方法可以看"Atomic Commit In SQLite",
這里是我翻譯的, 能看,
"how-to-implement-a-DB-like-sqlite/SQLite怎樣實現原子性.md at master · qw4990/how-to-implement-a-DB-like-sqlite · GitHub".
除了這篇最基本的文檔, 推薦看<<SQLite Database System: Design and Implementation>>的3章和4章, 看完能理解sqlite實現ACID的基本方法.

接著是cache, sqlite提供了插件式的cache結構, 所以你或許會驚訝為什麼sqlite裡面同時有pager.c, pcache.c, pcache1.c:
cache這個部分比較簡單, <<inside sqlite>>第三章, <<SQLite Database System>>第五章都有詳細的介紹, 主要講解了pager實現cache的方法.
在我github中的demo1.1中, cache的功能也已經完成了, 1 可以參考看下裡面的pager.h, pager.c, pcache.c, pcahce1這四份代碼.

最後是log:
這部分我現在直接選擇了忽視...

----------------------------------------------------

Tree層:
sqlite的tree層就是用B+/B-樹維護數據, 以達到快速"增刪查改"的目的.
這一層在官方文檔里沒多少資料.
先是演算法本身, 也就是B+/B-/B樹, 沒什麼好說的, 很多演算法書都有.
接下來重點是sqlite怎麼將B樹應用到自身的資料庫中的.
這一點可以看<<inside sqlite>>的第5章, <<SQLite Database System>>的第6章, 都有很詳細的介紹.
<<SQLite Database System>>講得更為仔細, 除了說原理外, 還說了sqlite里btree大致被分為了幾個結構體在工作.

以上就是我學習後端遇到的一些點吧.

=============================================================

如果嫌棄上面的學習方法麻煩的話,
可以先掃一下"Architecture of SQLite",
接著再看一下"Atomic Commit In SQLite",
最後簡單粗暴的把推薦的那兩本書掃完,
也大致知道sqlite是怎麼設計的了.

不過個人認為sqlite是一個"大師級的精緻的工藝品", 光看完兩本書就說自己學完了它, 未免有點"暴殄天物".
除了基本的資料庫設計方法(也就是那兩本書的內容), sqlite的源代碼中所蘊含的編程技巧, 工程設計, 以及各種小考慮, 也是非常值得吸收學習的.

=============================================================

最後總結一下
如果想簡單粗暴快捷的學習, 直接掃arch.html, atomiccommit.html和那兩本書, 就能明白sqlite是怎樣被設計的了.
如果想深入學習, 建議從7層開始向前學, 邊翻文檔邊看源碼邊寫demo.

❸ 如何學習TensorFlow源碼

如果從源碼構建TensorFlow會需要執行如下命令
bazel build -c opt //tensorflow/tools/pip_package:build_pip_package

對應的BUILD文件的rule為:
sh_binary(
name = "build_pip_package",
srcs = ["build_pip_package.sh"],
data = [
"MANIFEST.in",
"README",
"setup.py",
"//tensorflow/core:framework_headers",
":other_headers",
":simple_console",
"//tensorflow:tensorflow_py",
"//tensorflow/examples/tutorials/mnist:package",
"//tensorflow/models/embedding:package",
"//tensorflow/models/image/cifar10:all_files",
"//tensorflow/models/image/mnist:convolutional",
"//tensorflow/models/rnn:package",
"//tensorflow/models/rnn/ptb:package",
"//tensorflow/models/rnn/translate:package",
"//tensorflow/tensorboard",
],
)

sh_binary在這里的主要作用是生成data的這些依賴。一個一個來看,一開始的三個文件MANIFEST.in、README、setup.py是直接存在的,因此不會有什麼操作。
「//tensorflow/core:framework_headers」:其對應的rule為:
filegroup(
name = "framework_headers",
srcs = [
"framework/allocator.h",
......
"util/device_name_utils.h",
],
)

這里filegroup的作用是給這一堆頭文件一個別名,方便其他rule引用。
「:other_headers」:rule為:
transitive_hdrs(
name = "other_headers",
deps = [
"//third_party/eigen3",
"//tensorflow/core:protos_all_cc",
],
)

transitive_hdrs的定義在:
load("//tensorflow:tensorflow.bzl", "transitive_hdrs")

實現為:
# Bazel rule for collecting the header files that a target depends on.
def _transitive_hdrs_impl(ctx):
outputs = set()
for dep in ctx.attr.deps:
outputs += dep.cc.transitive_headers
return struct(files=outputs)

_transitive_hdrs = rule(attrs={
"deps": attr.label_list(allow_files=True,
providers=["cc"]),
},
implementation=_transitive_hdrs_impl,)

def transitive_hdrs(name, deps=[], **kwargs):
_transitive_hdrs(name=name + "_gather",
deps=deps)
native.filegroup(name=name,
srcs=[":" + name + "_gather"])

其作用依舊是收集依賴需要的頭文件。
「:simple_console」:其rule為:
py_binary(
name = "simple_console",
srcs = ["simple_console.py"],
srcs_version = "PY2AND3",
deps = ["//tensorflow:tensorflow_py"],
)
py_library(
name = "tensorflow_py",
srcs = ["__init__.py"],
srcs_version = "PY2AND3",
visibility = ["//visibility:public"],
deps = ["//tensorflow/python"],
)

simple_console.py的代碼的主要部分是:
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import code
import sys

def main(_):
"""Run an interactive console."""
code.interact()
return 0

if __name__ == '__main__':
sys.exit(main(sys.argv))

可以看到起通過deps = [「//tensorflow/python」]構建了依賴包,然後生成了對應的執行文件。看下依賴的rule規則。//tensorflow/python對應的rule為:
py_library(
name = "python",
srcs = [
"__init__.py",
],
srcs_version = "PY2AND3",
visibility = ["//tensorflow:__pkg__"],
deps = [
":client",
":client_testlib",
":framework",
":framework_test_lib",
":kernel_tests/gradient_checker",
":platform",
":platform_test",
":summary",
":training",
"//tensorflow/contrib:contrib_py",
],
)

這里如果仔細看的話會發現其主要是生成一堆python的模塊。從這里貌似可以看出每個python的mole都對應了一個rule,且mole依賴的mole都寫在了deps里。特別的,作為一個C++的切入,我們關注下training這個依賴:
py_library(
name = "training",
srcs = glob(
["training/**/*.py"],
exclude = ["**/*test*"],
),
srcs_version = "PY2AND3",
deps = [
":client",
":framework",
":lib",
":ops",
":protos_all_py",
":pywrap_tensorflow",
":training_ops",
],
)

這里其依賴的pywrap_tensorflow的rule為:
tf_py_wrap_cc(
name = "pywrap_tensorflow",
srcs = ["tensorflow.i"],
swig_includes = [
"client/device_lib.i",
"client/events_writer.i",
"client/server_lib.i",
"client/tf_session.i",
"framework/python_op_gen.i",
"lib/core/py_func.i",
"lib/core/status.i",
"lib/core/status_helper.i",
"lib/core/strings.i",
"lib/io/py_record_reader.i",
"lib/io/py_record_writer.i",
"platform/base.i",
"platform/numpy.i",
"util/port.i",
"util/py_checkpoint_reader.i",
],
deps = [
":py_func_lib",
":py_record_reader_lib",
":py_record_writer_lib",
":python_op_gen",
":tf_session_helper",
"//tensorflow/core/distributed_runtime:server_lib",
"//tensorflow/core/distributed_runtime/rpc:grpc_server_lib",
"//tensorflow/core/distributed_runtime/rpc:grpc_session",
"//util/python:python_headers",
],
)

tf_py_wrap_cc為其自己實現的一個rule,這里的.i就是SWIG的interface文件。來看下其實現:
def tf_py_wrap_cc(name, srcs, swig_includes=[], deps=[], copts=[], **kwargs):
mole_name = name.split("/")[-1]
# Convert a rule name such as foo/bar/baz to foo/bar/_baz.so
# and use that as the name for the rule procing the .so file.
cc_library_name = "/".join(name.split("/")[:-1] + ["_" + mole_name + ".so"])
extra_deps = []
_py_wrap_cc(name=name + "_py_wrap",
srcs=srcs,
swig_includes=swig_includes,
deps=deps + extra_deps,
mole_name=mole_name,
py_mole_name=name)
native.cc_binary(
name=cc_library_name,
srcs=[mole_name + ".cc"],
copts=(copts + ["-Wno-self-assign", "-Wno-write-strings"]
+ tf_extension_copts()),
linkopts=tf_extension_linkopts(),
linkstatic=1,
linkshared=1,
deps=deps + extra_deps)
native.py_library(name=name,
srcs=[":" + name + ".py"],
srcs_version="PY2AND3",
data=[":" + cc_library_name])

按照SWIG的正常流程,先要通過swig命令生成我們的wrap的c文件,然後和依賴生成我們的so文件,最後生成一個同名的python文件用於import。這里native.cc_binary和native.py_library做了我們後面的兩件事情,而swig命令的執行則交給了_py_wrap_cc。其實現為:
_py_wrap_cc = rule(attrs={
"srcs": attr.label_list(mandatory=True,
allow_files=True,),
"swig_includes": attr.label_list(cfg=DATA_CFG,
allow_files=True,),
"deps": attr.label_list(allow_files=True,
providers=["cc"],),
"swig_deps": attr.label(default=Label(
"//tensorflow:swig")), # swig_templates
"mole_name": attr.string(mandatory=True),
"py_mole_name": attr.string(mandatory=True),
"swig_binary": attr.label(default=Label("//tensorflow:swig"),
cfg=HOST_CFG,
executable=True,
allow_files=True,),
},
outputs={
"cc_out": "%{mole_name}.cc",
"py_out": "%{py_mole_name}.py",
},
implementation=_py_wrap_cc_impl,)

_py_wrap_cc_impl的實現為:
# Bazel rules for building swig files.
def _py_wrap_cc_impl(ctx):
srcs = ctx.files.srcs
if len(srcs) != 1:
fail("Exactly one SWIG source file label must be specified.", "srcs")
mole_name = ctx.attr.mole_name
cc_out = ctx.outputs.cc_out
py_out = ctx.outputs.py_out
src = ctx.files.srcs[0]
args = ["-c++", "-python"]
args += ["-mole", mole_name]
args += ["-l" + f.path for f in ctx.files.swig_includes]
cc_include_dirs = set()
cc_includes = set()
for dep in ctx.attr.deps:
cc_include_dirs += [h.dirname for h in dep.cc.transitive_headers]
cc_includes += dep.cc.transitive_headers
args += ["-I" + x for x in cc_include_dirs]
args += ["-I" + ctx.label.workspace_root]
args += ["-o", cc_out.path]
args += ["-outdir", py_out.dirname]
args += [src.path]
outputs = [cc_out, py_out]
ctx.action(executable=ctx.executable.swig_binary,
arguments=args,
mnemonic="PythonSwig",
inputs=sorted(set([src]) + cc_includes + ctx.files.swig_includes +
ctx.attr.swig_deps.files),
outputs=outputs,
progress_message="SWIGing {input}".format(input=src.path))
return struct(files=set(outputs))

這里的ctx.executable.swig_binary是一個shell腳本,內容為:
# If possible, read swig path out of "swig_path" generated by configure
SWIG=swig
SWIG_PATH=tensorflow/tools/swig/swig_path
if [ -e $SWIG_PATH ]; then
SWIG=`cat $SWIG_PATH`
fi

# If this line fails, rerun configure to set the path to swig correctly
"$SWIG" "$@"

可以看到起就是調用了swig命令。
「//tensorflow:tensorflow_py」:其rule為:
py_library(
name = "tensorflow_py",
srcs = ["__init__.py"],
srcs_version = "PY2AND3",
visibility = ["//visibility:public"],
deps = ["//tensorflow/python"],
)

❹ 怎樣學習代碼

建議你先學習C語言,C語言是最基礎的東西。

1、學代碼要有信心、恆心。

2、學代碼要由淺入深,從簡單到復雜。

拓展資料:

代碼就是程序員用開發工具所支持的語言寫出來的源文件,是一組由字元、符號或信號碼元以離散形式表示信息的明確的規則體系。代碼設計的原則包括唯一確定性、標准化和通用性、可擴充性與穩定性、便於識別與記憶、力求短小與格式統一以及容易修改等。源代碼是代碼的分支,某種意義上來說,源代碼相當於代碼。現代程序語言中,源代碼可以書籍或磁帶形式出現,但最為常用格式是文本文件,這種典型格式的目的是為了編譯出計算機程序。計算機源代碼最終目的是將人類可讀文本翻譯成為計算機可執行的二進制指令,這種過程叫編譯,它由通過編譯器完成。

(參考資料:代碼-網路)

❺ 代碼如何開始學習

建議你先學習C語言,C語言是最基礎的東西。

1、學代碼要有信心、恆心。

2、學代碼要由淺入深,從簡單到復雜。

拓展資料:

代碼就是程序員用開發工具所支持的語言寫出來的源文件,是一組由字元、符號或信號碼元以離散形式表示信息的明確的規則體系。代碼設計的原則包括唯一確定性、標准化和通用性、可擴充性與穩定性、便於識別與記憶、力求短小與格式統一以及容易修改等。源代碼是代碼的分支,某種意義上來說,源代碼相當於代碼。現代程序語言中,源代碼可以書籍或磁帶形式出現,但最為常用格式是文本文件,這種典型格式的目的是為了編譯出計算機程序。計算機源代碼最終目的是將人類可讀文本翻譯成為計算機可執行的二進制指令,這種過程叫編譯,它由通過編譯器完成。

(參考資料:代碼-網路)

java程序 請幫忙寫出TestMyPoint類的源代碼

我做的有點類似但不是完全一樣 發給你看看有沒有啟發。
public class MyPoint{
public static void main(String[] args){
MyPoint mp =new MyPoint();
mp.setStart(new Point(10,10));
mp.setEnd(new Point(20,20));
//mp.setstray(mp.getend());
mp.setStray(new Point(30,30));

System.out.println(mp.getstray());
System.out.println(mp.getstart());
System.out.println(mp.getend());

}
private Point start;
private Point end;
private Point stray;
public Point getstart(){
return start;
}
public void setStart(Point start){
this.start=start;

}
public Point getend(){
return end;
}
public void setEnd(Point end){
this.end=end;
}
public Point getstray(){
return stray;
}
public void setStray(Point stray){
this.stray=stray;
}
public MyPoint() {

}
public MyPoint(Point start, Point end ,Point stray) {
super();
this.stray = stray;
this.start = start;
this.end = end;
}

}
class Point{
public String toString(){
return "x:"+ x +"y"+ y ;
}
private int x;
private int y;

public int getx(){
return x;
}
public void setx(int x){
this.x=x;
}
public int gety(){
return y;
}
public void sety(int y){
this.y=y;
}
public Point (int x,int y){
this.x=x;
this.y=y;

}
}

❼ 如何學習hibernate源碼

我來分享一下查看源碼的方法:

查看源碼的首要任務是要有一款上手的工具,這里用的是 IDEA。IDEA 的功能比較強大,包括 查看類結構圖,debug。這兩個是查看源碼的關鍵功能。

查看源碼可以靜態查看和動態查看,靜態查看的方法是查看類圖,還有 ALT + f7 查看方法在哪裡被調用或者類在哪裡被調用。在看 spring 源碼的時候就是用這種方法,不過這種方法對閱讀者的要求比較高,包括要了解這個方法的執行,設計模式的理解,以及框架是如何配置這個類的。第二種方法是 debug。debug 方法是後來才發現的一個重要的 查看源碼的方法,要點是掌握執行棧,就能掌握整個執行流程。比如這個是在debug hibernate 源碼的時候的截圖,可以看到這個執行棧非常深,從 spring-data-jpa 到 hibernate 中間經過好幾層的代理,主要完成一些適配,事務,攔截器等等操作,然後再到 hibernate 核心代碼,最後就是 jdbc 的 statement。方法棧中的每一個方法都是可以查看的,裡面的變數有時候是代理了好幾層,所以要 F7 進去才能看到真正的執行類。

上面是簡單的簡述 mybatis 的 cache 機制的源碼,真正想讓讀者明白的是,debug 如何查看源碼,查看源碼需要抓住一個主題,不然在閱讀龐大的框架的時候會找不著北。

所以,閱讀源碼需要掌握工具使用,debug, 查看類圖,查看方法在哪裡調用,軟知識是要掌握設計模式,對框架的概念有了解。

❽ 如何 閱讀 testng 源碼

1、前提
安裝好jdk
配置好Java環境變數
安裝Eclips
這些網上都有,就不再詳細介紹。
2、安裝TestNG插件

在線安裝由於網速原因,速度較慢。下面是離線安裝方式。
(1)解壓eclipse-testng離線包.zip
(2)將【eclipse-testng離線包/feature】中的文件夾org.testng.eclipse_6.8.6.20130607_0745復制到【MyEclipse安裝目錄/features】目錄下
(3)將【eclipse-testng離線包/org.testng.eclipse_6.8.6.20130607_0745】文件夾復制到【MyEclipse安裝目錄/plugins】目錄下
(4)重啟MyEclipse,Windows - show view - TestNG
3、安裝Ant
(1)解壓apache-ant-1.9.6-bin.zip到任意目錄下

(2)配置Ant環境變數,在Path變數末尾添加:<Ant目錄>/bin;
二、在Eclipse中創建Java工程
1、Eclipse -> File -> New -> Java Project,如下圖,在彈窗中填入Project name,點擊Finish,即可完成工程的創建。

2. 導入相關的jar包:
工程上右鍵 -> Build Path -> Configure Build Path...,如下圖所示,打開Build Path配置窗口。

導入已經安裝的TestNG插件,如下圖所示完成testNG的導入:

3. 從資源分享鏈接中下載lib.zip,解壓開,按下圖方式導入裡面的jar包。導入的這些jar包會在程序中用到。

三、使用TestNG框架編寫測試用例
1. 創建src文件夾,存放測試相關的代碼,在工程上右鍵 -> New -> Folder,填入文件名字:src。
2. 按照數據與代碼分離和公共方法提取的原則,我的代碼結構如下劃分:

3. 腳本編寫順序
3.1 全局配置文件(GlobalSettings.java)
存放一些工程全局的變數,比如baseUrl、timeout等;
3.2 Http協議實現(HttpClientHelper.java)
根據項目介面使用的協議,實現相關的請求。我們的項目有兩種方式,一種是使用NameValuePair的方式封裝請求參數,一種是使用JSONObject的方式封裝請求參數,因此針對這兩種方式都做了代碼實現。
3.3 介面實現(GList_API.java)
以「創建G單」為例,實現該介面:

3.4 准備測試數據(TestData.java)
為介面准備測試數據。

3.5 測試數據參數化(GListDataProvider.java),返回的參數個數需要與testsuit中函數參數個數一致。

3.6 測試用例suit(GListCURD.java)

4. 測試用例調試與執行
按照步驟三寫好了所有的用例,可以進行用例的調試與執行了。
4.1 測試用例腳本調試
在步驟三的測試用例suit GListCURD.java上右鍵,「Debug as」或「Run as」 -> "TestNG Test",即可運行該腳本。
4.2 測試用例腳本執行
有兩種方式可以運行該腳本,testNG或者ant。
使用testNG運行,操作如步驟4.1。
使用ant運行,需要創建xml,請參考資源庫中的build.xml、smokeTest.xml。若需要生成testNG報告,還需要下載test-result.xsi文件。
4.3 美化後的運行結果report

❾ 求幾個JAVA小項目源代碼,供自己學習參考

package com.test01;
import java.util.Scanner;
public class oop5 { public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// int x = 9;
// int y = 1;
int x = sc.nextInt();
int y = sc.nextInt();
int z;
z = add(x, y);
System.out.println("x的值為:" + x);
System.out.println("y的值為:" + y);
System.out.println("二者之和為:" + z);
}

/** 四種小演算法 */
// 加法運算
public static int add(int a, int b) {
int c;
c = a + b;
return c;
}

// 減法運算
public static int jian(int d, int v) {
int m;
m = d - v;
return m;
}

// 乘積運算
public static int addAdd(int q, int w) {
int e;
e = q * w;
return e;
}

// 除法運算
public static int chu(int p, int k) {
int f;
f = p / k;
return f;
}
}

❿ 在linux系統中 編寫一個C語言源代碼 文件名為test.c 編寫好了以後為了調試看看結果是否正確

你linux系統有沒有gcc啊?
有的話直接輸入 : gcc test.c -o test
沒有任何提示的話,就說明編譯成功了,
之後再加./test 就可以看到結果了

閱讀全文

與test源碼學習相關的資料

熱點內容
php鏈接正則表達式 瀏覽:964
安卓版蘋果手機怎麼轉手 瀏覽:101
安卓怎麼修改app的名字 瀏覽:135
域名伺服器可將域名地址 瀏覽:721
廣州伺服器機櫃怎麼賣 瀏覽:236
轉讓騰訊雲三年伺服器 瀏覽:252
網易雲音樂加密怎麼處理 瀏覽:387
編譯小視頻軟體 瀏覽:595
盒馬app買東西怎麼送 瀏覽:119
編譯原理國產 瀏覽:691
在線用pdf轉word 瀏覽:424
咪咕app怎麼發表文章 瀏覽:209
phpsftp上傳 瀏覽:936
php可以幹嘛 瀏覽:879
梁箍筋加密區需要滿綁扎嗎 瀏覽:330
程序員半個月工資多少 瀏覽:821
雲伺服器租賃還是私有 瀏覽:752
php七牛視頻上傳 瀏覽:14
php五星 瀏覽:311
使用api訪問外部文件夾 瀏覽:220