五月流水账(多图杀猫慎入)

2012年5月31日 sigma 2 条评论 10,938 views

转眼五月就过去了,才发现在五月,我只写了一篇博文。其实中间几次想写,无奈江郎才尽,无从下笔。到了月末,逼着自己写一篇,尽管是流水账,顺便测试下wordpress手机客户端。无奈写流水账都写不好,只好用图片来凑个流水账。废话完了,上图:

image

我们的计算所

阅读全文…

分类: life 标签:

pdf嵌入字体

2012年5月12日 sigma 4 条评论 23,899 views

在论文提交final script时,一般都要求论文中所有的字体都嵌入到pdf中,一般来说,IEEE提供了一个叫做EXPRESS的工具,可以检查是否符合规范,包括字体是否嵌入。但是,有时候,我们通过latex编译出来的pdf,不能通过EXPRESS检查,并且大部分都是因为字体原因,那么,本文将介绍如何在linux pdflatex编译时能够潜入所有字体。

首先,linux下本身提供了一个检查pdf字体信息的工具,pdffonts。比如查看test.pdf的字体:

pdffonts test.pdf

结果应该是类似下面的:

name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
JNARJV+NimbusRomNo9L-Medi            Type 1            yes yes no       6  0
NBINYZ+NimbusRomNo9L-Regu            Type 1            yes yes no       7  0
CBDPEB+NimbusRomNo9L-ReguItal        Type 1            yes yes no       8  0
ZYBBWF+CMSY10                        Type 1            yes yes no       9  0
QVCFWU+NimbusRomNo9L-MediItal        Type 1            yes yes no      10  0
IJIDBD+CMMI10                        Type 1            yes yes no      11  0
MTWRTR+CMR10                         Type 1            yes yes no      16  0
Arial                                TrueType          no  no  no      35  0
Arial,Italic                         TrueType          no  no  no      36  0
WXQMOP+CMMIB10                       Type 1            yes yes no      46  0
Helvetica                            Type 1            no  no  no      51  0
DWKNIZ+CMMI7                         Type 1            yes yes no      55  0
IXNPPI+CMEX10                        Type 1            yes yes no      56  0
EUDIGL+CMR7                          Type 1            yes yes no      57  0
CLXNUD+CMSY7                         Type 1            yes yes no      58  0
RURLFQ+CMMIB7                        Type 1            yes yes no      62  0
LDBHLR+CMBX10                        Type 1            yes yes no      63  0
YJCSYX+CMMI5                         Type 1            yes yes no      69  0
Helvetica                            Type 1            no  no  no      74  0
Helvetica                            Type 1            no  no  no      79  0

可以看到,有些字体emb选项为no,表示没有嵌入。 阅读全文…

分类: 贝壳 标签: , , , ,

Vimdiff逐行比较

2012年4月27日 sigma 1 条评论 8,107 views

平时,我们用vimdiff都是基于最大匹配,但有时我们希望能够逐行比较,这个不能直接实现,但是可以通过diff的patchexpr实现,具体介绍可以看vim文档:

http://vimdoc.sourceforge.net/htmldoc/diff.html

下面给出一个vim逐行比较的patch,将下面内容复制到一个文件diffbyline.vim,并且放到plugin目录下(这个脚本是我很早从网络搜到的,现在忘了来源了,哪位看到来源,请告知,我好说明):

" File:         diffbyline.vim
" Created:      2010 Sep 28
" Last Change:  2010 Oct 02
" Rev Days:     3
" Author:	Andy Wokula <anwoku@yahoo.de>

" :SetLineByLineDiff[!]
"
"   set the 'diffexpr' to enable a trivial line-by-line diff algorithm (the
"   diff program has no option for this).  Reset 'diffexpr' with [!].

com! -bar -bang SetLineByLineDiff  call s:SetDiffExpr(<bang>0)

func! s:SetDiffExpr(bang)
    if !a:bang
	set diffexpr=DiffLineByLine()
	echo "'diffexpr' changed to enable line-by-line diff"
    else
	" XXX restore the previous value
	set diffexpr&
	echo "'diffexpr' restored"
    endif
endfunc

