Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

Debian_Linux下安装Docker的方法

发表于 2018-10-18

Docker是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。

Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(name space),来创建独立的软件容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网上、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网上。

下面即记录在Debian Linux下按照Docker社区版的方法。

前期准备

添加Docker的pgp key。

1
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

配置Docker的Apt仓库。

1
echo 'deb https://download.docker.com/linux/debian stretch stable' | sudo tee /etc/apt/sources.list.d/docker.list

更新Apt仓库

1
sudo apt-get update

安装Docker

1
2
3
4
5
6
// 清除之前安装的Docker版本
apt-get remove docker docker-engine docker.io
// 在安装最新的Docker社区版
apt-get install docker-ce
// 测试docker
docker run hello-world

以非root用户管理docker

1
2
sudo groupadd docker
sudo usermod -aG docker $USER

参考文献

  1. https://zh.wikipedia.org/wiki/Docker ,by wikipedia.

tensorflow学习笔记

发表于 2018-10-14 | 更新于 2022-02-05

TensorFlow™ 是一个开放源代码软件库,用于进行高性能数值计算。借助其灵活的架构,用户可以轻松地将计算工作部署到多种平台(CPU、GPU、TPU)和设备(桌面设备、服务器集群、移动设备、边缘设备等)。TensorFlow™ 最初是由 Google Brain 团队(隶属于 Google 的 AI 部门)中的研究人员和工程师开发的,可为机器学习和深度学习提供强力支持,并且其灵活的数值计算核心广泛应用于许多其他科学领域。

tensorflow入门

tensorflow实现机器学习的基本步骤如下:

  1. 定义模型,建立数据流图
  2. 定义loss,并指定优化器
  3. 传入数据并进行训练
  4. 使用测试集进行评测

通用代码框架

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import tensorflow as tf

# 初始化变量和模型参数,定义训练闭环中的运算

def inference(X):
# 计算推断模型在数据X上的输出,并将结果返回

def loss(X,Y):
# 依据训练数据X及其期望输出Y计算损失

def inputs():
# 读取或生成训练数据X及其期望输出Y

def train(total_loss):
# 依据计算的总损失训练或调整模型参数

def evaluate(sess,X,Y):
# 对训练得到的模型进行评估

# 在一个会话对象中启动数据流图,搭建流程
with tf.Session() as sess:
tf.initialize_all_variables().run()

X,Y=inputs()

total_loss=loss(X,Y)
train_op=train(total_loss)

coord=tf.train.Coordinator()
threads=tf.train.start_queue_runners(sess=sess,coord=coord)

# 实际的训练迭代次数
training_steps=1000
for step in range(training_steps):
sess.run([train_op])
# 出于调试和学习的目的,查看损失在训练过程中递减的情况
if step % 10 =0:
print "loss: ",sess.run([total_loss])

evaluate(sess,X,Y)

coord.request_stop()
coord.join(threads)
sess.close()

保存训练检查点

借助tf.train.Saver类可创建检查点文件,将数据流图中变量保存至其中。修改后框架如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 模型定义代码
# 创建一个Saver对象
saver=tf.train.Saver()

# 在会话对象中启动数据流图,搭建流程
with tf.Session() as sess:
# 模型设置

# 实际的训练闭环
for step in range(training_steps):
sess.run([train_op])

if step % 1000 ==0
# 将创建遵循命名模板为my-model-{step}的检查点文件,默认保存最近的5个文件
saver.save(sess,'my-model',global_step=step)

# 模型评估

saver.save(sess,'my-model',global_step=training_steps)
sess.close()

如果希望从检查点恢复,则使用tf.train.get_checkpoint_state方法验证检查点文件的存在,并使用tf.train.Saver.restore方法恢复变量值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
with tf.Session() as sess:
# 模型设置

initial_step=0

# 验证之前是否已经保存了检查点文件
ckpt=tf.train.get_checkpoint_state(os.path.dirname(__file__))
if ckpt and ckpt.model_checkpoint_path:
# 从检查点恢复模型参数
saver.restore(sess,ckpt.model_checkpoint_path)
initial_step=int(ckpt.model_checkpoint_path.rsplite('_',1)[1])

