设计模式一句话理解

  • 工厂方法与抽象工厂有何区别?

    工厂方法创建一个个对象,抽象工厂创建一套套对象
    
  • Visitor 模式与 Iterator 模式有何区别?

    visitor 是被动访问,一般提供遍历接口和回调函数,如 foreach 函数;iterator 模式是主动访问,可访问每个元素。
    
  • 模板方法与策略模式有何区别?

    模板方法适用于流程固定,算法区别不大的场景;策略模式适用于算法区别较大的场景。
    
  • 常用到的模式有哪些?
    • Factroy Method
    • ProtoType
    • Singleton
    • Template Method
    • Observer
    • Visitor
    • Iterator

把 c++当成脚本语言使用

工作中,经常需要批量解析文本。涉及到功能点主要包括:目录递归、文件读写、字符串解析。功能点不多,但很少有人用 C++做这方面的工作,一般认为脚本语言更适合。因为脚本语法表达更简洁,标准库更全面。C++是门严肃的语言,要写冗长的声明,标准库也不全,需要调用平台 API 完成工作,太繁琐。

这几年,C++标准频繁更新,情况不一样了。C++14 增加了 filesystem 标准库,语法也做了简化,几乎可以用来做为脚本语言。

  • 语法简化了,支持 auto 关键字,不用再写很长的 iterator 声明。
  • 目录递归功能,原来只能使用平台相关的 API,现在可以使用 filesystem 库。PS:在 Windows 平台上,MSVC 从 2015 版本开始支持。cygwin g++ 5.3 未支持。mingw g++才更新到 4.9.2 版本,也不支持。
#include <filesystem>
using namespace experimental::filesystem;

void IteratorDir(const path &p)
{
    for (const auto &iter : directory_iterator(p))
    {
        if (is_directory(iter.status()))
        {
            IteratorDir(iter.path());
        }
        else if (is_regular_file(iter.status()))
        {
            if (iter.path().extension() == ".vcproj")
            {
                // cout << iter.path().filename() << endl;
                ParseVcproj(iter.path());
            }
            else if (iter.path().extension() == ".sln")
            {
                SaveSlnContent(iter.path());
            }
        }
    }
}
  • 文件读写一直还是比较方便的
void SaveSlnContent(const path &p)
{
    ifstream file(p.string().c_str());
    ostringstream ss;
    ss << file.rdbuf();
    m_SlnContent = ss.str();
}
  • 字符串解析功能,各种语言差异不大
void ParseSln()
{
    ofstream out("R:\\a.txt");
    out << "digraph G {" << endl
        << "\trankdir = BT;" << endl
        << endl;

    size_t seg = 0;
    while ((seg = m_SlnContent.find("vcproj\", \"", seg)) != string::npos)
    {
        string curProjId = m_SlnContent.substr(seg + 10, 38);
        string curProjName = m_projectIdMap[curProjId];

        size_t seg2 = m_SlnContent.find("EndProject\n", seg);
        string tmp = m_SlnContent.substr(seg + 48, seg2 - seg - 48);
        seg = seg2;

        size_t pos = 0;
        while ((pos = tmp.find("= {", pos)) != string::npos)
        {
            string dependProjId = tmp.substr(pos + 2, 38);
            string dependProjName = m_projectIdMap[dependProjId];
            if (dependProjName.size() && curProjName.size())
                out << "\t\"" << curProjName << "\" -> \"" << dependProjName
                    << "\"" << endl;
            pos += 38;
        }
    }
    out << "}" << endl;
}
  • 编译问题。Sublime Text 3 里,自带 C++编译支持,但仅支持 g++,不支持 MSVC。添加以下配置后,可以支持 msvc 编译。写完代码后,按 C-S-b 调出编译菜单,选择 msvc Run ,直接编译运行,下方弹出窗口显示运行结果。以后再编译运行时,按 C-b 就可以了,不需要再次选择。
{
    "cmd": ["vcvars32.bat", "&", "cl", "/EHsc", "${file}", "1>&2"],
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.cpp, source.c++",
    // By default cl is not in your PATH, so add it to your path (preferably)
    // or uncomment "path" and check that it has correct value
    // "path": "C:\\Windows\\System32;C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin",
    // this also will set path for vcvars32.bat
    "shell": true, // Without this sublime has hard times to parse "&" in out command line

    "variants":
    [
        {
            "name": "Run",
            "cmd": ["vcvars32.bat", "&", "cl", "/EHsc", "${file}", "&", "${file_path}/${file_base_name}.exe"]
        }
    ]
}

总结,filesystem 经常用到的函数如下:

#include <filesystem>
using namespace experimental::filesystem;
path();
path.string();
for (const auto &iter : diretory_iterator(path)) {
    iter.path();
    iter.status();
}

在 spacemacs 中使用 graphviz

之前用 graphviz 画过几次流程图,感觉不错,只需要关注节点描述和节点关系, dot 程序自动搞掂图的大小和排放,很省脑。这次切换 spacemacs 后,原来的 graphviz 配置已经没有了,我也不想重新配置。