func! DiffLineByLine()
    let result = []	" diff output lines
    let oldlines = readfile(v:fname_in)
    let newlines = readfile(v:fname_new)

    let len_oldlines = len(oldlines)
    let len_newlines = len(newlines)
    let len_common = min([len_oldlines, len_newlines])

    " different number of lines allowed
    "	first common lines -> change(s) only
    "	rest -> append (er, no, see below)

    let idx = 0
    let change_start = -1
    while idx < len_common
	if oldlines[idx] !=# newlines[idx]
	    " XXX above test is case sensitive and ignores 'diffopt'
	    if change_start == -1
		let change_start = idx
	    endif
	    let change_end = idx
	elseif change_start >= 0
	    " line-idx is just after a block of changed lines

	    " prepare a diff block
	    if change_start < change_end
		let range = (1+change_start). ",". (1+change_end)
	    else
		let range = 1+change_start
	    endif
	    let ed_cmd = range. "c". range
	    call add(result, ed_cmd)
	    call extend(result, map(oldlines[change_start : change_end], '"< ". v:val'))
	    call add(result, '---')
	    call extend(result, map(newlines[change_start : change_end], '"> ". v:val'))

	    let change_start = -1
	endif
	let idx += 1
    endwhile

    if change_start >= 0

	" XXX extract to function? (paragraph copied from above)
	if change_start < change_end
	    let range = (1+change_start). ",". (1+change_end)
	else
	    let range = 1+change_start
	endif
	let ed_cmd = range. "c". range
	call add(result, ed_cmd)
	call extend(result, map(oldlines[change_start : change_end], '"< ". v:val'))
	call add(result, '---')
	call extend(result, map(newlines[change_start : change_end], '"> ". v:val'))

    endif

    if len_oldlines < len_newlines
        let append_start = len_oldlines
        let append_end = len_newlines - 1
        let old_range = append_start	" append below this line
        if append_start < append_end
            let new_range = (1+append_start). ",". (1+append_end)
        else
            let new_range = 1+append_start
        endif
        let ed_cmd = old_range. "a". new_range
        call add(result, ed_cmd)
        call extend(result, map(newlines[append_start : append_end], '"> ". v:val'))

    elseif len_oldlines > len_newlines
        let delete_start = len_newlines
        let delete_end = len_oldlines - 1
        let new_range = delete_start	" delete below this line
        if delete_start < delete_end
            let old_range = (1+delete_start). ",". (1+delete_end)
        else
            let old_range = 1+delete_start
        endif
        let ed_cmd = old_range. "d". new_range
        call add(result, ed_cmd)
        call extend(result, map(oldlines[delete_start : delete_end], '"< ". v:val'))

    endif

    " Decho result
    " XXX strange: :D echo prints at least two result lists, first is
    "	['1c1', '< line1', '---', '> line2'] and belongs nowhere (is this an
    "	internal diff test by Vim?)

    call writefile(result, v:fname_out)

endfunc

使用方法:

  • 在diff界面,输入:SetLineByLineDiff,跳到逐行模式,再输入一次,回到普通模式。
  • 或者加个SetLineByLineDiff选项,如:vimdiff +SetLineByLineDiff a.c b.c
分类: 贝壳 标签: , ,

程序(进程)在内存中的组织-由ld_brk_point以及brk函数谈起

2012年4月9日 sigma 1 条评论 38,391 views

今天调龙芯模拟器,发现里面有个ld_brk_point,一直不知道是啥东西,后来搜了下,发现就是malloc函数申请空间的起始地址。改值可以通过brk()以及sbrk函数设置。为了说清楚这个问题,有必要先了解下Linux下程序运行时(进程)在内存中的组织。

linux Flexible Address Space Layout

linux Flexible Address Space Layout

阅读全文…

[整理]SD协议概述

2012年3月29日 sigma 没有评论 5,850 views

这段时间折腾某芯片上的SDIO,在这里将相关知识整理下,以便备忘。需要注意的是,由于我们的SD只支持SD模式,不支持SPI模式,因此文中内容也是针对SD模式的,后面不再强调此点。

信号

CLK:时钟信号
CMD:双向命令和响应信号
DAT0-3:双向数据信号
VDD,VSS:电源和地信号
注:SD模式下可以选择总线宽度, 即选用几根DAT信号线(1或4根), 可以在主机初始化后设置.

比特流

SD协议规范的比特流类型有三类:

  • 命令: 是在CMD上传输的用于启动一个操作的比特流. 由主机发往从机, 可以是点对点也可以是广播的.
  • 响应: 是在CMD上传输的用于之前命令回答的比特流. 由从机发往主机.
  • 数据: 是在DAT上传输的比特流, 双向传输.

命令和数据流都有一个开始位和结束位.

命令

SD协议定义了两类命令,广播命令以及点对点命令,

  • 广播命令:给所有卡都发送, 某些命令需要响应.
  • 点对点命令:给指定地址的卡发送, 需要响应.

工作模式

  • 卡识别模式:主机上电复位后即处于此模式,它会在总线上等待卡. 卡复位后也处于此模式, 直到SEND_RCA(CMD3)命令到来.此模式下主机复位总线所有的卡, 验证工作电压, 询问卡的地址. 这个模式下所有数据的传输都是只通过CMD线来完成.
  • 数据传输模式:卡收到SEND_RCA(CMD3)命令后即进入此模式. 主机识别到卡后也进入此模式.CMD7命令用于使指定地址的卡进入传输模式, 任何指定时刻只能有一个卡处于传输模式.传输模式下所有的数据传输都是点对点的, 并且所有有地址的命令都需要有响应.
分类: 贝壳 标签: , ,

无觅相关文章插件,快速提升流量