# 实际的训练闭环
for step in range(initial_step, training_steps):
...

参考文献

  1. TensorFlow指南,by tensorflow.
  2. 尝试理解 shape 的用法,by mcoder.
  3. Python中的列表(list),元组(Tuple),字典(Dict)和集合(Set),by liuyanfeier.
  4. 使用list和tuple,by liaoxuefeng.
  5. Python的reshape(-1,1),by lxlong89940101.
  6. numpy.array,by numpy.
  7. TensorFlow 官方文档中文版,by pythontab.
  8. numpy.array shape (R, 1) and (R,) 的区别,by 时间被海绵吃了2.
  9. tf.variable_scope中的reuse,by 超级无敌小小顺利.
  10. Tensorflow共享变量机制理解与应用,by BetterManPeter.
  11. tf.reduce_mean()函数解析(最清晰的解释),by 我是管小亮.
  12. 深度解析OPENAI-MADDPG,by 起点教程.
  13. diagonal Gaussian policies的一些理解,by Intuition.
  14. 强化学习随机策略之高斯似然数原理与代码实现,by 神奇的战士.
  15. 数学基础——浅谈似然,by shidata.
  16. gym中的discrete类、box类和multidiscrete类简介和使用,by iitter.
  17. OPENAI Baeslines 详解(零)综述,by zachary2wave.
  18. 强化学习Gym库学习实践(一),by 愣娃RC.
  19. Gym使用简介,by Lisnol.
  20. 左右互搏,self-play,《Emergent Complexity via Multi-Agent Competition》,by 王小惟 Weixun.
  21. 多智能体深度强化学习——MADDPG算法代码分析(tensorflow),by RavenRaaven.
  22. 多元高斯分布以及高斯分布微分熵,by 侠肝义胆陈浩天.
  23. tf.split 与 tf.squeeze 用法,by 应钟有微.
  24. 碎片化学习之数学(二):Categorical Distribution,by 李新春.
  25. Distribution is all you need:这里有12种做ML不可不知的分布,by 机器之心.
  26. tensorflow中axis理解非常重要,by 爱视觉.
  27. tensorflow中四种不同交叉熵函数tf.nn.softmax_cross_entropy_with_logits(),by iotstu.
  28. TF里几种loss和注意事项,by 崔权.
  29. Softmax函数和Sigmoid函数的区别与联系初识CV,by 初识CV.
  30. 损失函数|交叉熵损失函数,by 飞鱼Talk.
  31. tf.random_uniform的使用,by UESTC_C2_403.
  32. sparse_softmax_cross_entropy_with_logits与softmax_cross_entropy_with_logits,by 光彩照人.
  33. 关于LogSumExp,by Hurry Z.
  34. softmax 与 log sum exp,by 我要给主播生猴子.

Python常用库简介

发表于 2018-10-14 | 更新于 2018-12-05

Python的高效开发建立在大量常用库基础上,因此掌握常用的Python库十分必要。下面简单介绍Python的各类常用库。

常用标准库

  • os: 访问操作系统功能模块
  • sys: 访问一些环境变量和与 Python 解释器交互
  • datetime: 日期时间处理
  • collections: 高级数据结构,有序字典,队列等等
  • uuid: 生成 UUID 模块
  • random: 随机数生成模块
  • re: 正则表达式模块
  • json: JSON 处理模块
  • pdb: 单步调试模块

科学计算

  • scipy:基于Python的matlab实现,旨在实现matlab的所有功能。包含Numpy、Ipython、Pandas、Matplotlib、Sympy等常用库
  • numpy: 基于Python的科学计算第三方库,提供了矩阵,线性代数,傅立叶变换等等的解决方案
  • pandas: 支持表格等多维数据
  • matplotlib: 用Python实现的类matlab的第三方库,用以绘制一些高质量的数学二维图形

命令交互

  • ipython: 交互命令行,适合科学计算
  • jupyter: ipython notebook 的延伸,可以直接放在github上
  • argparse:(Python 标准库)用于命令项选项与参数解析的模块

