Home

jpg和png图片的无损压缩工具

网站和APP中通常包含大量的图片素材,减少图片的大小可以改善网页的加载速度、减少APP的包大小。这里介绍两个比较有效的jpg和png的无损压缩工具。

1. jpegtran

jpegtran 是专门针对jpg图片的无损压缩工具,支持linux、osx、windows等平台,基本用法:

比如要压缩yy.jpg后重新存成xx.jpg,命令如下:
jpegtran -optimize -progressive -copy none -outfile xx.jpg yy.jpg
比如要针某个目录下的所有jpg进行压缩可以使用:
find path -name "*.jpg" -exec jpegtran -optimize -progressive -copy none -outfile {} {} \;

2. optipng
optipng 是专门png图片的无损压缩工具, Google Chrome的Pagespeed 插件中对png图片的无损压缩就是用的这个工具,同样支持多种平台,基本用法:
optipng -strip all xx.png
批量压缩:
find path -name "*.png" -exec optipng -strip all {} \;
具体参数的详细说明请参考man手册。

这两种工具对基本素材类的图片压缩比例非常可观,因为是无损的,所以不用担心图片质量的损耗。

Read more

快速排序(php实现)

最近在看《程序设计方法》(HTDP,讲解编程思想的经典),看到介绍快速排序的例子,实现思想实在是简练,基本上看完一遍再也不会忘记的感觉。

实现思想:

1.把要排序的内容分成两部分,第一部分是小于第一个元素的,第二部分是大于等于第一个元素的.

2.对分出来的两部分表分别采用1的方法排序。

3.把这些数据连接起来

实现代码(php实现):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
function qsort($arr)
{
    if (count($arr) <= 1)
        return $arr;
    $first = array_shift($arr);
    return array_merge(
        qsort(smallItems($first, $arr)),
        array($first),
        qsort(bigItems($first, $arr)));
}
//找出$arr中所有小于$item的元素
function smallItems($item, $arr)
{
    return array_filter($arr, function($v) use ($item){return $v > $item;});
}
//找出$arr中所有大于$item的元素
function bigItems($item, $arr)
{
    return array_filter($arr, function($v) use ($item){return $v <= $item;});
}
//测试部分
function testQsort()
{
    assert('qsort(array()) === array()');
    assert('qsort(array(1)) === array(1)');
    for ($i=0;$i<100;$i++) {
        $arr = randomArr(rand(0,1000));
        $mySortArr = qsort($arr);
        sort($arr);
        assert('$mySortArr === $arr');
    }
}
//随机生成一个长度为$count的数组,里面的数值随机
function randomArr($count)
{
    $arr = array();
    for($i = 0; $i < $count; $i++) {
        $arr[] = rand(-1000, 1000);
    }
    return $arr;
}

?>

算法的思想简单易懂,代码只要根据步骤翻译就好了。

Read more

在终端中用默认程序打开文件

在Linux环境下工作,大部分时间都是在与终端打交道,经常会遇到要查看某个文件,比如一个图片或者一个word文档(不能在终端中直接查看的)。这时通常的做法是切换到gui界面,到文件所在的目录,双击想打开的文件。另外一种方法是直接在shell中输入指定的程序打开文件,比如: evince xx.pdf 查看某个pdf文件。当然这样做的前提是你得记得住那些程序的名字,比如你能记得住用LibreOffice打开一个word文件的命令吗?反正我是记不住。

Read more

ssh-copy-id设置不同的端口

ssh-copy-id是一个可以很方便的设置机器之间对等登录的工具(不用每次都输入密码),ssh-copy-id的默认端口是22和ssh一样,但是有时我们为了考虑安全问题,会把ssh的端口改成其它端口,ssh-copy-id并没有提供设置端口的参数,查看了ssh-copy-id的代码(一个shell程序),发现可以使用下面的方法设置端口:

ssh-copy-id "-p port user@host"

这样就可以让ssh-copy-id使用不同的端口了。

Read more

Nokia N9 安装gcc、g++编译环境

Nokia N9是第一款基于Meego系统的手机(也可能是最后一款), Meego本身也是一款Linux系统。N9的开发者模式提供了很方便可配置性,用户可以以root用户随意修改系统配置,安装软件。经过一顿折腾,我在N9上安装了gcc、g++编译环境,并且在N9上编译了vim 7.3、Nginx,运行正常。记录了一下操作步骤。

1. , 在设置->应用程序->安全性中打开N9的开发人员模式

开启之后会提示安装一些软件,建议用通过无线网。另外建议安装上Utilities工具包,里面包含有wget,方便下载软件包。

2. N9在升级PR1.2之前可以直接用apg-get从仓库中安装开发包,PR1.2移除了gcc/g++。另外升级到PR1.2之后,用apt-get 安装软件包时会提示:signature check failed,无法安装。所以要采用手动下载软件包安装。

