在 shell 中常用的特殊符號

在shell中常用的特殊符號:

# ;    ;;       .       ,        /        \        'string'|        !    $    ${}    $?       $$    $*        "string"*      **    ?       :        ^       $#    $@        `command`{}     []       [[]]      ()     (())         ||    &&        {xx,yy,zz,...}~    ~+    ~-     &    \<...\>    +        -         %=    ==    !=                    

输出/输入重导向
>       >>    <    <<    : >    &>    2&>    2<>>&    >&2                         

# 井号 (comments)
这几乎是个满场都有的符号,除了先前已经提过的"第一行"
#!/bin/bash
井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行。
# This line is comments.
echo "a = $a" # a = 0
由于这个特性,当临时不想执行某行指令时,只需在该行开头加上 # 就行了。这常用在撰写过程中。
#echo "a = $a" # a = 0
如果被用在指令中,或者引号双引号括住的话,或者在倒斜线的后面,那他就变成一般符号,不具上述的特殊功能。

~ 帐户的 home 目录
算是个常见的符号,代表使用者的 home 目录:cd ~;也可以直接在符号后加上某帐户的名称:cd ~user
或者当成是路径的一部份:~/bin;~+ 当前的工作目录,这个符号代表当前的工作目录,她和内建指令 pwd 的作用是相同的。
# echo ~+/var/log~- 上次的工作目录,这个符号代表上次的工作目录。
# echo ~-/etc/httpd/logs

; 分号 (Command separator)
在 shell 中,担任"连续指令"功能的符号就是"分号"。譬如以下的例子:cd ~/backup ; mkdir startup ; cp ~/.* startup/.

;; 连续分号 (Terminator)
专用在 case 的选项,担任 Terminator 的角色。
case "$fop" inhelp) echo "Usage: Command -help -version filename" ;;version) echo "version 0.1" ;;esac

. 逗号 (dot)
在 shell 中,使用者应该都清楚,一个 dot 代表当前目录,两个 dot 代表上层目录。
CDPATH=.:~:/home:/home/web:/var:/usr/local
在上行 CDPATH 的设定中,等号后的 dot 代表的就是当前目录的意思。
如果档案名称以 dot 开头,该档案就属特殊档案,用 ls 指令必须加上 -a 选项才会显示。除此之外,在 regular expression 中,一个 dot 代表匹配一个字元。

'string' 单引号 (single quote)
被单引号用括住的内容,将被视为单一字串。在引号内的代表变数的$符号,没有作用,也就是说,他被视为一般符号处理,防止任何变量替换。
heyyou=homeecho '$heyyou' # We get $heyyou

"string" 双引号 (double quote)
被双引号用括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。这点与单引数的处理方式不同。
heyyou=homeecho "$heyyou" # We get home
`command` 倒引号 (backticks)
在前面的单双引号,括住的是字串,但如果该字串是一列命令列,会怎样?答案是不会执行。要处理这种情况,我们得用倒单引号来做。
fdv=`date +%F`echo "Today $fdv"
在倒引号内的 date +%F 会被视为指令,执行的结果会带入 fdv 变数中。

, 逗点 (comma)
这个符号常运用在运算当中当做"区隔"用途。如下例
#!/bin/bashlet "t1 = ((a = 5 + 3, b = 7 - 1, c = 15 / 3))"echo "t1 = $t1, a = $a, b = $b"

/ 斜线 (forward slash)
在路径表示时,代表目录。
cd /etc/rc.dcd ../..cd /
通常单一的 / 代表 root 根目录的意思;在四则运算中,代表除法的符号。
let "num1 = ((a = 10 / 2, b = 25 / 5))"

\ 倒斜线 (
)
在交互模式下的escape 字元,有几个作用;放在指令前,有取消 aliases 的作用;放在特殊符号前,则该特殊符号的作用消失;放在指令的最末端,表示指令连接下一行。
# type rmrm is aliased to `rm -i'# \rm ./*.log
上例,我在 rm 指令前加上 escape 字元,作用是暂时取消别名的功能,将 rm 指令还原。
# bkdir=/home# echo "Backup dir, \$bkdir = $bkdir"Backup dir, $bkdir = /home
上例 echo 内的 \$bkdir,escape 将 $ 变数的功能取消了,因此,会输出 $bkdir,而第二个 $bkdir 则会输出变数的内容 /home。

| 管道 (pipeline)
pipeline 是 UNIX 系统,基础且重要的观念。连结上个指令的标准输出,做为下个指令的标准输入。
who | wc -l
善用这个观念,对精简 script 有相当的帮助。

! 惊叹号(negate or reverse)
通常它代表反逻辑的作用,譬如条件侦测中,用 != 来代表"不等于"
if [ "$?" != 0 ]thenecho "Executes error"exit 1fi
在规则表达式中她担任 "反逻辑" 的角色
ls a[!0-9]
上例,代表显示除了a0, a1 .... a9 这几个文件的其他文件。

: 冒号
在 bash 中,这是一个内建指令:"什么事都不干",但返回状态值 0。
:
echo $? # 回应为 0
: > f.$$
上面这一行,相当于 cat /dev/null > f.$$。不仅写法简短了,而且执行效率也好上许多。
有时,也会出现以下这类的用法
: ${HOSTNAME?} ${USER?} ${MAIL?}
这行的作用是,检查这些环境变数是否已设置,没有设置的将会以标准错误显示错误讯息。像这种检查如果使用类似 test 或 if 这类的做法,基本上也可以处理,但都比不上上例的简洁与效率。
除了上述之外,还有一个地方必须使用冒号
PATH=$PATH:$HOME/fbin:$HOME/fperl:/usr/local/mozilla
在使用者自己的HOME 目录下的 .bash_profile 或任何功能相似的档案中,设定关于"路径"的场合中,我们都使用冒号,来做区隔。

? 问号 (wild card)
在文件名扩展(Filename expansion)上扮演的角色是匹配一个任意的字元,但不包含 null 字元。
# ls a?a1
善用她的特点,可以做比较精确的档名匹配。

* 星号 (wild card)
相当常用的符号。在文件名扩展(Filename expansion)上,她用来代表任何字元,包含 null 字元。
# ls a*a a1 access_log
在运算时,它则代表 "乘法"。
let "fmult=2*3"
除了内建指令 let,还有一个关于运算的指令 expr,星号在这里也担任"乘法"的角色。不过在使用上得小心,他的前面必须加上escape 字元。

** 次方运算
两个星号在运算时代表 "次方" 的意思。
let "sus=2**3"echo "sus = $sus" # sus = 8

$ 钱号(dollar sign)
变量替换(Variable Substitution)的代表符号。
vrs=123echo "vrs = $vrs" # vrs = 123
另外,在 Regular Expressions 里被定义为 "行" 的最末端 (end-of-line)。这个常用在 grep、sed、awk 以及 vim(vi) 当中。