爬虫相关

  • urllib: (Python 标准库),接受URL请求的相关模块
  • http: (Python 标准库),处理所有客户端–服务器http请求的具体细节
  • requests: 第三方库,人性化的HTTP请求库,比urllib更好用
  • pillow: 处理验证码
  • rsa: 处理加密问题
  • BeautifulSoup:解析html文档为用户提供需要抓取的数据
  • lxml: 是基于 libxml2 这一 XML 解析库的 Python 封装,解析速度比 Beautiful Soup 更快

环境管理

  • virtualenv:创建独立 Python 环境的工具
  • virtualenvwrapper:virtualenv 的一组扩展

包管理

  • pip:Python 包和依赖关系管理工具
  • conda:跨平台,Python 二进制包管理工具

并发和并行

  • threading:(Python 标准库)更高层的线程接口
  • multiprocessing:(Python 标准库) 基于进程的“线程”接口

日志

  • logging:(Python 标准库) 为 Python 提供日志功能。

兼容性

  • six:Python 2 和 3 的兼容性工具

计算机视觉

  • opencv

机器学习

  • tensorflow

参考文献

  1. Python 笔记四:Python的常用库收集, by brandonxiang

Virtualenv简易教程

发表于 2018-10-09 | 更新于 2021-06-07

virtualenv是一个创建隔离python环境的工具,主要用于解决包冲突问题。

安装方法

1
sudo pip3 install virtualenv -i https://mirrors.aliyun.com/pypi/simple/

使用方法

创建项目的虚拟环境

1
2
$ cd my_project_folder
$ virtualenv venv #venv是虚拟环境名称

执行上述命令后,将生成一个与虚拟环境同名的文件夹,包含 Python 可执行文件和 pip 库的拷贝,可用于安装其他包。

但是默认情况下,虚拟环境中不会包含也无法使用系统环境的global site-packages。比如系统环境里安装了 requests 模块,在虚拟环境里import requests会提示ImportError。如果想使用系统环境的第三方软件包,可以在创建虚拟环境时使用参数–system-site-packages。如下所示:

1
virtualenv --system-site-packages venv

此外可以指定虚拟环境所使用的 Python 版本,但前提是系统中已经安装了该版本:

1
virtualenv -p /usr/bin/python2.7 venv

使用虚拟环境

启动虚拟环境:

1
2
3
cd venv
source bin/activate
python -V

退出虚拟环境:

1
deactivate

virtualenvwrapper

virtualenvwrapper是virtualenv 的扩展工具,提供了一系列命令行命令,可以方便地创建、删除、复制、切换不同的虚拟环境。同时,使用该扩展后,所有虚拟环境都会被放置在同一个目录下。

安装方法

1
pip3 install virtualenvwrapper

环境配置

在$home/.bashrc文件中添加如下几行代码:

1
2
3
4
5
# bash -f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true
if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
fi

使用方法

mkvirtualenv 也可以使用 virtualenv 的参数,比如 –python 来指定 Python 版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mkvirtualenv venv # 创建虚拟环境,虚拟环境目录都在 WORKON_HOME 里

lsvirtualenv -b # 列出虚拟环境

workon [虚拟环境名称] # 切换虚拟环境

lssitepackages # 查看环境里安装了哪些包

cdvirtualenv [子目录名] # 进入当前环境的目录

cpvirtualenv [source] [dest] # 复制虚拟环境

deactivate # 退出虚拟环境

rmvirtualenv [虚拟环境名称] # 删除虚拟环境

conda vs. pip vs. virtualenv

Conda是一个开源包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换。 它适用于Linux,OS X和Windows,是为Python程序创建的,但可以打包和分发任何软件。

Pip是一个以Python计算机程序语言写成的软件包管理系统,用于安装和管理软件包。

它们直接的区别如下:

conda vs. pip vs. virtualenv

pip使用方法

1
2
3
4
# 导出python安装包环境
pip freeze > requirements.txt
# 导入requirements文件
pip install -r requirements.txt

参考文献

  1. 最全的Python虚拟环境使用方法,by Stevent.
  2. Pipenv:新一代Python项目环境与依赖管理工具,by 李辉.
  3. Python 修改 pip 源为国内源,by 花晓星辰.

Blender简易教程