3. 打开Terminal,输入 devel-su 切换到root用户(root默认密码为:rootme),用wget下载以下软件包(或者从pc下载后拷贝过去):

http://harmattan-dev.nokia.com/pool/harmattan/free/g/gcc-4.4/cpp-4.4_4.4.1-0maemo14+0m6_armel.deb
http://harmattan-dev.nokia.com/pool/harmattan/free/g/gcc-4.4/libgomp1_4.4.1-0maemo14+0m6_armel.deb
http://harmattan-dev.nokia.com/pool/harmattan/free/m/mpfr/libmpfr1ldbl_2.4.1-0maemo4+0m6_armel.deb
http://harmattan-dev.nokia.com/pool/harmattan/free/g/gcc-4.4/gcc-4.4_4.4.1-0maemo14+0m6_armel.deb
http://harmattan-dev.nokia.com/pool/harmattan/free/e/eglibc/libc-dev-bin_2.10-0maemo18.1+0m6_armel.deb
http://harmattan-dev.nokia.com/pool/harmattan/free/k/kernel/linux-kernel-headers_2.6.32-20112910+0m6_armel.deb

http://harmattan-dev.nokia.com/pool/harmattan/free/e/eglibc/libc6-dev_2.10-0maemo18.1+0m6_armel.deb
http://harmattan-dev.nokia.com/pool/harmattan/free/k/kernel/linux-kernel-headers_2.6.32-20112910+0m6_armel.deb
http://harmattan-dev.nokia.com/pool/harmattan/free/g/gcc-4.4/libstdc++6-4.4-dev_4.4.1-0maemo14+0m6_armel.deb
http://harmattan-dev.nokia.com/pool/harmattan/free/g/gcc-4.4/g++-4.4_4.4.1-0maemo14+0m6_armel.deb

下载完后用dpkg -i 全部安装。需要注意的是,安装以上软件包时会提示所需要的libc6-dev版本不符合要求(需要的版本为libc6-dev_2.10-0maemo20+0m6_armel.deb ),harmattan-dev上面并没有找到这个版本,所以用dpkg -i --force-depends  libc6-dev_2.10-0maemo18.1+0m6_armel.deb 强制安装,应该问题不大。

4. 经过以上操作以后,不出问题会成功安装gcc/g++编译环境:

安装完gcc/g++之后可以编译一些软件来使用。我试验了下vim和nginx.

安装Vim 7.3,先下载vim 7.3的源码包:

ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2

下载libncurses并安装

http://harmattan-dev.nokia.com/pool/harmattan/free/n/ncurses/libncurses5-dev_5.7+20081213-6-maemo1+0m6_armel.deb

解压vim的源码包后,编译、安装,很简单。

$ ./configure --enable-multibyte

$ make && make install

Nginx的编译也非常顺利,编译之前安装下面这两个软件包:

http://harmattan-dev.nokia.com/pool/harmattan/free/p/pcre3/libpcre3-dev_8.12-3maemo1+0m6_armel.deb
http://harmattan-dev.nokia.com/pool/harmattan/free/z/zlib/zlib1g-dev_1.2.3.3.dfsg-17+0m6_armel.deb

然后下载Nginx的源码包安装即可(注意修改Nginx的运行用户,因为权限问题要将端口改为1024以上)。Nginx运行截图。

Read more

利用html5的canvas绘制心形图案

在网上看到了一个gif图片(图片比较大,加载可能会有些慢),觉得挺有意思的:

于是做为娱乐,顺便试一下Html5的canvas, 仿照上面这个图片,用js写了一个html5版本的(请用支持html5的浏览器查看,如Chrome 、 Firefox 、Safari, IE9以下的版本不支持canvas,所以看不了)

Read more

Linux中去除pdf的密码

网上下载了一些pdf电子书,总是有些讨厌的家伙为了加个广告什么的,将pdf加上密码,然后再单独放里面一个写有密码的文件,每次打开这个pdf都要输入密码,即使有些pdf阅读器可以记住密码,但是如果哪天再拷贝到别的机器上,密码早忘了。要彻底解决这个问题还是要把密码去掉,下面介绍两种在Linux中去除pdf文件密码的方法(注意不是破解密码,是在知道密码的情况下永久解除密码):

方法一: 用evince文档阅读器打开pdf文档,输入密码,然后选择 文件->打印->选择“打印到文件”->输出格式选择pdf->点击打印,这样输出的pdf文件的密码就被去除了。

方法二: 利用ghostscript去除pdf文件密码

执行:

pdftops -upw your-pdf-paswsword input.pdf input.ps

执行后会生成一个input.ps文件

执行:

ps2pdf input.ps  output.pdf

新生成的output.pdf文件的密码已经去除了。

Read more