Saturday, August 30, 2008

C++学习笔记(十) -- 通过多态访问私有成员

// -1156203886

#include <iostream>

using namespace std;

class Base
{
public:
virtual ~Base() {}

virtual void debugPrint() const
{
cout << "in Base" << endl;
}
};

class Derived : public Base
{
private:
void debugPrint() const
{
cout << "in Derived" << endl;
}
};

int main()
{
Base* aPo = new Derived();

aPo->debugPrint();

return 0;
}
以上代码的输出结果为"in Derived", 最开始我一直想不通为什么可以在类的外部访问一个私有成员函数, 经过一番搜索以后, 知道了原因.

这段代码的问题在于, 编译时是不会有错误的, 因为那个指针的静态类型是指向基类的对象的, 而基类中的虚函数是public的, 可以直接在外部访问, 这在编译器看来是没有一点错误的. 然而动态绑定却是在实际运行时, 这时候指针就转到子类里了, 它不会判断这个成员到底是私有还是公有的, 所以就输出了上面的结果. 有人把这看成是C++的一个bug, 也有人认为这符合OO的思想, 向类的用户隐藏了细节, 唯一不对的是这样的编程风格.

Friday, August 29, 2008

Sunday, August 24, 2008

几款修改音频tag的小软件

今天试用了几个用来修改音频tag的软件, 这里记录了一点心得.

1. mid3v2
这是一个在终端下运行的小软件, 安装方法是:
sudo apt-get install python-mutagen
使用方法:
$ mid3v2 -a 陈绮贞 -A 失败者的飞翔 -t 失败者的飞翔 失败者的飞翔.mp3

2. Ex Falso
这是以GTK+作为前端的软件, 因为图形化的界面, 所以操作会相对mid3v2简便一些, 同时这个软件也支持多个文件修改为相同的tag.
sudo apt-get install exfalso
这是界面截图:
Ex Falso
综上, 这些全都是专门用来修改tag信息的, 当然, 一些播放器也有这个功能, 比如Audacious. 而且清一色的Python, 看来我暂时是用不上了, 还是先去学点原理吧.

Saturday, August 23, 2008

配置LaTeX & XeTeX & AUCTeX

