Caffe学习系列(13):数据可视化环境(python接口)配置

来源:互联网 发布:递归算法的时间复杂度 编辑:程序博客网 时间:2024/06/05 11:29

Caffe学习系列(13):数据可视化环境(python接口)配置

caffe程序是由c++语言写的,本身是不带数据可视化功能的。只能借助其它的库或接口,如opencv, python或matlab。大部分人使用python接口来进行可视化,因为python出了个比较强大的东西:ipython notebook, 现在的最新版本改名叫jupyter notebook,它能将python代码搬到浏览器上去执行,以富文本方式显示,使得整个工作可以以笔记的形式展现、存储,对于交互编程、学习非常方便。 

   python环境不能单独配置,必须要先编译好caffe,才能编译python环境。

    python环境的配置说起来简单,做起来非常复杂。在安装的过程中,可能总是出现这样那样的问题。因此强烈建议大家用anaconda来进行安装,anaconda把很多与python有关的库都收集在一起了,包括numpy,scipy等等,因此,我们只需要下载对应系统,对应版本的anaconda来安装就可以了。

如果你想通过anaconda来安装,请跳过第一、二步,直接进入第三步开始:

一、安装python和pip

一般linux系统都自带python,所以不需要安装。如果没有的,安装起来也非常方便。安装完成后,可用version查看版本

# python --version

pip是专门用于安装python各种依赖库的,所以我们这里安装一下pip1.5.6

先用链接下载安装包 https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz,然后解压,里面有一个setup.py的文件,执行这个文件就可以安装pip了

# sudo python setup.py install

有些电脑可能会提示 no moudle name setuptools 的错误,这是没有安装setuptools的原因。那就需要先安装一下setuptools, 到https://pypi.python.org/packages/source/s/setuptools/setuptools-19.2.tar.gz 下载安装包setuptools-19.2.tar.gz,然后解压执行

# sudo python setup.py install

就要以安装setuptools了,然后再回头去重新安装pip。执行的代码都是一样的,只是在不同的目录下执行。

二、安装pyhon接口依赖库

在caffe根目录的python文件夹下,有一个requirements.txt的清单文件,上面列出了需要的依赖库,按照这个清单安装就可以了。

在安装scipy库的时候,需要fortran编译器(gfortran),如果没有这个编译器就会报错,因此,我们可以先安装一下。

首先回到caffe的根目录,然后执行安装代码:

# cd ~/caffe# sudo apt-get install gfortran# for req in $(cat requirements.txt); do sudo pip install $req; done

安装完成以后,我们可以执行:

# sudo pip install -r python/requirements.txt

就会看到,安装成功的,都会显示Requirement already satisfied, 没有安装成功的,会继续安装。

在安装的时候,也许问题会有一大堆。这时候你就知道anaconda的好处了。

三、利用anaconda来配置python环境

如果你上面两步已经没有问题了,那么这一步可以省略。

如果你想简单一些,利用anaconda来配置python环境,那么直接从这一步开始,可以省略上面两步。

先到https://www.continuum.io/downloads 下载anaconda, 现在的版本有python2.7版本和python3.5版本,下载好对应版本、对应系统的anaconda,它实际上是一个sh脚本文件,大约280M左右。我下载的是linux版的python 2.7版本。

下载成功后,在终端执行(2.7版本):

# bash Anaconda2-2.4.1-Linux-x86_64.sh

或者3.5 版本:

# bash Anaconda3-2.4.1-Linux-x86_64.sh

在安装的过程中,会问你安装路径,直接回车默认就可以了。有个地方问你是否将anaconda安装路径加入到环境变量(.bashrc)中,这个一定要输入yes

安装成功后,会有当前用户根目录下生成一个anaconda2的文件夹,里面就是安装好的内容。

输入conda list 就可以查询,你现在安装了哪些库,常用的numpy, scipy名列其中。如果你还有什么包没有安装上,可以运行

conda install ***  来进行安装,

如果某个包版本不是最新的,运行 conda update *** 就可以了。

四、编译python接口

首先,将caffe根目录下的python文件夹加入到环境变量

打开配置文件bashrc

# sudo vi ~/.bashrc

在最后面加入

export PYTHONPATH=/home/xxx/caffe/python:$PYTHONPATH

