#14 ls 按时间排序

2013-04-07
## list, sort by name

# display mtime (默认)
ls -l
# display ctime
ls -lc
ls -l --time=ctime # OR status
# display atime
ls -lu
ls -l --time=atime # OR access, use
# display birth time
ls -l --time=birth # OR creation

## list, sort by time

# sort by mtime
ls -lt
ls -lt --time=mtime
# sort by ctime
ls -ltc
ls -lt --time=ctime
# sort by atime
ls -ltu
ls -lt --time=atime
# sort by birth time
ls -lt --time=birth

助记:

-l # list, sort by name
-t # sort by time
-c # use ctime
-u # use atime
--time=ctime/atime/birth
# 默认时间是 mtime

小实验

# cat /tmp/test.sh
set -xe

rm -f /tmp/a.log

date +%T
touch /tmp/a.log        # brtime, birth time
sleep 1

date +%T
echo "hello world" > /tmp/a.log # mtime, modify time
sleep 1

date +%T
cat /tmp/a.log          # atime, access time
sleep 1

date +%T
chmod 666 /tmp/a.log    # ctime, change time
sleep 1

# date +%T
# echo "nihao" >> /tmp/a.log # mtime, modify time
# sleep 1

stat /tmp/a.log

PS: 修改内容的时候也会更改 ctime

#13 Python自学 07: set 类型

2013-04-03

声明

a = set() # ps: {} 表示空字典
b = set([1, 2, 3])
c = {1, 2, 3}

方法清单

  • .add(x) 添加元素
  • .clear() 清空集合
  • .copy() 复制集合

  • .difference() 返回两个集合的差集

  • .difference_update() 在主集合中只移除交集部分

  • .discard() 删除集合中的元素

  • .intersection() 返回两个集合的交集

  • .intersection_update() 在主集合中只保留交集部分

  • .isdisjoint() 判断两个集合是否没有公共元素

  • .issubset() 判断一个集合是否是另一个集合的子集
  • .issuperset() 判断一个集合是否是另一个集合的超集
  • .pop() 删除并返回一个随机元素
  • .remove() 删除集合中的元素

  • .symmetric_difference() 返回两个集合的对称差集,即排除所有重复元素之后的合集

  • .symmetric_difference_update() 在主集合中加入其他集合中的元素,然后移除交集部分

  • .union() 返回两个集合的并集

  • .update() 在一个集合中添加另一个集合中的元素

#12 PHP FPM

2013-02-21

FPM 就是 PHP FastCGI Process Manager 的简称。

历史

最传统的方式是通过 Apache mod_php 模块提供服务,将 PHP 解释器内嵌到 Apache 进程内部。

另一条路就是通过 CGI/FastCGI。演化路线:php cgi -> php fastcgi -> php fpm

CGI (公共网关接口) 是一个非常简单的协议,每次来一个请求,CGI 就启动一个 PHP 进程,请求处理完成之后就退出进程。
PS: PHP 内置 CGI 支持(php-cgi)。
PS:php-cgi 也可以常驻内存,作为 FastCGI Worker 运行。

CGI 需要反复启动退出进程(解析配置文件,配置环境变量,加载拓展...),这个性能开销就非常大了,所以 CGI 很快被 FastCGI 所替代。
FastCGI 则是通过 CGI 进程常驻的方式提供服务,Web 服务器通过 FastCGI 协议将请求发给主进程 (master), 主进程又将请求分发给子进程(worker)进行处理。
这样的话性能得到的很大的改进。而且可以和数据库之间保持连接,进一步节省时间提高效率。

之前是使用 Apache 的 FastCGI 拓展模块 mod_fastcgi、mod_fcgid 来弄,这个模块是起到 CGI 进程管理的作用。
有人开发了 Spawn-FCGI(来自 lighttpd 项目,通用 FastCGI 管理)、PHP-FPM (作为 PHP 的补丁开发) 来提供 CGI 进程管理,将管理权从 Apache 拿过来,其中 FPM 和 PHP 结合更好,性能更胜一筹,后来被并入 PHP (从 5.4 开始)。

https://php-fpm.org/
https://www.php.net/manual/en/install.fpm.php

Apache + mod_proxy_fcgi + php-fpm

http://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html

加载 mod_proxy_fcgi 模块

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

SetHandler

<FilesMatch "\.php$">
    # Note: The only part that varies is /path/to/app.sock
    SetHandler  "proxy:unix:/path/to/app.sock|fcgi://localhost/"
</FilesMatch>

<FilesMatch ...>
    SetHandler  "proxy:fcgi://localhost:9000"
</FilesMatch>

<Proxy "balancer://myappcluster/">
    BalancerMember "fcgi://localhost:4000"
    BalancerMember "fcgi://localhost:4001"