${} 变量的正规表达式
bash 对 ${} 定义了不少用法。以下是取自线上说明的表列
    ${parameter:-word}    ${parameter:=word}    ${parameter:?word}    ${parameter:+word}    ${parameter:offset}    ${parameter:offset:length}    ${!prefix*}    ${#parameter}    ${parameter#word}    ${parameter##word}    ${parameter%word}    ${parameter%%word}    ${parameter/pattern/string}    ${parameter//pattern/string}

$*引用script 的执行引用变量,引用参数的算法与一般指令相同,指令本身为0,其后为1,然后依此类推。引用变量的代表方式如下:
$0, $1, $2, $3, $4, $5, $6, $7, $8, $9, ${10}, ${11}.....
个位数的,可直接使用数字,但两位数以上,则必须使用 {} 符号来括住。
$* 则是代表所有引用变量的符号。使用时,得视情况加上双引号。
echo "$*"
还有一个与 $* 具有相同作用的符号,但效用与处理方式略为不同的符号。

$@
$@ 与 $* 具有相同作用的符号,不过她们两者有一个不同点。
符号 $* 将所有的引用变量视为一个整体。但符号 $@ 则仍旧保留每个引用变量的区段观念。
$#
这也是与引用变量相关的符号,她的作用是告诉你,引用变量的总数量是多少。
echo "$#"

$? 状态值 (status variable)
一般来说,UNIX(linux) 系统的进程以执行系统调用exit() 来结束的。这个回传值就是status值。回传给父进程,用来检查子进程的执行状态。
一般指令程序倘若执行成功,其回传值为 0;失败为 1。
tar cvfz dfbackup.tar.gz /home/user > /dev/nullecho "$?"$$
由于进程的ID是唯一的,所以在同一个时间,不可能有重复性的 PID。有时,script 会需要产生临时文件,用来存放必要的资料。而此script 亦有可能在同一时间被使用者们使用。在这种情况下,固定文件名在写法上就显的不可靠。唯有产生动态文件名,才能符合需要。符号$$ 或许可以符合这种需求。它代表当前shell 的 PID。
echo "$HOSTNAME, $USER, $MAIL" > ftmp.$$
使用它来作为文件名的一部份,可以避免在同一时间,产生相同文件名的覆盖现象。
ps: 基本上,系统会回收执行完毕的 PID,然后再次依需要分配使用。所以 script 即使临时文件是使用动态档名的写法,如果 script 执行完毕后仍不加以清除,会产生其他问题。

() 指令群组 (command group)
用括号将一串连续指令括起来,这种用法对 shell 来说,称为指令群组。如下面的例子:(cd ~ ; vcgh=`pwd` ; echo $vcgh),指令群组有一个特性,shell会以产生 subshell 来执行这组指令。因此,在其中所定义的变数,仅作用于指令群组本身。我们来看个例子
# cat ftmp-01#!/bin/basha=fsh(a=incg ; echo -e "\n $a \n")echo $a# ./ftmp-01incgfsh
除了上述的指令群组,括号也用在 array 变数的定义上;另外也应用在其他可能需要加上escape 字元才能使用的场合,如运算式。

(())
这组符号的作用与 let 指令相似,用在算数运算上,是 bash 的内建功能。所以,在执行效率上会比使用 let 指令要好许多。
#!/bin/bash(( a = 10 ))echo -e "inital value, a = $a\n"(( a++ ))echo "after a++, a = $a"

{} 大括号 (Block of code)
有时候 script 当中会出现,大括号中会夹着一段或几段以"分号"做结尾的指令或变数设定。
# cat ftmp-02#!/bin/basha=fsh{a=inbc ; echo -e "\n $a \n"}echo $a# ./ftmp-02inbcinbc
这种用法与上面介绍的指令群组非常相似,但有个不同点,它在当前的 shell 执行,不会产生 subshell。
大括号也被运用在 "函数" 的功能上。广义地说,单纯只使用大括号时,作用就像是个没有指定名称的函数一般。因此,这样写 script 也是相当好的一件事。尤其对输出输入的重导向上,这个做法可精简 script 的复杂度。
此外,大括号还有另一种用法,如下
{xx,yy,zz,...}
这种大括号的组合,常用在字串的组合上,来看个例子
mkdir {userA,userB,userC}-{home,bin,data}
我们得到 userA-home, userA-bin, userA-data, userB-home, userB-bin, userB-data, userC-home, userC-bin, userC-data,这几个目录。这组符号在适用性上相当广泛。能加以善用的话,回报是精简与效率。像下面的例子
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
如果不是因为支援这种用法,我们得写几行重复几次呀!

[] 中括号
常出现在流程控制中,扮演括住判断式的作用。
if [ "$?" != 0 ]thenecho "Executes error"exit 1fi
这个符号在正则表达式中担任类似 "范围" 或 "集合" 的角色
rm -r 200[1234]
上例,代表删除 2001, 2002, 2003, 2004 等目录的意思。

[[]]
这组符号与先前的 [] 符号,基本上作用相同,但她允许在其中直接使用 || 与 && 逻辑等符号。
#!/bin/bashread akif [[ $ak > 5 || $ak < 9 ]]thenecho $akfi

|| 逻辑符号
这个会时常看到,代表 or 逻辑的符号。

&& 逻辑符号
这个也会常看到,代表 and 逻辑的符号。

& 后台工作
单一个& 符号,且放在完整指令列的最后端,即表示将该指令列放入后台中工作。
tar cvfz data.tar.gz data > /dev/null &
\<...\> 单字边界
这组符号在规则表达式中,被定义为"边界"的意思。譬如,当我们想找寻 the 这个单字时,如果我们用
grep the FileA
你将会发现,像 there 这类的单字,也会被当成是匹配的单字。因为 the 正巧是 there 的一部份。如果我们要必免这种情况,就得加上 "边界" 的符号
grep '\' FileA

+ 加号 (plus)
在运算式中,她用来表示 "加法"。
expr 1 + 2 + 3
此外在规则表达式中,用来表示"很多个"的前面字元的意思。
# grep '10\+9' fileB109100910000910000931010009#这个符号在使用时,前面必须加上 escape 字元。

- 减号 (dash)
在运算式中,她用来表示 "减法"。
expr 10 - 2
此外也是系统指令的选项符号。
ls -expr 10 - 2
在 GNU 指令中,如果单独使用 - 符号,不加任何该加的文件名称时,代表"标准输入"的意思。这是 GNU 指令的共通选项。譬如下例
tar xpvf -
这里的 - 符号,既代表从标准输入读取资料。
不过,在 cd 指令中则比较特别
cd -
这代表变更工作目录到"上一次"工作目录。

% 除法 (Modulo)
在运算式中,用来表示 "除法"。
expr 10 % 2
此外,也被运用在关于变量的规则表达式当中的下列
${parameter%word}${parameter%%word}
一个 % 表示最短的 word 匹配,两个表示最长的 word 匹配。 

= 等号 (Equals)
常在设定变数时看到的符号。
vara=123echo " vara = $vara"
或者像是 PATH 的设定,甚至应用在运算或判断式等此类用途上。

== 等号 (Equals)
常在条件判断式中看到,代表 "等于" 的意思。
if [ $vara == $varb ]
...下略
!= 不等于
常在条件判断式中看到,代表 "不等于" 的意思。
if [ $vara != $varb ]
...下略

^
这个符号在规则表达式中,代表行的 "开头" 位置。

Linux 特殊符號

http://www.cnblogs.com/balaamwe/archive/2012/03/15/2397998.html

在shell中常用的特殊符号罗列如下:

#   ;   ;;      .      ,       /       \       'string'|       !   $   ${}   $?      $$   $*  "string"*     **   ?   :   ^   $#   $@    `command`{}  []   [[]]   ()    (())  ||   &&       {xx,yy,zz,...}~   ~+   ~-    &   \<...\>   +       -        %=   ==   != 

# 井号 (comments)
这几乎是个满场都有的符号,除了先前已经提过的"第一行"
#!/bin/bash
井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行。
# This line is comments.
echo "a = $a" # a = 0
由于这个特性,当临时不想执行某行指令时,只需在该行开头加上 # 就行了。这常用在撰写过程中。
#echo "a = $a" # a = 0
如果被用在指令中,或者引号双引号括住的话,或者在倒斜线的后面,那他就变成一般符号,不具上述的特殊功能。


帐户的 home 目录
算是个常见的符号,代表使用者的 home 目录:cd ~;也可以直接在符号后加上某帐户的名称:cd ~user或者当成是路径的一部份:~/bin
~+ 当前的工作目录,这个符号代表当前的工作目录,她和内建指令 pwd的作用是相同的。
# echo ~+/var/log
~- 上次的工作目录,这个符号代表上次的工作目录。
# echo ~-/etc/httpd/logs


分号 (Command separator)
在 shell 中,担任"连续指令"功能的符号就是"分号"。譬如以下的例子:cd ~/backup ; mkdir startup ;cp ~/.* startup/.


;; 连续分号 (Terminator)
专用在 case 的选项,担任 Terminator 的角色。
case "$fop" inhelp) echo "Usage: Command -help -version filename";;version) echo "version 0.1" ;;esac


逗号 (dot,就是“点”)
在 shell 中,使用者应该都清楚,一个 dot 代表当前目录,两个 dot 代表上层目录。
CDPATH=.:~:/home:/home/web:/var:/usr/local
在上行 CDPATH 的设定中,等号后的 dot 代表的就是当前目录的意思。
如果档案名称以 dot 开头,该档案就属特殊档案,用 ls 指令必须加上 -a 选项才会显示。除此之外,在 regularexpression 中,一个 dot 代表匹配一个字元。


'string' 单引号 (single quote)
被单引号用括住的内容,将被视为单一字串。在引号内的代表变数的$符号,没有作用,也就是说,他被视为一般符号处理,防止任何变量替换。
heyyou=homeecho '$heyyou' # We get $heyyou