注意 /home/xxx/caffe/python 是我的路径,这个地方每个人都不同,需要修改

保存退出,更新配置文件

# sudo ldconfig

然后修改编译配置文件Makefile.config. 我的配置是:

复制代码
## Refer to http://caffe.berkeleyvision.org/installation.html# Contributions simplifying and improving our build system are welcome!# cuDNN acceleration switch (uncomment to build with cuDNN).USE_CUDNN := 1# CPU-only switch (uncomment to build without GPU support).# CPU_ONLY := 1# uncomment to disable IO dependencies and corresponding data layers# USE_OPENCV := 0# USE_LEVELDB := 0# USE_LMDB := 0# uncomment to allow MDB_NOLOCK when reading LMDB files (only if necessary)#    You should not set this flag if you will be reading LMDBs with any#    possibility of simultaneous read and write# ALLOW_LMDB_NOLOCK := 1# Uncomment if you're using OpenCV 3# OPENCV_VERSION := 3# To customize your choice of compiler, uncomment and set the following.# N.B. the default for Linux is g++ and the default for OSX is clang++# CUSTOM_CXX := g++# CUDA directory contains bin/ and lib/ directories that we need.CUDA_DIR := /usr/local/cuda# On Ubuntu 14.04, if cuda tools are installed via# "sudo apt-get install nvidia-cuda-toolkit" then use this instead:# CUDA_DIR := /usr# CUDA architecture setting: going with all of them.# For CUDA < 6.0, comment the *_50 lines for compatibility.CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \        -gencode arch=compute_20,code=sm_21 \        -gencode arch=compute_30,code=sm_30 \        -gencode arch=compute_35,code=sm_35 \        -gencode arch=compute_50,code=sm_50 \        -gencode arch=compute_50,code=compute_50# BLAS choice:# atlas for ATLAS (default)# mkl for MKL# open for OpenBlasBLAS := atlas# Custom (MKL/ATLAS/OpenBLAS) include and lib directories.# Leave commented to accept the defaults for your choice of BLAS# (which should work)!# BLAS_INCLUDE := /path/to/your/blas# BLAS_LIB := /path/to/your/blas# Homebrew puts openblas in a directory that is not on the standard search path# BLAS_INCLUDE := $(shell brew --prefix openblas)/include# BLAS_LIB := $(shell brew --prefix openblas)/lib# This is required only if you will compile the matlab interface.# MATLAB directory should contain the mex binary in /bin.# MATLAB_DIR := /usr/local# MATLAB_DIR := /Applications/MATLAB_R2012b.app# NOTE: this is required only if you will compile the python interface.# We need to be able to find Python.h and numpy/arrayobject.h.# PYTHON_INCLUDE := /usr/include/python2.7 \        /usr/lib/python2.7/dist-packages/numpy/core/include# Anaconda Python distribution is quite popular. Include path:# Verify anaconda location, sometimes it's in root.ANACONDA_HOME := $(HOME)/anaconda2PYTHON_INCLUDE := $(ANACONDA_HOME)/include \        $(ANACONDA_HOME)/include/python2.7 \        $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \# We need to be able to find libpythonX.X.so or .dylib.# PYTHON_LIB := /usr/libPYTHON_LIB := $(ANACONDA_HOME)/lib# Homebrew installs numpy in a non standard path (keg only)# PYTHON_INCLUDE += $(dir $(shell python -c 'import numpy.core; print(numpy.core.__file__)'))/include# PYTHON_LIB += $(shell brew --prefix numpy)/lib# Uncomment to support layers written in Python (will link against Python libs)WITH_PYTHON_LAYER := 1# Whatever else you find you need goes here.INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/includeLIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib# If Homebrew is installed at a non standard location (for example your home directory) and you use it for general dependencies# INCLUDE_DIRS += $(shell brew --prefix)/include# LIBRARY_DIRS += $(shell brew --prefix)/lib# Uncomment to use `pkg-config` to specify OpenCV library paths.# (Usually not necessary -- OpenCV libraries are normally installed in one of the above $LIBRARY_DIRS.)# USE_PKG_CONFIG := 1BUILD_DIR := buildDISTRIBUTE_DIR := distribute# Uncomment for debugging. Does not work on OSX due to https://github.com/BVLC/caffe/issues/171# DEBUG := 1# The ID of the GPU that 'make runtest' will use to run unit tests.TEST_GPUID := 0# enable pretty build (comment to see full commands)Q ?= @
复制代码

