为什么要安装Aria2

百度网盘限速,而Aria2是个十分强大的文件分片多线程下载工具,可以有效抵制限速。

为什么要采取编译安装

  1. Aria2的参数中-max-server-connection和-min-split-files很大程度上决定了网盘的下载速度。
  2. 默认参数中-max-server-connection(1,16),-min-split-files(1m,1g),下载服务器最大连接数16,肯定是不能满足高速下载要求的,而最小文件分片1M,尤其是当我们下载网盘上的小文件是,10M的文件按照最小1M的规格,要分成10片,Aria2最多只会分配10个线程去下载,即使是10M的小文件,也要耗用将近好几分钟的时间,效率党简直不能忍啊。
  3. 编译安装采取源代码的安装方式,允许我们修改Aria2核心的运行参数。在这里,我将-max-server-connection最高设置为256,-min-split-files最小设置为256k,大家可以根据自己电脑的性能来合理设置参数以提高下载速度。

具体安装过程

#下载源码
cd ~/Download/
git clone https://github.com/aria2/aria2.git
#修改源码
#aira2的基本配置选项大多都存储在文件OptionHandlerFactory.cc中
vi aria2/src/OptionHandlerFactory.cc
#定位到441行
#将服务器最大连接数16修改为256
    OptionHandler* op(new NumberOptionHandler(PREF_MAX_CONNECTION_PER_SERVER,
                                              TEXT_MAX_CONNECTION_PER_SERVER,
                                           // "1", 1, 16, 'x'));
                                              "1", 1, 256, 'x'));
#定位到第503行
#将最文件分片大小设置为256_k
#到此源代码需要修改的地方改完了
  OptionHandler* op(new UnitNumberOptionHandler(
//PREF_MIN_SPLIT_SIZE, TEXT_MIN_SPLIT_SIZE, "1M", 1_m, 1_g, 'k'));
 PREF_MIN_SPLIT_SIZE, TEXT_MIN_SPLIT_SIZE, "1M", 256_k, 1_g, 'k'));

#安装编译依赖
#以下依赖仅限于macosx,linux参照官方文档
brew install libtool
brew install automake
brew install autoconf-archive

#编译安装
autoconf configure.ac
autoconf -i
./configure
make check
make
sudo make install
#如果你遇到 error: possibly undefined macro这说明编译缺乏依赖,需要安装相关依赖
#
#查看编译后的Aria2参数
aria2c --help
# 可以看到设置项的参数范围已经改变了
 -x, --max-connection-per-server=NUM The maximum number of connections to one
                              server for each download.

                              Possible Values: 1-256
                              Default: 1
                              Tags: #basic, #http, #ftp

 -k, --min-split-size=SIZE    aria2 does not split less than 2*SIZE byte range.
                              For example, let's consider downloading 20MiB
                              file. If SIZE is 10M, aria2 can split file into 2
                              range [0-10MiB) and [10MiB-20MiB) and download it
                              using 2 sources(if --split >= 2, of course).
                              If SIZE is 15M, since 2*15M > 20MiB, aria2 does
                              not split file and download it using 1 source.
                              You can append K or M(1K = 1024, 1M = 1024K).

                              Possible Values: 262144-1073741824
                              Default: 1M
                              Tags: #basic, #http, #ftp

#修改~/.aria2/aria2.conf配置文件使Aria2新设置生效
vi ~/.aria2/aria2.conf
#这里我只截取主要设置项
#断点续传
continue=true
#同服务器连接数
max-connection-per-server=256
#最小文件分片大小, 下载线程数上限取决于能分出多少片, 对于小文件重要
min-split-size=256k
#单文件最大线程数, 路由建议值: 5
split=256
#下载速度限制
max-overall-download-limit=0
#单文件速度限制
max-download-limit=0
...

到此结束。

PS.本文中的 shell 代指 bash

Shell 中的括号

小括号()

# 应用实例
# ()作为一个命令组
if ($i<5)
# "[" 意为test, "-lt" 意为less than 小于, "]"  意为关闭条件判断
if [ $i -lt 5 ]
# "-ne" 意为 不等于,] 后面的 "-a" 为逻辑操作符,等价于 "&&"
if [ $a -ne 1 ] -a [ $a != 2 ]
if [ $a -ne 1] && [ $a != 2 ]
if [[ $a != 1 && $a != 2 ]]

for i in $(seq 0 4);do echo $i;done
for i in `seq 0 4`;do echo $i;done
for ((i=0;i<5;i++));do echo $i;done
for i in {0..4};do echo $i;done



# 循环读取文件中的每一行并将该行作为参数,执行相关的命令
while read p; do
  echo "$p"
done < file.txt

  1. 单小括号 ()
    • 命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
    • 命令替换。等同于cmd,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。
    • 用于初始化数组。如:array=(a b c d)。
  2. 双小括号 (( ))
    • 整数扩展。这种扩展计算是整数型的计算,不支持浮点型。((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者 是”假”,而一个非零值的表达式所返回的退出状态码将为0,或者是”true”。若是逻辑判断,表达式exp为真则为1,假则为0。
    • 只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制)
    • 单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++)) 可将 $a 重定义为6。
    • 双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。