但是,spacemacs 真的很智能,你不想用都不行。我只是打算用 emacs 编辑 dot 文件,刚打开文件,spacemacs 立即提示:“我这里有现成的 graphviz layer 支持,你要不要安装?”这种好事哪能拒绝呢,当然点 YES 了。

接着,就看见窗口切换着,spacemacs 拍啦拍啦自动搞掂了一切。完事后,看看它干了什么:

  • 修改 .spacemacs 文件,加上 graphviz layer 支持。
  • 下载 graphviz layer 相关支持 package。
  • 修改 .spacemacs 文件,把 package 添加到 elpa 列表里。

我的 dot 文件瞬间语法高亮显示了。再试试 graphviz 的快捷键好用不,点两下逗号,立即生成了预览图,真不错。还有更 NB 的,输入 ,t , 打开 graphviz-live-reload 功能,每次 C-x C-s 文件存盘后,预览图自动更新。

用 xampp 安装 wordpress

  • XAMPP 官网 下载安装包 xampp-portable-win32-5.6.19-0-VC11-installer.exe ,安装到 D:/xampp 目录。
  • 修改 D:/xampp/php/php.ini
    • 支持上传大文件

      upload_max_filesize = 32M
      
    • 去掉 mysql 的注释

      extension=php_mysql.dll
      
    • 支持 xdebug 调试

      [XDebug]
      zend_extension = "D:\xampp\php\ext\php_xdebug.dll"
      xdebug.profiler_append = 0
      xdebug.profiler_enable = 0
      xdebug.profiler_enable_trigger = 0
      xdebug.profiler_output_dir = "R:\tmp"
      xdebug.profiler_output_name = "cachegrind.out.%t-%s"
      xdebug.remote_enable = on
      xdebug.remote_handler = "dbgp"
      xdebug.remote_host = "127.0.0.1"
      xdebug.remote_port = 9000
      xdebug.trace_output_dir = "R:\tmp"
      xdebug.idekey= PHPSTROM
      
  • wordpress 中文官网 下载安装包,解压到 D:/xampp/htdocs ,重命名为 fengjian.info
  • XAMPP Control 中启动 Apache 和 MySql 服务。
  • 打开网址 localhost/phpMyAdmin ,新建数据库 fengjian.info ,排序规则 utf8_general_ci
  • 打开网址 localhost/fengjian.info ,开始安装使用 wordpress:数据库名填 fengjian.info ,用户名填 root ,密码为空。

在 linode 上使用 spacemacs

一直在用 linode vps,安装的 ubuntu 系统,远程用 putty 连接,emacs 是主力编辑器。emacs 配置是 ftp 上传的,安装成功后就一直没有更新过。没有用 git 托管,配置同步终究是不太方便。今天有时间,决定把 spacemacs 配置同步到 github,再更新到 linode。

我的 spacemacs 配置一共有三部分:一个 .emacs.d 目录,是 spacemacs 的原始代码,未做任何修改;一个 .spacemacs.private 目录,存放私有 layer 和 snippets;一个 .spacemacs 文件,就是 spacemacs 配置文件。

直接从 github 下载 spacemacs 的 develop 分支,作为 .emacs.d 目录:

git clone https://github.com/syl20bnr/spacemacs.git .emacs.d
git checkout -t origin/develop

在本地建立一个目录 .spacemacs.config ,并在目录内新建两个符号链接,保存 spacemacs 的私有配置,并将这个目录上传到 github。PS: junction 语法太 BT,参数顺序与 ln 是反的。

mklink /J ".spacemacs.private" "../.spacemacs.config/.spacemacs.private"
mklink /H ".spacemacs" "../.spacemacs.config/.spacemacs"

远程 linode 上,下载 spacemacs 的私有配置,并创建符号链接。

cd ~
git clone https://github.com/sweord/.spacemacs.config.git
ln -s .spacemacs.config/.spacemacs.private .spacemacs.private
ln -s .spacemacs.config/.spacemacs .spacemacs

启动 emacs,没有成功安装,提示找不到某个 el 文件,查看 emacs 版本太老还是 24.3 的,需要安装新版本的 emacs-25.1

add-apt-repository -y ppa:ubuntu-elisp
apt-get update
apt-get install emacs-snapshot

由于码农的洁癖,老版本必须删除。先查看安装包的名称:

dpkg -S emacs

再全部删除:

apt-get remove emacs24-bin-common emacs24-common emacs24-common-non-dfsg emacs24-nox

启动 emacs,spacemacs 自启成功,自动安装一百三十多个 package 后,成功启动了。linode 服务器网速不错,整个安装过程非常快。查看 spacemacs 启动时间,才两点几秒,太快了。要知道,spacemacs 在我的 x200 笔记本上启动时间大约 15 秒多,在我的 i5-2240 CPU 台式机上,启动时间要 8 秒多,在 linode 上为什么这么快?查看了 cpu 信息,原来是 X5 2680 v5 , cache 有 30M,相当 NB 啊。

cat /proc/cpuinfo