修改完编译配置文件后,最后进行编译:

# sudo make pycaffe

编译成功后,不能重复编译,否则会提示 Nothing to be done for "pycaffe"的错误。

防止其它意外的错误,最好还编译一下:

# sudo make test -j8# sudo make runtest -j8

也许你在编译runtest的时候,会报这样的错误:

.build_release/test/test_all.testbin: error while loading shared libraries: libhdf5.so.10: cannot open shared object file: No such file or directory

这是因为 libhdf5.so的版本问题,你可以进入/usr/lib/x86_64-linux-gnu看一下,你的libhdf5.so.x中的那个x是多少,比如我的是libhdf5.so.7

 因此可以执行下面几行代码解决:

# cd /usr/lib/x86_64-linux-gnu# sudo ln -s libhdf5.so.7 libhdf5.so.10# sudo ln -s libhdf5_hl.so.7 libhdf5_hl.so.10# sudo ldconfig

最终查看python接口是否编译成功:

进入python环境,进行import操作

# python>>> import caffe

如果没有提示错误,则编译成功。

五、安装jupyter

安装了python还不行,还得安装一下ipython,后者更加方便快捷,更有自动补全功能。而ipython notebook是ipython的最好展现方式。最新的版本改名为jupyter notebook,我们先来安装一下。(如果安装了anaconda, jupyter notebook就已经自动装好,不需要再安装)

# sudo pip install jupyter

安装成功后,运行notebook

# jupyter notebook

就会在浏览器中打开notebook,  点击右上角的New-python2, 就可以新建一个网页一样的文件,扩展名为ipynb。在这个网页上,我们就可以像在命令行下面一样运行python代码了。输入代码后,按shift+enter运行,更多的快捷键,可点击上方的help-Keyboard shortcuts查看,或者先按esc退出编辑状态,再按h键查看。

 

分类: caffe
标签: python, caffe
好文要顶关注我收藏该文
denny402
关注 - 3
粉丝 - 632
+加关注
1
0
«上一篇:Caffe学习系列(12):训练和测试自己的图片
»下一篇:Caffe学习系列(14):初识数据可视化

posted @ 2015-12-30 12:08 denny402 阅读(34526) 评论(43)编辑收藏

  
#1楼2016-02-01 14:23 |lightbone  
写得很好很详细。
我在编译runtest的时候,也遇到了这个问题,不过用你方法后还是不行。另外,import caffe 时 报错:No module named google.protobuf.internal

我先尝试自己解决,如果解决不了,还是得麻烦你帮我看看哪里不对?
支持(0)反对(0)
  
#2楼2016-02-01 14:40 |lightbone  
No module named google.protobuf.internal 的问题解决了,先用root权限,chmod 777 -R 解除anaconda2的文件夹保护,然后anaconda install protobuf ,就没有报错了。
支持(1)反对(0)
  
#3楼2016-02-01 15:29 |lightbone  
cd anaconda2
sudo cp /pkgs/hdf5-1.8.15.1-2/lib/libhdf5.so.10 /usr/lib/x86_64-linux-gnu
sudo cp /pkgs/hdf5-1.8.15.1-2/lib/libhdf5_hl.so.10 /usr/lib/x86_64-linux-gnu

完成。不知道为什么,我的库里面找不到libhdf5.so.x
本来x应该是8的。
支持(0)反对(0)
  
#4楼2016-03-24 10:19 |Zoe_only  
楼主您好,请问mac下编译sudo ldconfig时提示
ldconfig: command not found
应该怎么解决呢?
支持(0)反对(0)
http://pic.cnblogs.com/face/713636/20160322100705.png
  
#5楼2016-03-24 11:16 |Zoe_only  
已经解决了,谢谢花时间看我的问题~
支持(0)反对(0)
http://pic.cnblogs.com/face/713636/20160322100705.png
  
#6楼2016-04-28 00:06 |wwk9637  
@lightbone
请问如果采用的是第一种方法(没有安装anaconda),怎么解决No module named google.protobuf.internal 的问题呢?
支持(0)反对(0)
  