发表于 2018-09-19 | 更新于 2024-11-23

最近需要用Blender建3D模型,试用了半天,将经验简单总结一下。

3D建模流程

  • 建立3D模型:通常在Blender的3D视图窗口对物体进行建模。
  • 拆分制作纹理:设置缝合边,再展开。打开U/V图像编辑器窗口即可看到拆分效果。导出图片后制作纹理。
  • 使用材质贴图:设置材质着色,添加纹理。

Blender快捷键

Blender快捷键很多,熟练使用可加速3D模型的建立。

3D视图窗口

字母键

  • A:全选、取消选择
  • Shift+A:增加物件,新建的物件会出现在准星的位置
  • B:框选,加Shift取消选择,按Esc退出选择
  • C:刷选,加Shift取消选择,按Esc退出选择
  • Shift+C:将游标设置到坐标系中心
  • Ctrl+Shift+C:为骨头添加约束
  • Shift+D:复制对象
  • E:挤出选中对象
  • Shift+E:编辑模式下,打开对称镜像挤出骨架
  • F:编辑模式下,在点的基础上构建边或面;在权重绘制模式下,设置笔刷大小
  • G:移动选中对象
  • Alt+G: 在Pose Mode下,按“Alt+G”骨架归位
  • H:隐藏对象(Hide)
  • Alt+H:显示对象
  • I:增加关键帧
  • Ctrl+I:物体模式下,反选所有未选择的物体
  • Shift+I:在Pose Mode下,选中骨架,再按“Shift+I”插入反关节
  • Ctrl+J: 在Pose Mode下,连接两个独立的骨架,以便在编辑模式下同时编辑;在Object Mode下,选择两个物件后合并
  • K: 切割,按“enter”键完成切割。按“k”键接着按住“ctrl”键移动到线框上可以自动定位到线的二分之一处。按“k”键接着按一下“c”键可以水平垂直或者45度进行切割。按“k”键接着按一下“z”键可以对物体一圈进行切割。
  • Ctrl+L:编辑模式下,选择一个点,在Ctrl+L将选择与点相连的连续表面
  • M:选中物体,按“M”键,再选择要将物体放置的图层。
  • N:打开物体属性
  • Ctrl+P:编辑模式下,设置多个骨头的父骨头;或者物体模式下,设置多个物体的父级。
  • Alt+P:物体模式下,取消物体的父子关系。
  • R: 旋转
  • Alt+R: 在Pose Mode下,按“Alt+R”骨架归位
  • Ctrl+R: 环切并滑动
  • S: 缩放
  • S+XYZ:沿XYZ轴方向缩放
  • Alt+S:法向缩放
  • T:打开左侧工具栏
  • U:编辑模式下按“U”,打开UV映射菜单,选择活动面再全选,然后UV展开
  • Ctrl+U:存储为启动文件
  • W:快捷拓展命令栏
  • X:删除
  • Z:线框模式与实体模式之间切换
  • Shift+Z:视口着色切换到实时渲染模式
  • ]:在Pose模式下,选择主骨头,再按“]”可直接选择下一根骨头
  • Shift+]:在Pose模式下,选择主骨头,再按“Shift+]”可直接选择下一根骨头
  • Ctrl+Space:调出三维坐标系操纵物体
  • Ctrl+Tab:进行点、线、面的编辑模式
  • Ctrl+Alt+Q:切换四视图
  • Ctrl+向上箭头:最大化对应视图
  • Shift+空格键:放大视图
  • Tab:编辑模式和物体模式切换
  • Ctrl+句号.:仅变换原点

功能键

  • F12:计算结果(算图模式),如果是黑色的,需要把摄像机和光源放在同一个图层中,或者选择摄像机和光源的图层。

数字键

数字键主要用于视角切换

  • 1:前视图
  • 3:侧视图
  • 5:正交与透视之间切换
  • 7:俯视图

鼠标键

  • 右键:选择物体
  • shift+中键:平移
  • 滚轴/(Ctrl+中键拖拽):缩放