这几天折腾了一下LaTeX, 对于其中的概念也有了一些了解. 这篇日志主要是说下在Ubuntu 8.04下配置LaTeX+XeTeX环境的过程, 还有Emacs里的AUCTeX的配置.

  1. 首先是LaTeX与XeTeX的安装
  2. $ sudo apt-get install texlive texlive-latex-extra texlive-xetex lmodern

    当时为了安装最新的XeTeX, 花了很多时间在编译安装上, 最后只弄好一个半成品, 无法使用. 于是决定舍弃zhspacing宏包, 直接装了源里的XeTeX.

    经过以上步骤后, 应该就可以正常编译TeX文件了, 用XeTeX调整字体也很爽. 如果你也使用Emacs来编辑TeX文件的话, 那么一定要安上AUCTeX这个扩展, 下面是一些配置详情.

  3. AUCTeX
  4. $ sudo apt-get install auctex

    安装好以后, 重点是配置.emacs文件, 因为AUCTeX本身是不支持通过xelatex编译的.
    ;; AUCTeX
    (defun auctex ()
      (add-to-list 'TeX-command-list '("XeLaTeX" "%`xelatex%(mode)%' %t; %`xelatex%(mode)%' %t" TeX-run-TeX nil t)) ;; 这里我编译了两次
        (setq TeX-command-default "XeLaTeX") ;; 设定默认编译命令为XeLaTeX
        (setq TeX-save-query nil)            ;; 保存之前不询问
        (setq TeX-show-compilation t))       ;; 在新窗口显示编译过程
    (add-hook 'LaTeX-mode-hook 'auctex)
    
    (custom-set-variables
     '(TeX-output-view-style (quote (("^dvi$nnnnnnn" ("^landscape$" "^pstricks$\\|^pst-\\|^psfrag$") "%(o?)dvips -t landscape %d -o && gv %f") ("^dvi$" "^pstricks$\\|^pst-\\|^psfrag$" "%(o?)dvips %d -o && gv %f") ("^dvi$" ("^a4\\(?:dutch\\|paper\\|wide\\)\\|sem-a4$" "^landscape$") "%(o?)xdvi %dS -paper a4r -s 0 %d") ("^dvi$" "^a4\\(?:dutch\\|paper\\|wide\\)\\|sem-a4$" "%(o?)xdvi %dS -paper a4 %d") ("^dvi$" ("^a5\\(?:comb\\|paper\\)$" "^landscape$") "%(o?)xdvi %dS -paper a5r -s 0 %d") ("^dvi$" "^a5\\(?:comb\\|paper\\)$" "%(o?)xdvi %dS -paper a5 %d") ("^dvi$" "^b5paper$" "%(o?)xdvi %dS -paper b5 %d") ("^dvi$" "^letterpaper$" "%(o?)xdvi %dS -paper us %d") ("^dvi$" "^legalpaper$" "%(o?)xdvi %dS -paper legal %d") ("^dvi$" "^executivepaper$" "%(o?)xdvi %dS -paper 7.25x10.5in %d") ("^dvi$" "." "%(o?)xdvi %dS %d") ("^pdf$" "." "acroread %o %(outpage)") ("^html?$" "." "netscape %o")))))
    最后那个有点长, 主要是没有找到合适的方法像添加XeLaTeX一样只需要写新增的条目, 所以这里就把原有的和修改以后的都写了出来. 其实只改了一个地方, 已经用红色标注出来了, 就是在使用C-c C-v预览PDF文件的时候使用什么软件来打开. 我这里就是acroread, 你用的其它的话, 可以相应修改.

    这样修改好以后, 以后就可以直接使用C-c C-c编译, C-c C-v预览, C-c `在错误间跳转了.

    8月5日更新:
    如果不是用的源安装的LaTeX, 比如我为了用上最新版的XeTeX, 就选择单独安装TeX Live. 这时再用源安装AUCTeX的时候, 会因为依赖关系而又把源里的LaTeX相关包给装上, 囧

    不过幸运的是这并不会与TeX Live冲突, 原因在于:
    $ echo $PATH
    /home/xiaogaozi/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    嘿嘿, 我的TeX Live的可执行文件都放在了/usr/local/bin里, 而源里安装的放在了/usr/bin, 自然优先级不同啦~

    但是TeX Live中的install-info文件会导致源安装AUCTeX的时候失败, 所以如果是先安装的TeX Live, 再安装AUCTeX, 就需要先把TeX Live的install-info"消灭"掉:
    $ sudo mv /usr/local/bin/install-info /usr/local/bin/install-info.bak

附上我的TeX文件模板, 很杂, 也许有的在article上能用上, 而有的则只能在book上用上.

\documentclass[adobefonts]{ctexart}

\CTEXoptions[captiondelimiter={\quad}]

\usepackage{amsmath}            % AMS的数学宏包
\usepackage{amssymb}            % AMS的数学符号宏包
\usepackage{graphicx}           % 插入图片需要的宏包
\usepackage{float}              % 强大的浮动环境控制宏包
\usepackage{framed}             % `shaded'环境需要用到
\usepackage{enumitem}           % 增强列表功能
\usepackage{alltt}              % 在`alltt'环境中为等宽字体, 但可以使用LaTeX命令

% \usepackage{shortvrb}           % 简化\verb的写法
% \MakeShortVerb{\|}

\usepackage{color}              % 可以定义各种颜色
\usepackage[x11names]{xcolor}   % 下面的RoyalBlue3颜色需要用到的宏包
% 自定义的几种颜色
\definecolor{shadecolor}{gray}{0.85}
% \definecolor{darkblue}{rgb}{52,101,164}
% \definecolor{darkgreen}{rgb}{78,154,6}

% % 设置背景颜色
% \definecolor{bisque}{rgb}{.996,.891,.755}
% \pagecolor{bisque}

\usepackage[pdfauthor={Dreamseeker},
            pdftitle={For Alist},
            colorlinks=true,
            urlcolor=blue,
            linkcolor=RoyalBlue3]{hyperref} % 为超链接设置颜色, 修改PDF文件信息

\title{\textbf{For Alist}}
\author{Dreamseeker}
% \date{}

\usepackage[pagestyles]{titlesec} % 定制页眉页脚
% % 设置页眉页脚
% \newpagestyle{main}{%
%   \sethead[$\cdot$~\thepage~$\cdot$][][\thesection\quad%
%   \sectiontitle]{\thesection\quad\sectiontitle}{}{%
%   $\cdot$~\thepage~$\cdot$}
%   \setfoot{}{}{}\headrule}
% \pagestyle{main}
% \renewpagestyle{plain}{\sethead{}{}{}\setfoot{}{}{}}
\pagestyle{plain}

\usepackage[top=1in,bottom=1in,left=1.25in,right=1.25in]{geometry} % 设置页边距

\setlength{\belowcaptionskip}{1em} % 设置caption之后的距离

% XeTeX logo
\def\XeTeX{\leavevmode
\setbox0=\hbox{X\lower.5ex\hbox{\kern-.15em\reflectbox{E}}\kern-.1667em
\TeX}%
\dp0=0pt\ht0=0pt\box0}

% For LaN
\newcommand{\LaN}{L{\scriptsize\hspace{-0.47em}\raisebox{0.23em}{A}}\hspace{-0.1em}N}

\begin{document}

\maketitle

\tableofcontents
\newpage

\end{document}

另外推荐下好用的LaTeX, XeTeX入门文档:

  1. The (Not So) Short Introduction to LaTeX2e, 一个比较全面的文档, 是一个老外写的, CTeX论坛翻译的在这里下载, 版本相对老一点. 我刚开始看的就是这个, 觉得还是要边看边动手, 而且要勤动手, 毕竟说全面, 也只是相对下面两个文档的, 对于初学者来说, 里面很多讲得也不是很详细的, 毕竟这些都是比较短小的文档. 因为是老外写的, 所以看完以后你还是不会知道怎样在文档中输出中文.

  2. LaTeX Notes, 清华的一个老师写的LaTeX笔记, 比较务实地将经常用到的命令都讲了出来, 而且内容整体上比上一个新, 所以上一个主要是用来掌握基础, 看完你基本上可以写一个格式和这个PDF差不多的文章了. 最后还专门讲了一下中文化的一些内容, 不过现在用XeTeX了, 也基本上用不上了, 回顾下历史也是不错的.
    P.S. 文中古诗无数, 附精美照片一张.

  3. XeTeX/LaTeX中文排版之胡言乱语, 这个作为了我的XeTeX入门教程, 其实XeTeX的主要学习的地方还是在导言区. 这是一个很短小的文档, 总共只有7页, 对于提高排版质量有一定用处.

Saturday, August 16, 2008

C++学习笔记(八) -- cin状态错误造成的死循环

int i;
while (1)
{
cout << "input a number: ";
cin >> i;
if(cin && i >= 0 && i <= 100)
break;
else
{
cin.clear();
cout << "error" << endl;
}
}
上面这段代码中, 在要求输入i的地方, 如果输入了非数字, 就会造成死循环. 具体原因在于非数字字符仍然保留在缓冲区中, 所以当下一次cin读取的时候, 就直接从缓冲区中读取, 这样一直循环, 每次都是读取的非数字字符, 造成了死循环. 修改else里面的语句为:
else
{
cin.clear();
cin.ignore(1024, '\n');
cout << "error" << endl;
}
ignore()的作用主要是从缓冲区中取字符并丢弃, 就起到了刷新缓冲区的作用.

Friday, August 15, 2008

Emacs和Vim中将tab转化为空格

Emacs:
在.emacs中添加:
(setq-default indent-tabs-mode nil)
对于已经保存好的文件, 可以选中需要转化的区域, 然后:
M-x untabify

Vim:
在.vimrc中添加:
set expandtab
对于已经保存好的文件, 可以选中需要转化的区域, 然后:
:retab

笑笑

笑笑走的时候告诉我: 如果想我了, 就默念我的名字吧. 现在的我正努力地默念着, 她能听到吗? 我们仿佛处在了两个世界, 笑笑看不到我, 我也看不到她.

如果你已经不能控制
每天想我一次
如果你因为我而诚实

如果你看我的电影
听我爱的CD
如果我能带你一起旅行

如果你决定跟随感觉
为爱勇敢一次
如果你说我们有彼此

如果你会开始相信
这般恋爱心情
如果你能给我如果的事

Wednesday, August 13, 2008

使用less查看压缩文件的内容

今天在IRC上看到ee说的, 就试了下, 果然可以, 不管gz, bz2, zip, rar都可以, 真是舒服~

Saturday, August 9, 2008

今天体验了一下w3m

w3m
Adobe的Flash插件在Linux上的表现实在是差, 直接导致上新浪这类类似的大型门户时, CPU轻轻松松就接近100%. 以前没有看门户的习惯, 这几天奥运了, 想上去看点新闻, 无奈太高的CPU占用率使得打开一个网页需要极强的耐心和信心. 于是请出以前就听说过的w3m, 反正我也只是想看点文字, 那上面的图片啊, 视频啊什么的, 都不大感兴趣. 用起来还是很简单的, 没有想象中的那么难使用, 不过那里面的键绑定实在是多, 选了几个常用的:
h, j, k, l
这几个和Vim中的一样, 移动光标

C-t
在新标签中打开链接

C-q
关闭当前标签

{
前一个标签

}
后一个标签

C-v
下一页

b
上一页

q
退出

o
设置w3m的选项

H
帮助

Tuesday, August 5, 2008

crash

失敗者的飛翔
一瞬间的我变得那么无助, 只能感受到背后的阳光和前方消失的背影. 我呆呆地望着头顶悬停的蜻蜓, 似乎一切都正在离我远去. 胸腔内好像有什么东西没有密封好, 渗透了那么一点酸酸的液体在我的血管中回环. 我凭什么拥有爱一个人的权力...