#7楼[楼主]2016-04-29 09:33 | denny402  
先安装一下google的protobuf库
# sudo apt-get install libprotobuf-dev
支持(0)反对(0)
  
#8楼2016-05-07 10:28 |TonyFaith  
博主,你好。如果Makefile.config里面的配置配错了,怎么才能重新编译?我之前没有将anaconda2的路径加进去,导致很多功能不能用,现在重新编译提示缺少Python.h文件?
支持(0)反对(0)
  
#9楼[楼主]2016-05-07 10:54 | denny402  
@TonyFaith
清除以前的编译可以make clear,再重新编译就可以了。缺少python.h我不知道是什么原因
支持(0)反对(0)
  
#10楼2016-05-07 13:22 |TonyFaith  
在哪个路径下Make Clear 呢?Caffe的编译会被清除么?
支持(0)反对(0)
  
#11楼2016-05-26 16:29 |pmm淘气包  
博主你好,我在学习你这篇博客时,到了第四步的时候,我发现是编译pycffe,而我在搭建这个caffe平台时,是按照欧新宇的教程走的http://ouxinyu.github.io/Blogs/20151108001.html
这里面好像已经编译过了pycaffe,是不是意味着已经安装了python接口配置?是不是就缺最后一步——安装jupyter呢? 期待您的解惑!谢谢!
支持(0)反对(0)
  
#12楼[楼主]2016-05-26 18:23 | denny402  
@pmm淘气包
如果在python环境下,输入import caffe,没有报错,说明python接口就安装好了,直接安装jupyter就可以了
支持(0)反对(0)
  
#13楼2016-05-26 21:13 |pmm淘气包  
@denny402
谢谢博主的解答!经过试验,发现python接口是安装好的。
支持(0)反对(0)
  
#14楼2016-05-28 12:05 |Yan消云散_  
楼主,我也碰到了No module named google.protobuf.internal的错误呃

尝试了

No module named google.protobuf.internal 的问题解决了,先用root权限,chmod 777 -R 解除anaconda2的文件夹保护,然后anaconda install protobuf ,就没有报错了。

但是显示
usage: anaconda [-h] [--show-traceback] [--hide-traceback] [-v] [-q] [--color]
[--no-color] [-V] [-t TOKEN] [-s SITE]
...
anaconda: error: argument : invalid choice: 'install' (choose from 'auth', u'label', u'channel', 'config', u'copy', u'download', 'groups', u'login', 'logout', u'notebook', 'package', 'remove', 'search', 'show', u'upload', u'whoami')


也尝试了您说的
sudo apt-get install libprotobuf-dev

显示为libprotobuf-dev is already the newest version.


求助啊 /(ㄒoㄒ)/~~
支持(0)反对(0)
http://pic.cnblogs.com/face/506274/20130716162026.png
  
#15楼2016-06-03 14:48 |wuboqian  
楼上的,你改为conda install试试,我成功了……
可是我实践下篇的最后一个时,出现了kernel restart,这是什么情况?
支持(0)反对(0)
  
#16楼2016-06-30 01:09 |Bunny1987  
@Yan消云散_
博主原文“输入conda list 就可以查询,你现在安装了哪些库,常用的numpy, scipy名列其中。如果你还有什么包没有安装上,可以运行

conda install *** 来进行安装”

对于这个问题:
cd anaconda2
conda install -c anaconda protobuf=2.6.1

就可以了。
附 https://anaconda.org
支持(0)反对(0)
  
#17楼2016-07-01 20:46 |longci  
解决No module named google.protobuf.internal
我在网上看过很多,试过很多办法,在github下载安装protobuf,还有说和python3有关系,等等。
但是已经走到这一步,说明,caffe以及配置文件,还有anaconda的安装,所有都没问题。
最后,本人发现一个最简单的办法,就是:
直接在终端中安装protobuf,代码:pip install protobuf

