Ubuntu 14.04上使用CMake编译MXNet源码操作步骤(Python)
MXNet源码版本号为1.3.0,其它依赖库的版本号可参考:https://blog.csdn.net/fengbingchun/article/details/84997490 。
为了通过编译源码支持python接口,这里在 https://blog.csdn.net/fengbingchun/article/details/85162936 的基础上对build.sh和CMakeLists.txt进行了调整,新的build.sh和CMakeLists.txt内容如下:
build.sh:
#! /bin/bashreal_path=$(realpath $0)
dir_name=`dirname "${real_path}"`
echo "real_path: ${real_path}, dir_name: ${dir_name}"data_dir="data"
if [ -d ${dir_name}/${data_dir} ]; thenrm -rf ${dir_name}/${data_dir}
filn -s ${dir_name}/./../../${data_dir} ${dir_name}new_dir_name=${dir_name}/build
mkdir -p ${new_dir_name}
cd ${new_dir_name}
echo "pos: ${new_dir_name}"
if [ "$(ls -A ${new_dir_name})" ]; thenecho "directory is not empty: ${new_dir_name}"#rm -r *
elseecho "directory is empty: ${new_dir_name}"
ficd -
# build openblas
echo "========== start build openblas =========="
openblas_path=${dir_name}/../../src/openblas
if [ -f ${openblas_path}/build/lib/libopenblas.so ]; thenecho "openblas dynamic library already exists without recompiling"
elsemkdir -p ${openblas_path}/buildcd ${openblas_path}/buildcmake -DBUILD_SHARED_LIBS=ON ..make
filn -s ${openblas_path}/build/lib/libopenblas* ${new_dir_name}
echo "========== finish build openblas =========="cd -
rc=$?
if [[ ${rc} != 0 ]]; thenecho "########## Error: some of thess commands have errors above, please check"exit ${rc}
ficd -
cd ${new_dir_name}
cmake ..
makecd -
# use all *.o files include openblas and mxnet to generate mxnet dynamic library
# Note: need to modify mxnet_home_dir value in different machines
mxnet_home_dir=/home/likewise-open/xxxx/fengbc/Other/MXNet_Test/src
g++ -shared -o ${dir_name}/libmxnet.so ${openblas_path}/build/driver/others/CMakeFiles/driver_others.dir/*.c.o \${openblas_path}/build/driver/level2/CMakeFiles/driver_level2.dir/CMakeFiles/*.c.o \${openblas_path}/build/driver/level3/CMakeFiles/driver_level3.dir/CMakeFiles/*.c.o \${openblas_path}/build/kernel/CMakeFiles/kernel.dir/CMakeFiles/*.c.o \${openblas_path}/build/interface/CMakeFiles/interface.dir/CMakeFiles/*.c.o \${openblas_path}/build/kernel/CMakeFiles/kernel.dir/CMakeFiles/*.S.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/storage/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/executor/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/profiler/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/engine/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/nnvm/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/kvstore/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/common/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/ndarray/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/io/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/operator/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/operator/quantization/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/operator/quantization/mkldnn/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/operator/nnpack/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/operator/contrib/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/operator/random/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/operator/nn/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/operator/nn/cudnn/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/operator/nn/mkldnn/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/operator/tensor/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/operator/custom/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/imperative/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/mxnet/src/c_api/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/tvm/nnvm/src/core/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/tvm/nnvm/src/pass/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/tvm/nnvm/src/c_api/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/dmlc-core/src/*.cc.o \${dir_name}/build/CMakeFiles/mxnet.dir${mxnet_home_dir}/dmlc-core/src/io/*.cc.o \-lrt mxnet_python_dir=${dir_name}/../../src/mxnet/python
#echo "mxnet python dir: ${mxnet_python_dir}"
cp libmxnet.so ${mxnet_python_dir}
cd ${mxnet_python_dir}
python3 setup.py install --usercd -
CMakeLists.txt:
PROJECT(MXNet_Test)
CMAKE_MINIMUM_REQUIRED(VERSION 3.0)# support C++11
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
# support C++14, when gcc version > 5.1, use -std=c++14 instead of c++1y
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y")IF(NOT CMAKE_BUILD_TYPE)SET(CMAKE_BUILD_TYPE "Release")SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O2")SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O2")
ELSE()SET(CMAKE_BUILD_TYPE "Debug")SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -O2")SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -O2")
ENDIF()
MESSAGE(STATUS "cmake build type: ${CMAKE_BUILD_TYPE}")MESSAGE(STATUS "cmake current source dir: ${CMAKE_CURRENT_SOURCE_DIR}")
SET(PATH_TEST_FILES ${CMAKE_CURRENT_SOURCE_DIR}/./../../demo/MXNet_Test)
SET(PATH_SRC_DMLC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/./../../src/dmlc-core)
SET(PATH_SRC_MSHADOW_FILES ${CMAKE_CURRENT_SOURCE_DIR}/./../../src/mshadow)
SET(PATH_SRC_OPENBLAS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/./../../src/openblas)
SET(PATH_SRC_MXNET_FILES ${CMAKE_CURRENT_SOURCE_DIR}/./../../src/mxnet)
SET(PATH_SRC_TVM_FILES ${CMAKE_CURRENT_SOURCE_DIR}/./../../src/tvm)
SET(PATH_SRC_DLPACK_FILES ${CMAKE_CURRENT_SOURCE_DIR}/./../../src/dlpack)
MESSAGE(STATUS "path test files: ${PATH_TEST_FILES}")# don't use opencv in mxnet
ADD_DEFINITIONS(-DMXNET_USE_OPENCV=0)
ADD_DEFINITIONS(-DMSHADOW_USE_F16C=0)SET(PATH_OPENCV /opt/opencv3.4.2)
IF(EXISTS ${PATH_OPENCV})MESSAGE(STATUS "Found OpenCV: ${PATH_OPENCV}")
ELSE()MESSAGE(FATAL_ERROR "Can not find OpenCV in ${PATH_OPENCV}")
ENDIF()# head file search path
INCLUDE_DIRECTORIES(${PATH_SRC_OPENBLAS_FILES}${PATH_SRC_OPENBLAS_FILES}/build # include openblas config.h${PATH_SRC_DLPACK_FILES}/include${PATH_SRC_MSHADOW_FILES}${PATH_SRC_DMLC_FILES}/include${PATH_SRC_TVM_FILES}/include${PATH_SRC_TVM_FILES}/nnvm/include${PATH_SRC_MXNET_FILES}/src${PATH_SRC_MXNET_FILES}/include${PATH_SRC_MXNET_FILES}/cpp-package/include${PATH_OPENCV}/include${PATH_TEST_FILES}
)# build mxnet dynamic library
SET(MXNET_SRC_LIST )# tvm
FILE(GLOB_RECURSE SRC_TVM_NNVM_C_API ${PATH_SRC_TVM_FILES}/nnvm/src/c_api/*.cc)
FILE(GLOB_RECURSE SRC_TVM_NNVM_CORE ${PATH_SRC_TVM_FILES}/nnvm/src/core/*.cc)
FILE(GLOB_RECURSE SRC_TVM_NNVM_PASS ${PATH_SRC_TVM_FILES}/nnvm/src/pass/*.cc)# mxnet
FILE(GLOB_RECURSE SRC_MXNET ${PATH_SRC_MXNET_FILES}/src/*.cc)# dmlc
FILE(GLOB SRC_DMLC ${PATH_SRC_DMLC_FILES}/src/*.cc)
FILE(GLOB_RECURSE SRC_DMLC_INCLUDE ${PATH_SRC_DMLC_FILES}/include/*)
LIST(APPEND SRC_DMLC ${SRC_DMLC_INCLUDE})
LIST(APPEND SRC_DMLC ${PATH_SRC_DMLC_FILES}/src/io/line_split.cc)
LIST(APPEND SRC_DMLC ${PATH_SRC_DMLC_FILES}/src/io/recordio_split.cc)
LIST(APPEND SRC_DMLC ${PATH_SRC_DMLC_FILES}/src/io/indexed_recordio_split.cc)
LIST(APPEND SRC_DMLC ${PATH_SRC_DMLC_FILES}/src/io/input_split_base.cc)
LIST(APPEND SRC_DMLC ${PATH_SRC_DMLC_FILES}/src/io/filesys.cc)
LIST(APPEND SRC_DMLC ${PATH_SRC_DMLC_FILES}/src/io/local_filesys.cc)LIST(APPEND MXNET_SRC_LIST${SRC_TVM_NNVM_C_API}${SRC_TVM_NNVM_CORE}${SRC_TVM_NNVM_PASS}${SRC_MXNET}${SRC_DMLC}
)
#MESSAGE(STATUS "###### src: ${MXNET_SRC_LIST}")ADD_LIBRARY(mxnet SHARED ${MXNET_SRC_LIST})# find opencv library
FIND_LIBRARY(opencv_core NAMES opencv_core PATHS ${PATH_OPENCV}/lib NO_DEFAULT_PATH)
FIND_LIBRARY(opencv_imgproc NAMES opencv_imgproc PATHS ${PATH_OPENCV}/lib NO_DEFAULT_PATH)
FIND_LIBRARY(opencv_highgui NAMES opencv_highgui PATHS ${PATH_OPENCV}/lib NO_DEFAULT_PATH)
FIND_LIBRARY(opencv_imgcodecs NAMES opencv_imgcodecs PATHS ${PATH_OPENCV}/lib NO_DEFAULT_PATH)
FIND_LIBRARY(opencv_video NAMES opencv_video PATHS ${PATH_OPENCV}/lib NO_DEFAULT_PATH)
FIND_LIBRARY(opencv_videoio NAMES opencv_videoio PATHS ${PATH_OPENCV}/lib NO_DEFAULT_PATH)
FIND_LIBRARY(opencv_objdetect NAMES opencv_objdetect PATHS ${PATH_OPENCV}/lib NO_DEFAULT_PATH)
FIND_LIBRARY(opencv_ml NAMES opencv_ml PATHS ${PATH_OPENCV}/lib NO_DEFAULT_PATH)
MESSAGE(STATUS "opencv libraries: ${opencv_core} ${opencv_imgproc} ${opencv_highgui} ${opencv_imgcodecs} ${opencv_video} ${opencv_videoio} ${opencv_objdetect} ${opencv_ml}")# find dep library
SET(DEP_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build CACHE PATH "dep library path")
MESSAGE(STATUS "dep library dir: ${DEP_LIB_DIR}")
LINK_DIRECTORIES(${DEP_LIB_DIR})# recursive query match files :*.cpp, *.cc
FILE(GLOB_RECURSE TEST_CPP_LIST ${PATH_TEST_FILES}/*.cpp)
FILE(GLOB_RECURSE TEST_CC_LIST ${PATH_TEST_FILES}/*.cc)
MESSAGE(STATUS "test cpp list: ${TEST_CPP_LIST} ${TEST_C_LIST}")# build executable program
ADD_EXECUTABLE(MXNet_Test ${TEST_CPP_LIST} ${TEST_CC_LIST})
# add dependent library: static and dynamic
TARGET_LINK_LIBRARIES(MXNet_Testmxnet${DEP_LIB_DIR}/libopenblas.sopthreadrt # undefined reference to shm_open, need to be placed in front of opencv library${opencv_core}${opencv_imgproc}${opencv_highgui}${opencv_imgcodecs}${opencv_video}${opencv_videoio}${opencv_objdetect}${opencv_ml}
)
在ubuntu上安装pip3,numpy,matplotlib等的操作步骤可以参考:https://blog.csdn.net/fengbingchun/article/details/81590102
在ubuntu上安装OpenCV 3.4.2 python的操作步骤可以参考:https://blog.csdn.net/fengbingchun/article/details/81741384
遇到的问题如下:
(1). 直接通过以下两种命令安装均会提示安装某软件时无权限等问题,可能因非root用户原因,
pip3 install -epython3 setup.py install
解决方法是在命令后加--user选项参数,如:python3 setup.py install --user
(2). 在跑python测试代码时,提示libmxnet.so中找不到dmlc库中的实现,解决方法是将dmlc中相关.cc文件直接加入libmxnet.so中,不再单独生成一个libdmlc.a静态库;
(3). 在跑python测试代码时,提示libmxnet.so: undefined symbol: cblas_ddot,应该是找不到libopenblas.so库,但是试过几种方法依然不行,解决方法是将libopenblas.so中的*.o文件直接加入到libmxnet.so中,不再单独提供一个libopenblas.so库,即所有需要的实现全部放在libmxnet.so库中;
(4). 在跑python测试代码时,提示libmxnet.so: undefined symbol: zlapmr_等错误,因为是lapack或gfortran等问题,解决方法是修改原openblas中的CMakeLists.txt文件,使其在linux下编译时仅开启CBLAS,与windows一致,即加一条option(BUILD_WITHOUT_LAPACK "Without LAPACK and LAPACKE (Only BLAS or CBLAS)" ON)语句;
执行./build.sh脚本后,会同时产生C++和Python所需的库,Python所需的文件会安装到home的.local目录下,执行结果如下:
以下是Python测试代码,执行结果如下:
import mxnet as mx
import numpy as np
import cv2img = cv2.imread("../../data/images/handwritten_digits/0.png")
a = mx.nd.ones((2, 3)); print((a*2).asnumpy())
b = np.array([1, 2, 3]); print(b)cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()print("ok")
注:在不同的机子上执行build.sh脚本时,需要修改变量mxnet_home_dir的值,调整成本机MXNet_Test/src绝对路径值。
GitHub:https://github.com/fengbingchun/MXNet_Test
相关文章:

近段时间学习html和CSS的一些细碎总结
1、边框圆角属性:border-radius,取值能够是 百分比 / 自己定义长度,不能够取负值。假设是圆,将高度和宽度设置相等,而且将border-radius设置为100% 2、IE6,IE7,IE8,opera,…

Swift:闭包
[objc] view plaincopy print?/* 闭包(Closures) * 闭包是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。 * 在Swift中的闭包与C、OC中的blocks和其它编程语言(如Python)中的lambdas类似。 * 闭包…

Ubuntu下使用CMake编译OpenSSL源码操作步骤(C语言)
OpenSSL的版本为1.0.1g,在ubuntu下通过CMake仅编译c代码不包括汇编代码,脚本内容如下: build.sh内容: #! /bin/bashreal_path$(realpath $0) dir_namedirname "${real_path}" echo "real_path: ${real_path}, di…

从词袋到Transfomer,NLP十年突破史
作者 | Zelros AI译者 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】通过 Kaggle 竞赛视角,观察 NLP 十年发展简史。根据上下文(这里指句子的最后一个词),“它”可以指“动物”或“街道”。图源 | Goog…

《千只鹤》--[日]川端康成
《千只鹤》,作者是川端康成 故事梗概: 三谷菊治的父亲是个著名的茶道师匠,他生前与一位叫栗本近子的女人有染,后来又 钟情于太田夫人,而且由于后者而疏远了前者,但前者仍出入于三谷家。在三谷先生去 世四年…
所有接口添加plist文件的写法 swift
第一步 建立plist文件 interface JMTConfigUtils : NSObject /** * 获取配置文件中友盟key * * return NSString */ - (NSString *)umengKey; /** * 微信AppId * * return NSString */ - (NSString *)wxAppId; /** * 微信appSecret * * return NSString */ - (NSString…

提高C++性能的编程技术笔记:标准模板库+测试代码
标准模板库(Standard Template Library, STL)是容器和通用算法的强效组合。 渐近复杂度:算法的渐近复杂度是对算法性能的近似估计。它是算法集到特定性能标准集的映射。如果需要对包含N个整数的向量的所有元素求和,那么每个整数必须且仅需检查一次&…

「创式纪」人工智能应用创新大赛启动,首次结合商业计划和机器学习
谈到人工智能,技术和应用场景成为了大家广泛关注的话题。技术的演进,是推动人工智能发展的核心,而广泛的场景应用,则是人工智能真正价值所在。现阶段,精准营销、信贷风控、人脸比对等为人熟知的AI,已经经过…

linux chattr命令
chattr 设置linux文件的属性 (参照man手册进行翻译,常用的属性都翻译过来,个人觉得很少用到的属性就没有翻译) 用法:chattr [ -RVf ] -[acdeijstuADST] files选项:-R 对目录进行递归处理-V 显示详细的输出-F 忽略…

swift 中高德地图随时读取坐标地点的写法
自己写的方法 不比比 自己能看懂就行 只用作自己学习swift的总结 import UIKit typealias block (String,String) ->() class MoveCarViewController: UIViewController,MAMapViewDelegate,AMapLocationManagerDelegate,AMapSearchDelegate,UITextFieldDelegate,UIAler…

万字干货 | Python后台开发的高并发场景优化解决方案
嘉宾 | 黄思涵 来源 | AI科技大本营在线公开课互联网发展到今天,规模变得越来越大,也对所有的后端服务提出了更高的要求。在平时的工作中,我们或多或少都遇到过服务器压力过大问题。针对该问题,本次公开课邀请到了金山办公AI平台研…

提高C++性能的编程技术笔记:引用计数+测试代码
引用计数(reference counting):基本思想是将销毁对象的职责从客户端代码转移到对象本身。对象跟踪记录自身当前被引用的数目,在引用计数达到零时自行销毁。换句话说,对象不再被使用时自行销毁。 引用计数和执行速度之间的关系是与上下文紧密…

如何提升 CSS 选择器的性能?
CSS选择器对性能的影响源于浏览器匹配选择器和文档元素时所消耗的时间,所以优化选择器的原则是应尽量避免使用消耗更多匹配时间的选择器。而在这之前我们需要了解CSS选择器匹配的机制, 如子选择器规则: #header > a {font-weight:blod;} 我…

百度AI攻坚战:PaddlePaddle中国突围
作者 | 阿司匹林出品 | AI科技大本营(ID:rgznai100)2013年,百度开始研发深度学习框架PaddlePaddle,搜索、凤巢CTR预估上线DNN模型。2016年,在百度世界大会上,百度宣布PaddlePaddle开源ÿ…

提高C++性能的编程技术笔记:编码优化+测试代码
缓存:在现代处理器中,缓存经常与处理器中的数据缓存和指令缓存联系在一起。缓存主要用来存储使用频繁而且代价高昂的计算结果,这样就可以避免对这些结果的重复计算。如,循环内对常量表达式求值是一种常见的低性能问题。 预先计算…

Swift 中使用 SQLite——打开数据库
关于Swift中使用SQLite,接下来可能会分别从打开、增、删、改、查,几个方面来介绍SQLite的具体使用,这一篇重点介绍一下如何打开。 定义全局数据库访问句柄 /// 全局数据库访问句柄 private var db: COpaquePointer nil实现打开数据库函数 …

MVC中获取模型属性的Range和StringLength验证特性设置
MVC中的客户端及服务端模型验证信息都以ModelMetadata类型作为承载,在获得属性的ModelMetadata之后(还不知道怎么获取ModelMetadata的童鞋请自行恶补),我们可以轻松得到一些我们在模型中定义的特性,比如显示名称、是否…

以安装PyTorch为例说明Anaconda在Windows/Linux上的使用
在Windows10上配置完MXNet 1.3.0后,再配置PyTorch 1.0时,发现两者需要依赖的NumPy版本不一致,之前是通过pip安装NumPy,根据pip的版本不同,会安装不同版本的NumPy,使用起来很不方便,而且MXNet和P…

常用 SQL介绍
创建表 /*创建数据表CREATE TABLE 表名 (字段名 类型(INTEGER, REAL, TEXT, BLOB)NOT NULL 不允许为空PRIMARY KEY 主键AUTOINCREMENT 自增长,字段名2 类型,...)注意:在开发中,如果是从 Navicat 粘贴的 SQL,需要自己添加一个指令IF NO…

AttoNets,一种新型的更快、更高效边缘计算神经网络
作者 | Alexander Wong, Zhong Qiu Lin, and Brendan Chwyl 译者 | Rachel 出品 | AI科技大本营(ID:rgznai100)尽管机器学习已经在很多复杂的任务中取得了进展,但现有模型仍然面临许多边缘计算实践的困难,这些边缘计算场景包括移…

Appro DM8127 IPNC 挂载NFS遇到的问题及解决
对于Appro DM8127 IPNC,默认的启动方式是NAND is used for booting kernel and NAND is used as root filesystem 为了调试应用程序方便,通常使用挂载NFS作为 root filesystem 但是如果直接采用ti文档中所给的方法修改文件系统挂载方式(将启动…

提高C++性能的编程技术笔记:设计优化/可扩展性/系统体系结构相关+测试代码
1. 设计优化 我们可以粗略地将性能优化分为两种类型:编码优化和设计优化。编码优化定义为不需要完整理解要解决的问题或者应用程序的执行流程就能实施的优化。通过定义看出,编码优化用于局部代码,同时该过程不牵涉周围的代码。除了这些容易实…

ICLR 2020被爆半数审稿人无相关领域经验,同行评审制度在垮塌?
作者 | 若名出品 | AI科技大本营(ID:rgznai100)根据维基百科,同行评议(peer review),是指由一个或多个具有与作品生产者具有相似能力的人员(同行)对作品进行的评估活动。同行评审方法用于维持质…

Swift 中使用 SQLite——批量更新(事务处理)
本文是Swift 中使用 SQLite系列的收官之作,介绍一下在数据库中的批量更新。 事务 在准备做大规模数据操作前,首先开启一个事务,保存操作前的数据库的状态开始数据操作如果数据操作成功,提交事务,让数据库更新到数据操…

网络管理常用命令之二 - Ipconfig 命令详解(图文)
2、Ipconfig 命令...不带参数.../all 参数.../release 和 /realease6 参数.../Renew 和 /Renew6 参数.../flushdns 参数.../displaydns 参数2、Ipconfig 命令 ipconfig命令也是使用率非常高的一个命令,可用于显示系统的TCP/IP网络配置值,并刷新动态主…

Swift 中使用 SQLite——查询数据
本文主要介绍如何查询 SQLite 结果集,以及封装 SQLite 的操作方法。 准备测试代码 /// 从数据库中加载 person 数组 class func persons() -> [Person]? {// 1. 准备 SQLlet sql "SELECT id, name, age, height FROM T_Person;"// 2. 访问数据库// …

提高C++性能的编程技术笔记:总结
《提高C性能的编程技术》这本书是2011年出版的,书中有些内容的介绍可能已经过时,已不再适用于现在的C编程中,但大部分内容还是很有参考意义的。 这里是基于之前所有笔记的简单总结,笔记列表如下: 跟踪实例࿱…

13岁小孩都跟我抢Python了,完了!
以下来自一位程序员母亲和工作人员的对话。程序员妈妈:您好,可以帮我推荐一本适合我家小孩看的编程书籍吗?兔子:可以的呀,《Scratch从入门到精通》,这本书适合小孩学习,您可以先看一下哦~程序员…

Windows Mobile 6.0 SDK和中文模拟器下载
【转】 Windows Mobile 6.0 SDK和中文模拟器下载 Windows Mobile 6.5 模拟器2010年12月06日 星期一 07:48转载自 zhangyanle86终于编辑 zhangyanle86Windows Mobile 6.0 SDK和中文模拟器下载 SDK 6.0下载页面:http://www.microsoft.com/downloads/details.aspx?fam…

wxPython:Python首选的GUI库 | CSDN博文精选
作者 | 天元浪子来源 | CSDN博客文章目录概述窗口程序的基本框架事件和事件驱动菜单栏/工具栏/状态栏动态布局AUI布局DC绘图定时器和线程后记概述跨平台的GUI工具库,较为有名的当属GTK、Qt 和 wxWidgets 了。GTK是C实现的,由于C语言本身不支持OOP&#x…