</Proxy>
<FilesMatch ...>
    SetHandler  "proxy:balancer://myappcluster/"
</FilesMatch>

ProxyPass

ProxyPass "/myapp/" "fcgi://localhost:4000/"
ProxyPass "/myapp/" "fcgi://localhost:4000/" enablereuse=on
ProxyPass "/myapp/" "balancer://myappcluster/"

ProxyPassMatch

ProxyPassMatch "^/myapp/.*\.php(/.*)?$" "fcgi://localhost:9000/var/www/" enablereuse=on
ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php5-fpm.sock|fcgi://localhost/var/www/"

Nginx + php-fpm

Nginx 中的 fastcgi_pass 可以指定 FastCGI 进程,比如:fastcgi_pass 192.168.64.234:9000

#11 Web 字符编码

2013-02-02
  1. Content-Type: text/html; charset=ISO-8859-4 HTTP 头部
  2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  3. HTML5: <meta charset="utf-8">
  4. <?xml version="1.0" encoding="ISO-8859-1"?> XHTML 可以才用 XML 声明来定义编码

#10 高效能人士的七个习惯

2013-01-01

  • 个人领域的成功:从依赖到独立
    • 习惯一 积极主动 —— 个人愿景原则
    • 习惯二 以终为始 —— 自我领导原则
    • 习惯三 要事第一 —— 自我管理原则
  • 公众领域的成功:从独立到互赖
    • 习惯四 双赢思维 —— 人际领导原则
    • 习惯五 知己知彼 —— 同理心沟通原则
    • 习惯六 统合综效 —— 创造性合作原则
  • 自我提升和完善
    • 习惯七 不断更新 —— 平衡的自我提升原则

#9 Base 系列方法总结

2012-03-07

按二进制位来算:

  • Base16 四位
  • Base32 五位
  • Base64 六位

不按二进制位来算:

  • Base36 数字 + 字母
  • Base62 数字 + 字母(大小写敏感)
  • Base58 数字 + 字母(大小写敏感),然后排除 0OIi 4 个字符
  • Base85 有多种方案

#5 PHP 函数的引用返回

2011-12-07

遇到函数声明时前面加引用符号的情况。

调用函数时加引用符号可以理解,就是声明的接受变量是一个引用嘛。(实验证明,这是错的,说引用类型只能赋值给变量。What?不知所云,求指教。)

可是函数声明就没有那么好理解了。

php.net 中的例子:

<?php
class foo {
    public $value = 42;
    public function &getValue() {
        return $this->value;
    }
}
$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue; // prints the new value of $obj->value, i.e. 2.
?>

本例中 getValue 函数所返回的对象的属性将被赋值,而不是拷贝,就和没有用引用语法一样。

还是没太明白,试验先。

eg 1、普通的函数声明,然后引用接收。

function foo() {
    $var = 0;
    return $var;
}
$get = & foo();
var_dump($get);
$get = 5;
$get = & foo();
var_dump($get);

结果:

Strict standards: Only variables should be assigned by reference
int 0
Strict standards: Only variables should be assigned by reference
int 0

eg 2、将上面例子中的函数声明成了引用返回。

function & foo() {
    $var = 0;
    return $var;
}
$get = foo();
var_dump($get);
$get = 5;
$get = foo();
var_dump($get);

结果:

int 0
int 0

和没有把函数声明成引用一样的效果。

eg 3、将上面例子中的函数声明成了引用返回。

function & foo() {
    static $var = 0;
    return $var;
}
$get = & foo();
var_dump($get);
$get = 5;
$get = & foo();
var_dump($get);

结果:

int 0

int 5

eg 4、面向对象中引用返回的应用。

/**
* 试验辅类,用于试验主类属性 ref 的 `->` 操作。
*/
class Ex {
public $some;
    function __construct() {
        $this->some = 0;
    }
    public function set($v) {
        $this->some = $v;
    }
    public function get() {
        return $this->some;
    }
}
/**
* 试验主类
*/
class MyClass {
    public $ref;
    function __construct() {
        $this->ref = & foo();
    }
}
function & foo() {
    $var = new Ex;
    return $var;
}
$class = new MyClass();
$class->ref->set(5);
var_dump($class->ref->get());

结果:

int 5

总结

  1. 一般来说,函数返回就是返回一个值。
  2. 引用就是计算出变量的地址。
  3. 引用返回是把返回变量的引用返回来了。而且,返回引用的格式决定了两边都要用 & 声明。
    若只是在函数那边声明引用,那么返回结果将依然是赋值给接收变量。是不是就是返回一个变量拷贝呢?
    若只是在接收变量那边声明引用就会报错,因为函数(还是返回的值?)不能用 & 求地址。