仅供参考```
支持(2)反对(0)
  
#18楼2016-07-22 11:29 |qierhao  
楼主您好:
我按您的步骤进行python接口配置,在第四部之后出现了如下错误
python/caffe/_caffe.cpp:1:52: fatal error: Python.h: No such file or directory
#include <Python.h> // NOLINT(build/include_alpha)
请问下怎么解决?
谢谢
支持(1)反对(0)
  
#19楼[楼主]2016-07-22 13:21 | denny402  
@qierhao
caffe找不到python,如果你是用anaconda安装的python的话,在caffe的配置文件中,要把anaconda的路径写正确:
ANACONDA_HOME := $(HOME)/anaconda2
支持(0)反对(0)
  
#20楼2016-08-08 15:22 |大萌萌  
@qierhao 请问你那个问题解决了吗~~
支持(1)反对(0)
  
#21楼2016-08-08 15:23 |大萌萌  
opt/pb/binutils-2.24/bin/ld: skipping incompatible /usr/local/lib/libcudart.so when searching for -lcudart
/opt/pb/binutils-2.24/bin/ld: skipping incompatible /usr/lib/libcudart.so when searching for -lcudart
/opt/pb/binutils-2.24/bin/ld: cannot find -lpython2.7
/opt/pb/binutils-2.24/bin/ld: cannot find -lcblas
/opt/pb/binutils-2.24/bin/ld: cannot find -latlas
/opt/pb/binutils-2.24/bin/ld: cannot find -lpython2.7



我后来安装了python3.5的版本,连接什么的我也尽量改了 但还是报这个错 求指教啊
支持(0)反对(0)
  
#22楼2016-09-23 10:34 |鹿往森处走  
@qierhao
兄台 问题解决了吗
支持(0)反对(0)
  
#23楼2016-09-23 11:06 |qierhao  
@鹿往森处走
恩已经安装好了
支持(0)反对(0)
  
#24楼2016-09-23 15:52 |鹿往森处走  
@qierhao怎么解决的啊 我现在也是这个问题
支持(0)反对(0)
  
#25楼2016-09-23 15:55 |qierhao  
@鹿往森处走
不好意思哈具体忘记了,我就是百度或者用谷歌搜索解决的
支持(0)反对(0)
  
#26楼2016-09-23 16:07 |鹿往森处走  
@qierhao好的 我再看看 哈哈
支持(0)反对(0)
  
#27楼2016-11-02 12:13 |菜鸟童鞋  
楼主您好!我用的centOS,
安装好Anaconda后,在编译runtest的时候,会报这样的错误:
.build_release/test/test_all.testbin: error while loading shared libraries: libglog.so.0: cannot open shared object file: No such file or directory
但是我的电脑中没有/usr/lib/x86_64-linux-gnu文件夹,怎么办?我装的glog0.3.3版本解压后有libglog.so.0以及libglog.so.0.0.0文件。
支持(0)反对(0)
http://pic.cnblogs.com/face/801785/20161019235528.png
  
#28楼2016-11-09 10:10 |chinasdlcby  
楼主您好!
>>> import caffe后
会报这样的错误:
File "/home/by/caffe/python/caffe/pycaffe.py", line 11, in <module>
import numpy as np
ImportError: No module named numpy

但是
~$ conda update numpy后
conda: command not found
请问下怎么解决?
谢谢
支持(0)反对(0)
  
#29楼2017-02-26 09:52 |顺其&&自然  
博主,您好,请问一下,我在运行Python
import caffe时出现下面的错误:
>>> import caffe
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named caffe
是什么原因?该怎么解决?谢谢
支持(0)反对(0)
  
#30楼2017-03-08 10:07 |hurricanedjp  
jupyter notebook时出现
ERROR:bus.cc(427)] Failed to connect to the bus: Failed to connect to socket /home/tuxiang/anaconda2/var/run/dbus/system_bus_socket: 没有那个文件或目录
但是 /var/run/dbus/下有对应的socket文件。。搜了一下不知如何解决。私以为anaconda下的dbus和系统的dbus冲突。不过不能卸载anaconda下的dbus,因为会顺带卸载很多其他东西包括matplotlib等

求教该如何解决
支持(0)反对(0)
  
#31楼2017-03-11 17:04 |hurricanedjp  
后来发现加上sudo才行,是没有写权限 write notebook server cookie失败导致的
支持(0)反对(0)
  
#32楼2017-04-14 15:47 |eternity-in-an-hour  
@denny402
大神,最后在jupyter notebook时,点击右上角的New-python2时,报这个错误,
Unexpected error while saving file: Untitled.ipynb [Errno 13] Permission denied: '/home/ubuntu/.local/share/jupyter/notebook_secret'
怎么回事啊?
支持(0)反对(0)
http://pic.cnblogs.com/face/1124318/20170313092416.png
  
#33楼2017-04-15 15:35 |renwu  
@eternity-in-an-hour
你好,今天我也遇到同样的问题了,请问你解决了吗?怎么解决的,谢谢!
支持(0)反对(0)
  
#34楼[楼主]2017-04-17 12:44 | denny402  
@renwu
@eternity-in-an-hour
Permission denied,表示没有权限,用管理员权限打开notebook
支持(0)反对(0)
  
#35楼2017-04-17 14:41 |eternity-in-an-hour  
@denny402
弄完之后报这个错误,allow-root是什么啊?大神。
root@ubuntu-QiTianM4600-N000:/home/ubuntu# jupyter notebook
[I 14:36:05.718 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[C 14:36:05.730 NotebookApp] Running as root is not recommended. Use --allow-root to bypass.
支持(0)反对(0)
http://pic.cnblogs.com/face/1124318/20170313092416.png
  
#36楼2017-05-18 16:43 |xxxxxxxxxzzzzz  
作者您好,我是已经给 caffe配置好了python接口,所以没有安装anaconda,直接安装了jupyter notebook,可是启动jupyter notebook时就会出现dead kernel,然后又重新连接,失败,又报No kernel,以至于jupyter notebook无法使用。我的相关配置是Ubuntu16.04(only cpu),使用了ubuntu自带的Python2.7.在配置python接口时由于是python2.7,只能安装ipython6.0版本以下,所以我安装了5.xx版本了。希望得到你的帮助,谢谢你。
支持(0)反对(0)
  
#37楼2017-05-31 12:35 |孤风_1992  
博主你好,我想问一下anaconda2中gcc版本太低怎么办,我安装的只有4.7,很多库不支持。
支持(0)反对(0)
  
#38楼2017-06-01 14:27 |ereret2  
@孤风_1992
百度一下就有的,anaconda自己可以升级gcc版本的
支持(0)反对(0)
  
#39楼2017-07-05 11:41 |成名在望  
谢谢博主,终于弄好了。
支持(0)反对(0)
  
#40楼2017-08-29 15:16 |wy1110  
前面步骤都安装成功,但是import caffe出错 No module named caffe
支持(0)反对(0)
  
#41楼2017-08-29 15:17 |wy1110  
@顺其&&自然
引用
博主,您好,请问一下,我在运行Python
import caffe时出现下面的错误:
>>> import caffe
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named caffe
是什么原因?该怎么解决?谢谢


请问你的问题解决了吗?
支持(0)反对(0)
  
#42楼2017-08-31 11:45 |女王公园的八神  
@wy1110
这个原因很多的,我也不知道具体问题出在哪里,不过应该是你的caffe没有导入到Python path 里面
支持(0)反对(0)
http://pic.cnblogs.com/face/943005/20170910210011.png
  
#43楼37717662017/8/31 13:12:572017-08-31 13:12 | wy1110  
import caffe出错 No module named caffe的问题解决了
我的是需要在/etc/profile中加入Python路径,在~/.bashrc中修改没用
支持(0)反对(0)
刷新评论刷新页面返回顶部
【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
【推荐】腾讯云 十分钟定制你的第一个微信小程序
【推荐】报表开发有捷径:快速设计轻松集成,数据可视化和交互

华为云1016C2
最新IT新闻:
· 资深宇航员Scott Kelly:我再也不怀疑马斯克的话了!
· 李开复华盛顿邮报专栏:发钱解决AI失业潮?硅谷大咖太天真
· IBM取消远程办公政策,是远程办公方式出了错吗?
· 组织转型,10件你必须知道的事
· 盛大陈天桥:我从来没有离开,也从来没有后悔
» 更多新闻...
阿里云1001
最新知识库文章:
· 实用VPC虚拟私有云设计原则
· 如何阅读计算机科学类的书
· Google 及其云智慧
· 做到这一点,你也可以成为优秀的程序员
· 写给立志做码农的大学生

» 更多知识库文章...
阅读全文
0 0
原创粉丝点击