参考文献

  1. Blender常用快捷键,by JinunMeng.
  2. 如何系统的学习blender?,by zhihu.
  3. 贴图、纹理、材质的区别是什么?,by zhihu.
  4. 材质、贴图、纹理的区别,by MATU.
  5. 材质和纹理的区别,by zhuyong006.
  6. 一文看懂材质/纹理 Material, Texture, Shading, Shader 的区别,by kidult00.
  7. Blender 移动、旋转、缩放,by heavi.
  8. 数字人轻松学习Blender系列之七:坐标,by DIGITALMAN.
  9. 【转载】Blender 常用快捷键大全,by ShaderJoy.

Windows下将cmd命令添加到右键菜单

发表于 2018-09-11

经常需要使用cmd命令,如果打开cmd窗口后在cd到目标路径,则非常麻烦。可使用如下方法将cmd添加到右键菜单,这样一打开cmd窗口就到了目标路径。设置方法如下:

  1. 打开注册表
  2. 添加注册项
    1
    2
    3
    a) 找到[HKEY_CLASSESS_ROOT\Folder\shell]子键,在其下新建“cmdPrompt”子项,在窗口右侧名称列上点击右键修改,将数值数据改为“CMD快速通道”。

    b) 再在这个项下,新建名为“command”子项,同样修改数值数据修改为c:\windows\system32\cmd.exe /k cd "%1"
    设置完成后即可在目标路径文件夹上右键单击,选择“CMD快速通道”命令,打开cmd窗口的同时,已跳转到目标路径下。

Windows平台Python安装与配置教程

发表于 2018-09-07 | 更新于 2019-03-17

下面记录在Windows平台安装配置Python的过程。

  1. 去Python官网下载最新的Python3,当前最新版本为3.7。
  2. 双击Python3.7的安装包进行安装,设置安装路径为C:\Python\Python37,同时将Python路径加入系统Path变量中。
  3. 使用如下命令安装ipython。加参数–trusted-host,否则会报错误:SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed。加参数-i,制定国内pip源,显著提高下载速度。
    1
    pip install ipython -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn

Windows与Linux双系统Grub引导修复

发表于 2018-09-06 | 更新于 2018-11-20

因为个人爱好,我再笔记本中安装了Windows和Linux的双系统。最近因为Windows系统故障原因,重装Windows系统,导致无法引导Linux启动。

故障原因是之前安装双系统时,先安装Windows,再安装Linux,这样将由Grub2来引导Linux和Windows的启动。而重装Windows的过程中,将覆盖Grub2引导程序,导致无法Linux的启动。

故障解决方法是重新在硬盘中写入Grub2引导程序。具体步骤如下:

  1. 使用Linux安装盘,使用Live CD方式进行Linux系统。
  2. 使用fdisk -l命令查看硬盘信息。
  3. 使用grub-install –root-directory=/media/boot /dev/sda将grub2引导程序写入硬盘。/media/boot为引导分区所在位置,grub-install写入grub2引导程序时需要使用引导分区所在linux映像。
  4. 使用update-grub2更新引导配置。

中文文献免费下载方法

发表于 2018-08-26 | 更新于 2018-09-09

下面记录经过验证可用的中文文献下载方法:

  1. idata中国知网
    1
    2
    3
    4
    idata中国知网网址:https://www.cn-ki.net/
    进入系统,注册账号,登陆就可以每天免费下载五篇知网论文。
    额度用完之后,第二天可以继续下载。
    每天五篇的额度基本能满足需要,这样还不够的话,可以多注册几个账号。
  2. 全国图书馆参考咨询联盟
    1
    2
    3
    全国图书馆参考咨询联盟网址:http://www.ucdrs.superlib.net/
    很全,可以查图书,查期刊,报纸等。还有硕士,博士的毕业论文。不仅有中文,还有外文。
    网站无需注册,通过文献传递服务,即通过邮箱接收全文。最快一两分钟,最慢三四个小时即可接收到全文。
  3. 上海研发公共服务平台
    1
    2
    3
    上海研发公共服务平台网址:http://www.sgst.cn/。
    注册后可直接下载,论文、文献数量直接匹配知网和万方数据。
    下载速度较快,但有数量限制,可注册多个用户名。
  4. 库问搜索
    1
    2
    库问搜索网址:http://www.koovin.com/。
    库问搜索提供千万级文献免费下载。