中括号[]

  1. 单中括号 []
    • bash 的内部命令,[和test是等同的。如果我们不用绝对路径指明,通常我们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。if/test结构中并不是必须右中括号,但是新版的Bash中要求必须这样。
    • Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较”ab”和”bc”:[ ab \< bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。
    • 字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。
    • 在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号或是索引。
  2. 双中括号[[ ]]
    • [[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
    • 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
    • 使用[[ … ]]条件判断结构,而不是[ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
    • bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

关于单中括号 [] 和双中括号 [[]] 的区别,可以参照这里

大括号{}

$ ls {ex1,ex2}.sh
ex1.sh  ex2.sh
$ ls {ex{1..3},ex4}.sh
ex1.sh  ex2.sh  ex3.sh  ex4.sh
$ ls {ex[1-3],ex4}.sh
ex1.sh  ex2.sh  ex3.sh  ex4.sh
  1. 常规用法
    • 大括号拓展。

      (通配(globbing))将对大括号中的文件名做扩展。在大括号中,不允许有空白,除非这个空白被引用或转义。第一种:对大括号中的以逗号分割的文件列表进行拓展。如 touch {a,b}.txt 结果为a.txt b.txt。第二种:对大括号中以点点(..)分割的顺序文件列表起拓展作用,如:touch {a..d}.txt 结果为a.txt b.txt c.txt d.txt

    • 代码块,又被称为内部组,这个结构事实上创建了一个匿名函数。

      与小括号中的命令不同,大括号内的命令不会新开一个子shell运行,即脚本余下部分仍可使用括号内变量。括号内的命令间用分号隔开,最后一个也必须有分号。{}的第一个命令和左括号之间必须要有一个空格。

  2. 几种特殊的替换结构

    • ${var:-string}和${var:=string}:若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string};对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var: ${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。
    • ${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)
    • ${var:?string}替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。
    • 补充扩展:在上面这五种替换结构中string不一定是常值的,可用另外一个变量的值或是一种命令的输出。
  3. 四种模式匹配替换结构
    • ${variable%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最短的匹配模式
    • ${variable%%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
    • ${variable#pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最短的匹配模式
    • ${variable##pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
    • 这四种模式中都不会改变variable的值,其中,只有在pattern中使用了匹配符号时,%和%%,#和##才有区别。结构中的pattern支持通配符,表示零个或多个任意字符,?表示零个或一个任意字符,[…]表示匹配中括号里面的字符,[!…]表示不匹配中括号里面的字符
$ var=testcase
$ echo $var
testcase
$ echo ${var%s*e}
testca
$ echo $var
testcase
$ echo ${var%%s*e}
te
$ echo ${var#?e}
stcase
$ ${var##?e}
stcase
$ echo ${var##*e}

$ echo ${var##*s}
e
$ echo ${var##test}
case

Test 与 逻辑运算

判断一串命令的执行结果

# 判断文件夹知否为空
test `ls some-dir | wc -c` -eq 0 && echo "为空" || echo "非空"
# 以上命令等价于
test $(ls some-dir | wc -c) -eq 0 && echo "为空" || echo "非空"
[ $(ls some-dir | wc -c) -eq 0 ] && echo "为空" || echo "非空"
[[ $(ls some-dir | wc -c) -eq ]] && echo "为空" || echo "非空"
[[ $(ls some-dir | wc -c)=0 ]] && echo "为空" || echo "非空"
# 在实际的脚本中推荐使用含 双中括号 的第四种写法 "="等价判断两边不得含有空格,否则报错

为Composer/Git/Gulp/Brew/Npm/Pip/Drush添加自动补全

  1. 安装bash-completion

    Mac下是brew, Debian下面是Apt-get

  2. 从github的bash-it项目下载需要的自动补全bash脚本,放到/etc/bash-completion目录下

  3. vi /etc/bashrc 加入如下代码

function bash_completion_load(){

    local bash_completion=/etc/bash-completion

    if [[ -e $bash_completion ]] && [[ -d $bash_completion ]] && [[ $(ls $bash_completion | wc -c)!=0 ]]; then
        for completion_item in $(ls $bash_completion); do
            if [[ ${completion_item##*.}='bash' ]]; then
                chmod +x $bash_completion/$completion_item
                source $bash_completion/$completion_item
            fi
        done
    fi
}

bash_completion_load;

至于Debian Linux来说,直接把从github下载的补全脚本文件直接放到/etc/bash-completion.d/目录下就可以了。
需要添加执行权限

Drupal8 / Composer / Drush / Drupal Console 相关

修复features暴力卸载

修复由暴力卸载features模块生成的插件而导致的”The following module is missing from the file system…drupal…bootstrap…250…”错误。
drupal官网也有关于此问题的链接

  1. drush pmu module-name
  2. composer remove drupal/module-name
  3. drush sql-query “DELETE FROM key_value WHERE collection=’system.schema’ AND name=’module-name’;”
  4. drush cr
  5. 刷新 status report 页面,看错误是否还在。
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='b2bcms_catalogue';"
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='b2bcms_manufacturing_process';"
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='b2bcms_products';"
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='b2bcms_quick_details';"
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='b2bcms_standards';"
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='config_update';"
### 命令格式
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='module_name';"

2017年07月25日20:43:25更新

实际上仅仅从上述数据库记录中依旧不能完全删除暴力卸载的残留。

Features包导入的配置项以自定义模块的方式安装到drupal中,除了在上述数据库中记录外,还会在core.extension配置项中留下记录。core.extension目测是以数据库记录的形式保存在数据库中,而不是yml明文配置文件的形式存储,对应网站后台的操作就是admin/modules, 这里记录用户安装卸载的模块的情况,所以需要从数据库中删除记录,而我找了一圈也没有找到具体这些模块记录是存储在哪一个表中,而系统的很多配置项大多是以序列化之后的形式存储在key_value表中,直接在数据库中修改序列化之后的数据是不现实的,而且这里也没有找到core.extension配置项。

除了直接动数据库这样的危险操作,还可以直接使用drush内置的config选项来灵活的修改系统选项。

#查看有哪些config相关的命令可以用
drush | grep config
 core-config (conf,    Edit drushrc, site alias, and Drupal settings.php files.
 config)
 core-quick-drupal     Download, install, serve and login to Drupal with minimal configuration and dependencies.
 site-install (si)     Install Drupal along with modules/themes/configuration using the specified install profile.
Config commands: (config)
 config-delete (cdel)  Delete a configuration object.
 config-edit (cedit)   Open a config file in a text editor. Edits are imported into active configuration after closing editor.
 config-export (cex)   Export configuration to a directory.
 config-get (cget)     Display a config value, or a whole configuration object.
 config-import (cim)   Import config from a config directory.
 config-list (cli)     List config names by prefix.
 config-pull (cpull)   Export and transfer config from one environment to another.
 config-set (cset)     Set config value directly. Does not perform a config import.

 #查看模块配置信息
 drush config-get core.extension

 #修改模块配置信息,删除无效模块
 drush config-edit core.extension
 #这里drush会呼叫vi编辑器,删除干扰的无效模块记录就可以了
 #保存修改后的记录,终端会提示core.extension配置项已更新
 #询问我们是否导入新的配置项,选择Y导入即可
            core.extension  update
Import the listed configuration changes? (y/n): y
#drush config-import可能需要config_update模块支持,如果提示你安装,安装该模块就可以了。

Drupal console generate:module命令不存在的问题

  1. MAC MAMP环境
  2. Drupal基于Github Composer-Drupal环境安装
  3. Composer基于Brew安装
  4. Drupal Console基于composer安装

使用Composer安装Drupal Console的办法

# 添加需要模块
composer require drupal/console:~1.0 --prefer-dist --optimize-autoloader
# 安装模块依赖组件
composer update drupal/console --with-dependencies

这里面有个问题,composer是基于项目的包管理工具,安装的包都是针对当前项目的,所以这里安装的drupalconsole(以下简称drupal)并没有默认安装在系统的/bin,/usr/bin/,/usr/share/bin等系统默认可以查找二进制命令的目录下,所以当你尝试运行drupal的时候,很可能会shell会报错,找不到drupal命令。

即使是使用 composer global require drupal/console:@stable 全局安装并且export PATH=”$HOME/.composer/vendor/bin:$PATH”添加路径支持,那么在drupal安装的根目录(对于composer-drupal安装方式来说,就是项目根目录下的web目录)下执行 drupal genernate:module 你还是会收到shell提示如下错误:

[Symfony\Component\Console\Exception\CommandNotFoundException]
Command “generate:module” is not defined.

原因是因为drupal[drupal-console]是PHP脚本文件,运行时会有很多依赖,而全局化安装,一些具体的特殊命令例如generate等,依赖没有安装到位,所以就造成了这样的问题。

解决办法

  1. 针对 composer 安装 drupalconsole的方式 (注意,这里不要使用composer全局安装drupalconsole,安装了也不能解决你的问题)。
    cat << EOF >> ~/.bash_profile
    # 利用composer项目文件结构的特点,添加alias,使用相对路径来执行 drupalconsole 命令
    alias drupal='../vendor/drupal/console/bin/drupal'
    EOF
    source ~/.bash_profile
    

    这里需要注意的是,drupalconsole命令需要在web目录内执行,否则由于路径的问题,这会提示你找不到命令。

  2. 如果你使用drupalconsole官网curl命令下载安装的方式,很可能就不会出现这种问题。这种办法我目前还没有验证过。

Vanish

最近忙着总结以往的工作经验,并将实践得出的结果运用于新项目Pegasus中,在Pegasus项目中技术选型的基础为LNMP+Drupal-8.X,由于D8是Heavily Based on OOP,因此在实际不出的时候就不得不考虑到性能的问题。

实际上决定D8响应速度的因素有很多,仅仅就服务端来说,将动态网站进行反向代理静态化是提高响应速度非常有效的解决办法。如果一台服务上有多个网站,而大多都是资源消耗比较高的网站的话,合理配置一台前端反向代理缓存服务器对于提高优化服务器的性能和提高网站的响应就十分重要了。

什么是Vanish

Varnish是一款高性能的、开源的Http反向代理服务器和缓存服务器。
Varnish基于多线程。
Varnish高速缓存于内存中。
Varnish具有更好的稳定性、更快的访问速度、更多的并发连接支持数,可以通过管理端口管理缓存等优势,在高并发状态下,Varnish消耗更多的CPU、I/O和内存资源。Varnish进程一旦挂起、崩溃或者重启,缓存的数据会从内存中释放,此时所有的请求都会转发到后端服务器上,给后端服务器造成很大压力。Varnish基于线程,可与充分应对高并发的使用场景。

Vanish配置示例

针对drupal的Varnish优化

备份用

Network(网络)
  • Scapy:一款强大的交互式数据报分析工具,可用作发送、嗅探、解析和伪造网络数据包。
  • pypcap、Pcapy和pylibpcap:配合libpcap一起使用的数据包捕获模块
  • libdnet:底层网络工具,含接口查询和以太网帧传输等功能
  • dpkt:可以快速简单地创建或解析数据包
  • Impacket:制作和解码网络数据包,支持NMB和SMB等高级协议
  • pynids:封装了libnids,可用于数据包嗅探、消除IP碎片、TCP流再封装和端口扫描检测
  • Dirtbags py-pcap:读取pcap文件
  • flowgrep:使用正则表达式检索数据包payload
  • Knock Subdomain Scan:使用字典(wordlist)对特定域名进行子域名枚举
  • Mallory:可扩展的TCP/UDP中间人代理,支持对非标准协议进行实时修改
  • Pytbull:灵活的IDS/IPS测试框架,包含300多种测试
Debugging and Reverse Engineering(调试和逆向工程分析)
  • Paimei:逆向分析框架,包含PyDBG、PIDA和pGRAPH
  • Immunity Debugger:用于加速漏洞利用程序的开发,辅助漏洞挖掘以及恶意软件分析,拥有完整的图形用户界面,并提供了命令行调试器
  • mona.py:一款挖洞插件
  • IDAPython:IDA Pro插件,整合了Python编程语言,并支持在IDA Pro中运行脚本
  • PyEMU:支持脚本的完整IA-32模拟器,用于恶意软件分析
  • pefile:读取并操作PE文件
  • pydasm:提供了libdasmx86反汇编库的访问接口
  • PyDbgEng:封装了微软WindowsDebugging引擎
  • uhooker:拦截DLL内部的API调用,查看内存中可执行文件的任意地址
  • diStorm:针对AMD64的反汇编库,遵循BSD许可协议
  • python-ptrace:使用ptrace的调试器
  • vdb/vtrace:vtrace是一款通过Python调试API的跨平台工具,vdb是vtrace所使用的调试器
  • Androguard:可用于对Android应用进行逆向分析
Fuzzing(模糊测试)
  • Sulley: 集合了大量可扩展组件的模糊测试开发框架
  • Peach Fuzzing Platform: 基于生成和变异的模糊测试框架(可扩展性强)
  • antiparser: 模糊测试工具,提供了故障注入API
  • TAOF:包含ProxyFuzz,一款中间人网络模糊测试器
  • untidy:通用的XML模糊测试器
  • Powerfuzzer:高度自动化和完全可定制的Web模糊测试器
  • SMUDGE
  • Mistress:通过畸形数据测试文件格式和协议的工具,基于预定义模式
  • Fuzzbox:多媒体编解码模糊测试器
  • Forensic Fuzzing Tools:可生成模糊测试文件和模糊测试文件系统,文件系统中包含取证工具和测试系统
  • Windows IPC Fuzzing Tools:利用Windows进程间通信机制来对应用程序进行模糊测试的工具
  • WSBang:用于对Web服务进行自动化安全测试的Python工具
  • Construct:解析和构建数据结构的代码库
  • fuzzer.py (feliam):FelipeAndres Manzano 设计的一款简单的模糊测试工具
  • Fusil:编写模糊测试程序的代码库
Web
  • Requests:一个简单友好的HTTP库
  • HTTPie:有好的类cURL命令行HTTP客户端
  • ProxMon:处理代理日志,报告发现的问题
  • WSMap:寻找Web服务节点,扫描文件
  • Twill:通过命令行接口浏览Web,支持自动化Web测试
  • Ghost.py:Webkit Web客户端
  • Windmill:允许我们自动化测试和调试Web应用的Web测试工具
  • FunkLoad:该工具允许加载多功能的Web应用测试组件
  • spynner:支持Javascript/AJAX的可编程Web浏览模块
  • python-spidermonkey:桥接Mozilla SpiderMonkeyJavaScript引擎,允许对JavaScript脚本和函数进行测试和调用
  • mitmproxy:支持SSL的HTTP代理,可通过命令行接口实时拦截和编辑网络流量
  • pathod / pathoc:可向HTTP客户端和服务求提供畸形测试用例
Forensics(信息取证)
  • Volatility:从RAM样本中提取数据
  • LibForensics:开发数字取证应用的代码库
  • TrIDLib:通过代码签名识别文件类型
  • aft:Android取证工具-
Malware Analysis(恶意软件分析)
  • pyew:命令行十六进制编辑器和反汇编工具,主要用于分析恶意软件
  • Exefilter:过滤邮件、Web页面或文件中的文件格式,检测常见文件格式并能移除活动内容
  • pyClamAV:向Python软件中添加病毒检测功能
  • jsunpack-n:通用的JavaScript拆包工具,可枚举浏览器功能并检测漏洞,针对的是浏览器和浏览器插件漏洞
  • yara-python:识别和分类恶意软件样本
  • phoneyc:纯蜜罐系统
PDF
  • Didier Stevens’ PDF tools: 分析、识别和创建PDF文件,包括PDFiD、pdf-parser、make-pdf和mPDF
  • Opaf:开源PDF分析框架,可将PDF转换成可分析和修改的XML树
  • Origapy:封装了Origami Ruby模块,可对PDF文件进行安全审查
  • pyPDF:纯PDF工具,可提取、合并、加密和解密PDF内容
  • PDFMiner:从PDF文件中提取文字内容
  • python-poppler-qt4:绑定了Poppler PDF库,支持Qt4
杂项
  • InlineEgg:Python工具箱,可用于编写小型汇编程序
  • Exomind:开发开源智能模块的框架,以社交网络服务、搜索引擎和即时消息为中心
  • RevHosts:根据给定IP地址枚举出虚拟主机
  • simplejson:使用了 Google AJAX API的JSON解码/编码器
  • PyMangle:用于创建渗透测试工具所用字典(Wordlist)的命令行工具/代码库
  • Hachoir:查看和编辑代码流中的数据域
  • py-mangle:另一款用于创建渗透测试工具所用字典(Wordlist)的命令行工具/代码库
其他有用的库和工具
  • IPython:多功能增强型交互式Python Shell
  • Beautiful Soup:爬虫可能会用到的HTML解析器
  • Mayavi:3D科学数据虚拟化工具
  • RTGraph3D:创建3D动态图像
  • Twisted:事件驱动型网络引擎
  • Suds:用于Web服务的轻量级SOAP客户端
  • M2Crypto:最完整的OpenSSL封装器
  • NetworkX:图形库
  • Pandas:可提供高性能数据结构的数据分析工具
  • pyparsing:通用解析模块
  • lxml:采用Python编写的功能丰富且易于使用的XML和HTML工具
  • Whoosh:纯Python实现的全功能文本索引、搜索库
  • Pexpect:控制或实现其他程序的自动化,类似Don Libes Expect system
  • Sikuli:虚拟化技术,通过截图实现搜索和自动化GUI,可利用Jython进行脚本扩展
  • PyQt + PySide:Qt应用框架和GUI库所需模块

移除U盘

#使用 diskutil list 命令查看系统下已挂在的驱动器
your-user-name |=>$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +249.8 GB   disk1
                                 Logical Volume on disk0s2
                                 CAE7D100-6598-4C76-9720-6D58226B5857
                                 Unlocked Encrypted

#插入U盘再次运行 diskutil list 查看挂载驱动器列表
your-user-name |=>$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +249.8 GB   disk1
                                 Logical Volume on disk0s2
                                 CAE7D100-6598-4C76-9720-6D58226B5857
                                 Unlocked Encrypted
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *7.8 GB     disk2
   1:                 DOS_FAT_32 新加卷                  7.0 GB     disk2s1

#由两次运行的不同结果知道,U盘的设备名称为 /dev/disk2

#使用    diskutil unmountDisk 解除U盘的挂载以写入Kali镜像
diskutil unmountDisk /dev/disk2

#使用 dd 命令写入 Kali的镜像
sudo dd if=/Users/your-user-name/Downloads/kali-linux-2017.1-amd64.iso of=/dev/disk2 bs=1m

Git 配置全局代理

大多数时候国外的Git repository 都会被墙,而gitlab虽然没有被抢,但是上传和下载速度感人,很有必要配置代理项。

# 设置git代理
git config --global https.proxy http://127.0.0.1:1080
git config --global https.proxy https://127.0.0.1:1080
# 取消设置代理
git config --global --unset http.proxy
git config --global --unset https.proxy

以上的方式,其实我并不推荐,git其实可以按照项目来设置代理项
只需要在项目的.git/config配置文件中添加代理设置就可以了,没有必要完全设置为全局代理

cat << EOF >> .git/config
[http]
    proxy=http://127.0.0.1:1080
[https]
    proxy=https://127.0.0.1:1080
EOF

这样只会针对当前项目配置代理。

Git配置忽略OSX下的.DS_Store文件

#添加全局gitignore设置项
echo .DS_Store >> ~/.gitignore_global
#配置使设置生效
git config --global core.excludesfile ~/.gitignore_global
#如果你的commit中已经存在.DS_Store文件,使用如下命令从git记录中删除
cd your-project-root-directory
find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
#如果你仅仅相对当前的项目忽略.DS_Store文件
cd your-project-root-directory
echo ".DS_Store" >> ./.gitignore
echo "**/.DS_Store" >> ./.gitignore

Ocserv

ocserv实际上是以socks连接的,使用netstat -npl | grep 443命令以后,会发现,init在监听443端口,那么这就出现了一个问题,443被占用了,Apache2的SSL要怎么办?

Linux的软件大多都可以根据实际的应用情况而灵活配置,我相信ocserv也不例外,详细查阅man手册和官网的文档,包括debian的Bug report,还是让我找到了蛛丝马迹。主要的解决办法可以参照链接。
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=837944

默认的情况下,直接修改ocserv的配置文件/etc/ocserv/ocserv.conf然后直接service ocserv restart是不会有任何作用的。原因就在于ocserv是以socks方式运行的,由systemd管理,由daemon守护。

修改/etc/ocserv/ocserv.conf中端口的设定之后,新建一下配置文件,添加如下配置信息

/etc/systemd/system/ocserv.socket.d/port.conf

[Socket]
ListenStream=
ListenDatagram=
ListenStream=10443
ListenDatagram=10443

使用以下命令重载配置文件

systemctl daemon-reload
service ocserv restart

注意,这里/etc/ocserv/ocserv.conf和/etc/systemd/system/ocserv.socket.d/port.conf这两个配置文件设置的端口值需要一致。
然后就会发现ocserv在监听10443端口,这样Apache的443就可以腾出来了。

后记:
其实我也搞不通,为什么ocserv为何默认会监听443端口,这点确实出乎意料。我发现此问题的原因是,在我使用certbot给站点升级https的时候发现,certbot的tls-sni-01证书challenge总是不成功,然后被迫使用DNS challenge的方式来验证主机的所有权,在完成证书的安装、https激活和确定站点的配置文件全部正常之后,打开站点主页,返回的竟是一个含有vpn的xml页面,怎么回事?

随手netstat -npl | grep 443 发现init在监听443,为嘛不是Apache在监听443?随即google,然后就发现有人提到ocserv端口占用的问题,使用systemctl status ocserv.socket验证一下,果然443被占用了。由于ocserv是很久之前就装上了,我几乎忘了这件事。这是一次由端口占用而导致的乌龙。

如何在Wordpress里写Markdown

在这个Markdown大行其道的时代,作为一个Blog程序,不支持Markdown是会没落的,然而由于Wordpress是开源程序,有很多的第三方扩展可以很方便的获得Markdown支持。

很多人都会百度一下Wordpress里怎么写Markdown, 不要轻易的被知乎上的回答给骗了,那是回答早都过时了,只可参考,实际上并不能真正解决问题。

闲话少说,跟着我。

安装WP Editor.MD 插件

这个谁都会,插件页面搜一下,点安装就行了。

安装完之后,点击 【设置】->【Editor.MD】, 勾选 支持前端语法高亮。

PS. 这个插件还有一些Bug,比如使用#写标题或是其他的*等,排版符号和文本之间需要有空格才行。比如#h1#这样,前台页面显示是不正常的,# h1 #这样前台显示才正常,其他排版符号也类似。而且,这个插件到目前为止还不支持MD多标签嵌套。希望插件作者能够修复这个小bug.

取消Wordpress默认的Html标签过滤

由于Markdown插件是将MD排版语法转换成纯Html格式,而转换以后的Html里面会有很多class和style的Html代码,而默认的Wordpress会将这些代码过滤,这就是为什么你明明安装了MD的插件,而前台却显示不正常的原因了。

打开 【外观】-> 【编辑】

在右侧编辑区找到 【模板函数 functions.php】

在文件尾部添加

#移除Wordpress默认的Html标签和代码过滤
remove_action('init', 'kses_init');   
remove_action('set_current_user', 'kses_init');

注意:

这也意味着,别人可以在你的评论区,随意的写html和行内javascript,你的Blog的安全性可能有问题,如果针对评论你有更好的解决办法,可以联系我,我加到Blog里分享给大家。

调整Crayon Syntax Highlighter插件配置,使它可以和MD无缝结合

  • 打开 【设置】-> 【Cyayon】-> 【标签】
  • 取消勾选 【捕获 标签为插件所用】
  • 取消勾选 【捕获 反引号 标签】
  • 勾选【捕获 pre标签为插件所用 】
  • 可以根据自己的设置,灵活调整

到这里基本就完成了,就可以在Wordpress里顺利的写Markdown了

服务器优化,升级内核,提高性能

查看内核版本

uname -a

Debian升级内核

#配置source list
#Debian现阶段默认的安全与稳定内核是3.6,而实际上linux内核已经更新到了4.12,如要安装4.0以上版本的内核,这需要添加jessie-backports源
#使用修改/etc/apt/source.list添加如下行
deb http://ftp.debian.org/debian jessie-backports main
#更新缓存的软件列表
apt-get update
apt-cache search linux-image
#找到合适自己的版本,比如我的是64的系统
#这里需要注意的是,后缀含有bpo的为jessie-backports软件包,和jessie包是不同的
apt-get -t jessie-backports install linux-image-4.9.0-0.bpo.2-amd64
#这个命令运行完之后,根据相关的提示就可以看到,新的内核已经安装上了
#重启使新内核生效
reboot
#如果需要回滚到以前的kernel,重新安装jessie版本下的内核包就可以了

配置TCP BBR实现加速

#运行一下命令,添加设置项,需要root权限
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
#保存使命令生效
sysctl -p
#运行结果如下,表示设置以保存
kernel.sysrq = 1
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
#查看BBR是否开启
sysctl net.ipv4.tcp_available_congestion_control
#命令结果如下,表示BBR已开启
net.ipv4.tcp_available_congestion_control = bbr cubic reno
#查看BBR运行状态
lsmod | grep bbr
#结果如下,表示正在运行
tcp_bbr 16383 0
#关闭BBR和启用BBR相类似,删除相关的配置项,重启一下系统服务就可以了
sed -i '/net\.core\.default_qdisc=fq/d' /etc/sysctl.conf
sed -i '/net\.ipv4\.tcp_congestion_control=bbr/d' /etc/sysctl.conf
sysctl -p

这里有个小插曲需要说一下

目前我有三台服务器,其中1台Qcloud,2台Linodes,在Qcloud上部署BBR很简单,安装新版内核,激活配置就可以了,然而在Linode上却出现了问题。这可能和云平台底层的虚拟化技术有关。

具体的问题是,即使在terminal界面下载了适合自己系统的kernel, 你也成功的apt安装了,使用uanme -a查看,内核切换成了你安装的新内核,在sysctl -p命令下,BBR也生效了,然而使用lsmod | grep bbr命令验证,却发现并不是那么回事,BBR还是没有运行,这是为什么?

原因其实很简单,使用另外一个命令cat /proc/version查看系统当前的内核仍然是linode提供的内核,其实这是linode根据自己的平台而修改后的内核,很可惜这个内核目前并不支持我们想要的BBR功能,那么怎么办?

实际上新内核已经装上了,只不过系统启动的时候并没有采用新内核,这是因为linode默认的VPS启动过程似乎并没有调用相关的引导如GRUB2,而是直接载入内核,然后加载硬件和文件系统,对于VPS来说,这样启动很快。

解决办法如下:

开启系统引导,取消linode默认的快速启动

#安装grub2 引导
apt-get install grub2
# 配置引导项
vi /etc/default/grub
#这里基本不用设置,因为grub2提供的配置本身就是十分合适
#具体的配置可以参照下面几个重要的项目,建议不要修改默认的配置文件
GRUB_TIMEOUT=10
GRUB_CMDLINE_LINUX="console=ttyS0,19200n8"
GRUB_DISABLE_LINUX_UUID=true
GRUB_SERIAL_COMMAND="serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1"
GRUB_TERMINAL=serial

#使用update-grub命令更新引导,看到4个内核文件,其实实际上只有2个内核文件,有2个应该只是链接符Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.9.0-0.bpo.2-amd64
Found initrd image: /boot/initrd.img-4.9.0-0.bpo.2-amd64
Found linux image: /boot/vmlinuz-3.16.0-4-amd64
Found initrd image: /boot/initrd.img-3.16.0-4-amd64
done

#到这里配置也就完成了

登录到linode账户的后台,打开当前你要配置的linode,点击profile,在Boot settings设置项的Kernel子项目中,选择Grub2启动方式,然后再linode控制台重启VPS,这样新的内核就真正加载了。

使用terminal登录vps, 查看内核版本,新内核生效了,再重新验证一篇BBR的配置也都正常,使用lsmod | grep bbr命令验证BBR运行状态,终端显示

tcp_bbr 16384 10

说明TCP_BBR正式成功生效。由此,问题解决。

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FSL 7.0.6.01001)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FSL 7.0.7.01001)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FSL 7.0.5.01003)
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8
Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0.1
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Opera/9.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.01
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Mozilla/5.0 (Windows NT 5.1; rv:5.0.1) Gecko/20100101 Firefox/5.0.1
Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.02
Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1
Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.02 Bork-edition [en]
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.53 Safari/525.19
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.36 Safari/525.19
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10
Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.4 (KHTML, like Gecko) Chrome/6.0.481.0 Safari/534.4
Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.86 Safari/533.4
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.3 Safari/532.2
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.201.1 Safari/532.0
Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.173.1 Safari/530.5
Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.558.0 Safari/534.10
Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML,like Gecko) Chrome/9.1.0.0 Safari/540.0
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.600.0 Safari/534.14
Mozilla/5.0 (X11; U; Windows NT 6; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.587.0 Safari/534.12
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.11 Safari/534.16
Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20
Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.792.0 Safari/535.1
Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.872.0 Safari/535.2
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7
Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.45 Safari/535.19
Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24
Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1
Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.15 (KHTML, like Gecko) Chrome/24.0.1295.0 Safari/537.15
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36
Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1467.0 Safari/537.36
Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1623.0 Safari/537.36
Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.103 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.38 Safari/537.36
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36

作为悲催的跨境电商,免不了每天都要和GFW做斗争。最近明显的感觉的ssh到服务器延时越来越好,随手ping一下40%以上的丢包率,使我无言以对。

 

ssh到服务器中,shell明显的卡顿和延时,使得工作中大部分的时间都是在等待服务器的响应,这样的工作效率我无法接受,经过相关的研究和了解,mosh作为一个不错的ssh替代方案,使用udp协议传输数据,相信会比tcp协议在应对gfw方面具有更高的存活率和可到达性。我们可以这样理解,mosh在本质上和ssh是一样的,只不过是底层协议发生了变化。想了解关于mosh的具体情况,可以直接google。

实际上我已经在公司自己的本地开发服务器ubuntu上部署了mosh,运行十分完美,没有出现特别延时和卡顿现象,由于本地开发服务器使用的是动态域名解析和网关路由的DMZ技术,以前在家里使用ssh连接开发服务器,还是会时不时的掉线。

当我打算直接的生产服务器部署mosh时,却出现了意料不到的问题。生产服务器环境为debian jessie。

安装很简单,直接apt-cache search mosh结果显示,debian的repository中已包含该软件包。那么直接apt-get install mosh.

安装完之后,使用命令mosh-server检查mosh服务端的状态。意外出现了,mosh服务端没有运行,提示我

mosh-server needs a UTF-8 native locale to run.

Unfortunately, the local environment (LANG=) specifies
the character set "US-ASCII",

The client-supplied environment ([no charset variables]) specifies
the character set "US-ASCII".

LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

使用env命令打印一下服务器的环境变量设置,查看服务器的配置情况。

发现默认的有关语言的配置中,变量LANG和LANGUAGE都为空,而Debian默认的语言设置的US-ASCII,而mosh运行需要UTF8的语言包,这里mosh官方有完整的说明,为何要使用UTF8,这里不做解释。所以问题就出在服务器环境中语言的设置问题。

//由于mosh会接管ssh,所以mosh会读取ssh的相关配置,这里我们需要打开debian的sshd配置文件。

那么如何配置debian的系统环境,将语言设置为utf8呢。这里debian的官方文档有十分详细的说明。

https://wiki.debian.org/Locale#SSH_Server

第一步使用dpkg-reconfigure locales命令来配置查看系统语言包。

或是修改/etc/locale.gen文件,将en_US.UTF-8和zh_CN.UTF-8这两行的注释取消。

再使用命令locale-gen命令重新生成后语言包。

然后使用命令locale -a检查系统现在可用的语言包


C
C.UTF-8
en_US.utf8
POSIX
zh_CN.utf8

可以发现中英文的UTF-8语言包都有了,这样无论我们客户端环境,语言是中文还是英文都无所谓,只要是UTF-8版本就可以直接使用mosh来通信。

 

这里还有一个问题,由于sshd_config配置文件中,我将AcceptEnv LANG LC_*选项激活了,就使得远程的terminal客户端可以将自己的本地环境变量LANG值传递到sshd服务器,从而覆写生产服务器debian的LANG配置,如果ssh客户端和服务端的LANG值不相同,那么客户端和服务端是无法通信的,mosh就无法使用。所以,这里不建议将此选项激活,而是注释掉。而实际上debian sshd配置文件,默认该选项是禁用的。

该配置的都已经配置完了,下面使用命令mosh-server检查mosh服务端的状态。

MOSH CONNECT 60001 UGAt9iWfJD0zB37eO9MIlA

[mosh-server detached, pid = 20348]

以上的命令执行结果表明,mosh服务端正常运行。

 

在客户端mosh到服务器,连接正常,从此再也不怕shell卡了。

这里还有一个问题,就是mosh由于在实现方式上与ssh的不同,导致了mosh界面scroll功能只能借助于快捷键上下翻页,而无法使用鼠标滚轮或是触控板。

根据mosh官方的解释,他们目前正在修复这一bug,在下一个版本的mosh中可能会解决这个问题。

<div class="shadow-box"></div>
<div class="slibling-box"></div>

 

如果slibling-box是相对定位或是绝对定位,这个shadow-box的css阴影是不会显示的。

原因是因为css精确定位的元素在浏览器的渲染中或默认的覆盖自由布局的元素,在这里slibling-box会覆盖shadow-box,所以无论怎样设置阴影都是不会显示的。

 

解决办法,去除相邻元素的精确定位属性,或是对设置阴影的元素应用精确定位+z-index。

  1. 域名是不是你的品牌并不重要,域名没有有DA,能不能帮你排到行业关键词更高的位置才重要,况且你还不是品牌。
  2. 第一次上线发布,至少要有300个页面。
  3. 每天都要有1-2次更新,要有新的内容添加到网站中。
  4. 性能要快,没有人喜欢慢的网站。
  5. 建好之后不管不问,不断按照实际情况更新,修改,调整,优化的网站,不如不建。所以很多网站开发公司按稿开发,这本没有错,只是千万别再称自己是电商公司了。
  6. 己所不欲勿施于人,自己觉得不对劲的地方,别指望客户看着舒服。你都觉得不怎么样的图片,还是赶紧删了吧。
  7. 分析你的客户需求的类型,在合适的位置添加适当的CTA。获取潜在客户信息也很重要,有了客户的信息和长久的持续沟通,过滤排除无效客户,建立信任,才有高质量的询盘。如果来一个询盘就是需求,那么这个行业肯定是蓝海行业,肯定是没有竞争的行业。
  8. 不要把CTA和强迫客户去做一件事混淆。CTA重要的是有说服力和吸引力,核心是客户所关心的利益和好处。强迫更多的是站在自己的角度。
  9. 关注数据,没人访问的页面要及时的从重要的位置去除,腾位置给其他页面。
  10. 你的导航好不好用,用户能不能快速找到自己的目标,会对跳出率有很大的影响。一个网站的导航应该不止一个,应该根据页面的梯级层次,不同的内容类型,添加不同功能的导航,导航的设计应遵循同一性的原则。
  11. 结合产品的特征和用户的特点设计页面,好看和炫,有时候会适得其反。
  12. 少在一个产品页面放与这个产品或一类产品无关的东西,因为用户会觉得你不专业。
  13. 文案很重要,一个网站给人的印象计10分,设计占三分,文案占七分。有好的文案,甚至不需要设计。怎么写好的文案,瞄准关切,写!!!CARE。怎么知道关切,这需要行业浸淫和产品专业,这是内功。要想学习文案写作,关注微信号-纯净纽澳小栈。如果你还不知道什么是文案,我感觉没法说下去了。
  14. 第一屏必须要显示产品,72%的用户不会下滑到第二屏,什么,你是苹果的用户,当我没说。
  15. 外链,外链,外链,重要的事情说三遍。
  16. 时刻告诉客户,你来对地方了,我这有你想要的,我能给你想要的,我能做的很好。

公司经历页面可以添加图片和文档素材

 

最大图片规格

680X385 PX

同样Retina高清显示屏的PPI为401px/inch,实测领英官方会自动压缩图片,故使用标准PPI 72px/inch。

以低烟无卤电缆为例

  • 产品完整名称 –  low smoke zero halogen
  • 产品简写 – lszh / lsf  / lszh / ls0h / lsoh
  • 核心组合 – low smoke / zere halogen / smoke / halogen / compound
  • 错误拼写 – zore / halojen
  •  对应标准 – ICEA T-33-655 / IEC 60754 / BS 6425 / BS 7211
  • 产品用途 –
  • 产品面向问题 –
  • 前缀后缀 – Buy / Manufacturer / Supplier / Factory / Distribution / Sales / Seller / Price

在默认情况下,Mac只安装了Python的2.0版本,因为还有很多常用的第三方库文件依然是基于2.0的Python开发的。

但实际上,有大量的Python项目已经在往3.0的版本迁移,而且在不久的将来,Python官方将会停止对2.0版本的支持。

基于大量的新项目需求和官方的调整,在Mac上部署3.0的环境和使用3.0的Python已经变得越来越迫切和必要。

 

最佳实践

安装Python版本管理工具

Python实际上有第三方的版本管理工具,叫作Python Version Management,简称 pyenv

该工具可以灵活方便的管理Python环境,并且可以保证Python多版本的无冲突共存,鉴于以上的特性,使得在Mac上使用Python,使用Python的版本管理工具自然是最好不过了。

安装pyenv很简单。直接在命令行中使用brew安装命令即可。

brew install pyenv

如需对pyenv进行升级,则使用以下命令

brew upgrade pyenv

 

安装完成后,根据pyenv的官方文档,还需要对系统环境变量PATH进行配置

使用如下命令,将pyenv相关设置添加到系统中

echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
//如需要使设置立即生效,则需要source一下配置文件
source ~/.bash_profile

如此,pyenv安装配置完毕,我们便可以在Mac中使用Pyenv来管理和切换Python运行环境

注意,pyenv下的Python环境是独立于Mac系统自带的Python环境的,所以pyenv并不是对Mac自身的Python环境进行管理,如需使用Python 2.0 和 3.0的环境,这需要使用pyenv安装2.0和3.0的Python环境。

查看一下Python官方,发现此时最新的Python版本分别是2.7.13和3.6.0

pyenv也可以查询到哪些Python版本可以被安装,但实际上pyenv的版本信息会比Python官网的版本低。

运行以下命令来查询pyenv可以安装的版本

pyenv install --list

pyenv上的版本信息(稳定版)此时为2.7.12和3.5.2

于是我们安装2.7.12和3.5.2版本,版本稍微低一点点实际上是没有关系的,只要核心版本是2.0和3.0就可以了。

运行一下命令来安装

pyenv install 2.7.12
pyenv install 3.5.2

由于Python官网在国外,实际下载速度会比较慢,稍等片刻即可。

 

版本管理与切换

使用pyenv可以方便的切换系统的Python版本,使用

pyenv versions

可以查询系统当前的Python版本设置,如当前我的电脑设置为如下所示

* system (set by /Users/swatchion/.pyenv/version)  //MAC系统默认的Python版本
  2.7.12
  3.5.2

Python是基于文件夹和目录的,选项local指的是当前文件夹,选项global指的是系统全局使用的版本, local我们使用新的3.0版本,global我们使用系统默认即可,这样就不会影响mac系统自身的运行。

pyenv local 3.5.2
pyenv global system

环境安装和设置好之后,我们就可以使用安装好的环境进行项目开发了。

 

题外话

PS 实际上Brew支持直接安装Python3版本,直接使用命令

brew install python3

就可以安装Python 3.0版本,使用Python 3.0直接在命令行里输入

python3

就会直接进入3.0的环境。

 

Matt Cutts explained emphatically that using stock photos (or even duplicating photos repeatedly on the same site) does not impact your search engine ranking, negatively or positively.

While this question was put in the context of stock photos, the implications for photographers and artists clearly go beyond that. For example, if an infringer copies and posts a copy of a photo on their site, it doesn’t hurt the ranking of the original photographer and their site.

So while the good news is that legitimate sites won’t be penalized when their images are infringed, the flip side is that infringing sites won’t either. All of the sites that lift photos have the exact same chance for ranking well, including in Google Image Search, that your site does.

Though, for writers, Google sometimes gets it wrong and unfairly penalizes original sites, it gets it right most of the time and keeps the plagiarists out of the search results.

 

 

How to deal with duplicate image and site content?

  • Google’s “Search by Image” is based upon the COLOR PROFILE of the image. Changing the color, adding other elements to the image or reversing the landscape works.
  • duplicate image (or slightly modified image) is ok, make sure other content within page is unique AND still relevant to that image.
  • To avoid the duplicate image penalty comes in potential inpact totally, use unique images or photos of your products, brand and employees. Stock photos sometimes also means untruthful, cuz they make your audience feels not real.
  • Some duplicate or similar images may be beneficial to your site.  For example, having an image or photo of a coffee cup that Google feels is similar to coffee on a website for a coffee shop is helpful.
  • Optimize all your images and other multimedia on your site.
  • Other duplicate or similar images on your site that represent branding or trust are good, such as having Visa, Mastercard or the Better Business Bureau images.