"string" 双引号 (double quote)
被双引号用括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。这点与单引数的处理方式不同。
heyyou=homeecho "$heyyou" # We get home

`command` 倒引号 (backticks)
在前面的单双引号,括住的是字串,但如果该字串是一列命令列,会怎样?答案是不会执行。要处理这种情况,我们得用倒单引号来做。
fdv=`date +%F`echo "Today $fdv"
在倒引号内的 date +%F 会被视为指令,执行的结果会带入 fdv 变数中。


逗点 (comma,标点中的逗号)
这个符号常运用在运算当中当做"区隔"用途。如下例
#!/bin/bashlet "t1 = ((a = 5 + 3, b = 7 - 1, c = 15 / 3))"echo "t1= $t1, a = $a, b = $b"


斜线 (forward slash)
在路径表示时,代表目录。
cd /etc/rc.dcd ../..cd /
通常单一的 / 代表 root 根目录的意思;在四则运算中,代表除法的符号。
let "num1 = ((a = 10 / 2, b = 25 / 5))"


倒斜线
在交互模式下的escape 字元,有几个作用;放在指令前,有取消 aliases的作用;放在特殊符号前,则该特殊符号的作用消失;放在指令的最末端,表示指令连接下一行。
# type rmrm is aliased to `rm -i'# \rm ./*.log
上例,我在 rm 指令前加上 escape 字元,作用是暂时取消别名的功能,将 rm 指令还原。
# bkdir=/home# echo "Backup dir, \$bkdir = $bkdir"Backup dir,$bkdir = /home
上例 echo 内的 \$bkdir,escape 将 $ 变数的功能取消了,因此,会输出 $bkdir,而第二个 $bkdir则会输出变数的内容 /home。


管道 (pipeline)
pipeline 是 UNIX 系统,基础且重要的观念。连结上个指令的标准输出,做为下个指令的标准输入。
who | wc -l
善用这个观念,对精简 script 有相当的帮助。


惊叹号(negate or reverse)
通常它代表反逻辑的作用,譬如条件侦测中,用 != 来代表"不等于"
if [ "$?" != 0 ]thenecho "Executes error"exit 1fi
在规则表达式中她担任 "反逻辑" 的角色
ls a[!0-9]
上例,代表显示除了a0, a1 .... a9 这几个文件的其他文件。


冒号
在 bash 中,这是一个内建指令:"什么事都不干",但返回状态值 0。
:
echo $? # 回应为 0
: > f.$$
上面这一行,相当于 cat /dev/null >f.$$。不仅写法简短了,而且执行效率也好上许多。
有时,也会出现以下这类的用法
: ${HOSTNAME?} ${USER?} ${MAIL?}
这行的作用是,检查这些环境变数是否已设置,没有设置的将会以标准错误显示错误讯息。像这种检查如果使用类似 test 或 if这类的做法,基本上也可以处理,但都比不上上例的简洁与效率。
除了上述之外,还有一个地方必须使用冒号
PATH=$PATH:$HOME/fbin:$HOME/fperl:/usr/local/mozilla
在使用者自己的HOME 目录下的 .bash_profile或任何功能相似的档案中,设定关于"路径"的场合中,我们都使用冒号,来做区隔。


问号 (wild card)
在文件名扩展(Filename expansion)上扮演的角色是匹配一个任意的字元,但不包含 null 字元。
# ls a?a1
善用她的特点,可以做比较精确的档名匹配。


星号 (wild card)
相当常用的符号。在文件名扩展(Filename expansion)上,她用来代表任何字元,包含 null 字元。
# ls a*a a1 access_log
在运算时,它则代表 "乘法"。
let "fmult=2*3"
除了内建指令 let,还有一个关于运算的指令expr,星号在这里也担任"乘法"的角色。不过在使用上得小心,他的前面必须加上escape 字元。


** 次方运算
两个星号在运算时代表 "次方" 的意思。
let "sus=2**3"echo "sus = $sus" # sus = 8


钱号(dollar sign)
变量替换(Variable Substitution)的代表符号。
vrs=123echo "vrs = $vrs" # vrs = 123
另外,在 Regular Expressions 里被定义为 "行" 的最末端 (end-of-line)。这个常用在grep、sed、awk 以及 vim(vi) 当中。


