存档

2018年 的存档

Django 集成 tinymce

2018/04/04 5,984

环境

  • django-1.11.8
  • python2.7+

步骤

Install

setting

  • 在项目的 setting.py 文件中,找到 INSTALLED_APPS 节点, 添加 tinymce
  • 在项目的 urls.py 中添加以下内容:

     
  • 在项目的 setting.py 文件中,添加节点 TINYMCE_JS_URL, 指向 tinymce.min.js 文件。由于本机服务器资源有限,故使用了CDN:

继续阅读

使用 emacs 编辑 Markdown 文档

2018/03/29 5,232

安装

  1. 下载 markdown-mode.el 到 emacs 能找到的目录,如:share\emacs\25.2\lisp\progmodes
  2. 下载并安装一个第三方的 markdown 生成工具。如 Markdown.pl, MultiMarkdown, 或 Pandoc
  3. 配置你的 .emacs 。这里假设你使用的是 pandoc

快捷键

  • C-c C-s h 插入一级标题,C-c C-s n(1<= n <= 6) 插入 n 级标题
  • C-c C-s b 插入加粗/黑体
  • C-c C-s i 插入斜体
  • C-c C-s c 插入代码
  • C-c C-s f 插入脚标
  • C-c C-s q 插入块引用
  • C-c C-s - 插入标题线
  • C-c C-s w 插入链接
  • M-Enter 当光标在列表项上时,向下插入同级列表项
  • C-c C-- / C-c C-=C-c LEFT / C-c RIGHT 标题升级或降级
  • C-c UP / C-c DOWN 同级标题块/列表项及其内容上移或下移
  • C-c C-n / C-c C-p 光标在同级标题/列表项间移动
  • C-c C-k 将该点的目标kill掉,并将其内容送到kill ring中,适用于以下目标:inline code, headings, horizonal rules, links, images, email address等
  • C-c C-c Markdown 命令,如预览、导出等功能

 

多线程编程中的一些原则

2018/03/19 5,799

关于 C++ 多线程编程一的些基本知识可以参考本博客的《C++11/14 新特性(多线程)》 ,《Unix线程基础》。本章不是多线程编程教程,而是个人经验的一些总结。这些经验有一些可能是不正确的,希望在今后的编程中实践、改进。

线程同步的四项基本原则:

  1. 最低限度地共享对象。对象尽量不要暴露给别的线程,如果需要暴露,优先考虑 immutable对象。否则尽量使用同步措施来充分地保护它
  2. 尽量使用高级地并发编程构件,如 任务队列、生产者消费者模式等
  3. 只用非递归的互斥器和条件变量,慎用读写锁,尽量少用信号量
  4. 除了使用 atomic 整数外,不要自己编写 lock-free 代码,也不要用"内核级"同步原语

互斥器 Mutex

mutex 是最常用的同步原语,它保护一个临界区,任何时候最多只能有一个线程能够访问 mutex 保护的域。使用 mutex 主要是为了保护共享数据。一般原则有:

  • 使用 RAII手法封装 mutex 的创建、销毁、加锁、解锁操作,充分保证锁的有效期等于其作用域,而不会因为中途返回或异常而忘记解锁。这类似于 Java 的synchronized 或 C# 的 using 语句。
  • 使用非递归的 mutex
  • 尽量不要人为地调用 lock()unlock()函数,将这些操作交给栈上的 guard 对象,利用其构造与析构函数。
  • 不要跨线程地加解锁,避免在不同的函数中分别加锁\解锁,避免在不同的语句分支中加锁\解锁
  • 每当构造 guard 对象时,需要考虑栈上已有的锁,防止因加锁顺序不同而导致死锁
  • 避免跨进程的 mutex, 进程间通讯尽量使用 TCP sockets

只使用非递归地 mutex

继续阅读

using 关键字在 C++ 中的几种用法

2018/03/13 16,463

对C++中 using关键字的几种用法的总结:

1. using 声明

using 声明 (using declaration) 是将命名空间中单个名字注入到当前作用域的机制,使得在当前作用域下访问另一个作用域下的成员时无需使用限定符 ::

using 声明将其它 namespace 的成员引入本命名空间的 当前作用域 (包括其嵌套作用域)  。一个 using 声明一次只引入一个命名空间成员,它使得无论程序中使用哪些名字,都非常准确。
利用 using 声明,可以改变派生类对父类成员的访问控制:

尽管 Derived 对 base 是私有继承,但通过 using 声明,我们还是可以在 Derived 中访问其成员,且后续的继承同样不受 private 限定的影响。

继续阅读

正则表达式

2018/02/18 5,675

正则表达式为高级的文本模式匹配、抽取、与/或文本形式的的搜索与替换功能提供基础。简单地说,它可以匹配多个字符串。

符号

择一匹配、任意匹配

  • | 择一匹配,表示从多个模式中选择其中一个 ,如 at | home 既可以匹配 at, 也可以匹配 home
  • . 任意匹配,表示匹配除了换行符 \n 以外的任何一个字符

边界匹配

  • ^ $ 用于匹配行的开头和结尾
  • \b 用于匹配字符边界。\B 则与之相反。如 \bthe 匹配任何以 the 起始的单词,\Bthe 匹配任何不以 the 起始的单词

字符集

继续阅读

跨平台的命令行参数工具 — boost program_oprations

2018/02/16 6,447

1 例子

下例展示了 program_oprations 的基本用法:为程序定义了 3 个参数: help, host, port . 其中 host 与 port 分别定义了简写 h ,p 。host 是必填项, port 是有缺省值(80)的选填项,当 port 有输入时使用输入项,否则使用缺省值 ,当输入了错误的参数时会输出错误信息。

测试效果:

progma_options 库由三部分组成:

  • descrition , 描述组件,用于描述允许的参数及这些参数的值。
  • parser , 解析组件,用于解析输入的参数与值
  • storage , 存储组件, 它将解析器的输出转换成 字符串表示的健与 C++ 类型的值的 map, 并提供了访问这些值的接口。

对于上例来说, program_options 所做的事情,就是使用 options_description 描述了我们期望的参数,使用 parse_command_line 解析了输入参数并使用 store 将参数存储在 variables_map 中。当我们需要使用某个参数时直接从 variables_map 中获取。

继续阅读

CMake 使用札记

2018/01/20 6,600

本篇记录在使用 CMake 中遇到的一些问题及解决办法

参考资料:

继续阅读

解决 vs 无法 “附加到进程” 调试的问题 (msvsmon unexpectedly exited)

2018/01/02 6,519

The debugger's worker process (msvsmon.exe) unexpectedly exited. Debugging will be aborted

在 vs "附加到进程" 进行调试时,总是弹出如上错误。偶尔还会造成 vs crash。

检查环境变量,看一下 path 变量下是否有

"%USERPROFILE%\.dnx\bin"    或

"%USERPROFILE%\.dnx"

的值。如果有则删除之并重启。