#16 各种链接文件

2013-04-29

Windows 系统

  • 硬链接 Hard Link
  • 同一分区内的文件
  • 软链接 Soft Link / 符号链接 Symbolic Link
  • 文件或目录都行
  • 可以在任何位置,跨磁盘,跨主机
  • 目标位置不存在也没有关系
  • 连接点 Junction,类似软链接,但是需要是本地路径
  • dir 查看目录时显示不同(<SYMLINK><JUNCTION>

PS:Windows 下创建的快捷方式(.lnk 文件)不属于文件链接,在文件系统中也不是透明的存在,只在 图形界面中有用。

$ mklink /?
创建符号链接。

MKLINK [[/D] | [/H] | [/J]] Link Target

        /D      创建目录符号链接。默认为文件
                符号链接。
        /H      创建硬链接而非符号链接。
        /J      创建目录联接。
        Link    指定新的符号链接名称。
        Target  指定新链接引用的路径
                (相对或绝对)。

Linux 系统

只有软链接和硬链接两种,没有 Junction 这种东西混淆视听。

ln -sf src dst  # 创建软链接
ln -Pf src dst  # 创建硬链接
$ ln --help
用法:ln [选项]... [-T] 目标 链接名
 或:ln [选项]... 目标
 或:ln [选项]... 目标... 目录
 或:ln [选项]... -t 目录 目标...
在第一种格式中,创建具有指定<链接名>且指向指定<目标>的链接。
在第二种格式中,在当前目录创建指向<目标>位置的链接。
在第三、四种格式中,在指定<目录>中创建指向指定<目标>的链接。
默认创建硬链接,当使用--symbolic 时创建符号链接。
默认情况下,创建每个目标时不应存在与新链接的名称相同的文件。
创建硬链接时,每个指定的<目标>都必须存在。符号链接可以指向任意的位置;
当链接解析正常时,将其解析为一个相对于其父目录的相对链接。

必选参数对长短选项同时适用。
      --backup[=CONTROL]      为每个已存在的目标文件创建备份文件
  -b                          类似--backup,但不接受任何参数
  -d, -F, --directory         允许超级用户尝试创建指向目录的硬链接
                              (注意:此操作可能因系统限制而失败)
  -f, --force                 强行删除任何已存在的目标文件
  -i, --interactive           删除目标文件前进行确认
  -L, --logical               如目标为符号链接,本次创建链接时将其解引用
  -n, --no-dereference        如果给定<链接名>是一个链接至某目录的符号链接,
                                将其作为普通文件处理
  -P, --physical              创建直接指向符号链接文件的硬链接
  -r, --relative              创建相对于链接位置的符号链接
  -s, --symbolic              创建符号链接而非硬链接
  -S, --suffix=后缀           自行指定备份文件的后缀
  -t, --target-directory=目录  在指定<目录>中创建链接
  -T, --no-target-directory   总是将给定的<链接名>当作普通文件
  -v, --verbose               列出每个链接的文件名称
      --help            显示此帮助信息并退出
      --version         显示版本信息并退出

备份文件的后缀为"~",除非以--suffix 选项或是 SIMPLE_BACKUP_SUFFIX
环境变量指定。版本控制的方式可通过--backup 选项或 VERSION_CONTROL 环境
变量来选择。以下是可用的变量值:

  none, off       不进行备份(即使使用了--backup 选项)
  numbered, t     备份文件加上数字进行排序
  existing, nil   若有数字的备份文件已经存在则使用数字,否则使用普通方式备份
  simple, never   永远使用普通方式备份

使用 -s 选项会忽略 -L 和 -P。
否则当<目标>为一个符号链接(默认为 -P)时,会由最后一个指定的选项来控制行为。

GNU coreutils 在线帮助:<https://www.gnu.org/software/coreutils/>
请向 <http://translationproject.org/team/zh_CN.html> 报告任何翻译错误
完整文档 <https://www.gnu.org/software/coreutils/ln>
或者在本地使用:info '(coreutils) ln invocation'

参考资料与拓展阅读

#15 Python 随机模块

2013-04-17

示例

import string
import random

CHARS1 = string.ascii_letters
CHARS2 = string.ascii_letters + string.digits

def get_random_string(len=5, chars=None):
    if not chars:
        chars = CHARS1
    return ''.join(random.choice(chars) for _ in range(len))

# python3
def get_random_bytes(len=5):
    return bytes(bytearray((random.randrange(256) for _ in range(len))))

# python2
def get_random_bytes(len=5):
    return ''.join(chr(random.randrange(256)) for _ in range(len))

其他 随机字节的方法:

import Cryptodome.Random
Cryptodome.Random.get_random_bytes(size)

In [15]: os.getrandom
Out[15]: <function posix.getrandom(size, flags=0)>

In [17]: os.urandom
Out[17]: <function posix.urandom(size, /)>

#14 计算机专业课程

2013-04-13

计算机的本科教育主要是不变的政治、英语、数学,加上计算机专业课。

  • 政治
  • 英语、专业英语
  • 数学
  • 高等数学(微积分)
  • 离散数学
  • 线性代数
  • 概率论与数理统计
  • 计算机专业课
  • 电气方面
    • 大学物理
    • 模拟电路
    • 数字逻辑(数字电路与逻辑设计)
    • 信号处理原理
    • 系统分析与控制
  • 硬件方面
    • 计算机组成原理
    • 计算机体系结构
    • 微机原理与接口技术
    • 汇编语言
  • 理论课程
    • 操作系统
    • 计算机网络
    • 数据结构与算法
    • 数据库系统原理
    • 编译原理 / 形式语言 / 自动机 / 程序语言理论
    • 软件工程
  • 编程语言
    • C
    • C++
    • Java
    • Python
    • PHP
    • C#
  • 一些杂七杂八的课程(更细致的发展方向)
    • 多媒体技术
    • 相关法律法规
    • Linux 驱动开发
    • 人工智能 / 机器学习 / 自然语言处理
    • 云计算
    • 分布式系统
    • 图形学
    • 机器人工程
    • SQL Server
    • 计算机安全
    • 计算机视觉(CV)
    • 软件测试

PS:我觉得比较重要的五门理论课程加粗了。

参考资料与拓展阅读

#13 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

#12 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() 在一个集合中添加另一个集合中的元素

#11 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

#10 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 声明来定义编码

#9 Base 系列方法总结

2012-03-07

按二进制位来算:

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

不按二进制位来算:

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