ssh 公钥方式认证攻略

前面介绍cygwin下安装sshd时简单地提到了ssh的公钥认证。 下面将这种认证方式详细地解释一下。

(Read More)

Linux编程常用命令

查看myprog(二进制文件)依赖的库文件

ldd myprog

查看myprog的符号表

nm myprog

删除myprog中的符号,减小文件大小

strip myprog

myprog的详细信息

readelf -a myprog

另外这篇文章可以在调试时作为参考。

(Read More)

Linux多进程相关内容

最近在用 perl 写一个Linux下的多进程守护进程,因此研究了一下Linux下的进程相关的知识。 现将心得总结一下。主要是关于进程创建和回收。

(Read More)

Perl创建守护进程之二

前面这篇文章简单地阐述了用Perl创建守护进程(daemon)的方法。 实际上,创建一个多进程的守护进程需要注意很多事情。

(Read More)

Windows环境下wp-cache插件安装方法

wp-cache 这个插件能够将 WordPress 的页面输出内容进行缓存, 这样第二次访问该页面时就不必访问数据库,从而加快页面生成速度,并降低服务器负载。 但很可惜这个插件是为 Unix/Linux 系统设计的,如果服务器是 Windows,该插件将会出现错误。 在Windows下使用该插件需要做些修改。

  1. 修改 wp-cache/wp-cache.php,找到 wp_cache_check_link() 函数,紧接着该函数的 global 变量声明 加入下列语句: return true; 该函数的功能是检查符号链接,而Windows系统不支持符号链接,所以加入 return true 让该函数短路。
  2. 将 wp-cache/wp-cache-phase1.php 复制到 wp-content 下并改名为 advanced-cache.php。 官方安装手册上要求使用 ln -s 命令建立符号链接,而Windows并不支持符号链接,只能直接复制了。
  3. 修改 wp-cache/wp-cache-phase2.php,查找 ob_end_clean (大约在 220 行前后)将其修改为 ob_end_flush, 再将约10行之后的 flush 语句注释掉。

这样在插件面板中激活wp-cache,并在选项面板中 Enable Cache 即可。

另一个常见的问题就是 cache 不起作用,浏览任何页面 wp-content/cache 下也不会生成 cache 文件。 很可能因为当前的主题末尾忘记使用 </html> 标记。修改主题的 footer.php 文件并在最后添上 </html> 即可。

(Read More)

Windows下通过cygwin架设sshd服务

sshd服务是一种安全连接,它能让你访问服务器上的命令行界面。Windows本身没有提供该服务,所以我们可以通过 cygwin 来进行安装。

(Read More)

PrimoPDF出现DLL invalid错误的解决方法

PrimoPDF是个免费的PDF转换工具,安装之后它模拟一台打印机,只要把想转换的内容打印到 PrimoPDF 上即可生成 PDF 文档。最新版本为 3.0,但是我安装之后发现打印速度非常慢,从Windows打印结束到PrimoPDF的保存对话框出现需要几分钟的时间,不得已只好卸载之重新安装了 1.0 版。但是1.0版试图保存PDF文件时出现了DLL invalid的错误。Google了一下原来是 v2.0、v3.0 卸载时会在注册表中留下垃圾,影响了 1.0 的工作。只要删除注册表的 HKLM\SOFTWARE\AFPL Ghostscript\8.50 键 1.0 即可正常使用。

(Read More)

Perl中检查变量值的方法

调试 Perl 程序时使用最频繁的就是 print 语句了,不过它只能输出普通变量的内容, 而不能输出数组和哈希。使用 Data::Dumper 模块则可以输出数组和哈希等复杂变量。

#!/usr/bin/perl
use Data::Dumper;
my $hashref = { name=>'charlee', age=>25, gender=>'male', interest=>[ 'computer', 'movie', 'cooking' ] };
print Data::Dumper::Dumper($hashref);

注意Dumper函数的参数为引用。输出结果为:

$VAR1 = {
          'name' => 'charlee',
          'interest' => [
                          'computer',
                          'movie',
                          'cooking'
                        ],
          'age' => 25,
          'gender' => 'male'
        };

(Read More)

用Devel::SmallProf测量Perl函数的执行时间

Devel::SmallProf 是个很好用的模块,可以方便地测量出代码每一行的执行时间,以便进一步优化。

例如以下程序,文件名为 prof_sample.pl。

#!/usr/bin/perl
my $str = "0";
for (my $i = 0; $i < 100; $i++) {
  $str =~ s/\d+/($&+1)/e;
  print $str."\n";
}

该程序的功能是输出整数 1 到 100。当然实际写程序时可不要用这么低效率的方法。 安装 Devel::SmallProf 之后我们来测量一下它每一行代码的执行时间。

perl -d:SmallProf prof_sample.pl

执行之后会在当前目录下生成一个 smallprof.out 文件,其内容如下:

           ================ SmallProf version 1.15 ================
                           Profile of prof_sample.pl                   Page 1
       =================================================================
    count wall tm  cpu time line
        0 0.000000 0.000000     1:#!/usr/bin/perl
        0 0.000000 0.000000     2:
        1 0.000006 0.000000     3:my $str = "0";
      101 0.006418 0.010000     4:for (my $i = 0; $i < 100; $i++) {
      200 0.002581 0.000000     5: $str =~ s/\d+/($&+1)/e;
      100 0.001509 0.000000     6: print $str."\n";
        1 0.000003 0.000000     7:}

前三列的数字分别为执行次数、消耗时间、消耗CPU时间。

如果你的程序使用 use 语句引用了其他模块,那么所有被引用的程序都将被分析,生成一个长长的报告。这时可以使用下面的命令来迅速找到耗时最长的命令。

sort -k 2nr,2 smallprof.out | less

(Read More)

关于TagCloud显示算法的讨论

Weighted Categories 这个插件经过修改之后可以用来显示 TagCloud。 但是这个插件显示出的 TagCloud 总觉得有点别扭。一般人都是擅长某几个方面,很少样样精通的, 因此一般的博客总是会出现几个文章数非常多的标签,以及大量仅有一两篇文章的标签。 而 Weighted Categories 插件使用四则运算来计算标签的大小(附图公式(1)),结果就造成几个巨大标签混杂在大量的小标签中的 “众星捧月”的现象。

例如,假设有四个标签,文章数分别为 tagA=100、tagB=10、tagC=5、tagD=1,标签级别为 1~10,则各个标签的级别如下:

标签文章数计算式 级别
tagA100 100 / 99 * 9 + 1 10
tagB10 10 / 99 * 9 + 1 1
tagC5 5 / 99 * 9 + 1 1
tagD1 1 / 99 * 9 + 1 1

显然,由于tagA的存在,其他标签都被挤到了最底层。

解决这个问题的方法就是利用对数函数。(对数函数的效果可见本文。) 计算公式见附图公式(2)。

公式(2)的结果与对数的底是无关的,见公式(3)。

用公式(2)计算上例得到下面的结果:

标签文章数计算式 级别
tagA100 log(100) / (log(100)-log(1)) * 9 + 1 10
tagB10 log(10) / (log(100)-log(1)) * 9 + 1 5
tagC5 log(5) / (log(100)-log(1)) * 9 + 1 4
tagD1 log(1) / (log(100)-log(1)) * 9 + 1 1

显然这个结果要比原来的结果漂亮多了。

tagcloud-ev.png

(Read More)