${} 变量的正规表达式
bash 对 ${} 定义了不少用法。以下是取自线上说明的表列
   ${parameter:-word}   ${parameter:=word}   ${parameter:?word}   ${parameter:+word}   ${parameter:offset}   ${parameter:offset:length}   ${!prefix*}   ${#parameter}   ${parameter#word}   ${parameter##word}   ${parameter%word}   ${parameter%%word}   ${parameter/pattern/string}   ${parameter//pattern/string}


$* 
$* 
引用script的执行引用变量,引用参数的算法与一般指令相同,指令本身为0,其后为1,然后依此类推。引用变量的代表方式如下:
$0, $1, $2, $3, $4, $5, $6, $7, $8, $9, ${10}, ${11}.....
个位数的,可直接使用数字,但两位数以上,则必须使用 {} 符号来括住。
$* 则是代表所有引用变量的符号。使用时,得视情况加上双引号。
echo "$*"
还有一个与 $* 具有相同作用的符号,但效用与处理方式略为不同的符号。


$@
$@ 与 $* 具有相同作用的符号,不过她们两者有一个不同点。
符号 $* 将所有的引用变量视为一个整体。但符号 $@ 则仍旧保留每个引用变量的区段观念。

$#
这也是与引用变量相关的符号,她的作用是告诉你,引用变量的总数量是多少。
echo "$#"


$? 状态值 (status variable)
一般来说,UNIX(linux) 系统的进程以执行系统调用exit()来结束的。这个回传值就是status值。回传给父进程,用来检查子进程的执行状态。
一般指令程序倘若执行成功,其回传值为 0;失败为 1。
tar cvfz dfbackup.tar.gz /home/user > /dev/nullecho"$?"$$
由于进程的ID是唯一的,所以在同一个时间,不可能有重复性的 PID。有时,script会需要产生临时文件,用来存放必要的资料。而此script亦有可能在同一时间被使用者们使用。在这种情况下,固定文件名在写法上就显的不可靠。唯有产生动态文件名,才能符合需要。符号$$或许可以符合这种需求。它代表当前shell 的 PID。
echo "$HOSTNAME, $USER, $MAIL" > ftmp.$$
使用它来作为文件名的一部份,可以避免在同一时间,产生相同文件名的覆盖现象。
ps: 基本上,系统会回收执行完毕的 PID,然后再次依需要分配使用。所以 script 即使临时文件是使用动态档名的写法,如果script 执行完毕后仍不加以清除,会产生其他问题。

(   ) 指令群组 (command group)
用括号将一串连续指令括起来,这种用法对 shell 来说,称为指令群组。如下面的例子:(cd ~ ; vcgh=`pwd` ;echo $vcgh),指令群组有一个特性,shell会以产生 subshell来执行这组指令。因此,在其中所定义的变数,仅作用于指令群组本身。我们来看个例子
# cat ftmp-01#!/bin/basha=fsh(a=incg ; echo -e "\n $a \n")echo $a#./ftmp-01incgfsh
除了上述的指令群组,括号也用在 array 变数的定义上;另外也应用在其他可能需要加上escape字元才能使用的场合,如运算式。


((  ))
这组符号的作用与 let 指令相似,用在算数运算上,是 bash 的内建功能。所以,在执行效率上会比使用 let指令要好许多。
#!/bin/bash(( a = 10 ))echo -e "inital value, a = $a\n"(( a++))echo "after a++, a = $a"

{  } 大括号 (Block of code)
有时候 script 当中会出现,大括号中会夹着一段或几段以"分号"做结尾的指令或变数设定。
# cat ftmp-02#!/bin/basha=fsh{a=inbc ; echo -e "\n $a \n"}echo $a#./ftmp-02inbcinbc
这种用法与上面介绍的指令群组非常相似,但有个不同点,它在当前的 shell 执行,不会产生 subshell。
大括号也被运用在 "函数" 的功能上。广义地说,单纯只使用大括号时,作用就像是个没有指定名称的函数一般。因此,这样写 script也是相当好的一件事。尤其对输出输入的重导向上,这个做法可精简 script 的复杂度。

此外,大括号还有另一种用法,如下
{xx,yy,zz,...}
这种大括号的组合,常用在字串的组合上,来看个例子
mkdir {userA,userB,userC}-{home,bin,data}
我们得到 userA-home, userA-bin, userA-data, userB-home, userB-bin,userB-data, userC-home, userC-bin,userC-data,这几个目录。这组符号在适用性上相当广泛。能加以善用的话,回报是精简与效率。像下面的例子
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
如果不是因为支援这种用法,我们得写几行重复几次呀!


[   ] 中括号
常出现在流程控制中,扮演括住判断式的作用。if [ "$?" != 0 ]thenecho "Executes error"exit1fi
这个符号在正则表达式中担任类似 "范围" 或 "集合" 的角色
rm -r 200[1234]
上例,代表删除 2001, 2002, 2003, 2004 等目录的意思。


[[     ]]
这组符号与先前的 [] 符号,基本上作用相同,但她允许在其中直接使用 || 与&& 逻辑等符号。
#!/bin/bashread akif [[ $ak > 5 || $ak< 9 ]]thenecho $akfi


|| 逻辑符号
这个会时常看到,代表 or 逻辑的符号。


&& 逻辑符号
这个也会常看到,代表 and 逻辑的符号。


后台工作
单一个& 符号,且放在完整指令列的最后端,即表示将该指令列放入后台中工作。
tar cvfz data.tar.gz data > /dev/null&

\<...\> 单字边界
这组符号在规则表达式中,被定义为"边界"的意思。譬如,当我们想找寻 the 这个单字时,如果我们用
grep the FileA
你将会发现,像 there 这类的单字,也会被当成是匹配的单字。因为 the 正巧是 there的一部份。如果我们要必免这种情况,就得加上 "边界" 的符号
grep '\' FileA


加号 (plus)
在运算式中,她用来表示 "加法"。
expr 1 + 2 + 3
此外在规则表达式中,用来表示"很多个"的前面字元的意思。
# grep '10\+9' fileB109100910000910000931010009#这个符号在使用时,前面必须加上escape 字元。


减号 (dash)
在运算式中,她用来表示 "减法"。
expr 10 - 2
此外也是系统指令的选项符号。
ls -expr 10 - 2
在 GNU 指令中,如果单独使用 - 符号,不加任何该加的文件名称时,代表"标准输入"的意思。这是 GNU指令的共通选项。譬如下例
tar xpvf -
这里的 - 符号,既代表从标准输入读取资料。
不过,在 cd 指令中则比较特别
cd -
这代表变更工作目录到"上一次"工作目录。


除法 (Modulo)
在运算式中,用来表示 "除法"。
expr 10 % 2
此外,也被运用在关于变量的规则表达式当中的下列
${parameter%word}${parameter%%word}
一个 % 表示最短的 word 匹配,两个表示最长的 word 匹配。


等号 (Equals)
常在设定变数时看到的符号。
vara=123echo " vara = $vara"
或者像是 PATH 的设定,甚至应用在运算或判断式等此类用途上。


== 等号 (Equals)
常在条件判断式中看到,代表 "等于" 的意思。
if [ $vara == $varb ]
...下略

!= 不等于
常在条件判断式中看到,代表 "不等于" 的意思。
if [ $vara != $varb ]
...下略


^
这个符号在规则表达式中,代表行的 "开头" 位置,在[]中也与"!"(叹号)一样表示“非”


输出/输入重导向
>      >>   <   <<   :>   &>   2&>   2<>>&   >&2 

文件描述符(File Descriptor),用一个数字(通常为0-9)来表示一个文件。
常用的文件描述符如下:
文件描述符          名称         常用缩写     默认值
     0               标准输入      stdin            键盘
     1               标准输出      stdout         屏幕
     2            标准错误输出   stderr          屏幕
我们在简单地用<或>时,相当于使用 0< 或 1>(下面会详细介绍)。
* cmd > file
把cmd命令的输出重定向到文件file中。如果file已经存在,则清空原有文件,使用bash的noclobber选项可以防止复盖原有文件。
* cmd >> file
把cmd命令的输出重定向到文件file中,如果file已经存在,则把信息加在原有文件後面。
* cmd < file
使cmd命令从file读入
* cmd << text
从命令行读取输入,直到一个与text相同的行结束。除非使用引号把输入括起来,此模式将对输入内容进行shell变量替换。如果使用<<- ,则会忽略接下来输入行首的tab,结束行也可以是一堆tab再加上一个与text相同的内容,可以参考後面的例子。
* cmd <<< word
把word(而不是文件word)和後面的换行作为输入提供给cmd。
* cmd <> file
以读写模式把文件file重定向到输入,文件file不会被破坏。仅当应用程序利用了这一特性时,它才是有意义的。
* cmd >| file
功能同>,但即便在设置了noclobber时也会复盖file文件,注意用的是|而非一些书中说的!,目前仅在csh中仍沿用>!实现这一功能。
: > filename      把文件"filename"截断为0长度.# 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同).
cmd >&n 把输出送到文件描述符n
cmd m>&n 把输出 到文件符m的信息重定向到文件描述符n
cmd >&- 关闭标准输出
cmd <&n 输入来自文件描述符n
cmd m<&n m来自文件描述各个n
cmd <&- 关闭标准输入
cmd <&n- 移动输入文件描述符n而非复制它。(需要解释)
cmd >&n- 移动输出文件描述符 n而非复制它。(需要解释)
注意: >&实际上复制了文件描述符,这使得cmd > file 2>&1与cmd 2>&1 >file的效果不一样。

MySQL 加密傳輸

以 OpenSSL 實作 MySQL 加密傳輸:
http://www.netadmin.com.tw/article_content.aspx?sn=1609080004

Linux 使用 Let’s Encrypt 實現 SSL:
https://teddysun.com/454.html

MySQL 5.7 啟用 SSL 之實作與評估: https://tw.saowen.com/a/74b5871c8e4e380b9dbec9b7698a77339a9bfea6d4fe0770982dceedb92d995f

雖然 SSL方式使得安全性提高了,但是卻相對使得 MySQL 5.7 Queries per second (QPS) 降低 23% 左右,所以:

1、對於非常敏感核心的資料,或者 QPS 本來就不高的核心資料,建議採用 SSL方式保障資料安全。

2、對於採用短連結、要求高效能的應用,或者不產生核心敏感資料的應用,當效能和可用性才是首要時,建議不要採用SSL方式。

TLS/SSL 安全性憑證 與 HTTP/2

https://www.kingman.idv.tw/internet-genaration/180-what-ssl-how-choose.html

SSL依據驗證等級分為EV、OV、DV三種等級,不同等級驗證的項目不同,通常一個SSL證書給一個網站使用,但是也有部份CA單位簽發子網域通用、甚至跨不同網域的SSL證書,可以同時給多個網站使用。

如果是OV、EV等級的SSL,需要洽詢SSL簽證單位,付費申請SSL,常見的簽證單位有Comodo、Kaspersky等… 台灣則有TWCA提供SSL簽證服務。

如果是一般的個人Blog網站,或者小型、微型企業的官方形象網站,想要避免出現不安全警告、提供使用者安全瀏覽環境,並獲得SEO加分,有幾個辦法可以取得免費的DV SSL憑證:

Free SSL憑證:

AWS Certificate Manager
如果使用AWS的雲端主機服務,可以透過AWS Certificate Manager取得免費的SSL,Amazon申請成為CA機構,讓使用AWS的客戶都可以藉此獲德免費的SSL憑證,並免去安裝、管理的麻煩。

cPanel憑證
如果網站的虛擬主機使用cPanel公司的後台管理系統,在cPanel介面內可以設定、取得cPanel發出的憑證,或者建立虛擬主機的時候就會自動安裝、擁有網域憑證,要使用cPanel憑證請洽租賃虛擬主機的公司,基本上cPanel憑證不需要特別申請、安裝,只要虛擬主機建立好之後就會自動簽發、取得憑證,只需要將網站設定好就可以直接使用https連線。

Let's Encrypt
Let's Encrypt是由Google、Facebook、Cisco、Mozilla等單位贊助成立的CA憑證機構(ISRG),主旨是希望能夠有更安全的網路瀏覽環境,因此為每一個網域提供免費的DV SSL憑證。
Let's Encrypt的SSL安裝需要透過伺服器去設定、取得憑證,並自動展期、或者更新憑證,這部份比較麻煩,且需要一些技術基礎,如果會使用一般的CRT憑證安裝方式,可以去SSL For Free網站申請並取得SSL憑證安裝資料,SSL For Free透過網頁介面協助我們從Let's Encrypt取得SSL憑證,並導出CRT、KEY、CABUNDLE等SSL憑證安裝資料。唯一麻煩的是Let's Encrypt的憑證效期比較短,需要經常重設憑證。



https://ihower.tw/blog/archives/8489

HTTP/2 是 HTTP/1.1 從 1999 年發布以來,十六年來最重要的一次升級。HTTP/2 這項技術可以讓網站瀏覽更快、更安全、SEO 加分,而且網站工程師不需要改 code 就可以全站使用。

關於 HTTP/2 的歷史,由 SPDY 這個通訊協定開始。SPDY 是 Google 狹著 Chrome 瀏覽器龐大市佔率,在 2009-2016 年所進行的大規模網路實驗,在獲得了顯著的成功之後,進一步將 SPDY 推向網路標準,終於在 2015/5 正式發布。目前包括 Chrome、Safari、Firefox、IE/Edge 瀏覽器都已經支援,在不知不覺中,HTTP/2 已經進入使用者的生活。

為了能夠順利讓瀏覽器相容現存的 HTTP 網站 (使用通訊埠 Port 80),所以 HTTP/2 選擇佈署在 HTTPS (使用通訊埠 Port 443) 上,因此在安裝 HTTP/2 的步驟中,要先擁有 TLS/SSL 安全性憑證。

使用 HTTPS 加密連線的好處有:
  • 保護瀏覽器和伺服器之間的傳輸,不會被別人修改。這不一定指惡意的駭客進行中間人攻擊,也可能只是想插入廣告。例如有些咖啡店的免費 Wifi 會在網頁上面插入廣告。但是如果是 HTTPS 網站就沒辦法了。
  • 保護了使用者的隱私安全,不會被人竊聽。特別是需要登入的網站,沒有 HTTPS 加密,非常容易就可以被人竊取帳號密碼。
  • SEO 加分。
  • 方可與新技術或重要服務整合。很多新的瀏覽器功能已經把 HTTPS 當作必要條件,例如 Geolocation 定位、ServiceWorker 等。此外,所有 iOS app 的網路連線都必須使用加密連線 HTTPS。
為了推廣 HTTPS 安全連線,由許多團體共同贊助推出 Let's Encrypt 這個服務,免費發佈 TLS/SSL 憑證。中文使用說明可以參考 https://letsencrypt.tw,或是用 Certbot 這個工具。不過因為它的使用方式,跟一般我們在憑證機構網站上購買的步驟不太一樣,需要在主機上下指令來取得憑證,所以也有人設計了一個線上工具 SSL For Free 可以在線上就完成憑證申請。

第一步取得 TLS/SSL 安全性憑證,第二步設定 Web 伺服器,如果上述的兩個步驟還是太麻煩,也可以使用 CloudFlare 這個網站加速服務(CDN),它有免費方案提供 TLS/SSL 憑證以及 HTTP/2 連線。也就是說網站伺服器也可以什麼都不用改,只需要修改 DNS 讓使用者的連線先經過 CloudFlare 伺服器即可。使用者到 CloudFlare 的這一段傳輸,就會是有加密的 HTTP/2 連線。CloudFlare 在全球各地都有節點,所以網路速度非常好。

第三步:替換 HTTP 網址為 HTTPS

需要將所有 HTTP 網址都換成 HTTPS 網址。網頁上所有連到自己網站的超連結、圖片、JavaScript 和 CSS 等等網址,都必須修改成 https:// 開頭。而所有外部系統中自己的網址,例如 Facebook 廣告、Google Analytics 和其他網站分析追蹤工具,都必須把網址改成 https:// 開頭。

第四步:最後檢查

先檢查 TLS/SSL 安全性憑證安裝正確,可以使用 SSL Server Test 這個線上工具。接著啟用 HTTP/2 ,可以安裝 HTTP/2 and SPDY Indicator。線上測試工具則可以用 HTTP/2 Test。更多工具可以參考 Tools for debugging, testing and using HTTP/2

第五步:全面啟用

檢查沒有問題後,可以設定 Web 伺服器只允許 HTTPS 連線,所有連線到 HTTP 的情求,全部轉址 (301 Redirect) 到 HTTPS 連線,並且打開 HSTS 這個 HTTP Header 強制使用者瀏覽器只能用 HTTPS 連線。

最後的成果就是會有一個綠色的 Icon 出現在網址列。




Golang 網頁伺服器 申請 Let's Encrypt 的 HTTPS 實現證書自動部署 (一個說明清楚的簡潔作法):https://www.golangnote.com/topic/211.html

手動模式申請Let's Encrypt萬用字元證書:https://itw01.com/QCJTFEH.html

利用golang申請Let's Encrypt的HTTPS實現證書自動部署:https://itw01.com/YB75DED.html

https://blog.wu-boy.com/2017/04/1-line-letsencrypt-https-servers-in-golang/

https://github.com/golang/go/issues/14374

https://golang.org/pkg/net/http/

https://studygolang.com/articles/10380

https://github.com/golang/go/issues/21890

https://stackoverflow.com/questions/37321760/how-to-set-up-lets-encrypt-for-a-go-server-application

https://stackoverflow.com/questions/37536006/how-do-i-rewrite-redirect-from-http-to-https-in-go?noredirect=1&lq=1



Let’s Encrypt 相關備忘

Let's Encrypt 终于支持通配符证书了
https://studygolang.com/articles/12599

什么是通配符证书
在没有出现通配符证书之前,Let’s Encrypt 支持两种证书。

1)单域名证书:证书仅仅包含一个主机。

