0%

2019 8 月更新

实际上如果不想要整个 IDE,可以仅安装 Build Tools。
下载链接位于 https://aka.ms/buildtools 中的
"所有下载" -> "Visual Studio 20xx 工具" -> "VS 20xx 生成工具"


Visual Studio 2017 Comunity 版

在学习 C/C++ 时, 需要编译源文件, 但是不希望为此而打开这个庞大的 IDE, 所以研究如何在命令行中调用它的编译工具链:

1
2
3
4
cl.exe      编译
link.exe 连接
lib.exe 加载 lib
nmake.exe Makefile 的解析器

但是, 即便找到了这些可执行文件的路径, 还需要解决一大堆 include, lib 等等的搜索路径, 非常麻烦.

阅读全文 »

  • 判断整数奇偶性
  • 快速取余数
  • 快速幂
  • 交换两值

位运算的运算规律

位运算分别有 & 与, | 或, ~ 非, ^ 异或 四种.

与运算

两者同时为 1 才为 1.

左操作数 右操作数 结果
1 1 1
0 1 0
1 0 0
0 0 0

或运算

两者一者为 1 就为 1.

左操作数 右操作数 结果
1 1 1
0 1 1
1 0 1
0 0 0

非运算

反过来.

异或运算

相同为 0, 不同为 1

左操作数 右操作数 结果
1 1 0
0 1 1
1 0 1
0 0 0

运算律

交换律

1
2
3
a & b == b & a;
a | b == b | a;
a ^ b == b ^ a;

自运算

1
2
3
a & a == a;
a | a == a;
a ^ a == 0;

结合律

1
2
3
a & b | b == b;
a | b & a == a;
a ^ b ^ a == a ^ a ^ b == 0 ^ b == b;
阅读全文 »

在 Hexo 站点上布置 Gitalk

安装 Gitalk, 实际上就是为博客添加了一些 JavaScript 代码, 只有在浏览器上发生访问时才会运行.

本文介绍 Hexo 的 NexT 主题安装 Gitalk 的方法.

Gitalk 官方提到的一种安装方式是通过 npm install 安装, 但是我根本不知道应该在哪里添加 import gitalk 代码, 所以就按在页面引用 gitalk.js 的方法安装了.

阅读全文 »

图片显示中文

问题原因

matplotlib 中作图, 一旦遇到中文就会出现方块符号, 表示无法显示.

出现这个问题的原因只可能有两种: 字符编码不对, 没有支持的字体.

现在字符编码都是标准的 utf-8 了, 并且 Python 运行时处理字符都会转换为 Unicode, 因此这个问题只可能是没有支持的字体了.

在网上找到的很多解决方案, 都提到要绘制中文需要使用 u'中文' 这样的语句, 猜测这个是 Python2 的遗留, Python3 实测不需要这么做.

阅读全文 »

Jupyter Notebook 可以更换笔记本使用的内核, 除了 Python 之外, 还可以支持 C++!

要添加其他支持的语言, 在 此链接 查看支持的语言内核.

这些内核中, 有些是基于 Ipython Kernel 开发的, 因此需要在运行时指定, 并且在保存时为 .ipynb 文件, 例如 bash kernel, IOctave kernel(基于 Oct2Py) 等.

详细的方法见 此文档.

阅读全文 »

概览

安装了 Jupyter Notebook 之后, 使用了大约一周的时间(从安装到现在, 中间有很长一段时间是闲置的), 越发感觉到 Jupyter Notebook 的强大之处了:

用Cell区分代码块与文本

在 Jupyter Notebook 中, 是用 Cell 来作为文件的基本单位, 对于每一个 Cell, 可以设定独立的属性, 比如设定为

  • Code 代码块
  • Markdown
  • Raw NBConvert 纯文本, 在 Jupyter 中不会对此 Cell 的内容进行计算处理, 但是把 notebook 转换为其他格式, 比如 html 或 pdf 时, 会将此 Cell 按照对应规定转换.
  • Heading 标题, 但是根据官方的建议, 应当在 Markdown 中使用对应语法创建标题, 此选项为历史遗留.

因为 Jupyter NoteBook 将代码与说明文本区分得明明白白, 并且其 Markdown Cell 支持所有 Markdown 特性, 甚至可以使用 MathJax 渲染数学环境! 这就是任何其他形式的 Python 编辑器无法做到的了. 一边在 Code 中编写代码, 一边还能在 Markdown 中进行说明, 插入表格,图片,链接,数学公式等等一系列注释无法做到的表达方式.

实时输出

