分类:编程
计算机(网络)的文章分为了三部分:
此为第二部分。
常用标签:
C++ 55, Matlab 26, Python 21, Excel 20, VBA 14, 数据库 12, 办公自动化 10, folly 9, 编程和算法效率 9, Linux 6
-
先编译 libfmt.a :
-
在一个
rsync
命令同步文件夹时: -
在 Python 里,我们可以直接用 os.system 来执行系统命令(假设下面的 strip 是一个可以处理多个文件的第三者程序):
-
今天写一段程序时遇到一个问题,查了好一会才搞清楚。代码可以简化为下面这个小代码:
-
Javascript 在很多地方会出现字符串隐私转换,需要特别留意。
-
在 Python 里,我们可以用
request.post
提交json
数据: -
一个最直接的方法如下,最后得到的
s2
就是一个普通的pandas.DataFrame
,可以继续处理: -
我们用访问网页动态数据时,经常会提交一些参数,比如用
axios.get
: -
最近写一个 vue 的写法:
-
在写代码过程中,会定义一些变量但没有用,比如为了保持函数参数原型:
-
今天写 Python 代码时遇到一个恶心的 bug ,花了好一会才定位和搞清楚。我的目标是寻找第一个非 NAN 的数的位置(其中 array 是一个 numpy 向量),很自然有下面实现:
-
Python 的官方自带库
json
库处理 JSON 很方便,但它只支持标准的 JSON 格式。rapidjson 库来自于 json 的 C++库,速度比json
库快五倍,而且支持一些非标准的 JSON 字符串。 -
在 Python 中,有时候为了获取当前运行的脚本的同目录下的另外一个文件,会这么写:
-
命令行参数的初步说明,请参考argparse 模块用法实例详解,写的很清晰而详细。
-
首先任意定义一个结构,注意不要用 std::string 非平凡布局的变量,用 char[] 代替:
-
vim 有一个注释相关的插件 nerdcommenter ,特别好用。可以使用
<leader>c
快速切换注释状态(不是注释就改成注释,已经是注释则取消注释): -
C++对一个有序序列
[first, last)
(first
、last
都是iterator
,可简单理解为位置指针),以及指定值v
,标准库直接提供二分查找的函数std::lower_bound
和std::upper_bould
: -
在升级 django-wiki 后, Python 的 markdown 库里爆出来一个错误:
-
最近遇到一个诡异的问题,一个程序经常卡死。最后定位到 fmt 和下面简单的例子:
-
requests 除了 url 之外,还有 params, data 和 files 三个参数,用于和服务器后台交互。
-
-
BASH 的一些笔记。
-
如果我们用
std::getline
或者简单的std::cin >>
获取用户输入,有一个问题是,它会阻塞掉整个程序,用户必须有输入后才能继续执行。如果这个输入是单独的线程,它还会阻止整个程序的退出。 -
std::vector
有两个大小: -
-
在 Python 中操作文件或字符串时,有时候会碰到 UnicodeDecodeError 异常:
-
主要形式是下面三种。后面两种实际指向同一个位置(如果
path
是一个已存在的文件夹),但处理结果会有所差异。 -
其实moment.js 官方主页已经很详细和清晰了,这里做一下笔记加强记忆。
-
datetime 是 Python 的标准库:
-
在 Python3 以上,通常说的字符串是指
unicode
字符串,以下将不再重复强调。 -
核心就是
threading.Thread
: -
Pyhon 的抽象基类( abstruct base class )库
abc
定义了类似于 C++的纯虚函数的功能: -
popen
函数可以获取比std::system
函数更详细的程序输出。只是正常调用 popen 只能获取 stdout 的输出,而 stderr 的输出被忽略。 -
imp.load_source
在动态载入 python 模块时非常有用,但需要注意其特性。 -
最近升级系统,出现好多莫名其妙的问题。其中一个便是 G++编译后,发现其中一个动态链接库引用了绝对地址。正常情况下运行
ldd bin/auto
应该是下面的结果: -
目前 pytorch 已经升级到了 1.7.0 ,但在 ubuntu 20.04 下有一个非常诡异的 bug。为此,我们只能自己编译。
-
现在一般不能用 sprintf 和 strcpy ,推荐使用 snprintf 和 strncpy ,以防止缓冲区溢出:
-
C++的
fmt::format
格式化库,由于效率高,功能强大,相关的 API 已经进入C++20
,但其文档和 API 细节无法恭维。 -
一个典型的 GCC C++编译过程为:
-
C++的链接分为两部分,一个是编译时,一个是运行时。但运行时的行为也收到编译参数的影响。
-
1)在函数开始处检验传入参数的合法性
-
我们在 C++里可以这么查看
popen
是否正常执行: -
Python
的命令行包argparse
内置了-h, --help
命令。但它没有分组,和其它的命令混在一起,并且显示在最前面。我更喜欢把它放在单独的「LOG 和帮助」分组: -
numpy 的一维向量:
-
有两种方法,一种在线程的调用函数内部设置,还有一种是在外部对指定线程变量做设置。
-
Python 在搜索模块时,依次搜索
sys.path
里的位置,直到找到模块为止。下面命令可以查看当前的搜索路径: -
假设在 C++里有一个数据结构:
-
一般而言,在 Python 里:
-
我们用
boost
的命令行库program_options
解析命令行,在解释布尔命令行时使用下面代码: -
-
Python 提供很多语法糖,用起来非常方便。@dataclass 就是其中之一。
-
C++的多行宏有标准定义方式,
boost
和folly
库都采用了这种方式: -
C++11 的标准异步库至少包含下面内容:
-
前面已经提到
std::shared_ptr
有三个缺陷: -
如果理解了侵入式容器,侵入式智能指针也很容易理解。传统的智能指针
std::shared_ptr
使用了和数据无关的引用计数,这带来两个问题: -
Boost.Intrusive 是一个很有意思的实现,里面实现了很多侵入式容器,在特定环境下,可以大大提升性能。
-
智能指针在现代 C++里用得越多。以前只知道它大致的原理,比如使用引用计数。但很多实现细节并不清楚,最直接的,它是如何实现多线程安全的?今天找了 gnu c++ library 的实现好好看了一下。
-
看到网上有片段,提到没有必要自己实现自旋锁,因为标准库的 std::mutex 和现在的自旋锁的实现没有两样。比较好奇,翻了一些资料,试图找到答案。
-
主要函数是
timespec_get
,可参考https://zh.cppreference.com/w/c/chrono/timespec_get。 -
之前提到单字节且为 POD 结构的自旋锁实现
folly::MicroSpinLock
,而folly:PicoSpinLock
则只需要一个位!实现代码在https://github.com/facebook/folly/blob/master/folly/synchronization/PicoSpinLock.h。 -
要在
C++
中运行系统命令,可以直接使用std::system
函数: -
由 Facebook 开发和维护的 C++库 Folly 提供了自旋锁的实现
folly::MicroSpinLock
,代码文件地址:https://github.com/facebook/folly/blob/master/folly/synchronization/MicroSpinLock.h。 -
由 Facebook 开发和维护的 C++库 Folly 提供
folly::small_vector
,代码文件地址:https://github.com/facebook/folly/blob/master/folly/small_vector.h。 -
std::thread
是 C++ 11 新引入的标准线程库。在同样是 C++ 11 新引入的 lambda 函数的辅助下,std::thread
用起来特别方便: -
-
高效程序总是尽量避免频繁触碰在堆上分配和释放内存,所以无论是
std::string
还是folly:fbstring
都做了SSO
( small string optimization )。而folly::FixedString
是一个很有意思的实现,它可以把任意长度的字符串都放在堆上。代码可见https://github.com/facebook/folly/blob/master/folly/FixedString.h。 -
由 Facebook 开发和维护的 C++库 Folly 提供了锁
folly::MicroLock
,代码文件地址:https://github.com/facebook/folly/blob/master/folly/MicroLock.h。 -
std::tuple
的原理并不复杂,但有些细节非常有意思。其中有一个是至少在gnu C++ std
的实现中,std::tuple
是倒序存储的: -
理论上而言,当 C++提供了
std::unique_ptr
, C++的程序就不应该出现普通指针了。所有普通指针都可以用std::unique_ptr
代替,避免手动删除对象。 -
folly::fbstring
是一个完全兼容std::string
的类,可以做到无缝替换,而且性能更高。其代码参见https://github.com/facebook/folly/blob/master/folly/FBString.h。 -
folly::dynamic
提供类似于C++
的动态类型。和std::any
可以容纳任意类型不一样,folly::dynamic
只支持保存以下几种类型: -
我们知道在
javascript
以及Python 3.6+
中,所有的dict
都保留了插入顺序。但在 C++中,无论是std::map
还是std::unordered_map
,都没有保留插入顺序。当遍历时,std::map
得到的是一个根据键值排序的有序序列,而std::unordered_map
则基本是乱序。 -
我们知道在
javascript
以及Python 3.6+
中,所有的dict
都保留了插入顺序。但在 C++中,无论是std::map
还是std::unordered_map
,都没有保留插入顺序。当遍历时,std::map
得到的是一个根据键值排序的有序序列,而std::unordered_map
则基本是乱序。 -
由 Facebook 开发和维护的 C++库 Folly 提供
folly::sorted_vector_set
和folly::sorted_vector_map
,是std::map
和std::set
在小数据集上的优化版。代码见: https://github.com/facebook/folly/blob/master/folly/sorted_vector_types.h。 -
Folly 官方地址:https://github.com/facebook/folly。
-
获取程序占用的内存量,是一个诡异的需求。但程序写多了,有时候还真需要,尤其是代码运行出现问题的时候。
-
在同步一个超大文件时,发现 rsync 并没有按照预期的同步一个文件。而使用
md5sum
检验文件内容时,原始文件和目标文件的内容并不一样。 -
http://senlinzhan.github.io/2017/12/04/cpp-memory-order/ 写得最浅显易懂。记录一下以备查询。
-
出现的一个场景是将函数指针用 void
-
armadillo
是一个线性代数 C++库,封装了blas
和lapack
,提供更直观的接口。 -
由于 UNICODE 的优势,目前推荐都用 UTF-8 进行编码。
-
有时候不小心把一些大文件 commit 到了本地版本库,但往网络版本库同步时,因为文件过大被拒绝。如果在上传前,本地有多次提交,此时再在当前版本里删除这些大文件还不够,还需要把历史记录全删掉。效果要跟从来没提交过这些文件一样。
-
git
经常出现类似于HEAD detached at origin/development
的错误提示。这是因为当前的 HEAD 没有位于任何一个分支上的缘故。 -
一定要先座这一几步,否则直接用
pypyodbc
会爆下面错误: -
-
一个短小、高效的 C++函数,用来判断指定日期是星期几:
-
花括号初始化是
C++11
引入的一种初始化方法。 -
LD 在链接生成目标文件时,会从左到有扫描输入的依赖库,当依赖库之间也有依赖关系时,必须将「依赖别人的库」放在「被别人依赖的库」的前面。否则会链接失败!失败的症状有:
-
最近老遇到一个奇怪的问题。在 VS 2013 编译时,爆出很多警告:
-
在 gcc 中,存在继承关系的模版类,子类无法直接访问父类的成员,即使该成员是
protected
或public
。 -
C++的浮点数转整数有四种方法,直接类型转换、round、floor、ceil。其效果如下表:
-
C++内存检查和性能分析工具 valgrind里介绍了 valgrind 的安装,以及用于效率分析 profiler 工具。valgrind 最本来的功能是内存检查。这篇文章做简单的介绍。
-
一个好用的 C++性能分析工具需满足几个条件:
-
Python 数据分析工具 pandas 中以 DataFrame 和 Series 作为主要的数据结构。
-
由于 instantclick 不会重新运行位于 head 部分的 JavaScript 代码,而很多工具性软件,比如 MathJax、百度统计、Google Analytics、Google Code Prettify 等软件都是直接将 JS 文件插入到 head 区域。这导致这些工具在 instantclick 点击后失效,需要重新配置。
-
以前总是被教育说注释写得越详细越好,我自己写代码的时候也恨不得将每一步都用自然语言给它翻译一遍,如果没写注释就觉得不专业。后来看到健硕写的 notes ,再加上最近做一个东西,也有一些感受。
-
现在 Access 用的人应该不多了,本来我以为我也不可能用这玩意儿,但最近在用 VBA 通过 SQL 处理数据时,发现它的语法是 Access 的语法。平时对 SQL Server 语法相对熟悉一些。下文总结了 Access 和 SQL Server 语法的差异。
-
我们知道 Matlab 不支持多重 parfor 循环。下面代码会出错:
-
在写 Matlab 程序时,函数的命名方式让人头疼,很难保证刚写的一个函数名在很久以前被用过,成为隐藏的一颗炸弹。
-
parfor
适用于 -
Matlab 在启动时会自动运行脚本
startup.m
。在这个脚本里可以自动修改当前目录,修改显示方式等等。比如 -
公司使用 Lotus ,我每天都通过 Excel 编写 VBA 代码自动调用 Lotus 发送邮件,发现一个奇怪的现象。一般我们通过下面的 VBA 代码指定邮件收件人:
-
第一步,
which
函数可用来获取 Matlab 函数的全路径(包含路径和文件名)。 -
更新一下之前写的Excel 的数据库类,将其改成函数的形式,调用更简单(省却了生成类实例的步骤)。现在这个代码在工作中用了一年多,已经比较健壮。若有问题,请留言指出或与我联系。
-
在前面的文章里,我已经提到Excel 数据本身可以当做一张 SQL 查询的数据表,并在 Excel 内进行数据库运算操作。数据库查询函数可以用我之前写的Excel 数据库操作函数类。我们可以用以下方式
-
之前对普通 Excel 文件,我都保存为默认的 xlsx 格式,带 vba 的保存为 xlsm 格式。最近从同事那里见到一个高大上的 excel 文件格式: xlsb。我学习了一下,觉得甚为强大,在此推荐一下。
-
在编辑 Excel 文件时经常遇到的一个问题是,我这边用得好好地,换台机器就变了个样,或者根本用不了。下面是我在日常工作中总结的一些避免这些情况的小技巧。
-
最近 PowerPoint 打字速度慢就困扰着我。打字以后出现文字很慢,基本上我在键盘上狂敲十几个字,过了几秒钟才会慢慢的出来。长一点的段落我还需要先在别的地方写好,然后复制粘贴到 PPT。
-
键盘流(指尽量使用键盘,少动用鼠标,尤其不要在鼠标和键盘之间来回切换)是我追求的目标。我工作中用的最多的软件是 Excel ,写代码写的最多的是 Excel/VBA。用得多了自然比较关注工作效率,所以我在 Excel 键盘流上略有心得,这里给大家分享一下。网上有很全的快捷键列表,但那不是我想写的,因为太多记不下来不实用。这里只列举一下我在实际工作中的的确确总是在用的,为自己方便,也共享给大伙们。
-
Matlab 默认字体为 Monospaced ,这是种逻辑字体,它在不同语言和操作系统上映射为不同的物理字体。一般在中文系统下, Monospaced 字体被映射到宋体。它很丑,我想换掉它。
-
如果不提供错误处理方法,
VBA
在出错时会停留在出错之处。Excel/VBA 提供On Error
关键词来处理程序运行过程中的错误,具体有下面两种用法: -
Excel 中可设置每个单元格显示数字和文本的格式:
-
Matlab 2008b 才开始引入 containers.Map ,这是 Matlab 唯一的数据结构(这里的数据结构是指自带一定逻辑性的数据结构,不包括普通数据类型)。如果要有其它,比如 Queue、Set 等数据结构,只能自己编写一个。File Exchange 上有不少人做过这个工作,我也写过Queue、List、Vector 的 Matlab 对象。不过 Matlad 的面向对象编程效率极低,这种方法只能用于不太注重效率的场合。解决这个问题的另外一个方法是使用 Java 对象。
-
平时电视看得极少。有时候看看电影或电视剧,都是从网上下载或者看在线视频。俺家里的歌华有线电视欠费快两个月,一直没有续费,但没觉得生活中少了些什么,可见电视对我来说没什么用处。
-
2014-03-25 更新:我已经将该类修改成函数形式,并增加新功能,参见更新 Excel 的数据库查询函数库。
-
以前发过一个编辑和发送 Outlook 邮件的 Excel/VBA 脚本。最近公司不让用 Outlook ,强制使用 IBM Lotus Notes ,我又写了一个编辑和发送 Lotus 邮件的 VBA 脚本。
-
Excel 多表合并和查询是一个应用很广泛的问题。下面是一个简单的例子,我们需要从两张数据表里,得出每个行业的股票波动率平均值。第一个数据表保存了股票和行业的对应关系,有两列,第一列为股票名,第二列为每只股票对应的行业。第二张表保存了各个股票在各个交易日的收盘价和前收盘价,有四列,第一列是股票名,第二列为交易日,第三列和第四列分别为股票在这个交易日的前收盘价和收盘价。
-
此篇为学习笔记。
-
最近看到一个比较有趣的问题, Excel 中以下表达式代表什么含义:
-
某些时候,我们需要在 Excel 中调用命令行或者 Bash 脚本, VBA 可以通过 Shell 函数很方便地做到这一点。以下用
ipconfig /all
来举例,这条命令行语句用来获得机器的网路配置信息,包括 IP、网关等信息。它可以替换成任何一个 bash 脚本和命令行代码。 -
我写了一个期权到期收益结构的 Excel 模板。欢迎大家无聊的时候使用。
-
现在比较新的电脑基本上都是 64 位的 CPU , Matlab 也是 64 位的版本,但 64 位的 Matlab 没有自带编译器,需另行安装编译器。下面是方法之一:
-
无意中发现一个 Excel VBA 对待参数的一个"不正常"现象。这种处理方式可能无意中导致程序结果错误,而且你很难发现你的错误所在:
-
香港这边没有 WIND ,部门的彭博也不在我的机器上,为了取个股票价格数据都得跑来跑去。一怒之下,我写了一个 Excel 的函数,用来获取行情数据。
-
Excel VBA 出错时给出的错误信息极少,需要充分利用各种工具来进行调试。
-
读者来信:
-
Matlab 内置的 runstoredprocedure 函数,用来运行同时有输入和输出参数的存储过程:
-
我所在部门也不是 IT 部门,职位也不是开发职位,但平时工作还是需要大量处理和分析数据、计算和开发各种指标等,还是需要写很多程序,语言以 VBA 和 Matlab。但同时,部门里像着我这种写程序的人并不多,别人并不看我的代码而只关心我提交的结果(说实话,大多数时候即便我写错了也不会有人知道),工作环境也不像专业的 IT 公司或部门,有严格的流程控制和工作平台。我这里没有版本控制、没有自动测试环境、没有代码格式和注释要求,也不需要去 Linux 下干活。我相信国内金融行业有不少人与我处于同样的状态。
-
写了一个统计代码量的函数,函数已上传到 Matlab Central File Exchange,下载地址,使用方法:
-
Excel 的数据透视表是一个很好用的功能,我写了一个 Matlab 版本,在处理上和 Excel 的透视表差不多,还差一个 filter 而已。
-
没有人敢说 Matlab 的帮助文件不够详细和全面,但 Matlab 里面的确存在一些功能和函数,你很难找到它的帮助文档。下面列举一些,以后碰到其它的也会放到这里来:
-
上次说起遇到两个 Matlab 的效率问题,还剩下 save , load 没说。不过这个问题的结论挺简单的,就是在 save 的时候尽量指定使用-v6 选项。
-
工作中或多或少有些琐碎的事情,比如每天要发送和接受数据,很多是通过邮件的方式传递的。之前写过如何在 Outlook 里自动保存附件,这里再发一个如何更方便地发送带附件的邮件。
-
以下对并行计算的个人理解受到较多质疑,删除之。
-
最近用 Matlab 写了个东西,运行效率不如我意。用 Profiler 跟踪了一下,结果让我大吃一惊。其中三分之一的时间花费在 datestr 这个函数上,六分之一的时间花费在 save 和 load 数据上。这里先谈前一个问题,关于 save 和 load 的效率以后再谈。
-
基于将工作文件在家里电脑和公司电脑上的转移、Kindle 上电子书的管理的需求,我用 Matlab 写了几个函数,用来实现这些需求。
-
这里放两个在实际工作中遇到的问题,还没找到解决的方法,向广大网友求助。
-
Matlab 的 database 工具箱只支持 ODBC 数据库连接,在使用之前需要先设置 ODBC 数据源。之前在 Excel 里用的是 ADODB ,使用 ADODB 的好处是无需设置 ODBC 源,似乎效率也要高一些(但我一直没弄懂 ADODB 是什么东西,所以效率这东西我也说不清)。
-
如果一个日期(或者时间),如果用字符串,比如"2010-10-04"的形式,各个系统都没有什么区别。在某些时候,将日期用数字表示,将大大增加对日期查找、比较的效率。而如果用数字来表示日期,在不同的系统之间差别就大了。
-
Excel、Matlab 在与数据库交互数据时,通常需要事先配置好 ODBC 数据源,这导致一个文件换到另一台机器还需要重新配置 ODBC。手工配置太麻烦,从国外一个网站看到一种解决方案:
-
现在相机的像素实在是太高了,上次去泰山玩,朋友的 1200 万像素的 D90 照出来的照片分辨率高达 4288×2848 ,即使转为 jpg 格式,每张都在 5M 以上。而现在电脑屏幕的分辨率最高也在 1920 以下吧,超高分辨率的照片除了打印大照片之外没什么用处,反而不方便传输、流通、保存。
-
-
上次大规模使用 Matlab 还是本科的时候,当时还是 5.3 版,现在重新尝试它,已经是 7.8 ( R2009a ),而且 R2010b 版都已经发售。而这些版本引入的一个新玩意儿便是面向对象化编程( object-oriented programming , OOP )。
-
最近做了些东西,用到了 Matlab 的优化工具箱, optimization toolbox。因为以前没用过这东西,今天把这个工具箱的帮助文档基本上翻了一遍。
-
本文结论:不要过度担心 Matlab 的传值调用的效率问题。
-
Excel 有一个很有用的功能是直接导入外部数据库或者使用外部数据源建立数据透视表和数据透视图。但比较可惜的是,这个数据源的查询语句是静态的,它无法根据日期自动修改(比如在应用中,我们希望每天获取的外部数据都是当天最新的数据),下面两个函数是修改外部数据源的 VBA 代码,调用它们就可以建立动态的数据源。
-
最近学到一招,效果不错~
-
在工作中定期或不定期会收到一些数据文件,然后要将它们的附件保存到自己的电脑上,下面演示如何让 Outlook 自动做这件事情。
-
效果图:
-
某些时候需要打开 Excel 文件来获取或者写入数据,但又不希望跳出打开的 Excel 文件窗口,可以用下面的代码:
-
时间管理中有重要的一条,保持你的收件箱整洁、干净。Gmail 一个重要的创新就是 Archive (存档),选中邮件后点下「archive」按钮或者按一下快捷键 y ,邮件就被移出收件箱,但又跟删除邮件不一样,这些邮件还可以继续被搜索。这里讲最近写的如何在 Outlook 里实现这个功能。
-
VBA 的 Date 类型比较奇怪。
-
最近写一个 vba 程序的时候不间歇的出现 「存取器不是参数存取器 」或者「列值被截断」的错误。后来发现对于我等不专业人士,遇到这样的错误还挺 e 的。下面是综合各种资料了解到的一些东西。
-
最近写了一些 Matlab 程序,想起以前想过的一个东西,记录一下。
-
Matlab 程序效率低下,其中一个原因就是它的参数无法引用,每次都是传值。这不但导致效率问题,要实现某些功能,也需要一些特殊的手段。比如最简单的,如果交换两个变量的值,也就是在 C/C++里的函数 void swap(int& a, int& b),在 C/C++里实现很容易,但在 Matlab 里,你会吗?
-
下面这个求$ 1/\sqrt{x}$ 的函数号称比直接调用 sqrt 库函数快 4 倍,来自游戏 Quake III 的源代码。
-
从+0 那看来的。主要测试快速记忆能力。
-
Google 更懂中文我拿不出什么确切的证据(虽然我已经这样认为),但下面的数据是否能说明 Google 确实更懂阅微堂呢?
-
最近做社会实践项目遇到的一个问题,需要动态修改一个表格。本来以为要想修改一行,直接设置新的 tr.innerHTML 即可。后来发现在 Firefox 下可行,但在 IE 下通不过,查看了一下帮助,才发现 innerHTML 还没有一个通用标准,而在 IE 下innerHTML对于标签为 COL, COLGROUP, FRAMESET, HTML, STYLE, TABLE, TBODY, TFOOT, THEAD, TITLE, TR 的元素是只读的。要想在 IE 下动态修改表格,只能使用 insertRow 和 insertCell;