2)SAN 证书:一张证书可以包括多个主机(Let’s Encrypt 限制是 20),也就是证书可以包含下列的主机:www.example.com、www.example.cn、blog.example.com 等等。

证书包含的主机可以不是同一个注册域,不要问我注册域是什么?注册域就是向域名注册商购买的域名。

对于个人用户来说,由于主机并不是太多,所以使用 SAN 证书完全没有问题,但是对于大公司来说有一些问题:

子域名非常多,而且过一段时间可能就要使用一个新的主机。
注册域也非常多。
读者可以思考下,对于大企业来说,SAN 证书可能并不能满足需求,类似于 sina 这样的网站,所有的主机全部包含在一张证书中,而使用 Let’s Encrypt 证书是无法满足的。

Let’s Encrypt 通配符证书
通配符证书就是证书中可以包含一个通配符,比如 .example.com、.example.cn,读者很快明白,大型企业也可以使用通配符证书了,一张证书可以防止更多的主机了。

这个功能可以说非常重要,从功能上看 Let’s Encrypt 和传统 CA 机构没有什么区别了,会不会触动传统 CA 机构的利益呢?

如何申请 Let’s Encrypt 通配符证书
为了实现通配符证书,Let’s Encrypt 对 ACME 协议的实现进行了升级,只有 v2 协议才能支持通配符证书。

在了解该协议之前有几个注意点:

1)客户在申请 Let’s Encrypt 证书的时候,需要校验域名的所有权,证明操作者有权利为该域名申请证书,目前支持三种验证方式:

dns-01:给域名添加一个 DNS TXT 记录。
http-01:在域名对应的 Web 服务器下放置一个 HTTP well-known URL 资源文件。
tls-sni-01:在域名对应的 Web 服务器下放置一个 HTTPS well-known URL 资源文件。

註解:tls-sni-01 將於 February 13th, 2019 完全停用。取而代之的是 HTTP-01, DNS-01 or TLS-ALPN-01 三種。

而申请通配符证书,只能使用 dns-01 的方式




解析 Certbot(Let's encrypt) 使用方式
https://andyyou.github.io/2019/04/13/how-to-use-certbot/

Golang 配置 Let's encrypt
https://stackoverflow.com/questions/37321760/how-to-set-up-lets-encrypt-for-a-go-server-application

2019 年因為安全理由需要升級 Golang 配置  Let's encrypt 的方法
https://github.com/golang/go/issues/21890

實作解決方案 => Golang 官方網站:
https://godoc.org/golang.org/x/crypto/acme/autocert#example-Manager

對官方網站實作的中文解說 (代碼有誤) 與關於這個包的設計的英文討論:
https://colobu.com/2017/09/30/use-letsencrypt-in-go/
https://github.com/golang/go/issues/17053

其他參考資料:
https://community.letsencrypt.org/t/help-with-golang-autocert/75806
https://ericchiang.github.io/post/go-letsencrypt/
https://studygolang.com/articles/10380
https://studygolang.com/articles/16463
https://itw01.com/YB75DED.html
https://github.com/mholt/certmagic


Amazon Web Services (AWS) 與 Google Cloud Platform (GCP)

https://aws.amazon.com

定價:
https://aws.amazon.com/tw/ec2/pricing/
https://aws.amazon.com/tw/rds/mysql/pricing/
http://calculator.s3.amazonaws.com/index.html

AWS Shield – DDoS 保護
https://aws.amazon.com/tw/shield/

使用導覽:
Connect to Your Linux Instance
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html
Tutorial: Installing a LAMP Web Server on Amazon Linux
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-LAMP.html



https://cloud.google.com

定價:
https://cloud.google.com/compute/pricing
https://cloud.google.com/sql/docs/mysql/pricing
https://cloud.google.com/products/calculator/

承諾使用折扣 (Commited Use Discount) 最低43折的優惠:
https://blog.gcp.expert/committed-use-discounts/
https://cloud.google.com/compute/docs/instances/signing-up-committed-use-discounts

Regions and Zones:
https://cloud.google.com/compute/docs/regions-zones/

使用導覽:
https://jerrynest.io/gcp-server/
https://mrtang.tw/blog/post/creating-and-starting-an-instance

如何在 Linux、OSX 和 Windows 工作站使用常見的 SSH 工具來連線至 Linux 執行個體
https://www.techcoke.com/2017/01/google-compute-engine-putty-ssh-instances.html
https://cloud.google.com/compute/docs/instances/connecting-to-instance?hl=zh-tw
https://adon988.logdown.com/posts/7810772-gcp-establish-ssh-online-login-vm-mode

GCP 中繼資料 SSH 金鑰管理 (多人協同作業時的管理方法):
https://ithelp.ithome.com.tw/articles/10217457

How to Set Up MySQL on Google Compute Engine
https://21st.each1.net/2019/04/google-compute-engine-mysql.html

如何設定 GCP HTTP(S) 負載平衡器
https://blog.gcp.expert/google-cloud-load-balancing/




关于共享核的实例的补充
https://guozeyu.com/2016/10/asia-google-compute-engine/

f1-micro(0.6 GB)和 g1-small(1.7GB)这两个版本使用的是共享核心(其余配置都是独立核心),根据 Google 的说明,0.60GB 是 0.2 vCPU,1.70GB 是 0.5 vCPU。但是却支持 Bursting,也就是短时间内最高能使用到 1.0 vCPU。

那么 1.0 vCPU 是多少呢?查 cpuinfo,是 Intel(R) Xeon(R) CPU @ 2.50GHz。也就是说这两个版本最高能占用到 2.5GHz。但是假如长时间占用,速度就会压缩到 0.5GHz 和 1.75 GHz。


我的 f1-micro 装了监控软件,对比 Google 给的 CPU 占用率(深蓝色)和系统自己监控到的占用率(浅蓝色),发现 Google 图表上统计的 CPU 占用率正好是本地统计的 5 倍,也就是说如果本地看到的 CPU 占用是 20%,Google 图表上显示的就正好是 100%,本地为 20~100%,Google 图表上就是 100~500%,这时就算作 Bursting 了。

和其他 VPS 对比,其他的 VPS 也几乎都是共享核心,但你却无从判断是否超售。比如有 10 个用户共用一个核心,如果那 10 个人都在不停的占用 CPU,那么你的 CPU 速度会低于单核的十分之一。而 Google 的共享核心,保证了一个最低的速度(0.2 vCPU 和 0.5 vCPU),就算其他用户用的再狠,也能给你保证一定的速度。



2017 比較
網路流量費
AWS

GCP


https://www.mile.cloud/single-post/cloud_comparison/
https://blog.gcp.expert/google-cloud-v-aws/



GOOGLE STACKDRIVER
監控、記錄和診斷在 Cloud Platform 及 AWS 上的應用程式
https://cloud.google.com/stackdriver/




瞬間移動

應用量子纏結現象,實現粒子瞬間移動:


量子力學

雙縫實驗:


量子延遲實驗:


薛丁格的貓:


量子糾纏、量子纏結:


量子電腦:


網站的負載平衡

Web 伺服器

How to configure a low-cost load-balanced LAMP cluster:
https://www.linux.com/news/how-configure-low-cost-load-balanced-lamp-cluster
上述方法實作心得:
http://anderson1029.pixnet.net/blog/post/25103266

鳥哥的 Linux 私房菜,DNS 伺服器:
http://linux.vbird.org/linux_server/0350dns.php



Database 伺服器

資料庫效能瓶頸分析:
優化 Disk I/O,比如說 Index 的設定是否恰當、SQL指令是否考慮到資料成長後的效能問題。

資料庫的複寫或鏡像:
將複雜的查詢指令、BI報表、Data Mining的資料來源等,指向複寫或鏡像的 Database主機。

規劃 Table 結構:
分散式 Table 的設計,並考慮資料存取層,避免商業物件直接下 SQL 存取資料庫資料,透過資料存取層元件來存取資料庫資料,比較能避免人為錯誤。



大型網站的個案研究 1 WhatsApp

https://www.zhihu.com/question/22805720



大型網站的個案研究 2 Stack Overflow

https://www.zhihu.com/question/40514188

http://www.open-open.com/news/view/119d55a
Stack Overflow 2016 架構:
  • 4台数据库服务器(微软SQL Server),其中两台更新硬件配置
  • 11台Web服务器(IIS),都已更新硬件配置
  • 2台分布式缓存和消息处理服务器(Redis),都已更新硬件配置
  • 3台应用服务器(实现了tag引擎功能),其中两台为新硬件配置
  • 3台搜索服务器(ElasticSearch),配置同2013年
  • 4台负载均衡服务器(HAProxy),其中新增加的两台用于支持CloudFlare的CDN加速服务
  • 2台网络交换机(每个都是Cisco Nexus 5596 + Fabric Extenders,并升级网卡10Gbps)2台Fortinet 800C(替代2台Cisco 5525-X ASA防火墙)
  • 2台Ciso ASR-1001路由器(替代2台Cisco 3945路由器)
  • 2台Ciso ASR-1001-x路由器
遵循 Best Practices for Speeding Up Your Web Site

《高效能程序员的修炼》Effective Programming More Than Writing Code











無機生命

https://en.wikipedia.org/wiki/Miller%E2%80%93Urey_experiment

Miller–Urey experiment 是一項模擬假設性早期地球環境的實驗,研究目的是測試化學演化的發生情況。尤其是針對  Alexander Oparin's and J. B. S. Haldane's hypothesis,該學說認為早期地球環境使無機物合成有機化合物的反應較易發生。

Miller–Urey experiment 是關於生命起源的經典實驗之一,其結果以《在可能的早期地球環境下之胺基酸生成》(A Production of Amino Acids Under Possible Primitive Earth Conditions)為題發表。米勒實驗對後來探索生物分子的非生物合成具有相當大的啟發性,至今依然是教科書中關於生命起源的經典實驗。


http://news.sciencenet.cn/htmlnews/2011/9/252631.shtm 

格拉斯哥大学的李-克罗宁从含有金属的大分子结构中形成类似细胞的泡沫,并赋予一些类似生命体的特性。目前他希望能够诱导这些“金属细胞”演变成为完全有机自繁殖能力的实体。


量子電腦



https://en.wikipedia.org/wiki/Quantum_computing

2015年5月,IBM在量子運算上取得兩項關鍵性突破,開發出四量子位原型電路(four quantum bit circuit),成為未來10年量子電腦基礎。另外一項是,可以同時發現兩項量子的錯誤型態,分別為bit-flip(位元翻轉)與phase-flip(相位翻轉),不同於過往在同一時間內只能找出一種錯誤型態,使量子電腦運作更為穩定。

2016年8月,美國馬里蘭大學學院市分校發明世界上第一台由5量子位元組成的可編程量子電腦。

2017年5月,中國科學院宣布製造出世界首台超越早期經典電腦的光量子電腦,研發了10位元超導量子線路樣品,通過高精度脈衝控制和全局糾纏操作,成功實現了目前世界上最大數目的超導量子位元多體純糾纏,並通過層析測量方法完整地刻畫了十位元量子態。此原型機的「玻色取樣」速度比國際同行之前所有實驗機加快至少24000倍,比人類歷史上第一台電子管計算機(ENIAC)和第一台電晶體計算機(TRADIC)運行速度快10-100倍,雖然還是緩慢但已經逐步跨入實用價值階段。

2017年7月,美國研究人員宣布完成51個量子位元的量子電腦模擬器。哈佛大學米哈伊爾·盧金(Mikhail Lukin)在莫斯科量子技術國際會議上宣布這一訊息。量子模擬器使用了雷射冷卻的原子,並使用雷射將原子固定。


https://technews.tw/2017/10/17/quantum-computation-trend-google/

Google 量子電腦 2018 年初測試,料開創新紀元

Google 等運用量子力學(quantum mechanics)打造新型態的電腦。一般電腦運用位元(bit)紀錄處理數據,只能以 1 或 0 的狀態存在,但是量子位元(qubit)具有「疊加」(superposition)特性,能夠同時處於 1 和 0 的狀態。換句話說,傳統位元像是靜止的硬幣,只能出現正面或反面。量子位元則像正在旋轉的硬幣,可以同時秀出硬幣正反面。

微軟執行長 Satya Nadella 以迷宮來解釋一般電腦和量子電腦的差別。一般電腦若要走出迷宮,需要先試走某一條路,撞牆後倒退,重新嘗試,直到找到出路為止,需要花上許多時間才能找到答案。但是量子電腦能編碼資訊,不只 0 或 1 的狀態,而是 0 和 1 一起,可以同時試驗迷宮內的所有路徑,這就是量子的威力。

量子運算的潛能在於原本需要花上好幾個世代才能處理的問題,有了量子運算在數小時或幾天內就能解決,比方說人工智慧、清淨能源、全球暖化等。但是量子運算難題仍多,次原子粒子難以處理,電腦也還在研發當中,仍有許多障礙。

2017年7月,美國研究人員宣布完成51個量子位元的量子電腦模擬器。哈佛大學米哈伊爾·盧金(Mikhail Lukin)在莫斯科量子技術國際會議上宣布這一訊息。量子模擬器使用了雷射冷卻的原子,並使用雷射將原子固定。


各國公家投入量子領域的研究經費非常高,而且並不只限於美國,麥肯錫統計的2015年量子相關科技研發經費如下圖:
上圖是經濟學人根據麥肯錫的調查數據所整理出來的,可以看到2015年一整年,美國、歐洲和中國各投入了360M€、550M€和220M€的研發經費在各種量子領域中,而全球研發總支出更高達1.5B€!

專利申請上的分布如下圖:
從上圖可以看到,整個歷史累積下來,美國和中國在量子技術的專利申請上毫無意外地位居前兩名,其中中國在量子加密技術(Quantum cryptography)上更是大幅超越美國高居第一。但更有趣的是,美國的專利申請在2005年前後到達了高峰,隨後幅度就大幅縮小,反而是中國的專利申請數量從2010年起飛,然後持續放大中。這也造成一些美國專家憂心中國量子技術超越美國,就像有些專家憂心阿里巴巴橫掃美國一樣。

https://www.bnext.com.tw/article/47890/quantum-qubit-quantum-manifesto


分子機械

http://pansci.asia/archives/106820

2016諾貝爾化學獎:如何將分子變成機器

2016 年的諾貝爾化學獎頒給了索瓦(Jean-Pierre Sauvage),史托達特爵士(Sir J. Fraser Stoddart),和費倫加(Bernard L. Feringa),這是因為他們開發出了比頭髮還要細上千倍的分子機器,這是關於他們如何將化學分子連結在一起並設計出各種機器,包括微型電梯,馬達以及微型肌肉的故事。

https://kknews.cc/zh-tw/science/kay5a8.html

納米機器人可以透過微血管無害地進入大腦,並將大腦皮層和雲端連結起來,合成一個新皮層,如此一來人類就能擁有一個額外的大腦皮層。
血液中的納米機器人將可以充當免疫系統,摧毀病原體、清除雜物、血栓和腫瘤,甚至糾正DNA錯誤、逆轉衰老過程,這樣的醫療技術會使人均壽命每過一年就延長一歲,接近「永生」。



[永生相關科技]

https://kknews.cc/zh-tw/science/rpyjao.html

「阿凡達」高科技研究計劃

這個計劃將分四個階段進行。
首先,在第一個階段打造出可以通過人腦進行遙控的機器人複製體「阿凡達」,也就是人類可以藉助設備遠程控制「阿凡達」,實現人類意識的轉移;
第二階段,當某人生命終止後,科學家能夠將其大腦移植到「阿凡達」身上,從而使他的生命可以在這個「生化機器人」身上繼續「存活」下去;
第三階段,科學家將研究發明出和真人大腦功能相似的「人造大腦」,它可以儲存主人的所有經歷、記憶甚至性格;
最後一個階段,科學家將創造出一個全息影像版的虛擬「阿凡達」,它雖然沒有真實的肉體,但外觀與主人一模一樣,且具有人類的思維、意識和感情。當主人去世後,這個擁有「人造大腦」的仿真阿凡達將會延續主人的生命。

國際化與在地化 程式設計

所謂的國際化:就是根據特定的 locale 信息,提取與之相應的字符串或其它一些東西(比如時間和貨幣的格式)等等。這涉及到三個問題:

1,如何確定語言環境。
2,如何保存與 locale 相關的字符串或其它信息。
3,如何根據 locale 提取字符串和其它相應的信息。

https://astaxie.gitbooks.io/build-web-application-with-golang/content/zh/10.0.html




地區設定:https://zh.wikipedia.org/wiki/%E5%8C%BA%E5%9F%9F%E8%AE%BE%E7%BD%AE




Unicode 字元平面對映:
https://zh.wikipedia.org/wiki/Unicode%E5%AD%97%E7%AC%A6%E5%B9%B3%E9%9D%A2%E6%98%A0%E5%B0%84

http://www.unicode.org/

讀出一個 character, utf-8 to unicode convert 後的一個 character (not word), 兩個byte 它的值:
# 0000-007F:C0控制符及基本拉丁文 (C0 Control and Basic Latin)
就表示它是拉丁文 character
而英文只用到 128 也就是 7F 所以 0000-007F 的字就必然落在英文的範圍. 但不代表它不會是拉丁語系的 word 中的一個 character
兩個byte 它的值:
# 0080-00FF:C1控制符及拉丁文補充-1 (C1 Control and Latin 1 Supplement)
這就表示這個字是包括了法德葡西意等拉丁字, 但一定不是英文字. 這個word 不可能會是英文字了.

character = 拉丁語中的字符, 如英文的 A,B,C,D... 到 Z
word = 一個字, 例如 apple 為一個字.




如果要開發一個多語系的網站時,其中一種方法可以使用瀏覽器所設定的語系來判斷使用者的網頁語系。

http://blog.roodo.com/jessica_bird/archives/10029085.html

當瀏覽網頁時,瀏覽器會發送給 web 伺服器 HTTP Headers Information ,在表頭資訊裡,包含了這樣一個信息 Accept-Language,這是用來設置瀏覽器可接受的語言選項,可以設置一個以上的語系,再依優先順序使用。

以 PHP 來說,可使用 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 來取得,取得類似 “zh-cn” 這樣子的結果;如果是多語系設定,則類似 “zh-cn,en;q=0.8,ko;q=0.5,zh-tw;q=0.3″ 這樣子的情況。

$lang = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);

if($lang[0]=='zh-tw')
{  //如果瀏覽器使用繁體中文,則為true。
 header("Location: ch/index.php"); //轉址到中文網頁。
else
 header("Location: en/index.php"); //轉址到英文網頁。
}

用 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 來取得瀏覽器的訊息,此時若瀏覽器設為多語系,$lang 會是陣列,並且以逗號(,)做為陣列值的切割。

explode()
語法 : array explode (string separator, string string [, int limit])
說明 :
傳回一個字串的陣列,以參數 separator 為界線將參數 string 切開,如果有設定參數 limit,則傳回的陣列最多將會包含 limit 個元素,而最後一個元素將會包含 string 全部剩餘的部份。

http://php.net/manual/en/function.explode.php




檢測字串的編碼:
http://us2.php.net/manual/en/function.mb-detect-encoding.php




google 『字串 語系判斷』:
https://www.google.com.tw/search?espv=2&q=%E5%AD%97%E4%B8%B2+%E8%AA%9E%E7%B3%BB%E5%88%A4%E6%96%B7




語系代碼:

https://zh.wikipedia.org/wiki/%E5%8C%BA%E5%9F%9F%E8%AE%BE%E7%BD%AE
http://blog.roodo.com/jessica_bird/archives/10029085.html
http://www.htmldrive.net/items/demo/1312/-jQuery-Useful-freeze-header-row-in-table-plugin

Culture Name Display Name Culture Code ISO 639x
af-ZA Afrikaans - South Africa 0x0436 AFK
sq-AL Albanian - Albania 0x041C SQI
ar-DZ Arabic - Algeria 0x1401 ARG
ar-BH Arabic - Bahrain 0x3C01 ARH
ar-EG Arabic - Egypt 0x0C01 ARE
ar-IQ Arabic - Iraq 0x0801 ARI
ar-JO Arabic - Jordan 0x2C01 ARJ
ar-KW Arabic - Kuwait 0x3401 ARK
ar-LB Arabic - Lebanon 0x3001 ARB
ar-LY Arabic - Libya 0x1001 ARL
ar-MA Arabic - Morocco 0x1801 ARM
ar-OM Arabic - Oman 0x2001 ARO
ar-QA Arabic - Qatar 0x4001 ARQ
ar-SA Arabic - Saudi Arabia 0x0401 ARA
ar-SY Arabic - Syria 0x2801 ARS
ar-TN Arabic - Tunisia 0x1C01 ART
ar-AE Arabic - United Arab Emirates 0x3801 ARU
ar-YE Arabic - Yemen 0x2401 ARY
hy-AM Armenian - Armenia 0x042B
Cy-az-AZ Azeri (Cyrillic) - Azerbaijan 0x082C
Lt-az-AZ Azeri (Latin) - Azerbaijan 0x042C
eu-ES Basque - Basque 0x042D EUQ
be-BY Belarusian - Belarus 0x0423 BEL
bg-BG Bulgarian - Bulgaria 0x0402 BGR
ca-ES Catalan - Catalan 0x0403 CAT
zh-CN Chinese - China 0x0804 CHS
zh-HK Chinese - Hong Kong SAR 0x0C04 ZHH
zh-MO Chinese - Macau SAR 0x1404
zh-SG Chinese - Singapore 0x1004 ZHI
zh-TW Chinese - Taiwan 0x0404 CHT
zh-CHS Chinese (Simplified) 0x0004
zh-CHT Chinese (Traditional) 0x7C04
hr-HR Croatian - Croatia 0x041A HRV
cs-CZ Czech - Czech Republic 0x0405 CSY
da-DK Danish - Denmark 0x0406 DAN
div-MV Dhivehi - Maldives 0x0465
nl-BE Dutch - Belgium 0x0813 NLB
nl-NL Dutch - The Netherlands 0x0413
en-AU English - Australia 0x0C09 ENA
en-BZ English - Belize 0x2809 ENL
en-CA English - Canada 0x1009 ENC
en-CB English - Caribbean 0x2409
en-IE English - Ireland 0x1809 ENI
en-JM English - Jamaica 0x2009 ENJ
en-NZ English - New Zealand 0x1409 ENZ
en-PH English - Philippines 0x3409
en-ZA English - South Africa 0x1C09 ENS
en-TT English - Trinidad and Tobago 0x2C09 ENT
en-GB English - United Kingdom 0x0809 ENG
en-US English - United States 0x0409 ENU
en-ZW English - Zimbabwe 0x3009
et-EE Estonian - Estonia 0x0425 ETI
fo-FO Faroese - Faroe Islands 0x0438 FOS
fa-IR Farsi - Iran 0x0429 FAR
fi-FI Finnish - Finland 0x040B FIN
fr-BE French - Belgium 0x080C FRB
fr-CA French - Canada 0x0C0C FRC
fr-FR French - France 0x040C
fr-LU French - Luxembourg 0x140C FRL
fr-MC French - Monaco 0x180C
fr-CH French - Switzerland 0x100C FRS
gl-ES Galician - Galician 0x0456
ka-GE Georgian - Georgia 0x0437
de-AT German - Austria 0x0C07 DEA
de-DE German - Germany 0x0407
de-LI German - Liechtenstein 0x1407 DEC
de-LU German - Luxembourg 0x1007 DEL
de-CH German - Switzerland 0x0807 DES
el-GR Greek - Greece 0x0408 ELL
gu-IN Gujarati - India 0x0447
he-IL Hebrew - Israel 0x040D HEB
hi-IN Hindi - India 0x0439 HIN
hu-HU Hungarian - Hungary 0x040E HUN
is-IS Icelandic - Iceland 0x040F ISL
id-ID Indonesian - Indonesia 0x0421
it-IT Italian - Italy 0x0410
it-CH Italian - Switzerland 0x0810 ITS
ja-JP Japanese - Japan 0x0411 JPN
kn-IN Kannada - India 0x044B
kk-KZ Kazakh - Kazakhstan 0x043F
kok-IN Konkani - India 0x0457
ko-KR Korean - Korea 0x0412 KOR
ky-KZ Kyrgyz - Kazakhstan 0x0440
lv-LV Latvian - Latvia 0x0426 LVI
lt-LT Lithuanian - Lithuania 0x0427 LTH
mk-MK Macedonian (FYROM) 0x042F MKD
ms-BN Malay - Brunei 0x083E
ms-MY Malay - Malaysia 0x043E
mr-IN Marathi - India 0x044E
mn-MN Mongolian - Mongolia 0x0450
nb-NO Norwegian (Bokmål) - Norway 0x0414
nn-NO Norwegian (Nynorsk) - Norway 0x0814
pl-PL Polish - Poland 0x0415 PLK
pt-BR Portuguese - Brazil 0x0416 PTB
pt-PT Portuguese - Portugal 0x0816
pa-IN Punjabi - India 0x0446
ro-RO Romanian - Romania 0x0418 ROM
ru-RU Russian - Russia 0x0419 RUS
sa-IN Sanskrit - India 0x044F
Cy-sr-SP Serbian (Cyrillic) - Serbia 0x0C1A
Lt-sr-SP Serbian (Latin) - Serbia 0x081A
sk-SK Slovak - Slovakia 0x041B SKY
sl-SI Slovenian - Slovenia 0x0424 SLV
es-AR Spanish - Argentina 0x2C0A ESS
es-BO Spanish - Bolivia 0x400A ESB
es-CL Spanish - Chile 0x340A ESL
es-CO Spanish - Colombia 0x240A ESO
es-CR Spanish - Costa Rica 0x140A ESC
es-DO Spanish - Dominican Republic 0x1C0A ESD
es-EC Spanish - Ecuador 0x300A ESF
es-SV Spanish - El Salvador 0x440A ESE
es-GT Spanish - Guatemala 0x100A ESG
es-HN Spanish - Honduras 0x480A ESH
es-MX Spanish - Mexico 0x080A ESM
es-NI Spanish - Nicaragua 0x4C0A ESI
es-PA Spanish - Panama 0x180A ESA
es-PY Spanish - Paraguay 0x3C0A ESZ
es-PE Spanish - Peru 0x280A ESR
es-PR Spanish - Puerto Rico 0x500A ES
es-ES Spanish - Spain 0x0C0A
es-UY Spanish - Uruguay 0x380A ESY
es-VE Spanish - Venezuela 0x200A ESV
sw-KE Swahili - Kenya 0x0441
sv-FI Swedish - Finland 0x081D SVF
sv-SE Swedish - Sweden 0x041D
syr-SY Syriac - Syria 0x045A
ta-IN Tamil - India 0x0449
tt-RU Tatar - Russia 0x0444
te-IN Telugu - India 0x044A
th-TH Thai - Thailand 0x041E THA
tr-TR Turkish - Turkey 0x041F TRK
uk-UA Ukrainian - Ukraine 0x0422 UKR
ur-PK Urdu - Pakistan 0x0420 URD
Cy-uz-UZ Uzbek (Cyrillic) - Uzbekistan 0x0843
Lt-uz-UZ Uzbek (Latin) - Uzbekistan 0x0443
vi-VN Vietnamese - Vietnam 0x042A VIT



程式語言編年史

程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...