在 Jupyter Notebook 中, 其代码的运行结果可以紧跟在代码块后输出. 在每一个代码块前, 都有一个 In [xxx] 标识符, 如果有输出, 则输出块前也会有一个 Out[xxx] 并且, 如果使用 matplotlib 等画图工具, 还能直接在网页上显示图像!

如果在进行一系列处理后, 代码产生的返回值没有赋值给一个变量, 那么此值就会直接输出. 也可以使用 print 等方法将值输出, 但是不会有 Out[xxx] 标记. 作图也是如此.

多种格式导出

原生的 Jupyter Notebook 就可以将 .ipynb 文件导出为 markdown, html, pdf, tex 等多种格式的文档, 并且同样区分不同的 Cell.

如果文档中有图, 那么在导出为 markdown, tex 时, 会导出一个压缩包, 图片在文本中以相对路径的方式引用.

如果导出 pdf, 需要调用系统上安装的 LaTeX 引擎, 如果要成功渲染中文还需要一番折腾.

也可以导出为 .py 脚本, 这会去除非 Code 的 Cell.

阅读全文 »

排列 Permutation

假设有这么一条列表, 其中的元素有:

1
ABCDEFG

那么, 要生成规律的排列, 很明显得靠递归, 需要

  1. 从上次传入的待处理列表中除去一个元素(按顺序循环)
  2. 将除去的元素写入已处理列表
  3. 将列表传入递归
  4. 直到待处理列表为空或取元素的数目达到条件, 就终止递归, 并将已处理的元素写入存储池

当所有递归步骤结束后, 存储池中就存储了目标序列的排列.

排列的数目, 就是数学中的 排列数:

Amn=m!n!A_m^n = \frac{m!}{n!}

以举例的列表为例,

1
2
3
4
5
6
7
8
9
10
11
ABCDEFG
-> A BCDEFG
--> ...
-> B ACDEFG
--> ...
-> C ABDEFG
...
-> E ABCDFG
--> EA BCDFG
--> EB ACDFG
...

Python 标准库

1
2
3
4
5
itertools.permutations(iterable:iter[, r:int])->itertools.permutations:
"""输入可迭代对象与层数(默认为总长), 返回一个排列实例,
不可用对其他可迭代对象的方法取出其中元素, 除了 for 循环.
但是可先将其转换为 list 或 tuple.
(每一个元素为一个排列)"""
1
2
3
4
5
6
7
8
9
10
11
12
13
def myperm(Iter:list, Count:int)->list:
result = []
def _trueAlgo(done:list, rest:list, count:int)->list:
if count == 0:
nonlocal result
result.append(tuple(done))
else:
for index in range(len(rest)):
_rest = rest[:]
_del = _rest.pop(index)
_trueAlgo([*done, _del], _rest, count-1)
_trueAlgo(done=[], rest=Iter, count=Count)
return result

组合 Combination

组合与排列的算法大同小异, 只不过组合需要注意, 组合是无序的, AB 与 BA 是同一个组合.

因此, 只需要对排列的代码进行一点小修改, 把已经使用过的列表截断即可.

组合的数目就是 组合数:

Cmn=m!n!(mn)!C_m^n = \frac{m!}{n!(m-n)!}

同样, 以例子来说明.

1
2
3
4
5
6
7
8
9
10
11
12
13
ABCDEFG

-> A BCDEFG
--> AB CDEFG
--> AC DEFG
--> AD EFG
--> AE FG
--> ...
-> B CDEFG
--> BC DEFG
--> ...
--> BE FG
...

Python 标准库

1
2
3
4
5
itertools.combinations(iterable:iter, r:int) -> itertools.combinations:
"""输入可迭代对象与层数(必选), 返回一个组合实例,
不可用对其他可迭代对象的方法取出其中元素, 除了 for 循环.
但是可先将其转换为 list 或 tuple.
(每一个元素为一个组合)"""
1
2
3
4
5
6
7
8
9
10
11
12
13
def mycombi(Iter:list, Count:int)->list:
result = []
def _trueAlgo(done:list, rest:list, count:int)->list:
if count == 0:
nonlocal result
result.append(tuple(done))
else:
for index in range(len(rest)):
_rest = rest[index:] #!免逆序重复
_del = _rest.pop(0)
_trueAlgo([*done, _del], _rest, count-1)
_trueAlgo(done=[], rest=Iter, count=Count)
return result

在 Linux 下, 我知道要运行一个 长期运行的, 不随当前终端的退出而结束的, 输出被重定向的后台任务, 可以使用 nohup 命令.

但是在 Windows 的 PowerShell 中, 有什么命令可以起到这样的效果呢?

阅读全文 »