C++跨平台移植开发思考

发表于 2018-07-16 | 更新于 2022-07-17

最近需要将一份C++代码通过Emscripten编译成asm.js,结果失败,因为这份C++代码使用MFC GUI库,导致Emscripten编译失败。这引起了我对C++跨平台移植的思考。

C++代码理论上能实现源代码级别的跨平台移植,即同一份代码可以不加修改的在不同的平台上编译运行且表现一致。这要求编写的C++代码符合跨平台移植的规范,如链接[1]所指出的那样,它给出了很多实现C++代码跨平台移植的编码细节,在编写跨平台的底层库方面十分有用。但在编写跨平台的C++应用方面,应使用经过长期实践证明能用的跨平台库来帮助编码,建立在巨人的肩膀上,使跨平台C++代码编写工作变得简单容易。下面给出一些常用的跨平台C++库供参考:

  1. 语言及基础库
  • 标准 C++:标准 c++ 是98年制定的,现在主流的 c++ 编译器都能够比较好的支持了。这里建议使用VC7.1和GCC4.0及以上版本。在Linux中,glibc是标准C的实现,libstdc++则是标准C++的实现。在Windows中,VS2015之前MSVCRT.DLL是标准C/C++的实现,之后UCRTBASE.DLLz则是标准C/C++的实现。
  • boost:boost 则是 C++ 标准委员会的一群人弄起来的一个 C++ 库集合,其中不少库以经进入 C++ TR1,可以说是准标准。使用这里的库我们有着充分的理由。象字符串的操作可以用 boost 的 String algorithms 库,格式化操作可以用 boost::format,正则式可用 boost::regex 等等。
  1. 网络
  • ACE(Adaptive Communication Environment):ACE是一个以C++的Template技术所做成的开放源代码的可跨平台的网络应用程序的程式库套件。ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework),在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++ Wrapper Facade(包装外观)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。
  • Boost.Asio:用于网络和底层I/O编程的跨平台的C++库
  1. 数据库
  • OTL (Oracle, Odbc and DB2-CLI Template Library):
    不但支持跨平台,还跨数据库。OTL支持以下面的数据库 : OTL Oracle ,SQL Server, Access, MySQL。还有其它的库如DTL,这个库不但支持ODBC,它还支持数据库的原生接口,可以有更佳的性能。
  1. GUI
  • QT:QT是双认证的,当你的程序免费时它就免费,你的程序打算卖钱时,它也要,而且要价很高。所以,如果有版权,成本上的考虑的话,则可以考虑wxWidgets。
  • wxWidgets:wxWidgets(/wɪksˈwɪdʒɪts/,原名wxWindows)是一个开放源代码且跨平台的对象工具集(widget toolkit),其库可用来创建基本的图形用户界面(GUI)。wxWidgets由Julian Smart于1992年首先开发。
  1. 科学计算
  • GSL:GNU科学库。
  1. 游戏开发
  • Cocos2d-x:一个跨平台框架,用于构建2D游戏,互动图书,演示和其他图形应用程序。
  1. 视频
  • FFmpeg:一个完整的,跨平台的解决方案,用于记录,转换视频和音频流

参考文献

  1. c++跨平台移植指南, by 洪柏敏.
  2. ACE自适配通信环境,by wikipedia.
  3. C++库汇总, by 工程师WWW.
  4. 值得推荐的C/C++框架和库, by zhihu.
  5. printf 格式化输出符号详细说明,by jackytse_.
  6. 理一理字节对齐的那些事,by 守望.
  7. 不见得你会计算C字符串长度,by veryitman.
  8. 浅析C语言之uint8_t / uint16_t / uint32_t /uint64_t,by 海阔天空sky1992.
  9. char,int,float,double所占字节数,by 张小铭.
  10. c++ 时间类型详解 time_t,by runoob.
  11. 网络传输——序列化,by bw_0927.
  12. 干货:构建C/C++良好的工程结构,by Froser.
  13. UTF-8与UTF-8 without BOM,by 苏州-微尘.
上一页1…495051…53下一页

Jack Huang

528 日志
68 标签
© 2025 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse