科学上网-零基础搭建个人专线shadowsocks

一、首先购买一个海外vps ,安装centos7系统

VPS有:BandwagonHost,dataocean,vultr,linode。选择服务器地址时,可以先测试一下速度,选速度快的机房。

二、登录vps 并加固

1、利用SSH远程 登入 centos7,方便后续操作。(有些vps的ip可能被屏蔽了,所以需要换一个vps试试看)
SSH远程连接入门

2、加固 centos7 安全性:

(1)、更新centos7系统
(2)、解决系统编码问题
(3)、开启 防火墙。

systemctl start firewalld

(4)、修改SSH默认端口SSH只用密钥登录

3、安装VNC软件,进行远程访问。(可选操作,如果不适应用命令行操作,可以借助vnc 进行远程桌面操作)
(为了提高安全性,使用SSH端口转发,登入服务器)
vnc远程连接配置与入门

三、安装shadowsocks服务端

我们安装的是python版本的。因为centos7 默认自带了 python,所以不需要安装了。如果没有安装的话,可以运行

yum install python

这样子 也可以检查出,是否安装了python。

安装 pip :
1、可以用 VNC 远程登录 vps 主机,然后用浏览器 下载 pip 安装包。
下载页面:https://pypi.org/project/pip/9.0.1/
文件链接地址:https://files.pythonhosted.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz

为什么不选最新版,因为最新版pip 和 python 有一点 兼容性问题。
也可以在SSH中用命令行的方式 下载文件:

curl https://files.pythonhosted.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz -o pip.tar.gz --progress

文件下载完,可以用 VNC 桌面方式进行 解压。或者 在 SSH 中 用命令行 进行解压。

tar zxvf pip-9.0.1.tar.gz -C /root/mydir

将文件 解压到了mydir目录下面。
解压完成后,进入 mydir 文件夹。可以用vnc 直接进入。也可以用命令行

cd /root/mydir

只有进入到 mydir文件夹以后,下面的安装才能成功。
在SSH下或者vnc的终端运行命令行:

python setup.py install

(其实 用命令行 可以直接装 pip,但是安装的是最新版的pip,好像与python存在兼容性问题)

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py

2.安装 shadowsocks
在SSH或者VNC的终端下运行如下代码:

安装 加密软件 库 用于支持 aes-256-gcm 加密方式 (带#的,都是注释,不需要打 )
 yum install epel-release
 
yum install libsodium
 安装 或升级 最新 软件 版本
 pip install --upgrade git+https://github.com/shadowsocks/shadowsocks.git@master

3.配置shadowsocks
SSH下:

[bash] # 创建 /etc/shadowsocks.json vim /etc/shadowsocks.json [/bash]

上面就创建了配置文件,然后用 vim 编辑 下面内容就行了。

{
"server": "0.0.0.0",
"server_port": 3678,
"password": "sdfsndsfoni",
"method": "aes-256-cfb"
}

多余多个端口可以如下:(顺便说了一下,可以添加PID_FILE和LOG_FILE)

pidfile

{
  "server": "0.0.0.0",
  "port_password": {
        "8850":"hehe2016"
 },
  "method": "aes-256-gcm",
  "PID_FILE": "/var/run/shadowsocks_ssserver.pid",
  "LOG_FILE": "/var/run/shadowsocks_ssserver.log"
}

添加PID_FILE,是因为 执行下面这句话时,需要PID 文件,否则会报错。

ssserver -c /etc/shadowsocks.json -d  stop

这个时候,服务器就可以使用了:

##### 开启 shadowsocks  服务
ssserver -c /etc/shadowsocks.json -d  stop

##### 关闭 shadowsocks  服务
ssserver -c /etc/shadowsocks.json -d  start

后面提到的shadowsocks.service是另一种启动方式。

##### 查看 shadowsocks 状态 
#####(如果 我用ssserver -c /etc/shadowsocks.json -d start 启动,那么这里查看的启动状态是 dead 的,两种启动方法 应该隶属于 不同的管理方式中)
systemctl status shadowsocks

##### 启动 shadowsocks 服务
systemctl start shadowsocks

##### 关闭 shadowsocks 服务
systemctl stop shadowsocks

注意: 加密方式(method),密码(password),服务器端口(server-port)都可以自己设置,只要客户端相同就行。服务器端口 1024以下是系统保留的,从1024-65535是用户使用的。密码 建议选择 aes 系列。method为加密方法,可选aes-128-cfb, aes-192-cfb, aes-256-cfb, bf-cfb, cast5-cfb, des-cfb, rc4-md5, chacha20, salsa20, rc4, table

vim编辑器用法可以查看:vim入门基础
VNC桌面环境就直接创建json文件就行了。

4.配置开机自启动。SSH和VNC操作都行。

新建启动脚本文件/etc/systemd/system/shadowsocks.service,内容如下:

[Unit]
Description=Shadowsocks
[Service]
TimeoutStartSec=0
ExecStart=/usr/bin/ssserver -c /etc/shadowsocks.json
[Install]
WantedBy=multi-user.target

然后 , 在SSH或者VNC终端下:输入命令

systemctl enable shadowsocks
systemctl start shadowsocks

为了检查 shadowsocks 服务是否已成功启动,可以继续执行以下命令查看服务的状态:

systemctl status shadowsocks -l 

如果服务启动成功,则控制台显示的信息可能类似这样:

● shadowsocks.service - Shadowsocks
 Loaded: loaded (/etc/systemd/system/shadowsocks.service; enabled; vendor preset: disabled)
 Active: active (running) since Mon 2015-12-21 23:51:48 CST; 11min ago
 Main PID: 19334 (ssserver)
 CGroup: /system.slice/shadowsocks.service
 └─19334 /usr/bin/python /usr/bin/ssserver -c /etc/shadowsocks.json
 Dec 21 23:51:48 morning.work systemd[1]: Started Shadowsocks.
 Dec 21 23:51:48 morning.work systemd[1]: Starting Shadowsocks…
 Dec 21 23:51:48 morning.work ssserver[19334]: INFO: loading config from /etc/shadowsocks.json
 Dec 21 23:51:48 morning.work ssserver[19334]: 2015-12-21 23:51:48 INFO loading libcrypto from libcrypto.so.10
 Dec 21 23:51:48 morning.work ssserver[19334]: 2015-12-21 23:51:48 INFO starting server at 0.0.0.0:8388

不过此时还连接不上服务器,因为CentOS 7默认防火墙是阻止SS端口的,这里需要放行SS端口,由于CentOS 7的防火墙升级为Firewall了,操作方式与之前的iptables有所不同(3678为文中shadowsocks服务器配置端口号,这里要改为你安装SS时设置的端口):
firewall-cmd –permanent –add-port=3678/tcp
firewall-cmd –reload

四、安装kcp加速插件

由于原生shadowsocks速度慢,所以用kcp 插件加速。
访问链接,选择linux-amd64 下载,centos7系统 是 64位的linux系统。
https://github.com/shadowsocks/shadowsocks-windows/releases

解压后有两个文件,其中类似server_linux_amd64这样的文件就是服务端程序了,另一个类似client_linux_amd64的就是客户端程序了。如果客户端在Windows上使用要下载Windows版本的哦。

SSH 里面可以用 tar命令进行解压(前面解压pip文件已经提到过了), ls 命令可以查看 当前目录所有文件 cd 命令表示进入某目录。可以搜索一下bash常用命令操作。
VNC里面直接可视化操作就行了。

先来创建服务端配置文件,创建开机启动项如下供参考:

[bash] vim /etc/systemd/system/kcptun.service [/bash]

然后 配置启动文件如下:

[Unit]
 Description=kcptun
 [Service]
 TimeoutStartSec=20
 ExecStart=/usr/bin/server_linux_amd64 -t "0.0.0.0:3678" -l ":5678" -mode fast2
 [Install]
 WantedBy=multi-user.target

其中TimeoutStartSec为延时启动的时间,这里由于需要等待ShadowSocks启动完成后再启动,所以配置20秒的延迟。ExecStart后的server_linux_amd64为你刚刚下载的文件的位置,建议放到相应的文件夹以便管理。-t后的是服务器的IP和ShadowSocks服务的端口,这里IP配置为本机IP即可。-l表示KCP服务使用的端口,-mode表示速度的模式,从快到慢依次是fast3 > fast2 > fast > normal > default,fast3一般用于游戏,不想要任何的延迟(no lag),但这也意味浪费的流量会增多,这里我选择fast2就够用了。

[bash] systemctl daemon-reload # 创建开机启动 systemctl enable kcptun # 启动kcp服务。 systemctl start kcptun # 防火墙 开放 kcp 端口 (kcp 是 udp 协议,shadowsocks 是tcp协议) firewall-cmd –permanent –add-port=5678/udp # 防火墙 重新 加载 配置 firewall-cmd –reload [/bash]

五、安装客户端

安卓版本:(个人用 3.3.1 版本,因为 好像 不需要 google play 插件吧。并且内置kcp 插件)
https://github.com/shadowsocks/shadowsocks-android/releases
windows版本:
https://github.com/shadowsocks/shadowsocks-windows/releases
需要下载kcp客户端单独进行集成。(Windows-386 32位系统,Windows-amd64 64位系统)
https://github.com/xtaci/kcptun/releases
集成方法可以参考链接:
(总体思路是本地shadowsocks先连接本地的kcptun,然后kcptun 连接 代理服务器的 kcptun,
接着 代理服务器的kcptun 连接 代理服务器的 shadowsocks)
https://blog.csdn.net/farawayzheng_necas/article/details/63255799

mac版本:(内置kcp插件)
https://github.com/shadowsocks/ShadowsocksX-NG
ios版本:
因为大陆已经下架,需要在其他地区搜索:Shadowrocket 等 支持shadowsocks的 应用软件。

之前3.几的安卓客户端,kcp与客户端是集成的,配置文件中,shadowsocks服务器端口就填shadowsocks端口。kcp配置:需要配置kcp端口,kcp参数:

--crypt aes-192 --key "hello"

到了安卓4.x版本,kcp是插件化了。无法启动kcp,可能是1、shadowsocks卸载重装2、手机管家的自启动的链式启动,允许kcptun。

如果要添加kcp插件,那么shadowsocks的端口就要填 kcp的端口,kcp的插件需要配置:[注意与3.x的配置不同,这里的密码,不再需要添加引号了]

key=hello;crypt=aes-192

六、安装obfs 混淆,这个只能与 kcp 二选一

服务器:centos

sudo yum install gcc autoconf libtool automake make zlib-devel openssl-devel asciidoc xmlto

git clone https://github.com/shadowsocks/simple-obfs.git
cd simple-obfs
git submodule update --init --recursive
./autogen.sh
./configure && make
sudo make install

### 会报错 缺少 libev,于是 猜测 shadowsocks libev版本有,
### 于是安装 shadowsocks libev 的依赖库
yum install gcc gettext autoconf libtool automake make pcre-devel asciidoc xmlto c-ares-devel libev-devel libsodium-devel mbedtls-devel -y

服务器配置:

因为是独立模式:vim /etc/systemd/system/obfs-server.service

[Unit]
Description=Simple-obfs
After=network.target

[Service]
Type=simple-obfs
User=nobody
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
ExecStart=/usr/local/bin/obfs-server -s 0.0.0.0 -p 443 --obfs tls -r 127.0.0.1:8866

[Install]
WantedBy=multi-user.target

监听 1024以下端口 需要 root 用户权限,所以采用下面的方法:(应该是绑定服务吧)

setcap cap_net_bind_service=+ep /usr/local/bin/obfs-server
### 最后更新服务并启动:
sudo systemctl enable obfs-server
sudo systemctl daemon-reload
sudo systemctl restart obfs-server

特别注意:复制粘贴时的 问题:【正常情况应该不会出现这个问题,然后我把vim后面的空格给删了,然后用打了一个空格,结果就好了,可以新建文件了】

[root@superguy ~]# vim /etc/systemd/system/obfs-server.service
-bash: vim /etc/systemd/system/obfs-server.service: No such file or directory

这里有编译好的软件可直接放到目标位置  obfs-localobfs-server

有可能 443端口被占用了,导致绑定出错,可以换其他端口再重试。

# 查看端口被占用方法

lsof -i:443

客户端:因为是集成插件模式:

1、客户端连接 服务器 端口 就是 443

2、指定 插件为:  obfs-local【有些地方填:simple-obfs】  ;  并配置插件参数 ,如下面的示例。

--plugin-opts "obfs=tls;obfs-host=www.bing.com"

备注:obfs 类型有 tls和http  主要是 服务器 和客户端 类型要统一。

参考教材:

###Plugin mode with shadowsocks
###Add respective item to --plugin and --plugin-opts arg or as value of plugin and plugin_opts in JSON.

### On the client:

ss-local -c config.json --plugin obfs-local --plugin-opts "obfs=http;obfs-host=www.bing.com"
### On the server:

ss-server -c config.json --plugin obfs-server --plugin-opts "obfs=http"
### Standalone mode
### On the client:

obfs-local -s server_ip -p 8139 -l 1984 --obfs http --obfs-host www.bing.com
ss-local -c config.json -s 127.0.0.1 -p 1984 -l 1080
### On the server:

obfs-server -s server_ip -p 8139 --obfs http -r 127.0.0.1:8388
ss-server -c config.json -s 127.0.0.1 -p 8388

七、nginx与shadowsocks共用443端口伪装

1、shadowsocks 转发给 nginx

最近突发奇想把网站改为https,不可避免的遇到了与shadowsocks的443端口冲突问题(443端口不容易被检出)。废了好大劲才发现原来ss的simple-obfs已经带有非ss流量转发功能。

shadowsocks

# HTTP only with plugin mode
ss-server -c config.json --plugin obfs-server --plugin-opts "obfs=http;failover=example.com:80"

# Both HTTP and HTTPS with standalone mode
obfs-server -s server_ip -p 80 --obfs http -r 127.0.0.1:8388 --failover example.com:80
obfs-server -s server_ip -p 443 --obfs tls -r 127.0.0.1:8388 --failover example.com:443

# suppose you have an HTTP webserver (apache/nginx/whatever) listening on localhost:8080 and HTTPS on 8443
# (you probably shouldn't expose these ports)
obfs-server -s server_ip -p 80 --obfs http -r 127.0.0.1:8388 --failover 127.0.0.1:8080
obfs-server -s server_ip -p 443 --obfs tls -r 127.0.0.1:8388 --failover 127.0.0.1:8443

这样便将web流量转发到了8443端口

nginx

user xx xx;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    types_hash_max_size 1024;

    server {
        listen       80;
        server_name  localhost;
        return       301    https://$host$request_uri;  #redir to https
   #     #charset koi8-r;

   #     #access_log  logs/host.access.log  main;

        # redirect server error pages to the static page /50x.html
        #
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html {
        #    root   /usr/share/nginx/html;
        #}

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    server {
        listen       8443 ssl http2;
        server_name  localhost;

        ssl_certificate      /etc/letsencrypt/live/cclin.net/fullchain.pem; #managed by Certbot
        ssl_certificate_key  /etc/letsencrypt/live/cclin.net/privkey.pem; #managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

        location / {
            uwsgi_pass 127.0.0.1:3031;
            include uwsgi_params;
        }

        }
    #   ssl_session_cache    shared:SSL:1m;
    #   ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    }
}

2、利用nginx转发到shadowsocks

下面的方法 可以 ,即访问网站,同时又 ss。 也就是说 simple-obfs 支持 http代理 转发
server {
    listen       80;
     server_name  localhost;
  # server_name  www.huaijiujia.com;
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;

        if ($http_upgrade = "websocket") {
             proxy_pass http://127.0.0.1:8443;
        }
        proxy_http_version 1.1;
        proxy_set_header Upgrade "websocket";
        proxy_set_header Connection "upgrade";
    }

…..

}

下面的 方法 不行,只能访问 网路,但是无法 使用  ss。也就是说 simple-obfs 不支持 tls 代理 转发

server {
    listen   443  default_server;
    server_name  _;
    ssl_certificate     https_cert/huaijiujia_ca_chained.crt;
    ssl_certificate_key https_cert/huaijiujia_private.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
  #  return 404;
   #   return 301 https://www.amazon.com;
      location = / {
        if ($http_upgrade = "websocket") {
             proxy_pass https://127.0.0.1:8443;
        }
        proxy_http_version 1.1;
        proxy_set_header Upgrade "websocket";
        proxy_set_header Connection "upgrade";
    }
   return 301 https://www.amazon.com;
}

因为,安卓手机的功能不完善,不完全支持 simpobfs功能,所以需要重新下个 改进版的。点击下载: Simple-obfuscation-fix


补充:

如果 shadowsocks需要支持 aes-256-gcm加密的话:

For CentOS 7, if you need AEAD ciphers(支持aes-256-gcm加密), you need install libsodium

yum install libsodium python34-pip
pip3 install  git+https://github.com/shadowsocks/shadowsocks.git@master

 

wordpress-上传文件类型限制

楼主想上传一个脚本文件到wordpress,但是 发现 由于安全限制,无法上传。

文件类型不符合安全规则。试试别的文件。

这种错误是由于WordPress中做了文件上传格式的限制,这种限制可以在WordPress中的wp-include/functions.php的get_allowed_mime_types函数中找到,函数如下:

function get_allowed_mime_types() {
static $mimes = false;
if ( !$mimes ) {
// Accepted MIME types are set here as PCRE unless provided.
$mimes = apply_filters( ‘upload_mimes’, array(
‘jpg|jpeg|jpe’ => ‘image/jpeg’,
‘gif’ => ‘image/gif’,
‘png’ => ‘image/png’,
‘bmp’ => ‘image/bmp’,
‘tif|tiff’ => ‘image/tiff’,
‘ico’ => ‘image/x-icon’,
‘asf|asx|wax|wmv|wmx’ => ‘video/asf’,
‘avi’ => ‘video/avi’,
‘divx’ => ‘video/divx’,
‘flv’ => ‘video/x-flv’,
‘mov|qt’ => ‘video/quicktime’,
‘mpeg|mpg|mpe’ => ‘video/mpeg’,
‘txt|c|cc|h’ => ‘text/plain’,
‘rtx’ => ‘text/richtext’,
‘css’ => ‘text/css’,
‘htm|html’ => ‘text/html’,
‘mp3|m4a’ => ‘audio/mpeg’,
‘mp4|m4v’ => ‘video/mp4′,
‘ra|ram’ => ‘audio/x-realaudio’,
‘wav’ => ‘audio/wav’,
‘ogg’ => ‘audio/ogg’,
‘mid|midi’ => ‘audio/midi’,
‘wma’ => ‘audio/wma’,
‘rtf’ => ‘application/rtf’,
‘js’ => ‘application/javascript’,
‘pdf’ => ‘application/pdf’,
‘doc|docx’ => ‘application/msword’,
‘pot|pps|ppt|pptx’ => ‘application/vnd.ms-powerpoint’,
‘wri’ => ‘application/vnd.ms-write’,
‘xla|xls|xlsx|xlt|xlw’ => ‘application/vnd.ms-excel’,
‘mdb’ => ‘application/vnd.ms-access’,
‘mpp’ => ‘application/vnd.ms-project’,
’swf’ => ‘application/x-shockwave-flash’,
‘class’ => ‘application/java’,
‘tar’ => ‘application/x-tar’,
‘zip’ => ‘application/zip’,
‘gz|gzip’ => ‘application/x-gzip’,
‘exe’ => ‘application/x-msdownload’,
// openoffice formats
‘odt’ => ‘application/vnd.oasis.opendocument.text’,
‘odp’ => ‘application/vnd.oasis.opendocument.presentation’,
‘ods’ => ‘application/vnd.oasis.opendocument.spreadsheet’,
‘odg’ => ‘application/vnd.oasis.opendocument.graphics’,
‘odc’ => ‘application/vnd.oasis.opendocument.chart’,
‘odb’ => ‘application/vnd.oasis.opendocument.database’,
‘odf’ => ‘application/vnd.oasis.opendocument.formula’,
) );
}
return $mimes;
}

以上传入 apply_filters函数中的Array,即使允许上传的类型列表,我们可以修改这个地方,以禁止或允许可以上传的文件类型。

例如我们想要允许rar文件上传,只需添加一行格式说明即可:

‘rar’ => ‘application/rar’,

除了直接修改这个Array外,还有另外一种方法,可以修改wp-config.php文件,这个文件在WordPress的根目录下,在其中增加一行语句:
define(‘ALLOW_UNFILTERED_UPLOADS’, true);

这条语句将去除上传的文件类型限制,一劳永逸。

转载自:https://www.cnblogs.com/kedarui/p/3627307.html

python练手-srt字幕转换lrc字幕

之前因为有学习英语的需求,看了一些美剧。但由于平常时间有限,所以将美剧视频压缩成了mp3,然后顺便将srt字幕转换成了lrc。

github上参考了 一个 srt转 lrc 的 python脚本。

楼主将自己完善的python字幕转换脚本 展示如下:

#coding=utf-8  
# 如果要在python2的py文件里面写中文,则必须要添加一行声明文件编码的注释,否则python2会默认使用ASCII编码。

'''
Run it in srt file folder.
python 2.7
'''
import glob
import re

SRT_BLOCK_REGEX = re.compile(
        r'(\d+)[\r\n]+'  # srt --> num
        r'(\d{2}:\d{2}:\d{2},\d{2,4})[\s]*-->[\s]*(\d{2}:\d{2}:\d{2},\d{2,4})[\r\n]+' # srt --> time
       # r'(.+)'     
        r'(.*)[\r\n]+'   # srt --> subtitles 
        r'(.*)'   #  srt --> subtitles  ( sometimes srt has 2 subtitles  )
        )
        
      # [^\S\r\n]*[\r\n]+

def srt_block_to_irc(block):
    match = SRT_BLOCK_REGEX.search(block)

    """
    IndentationError: unindent does not match any outer indentation level
    /////////////////////////////////////     python 的 注释 居然 也要 对齐的 我去
Traceback (most recent call last):
  File "srt2lrc.py", line 100, in <module>
    srt_file_to_irc(file_name)
  File "srt2lrc.py", line 50, in srt_file_to_irc
    blocks_out = [srt_block_to_irc(block) for block in blocks_in]
  File "srt2lrc.py", line 24, in srt_block_to_irc
    print('match groups 0: %s' %(match.group(0)) ) 
AttributeError: 'NoneType' object has no attribute 'group'

因为 下面的 print 函数 有问题 啊,每一次 调用 上面的  search(block) 有可能 出现 不匹配,于是 会传给 match = none 
    """



    if not match:
        return None
    #else:
     #   print('match groups 0: %s' %(match.group(0)) ) 


    num, t1, t2, content1, content2 = match.groups() 
    # 匹配 每一个 正则表达式 单元 ---> 就是 正则表达式 里面 加了 括号的部分 时间部分 有11位 ,t1[3:11] 就是 截取 t[3] 到 不包括最后的 t1[11].其实最大是t[10],t[11]越界不存在的

    """
    print( 'hell' )
    print('match num 0: %s' %(num)  ) 
    print('match t1 0: %s' %( t1 )  )
    print('match t2 0: %s' %( t2 )  )
    print('match content1 0: %s' %(content1 ) )
    print('match content2 0: %s' %(content2) )
    """

   # ts = ts[3:-1].replace(',', '.')
   # te = te[3:-1].replace(',', '.')
   # co = content.replace('\n', ' ')
   # python里面的索引的特征是包含起点,但是不包含结束的索引值,-1表示最后一个元素,但是-1是结尾的index,所以含义就是取 第三个元素 到 最后一个元素
   # t1 = t1.split(',')[0]  # 分裂后 取 第一个字符串 
   # t2 = t2.split(',')[0]

   # print('match t1 0: %s' %( t1[10] )  )

    t1 = t1[3:11].replace(',', '.')
    # t2 = t2[3:-1].replace(',', '.')
   # print('match t1 replace: %s' %( t1 )  )

    # return '[%s]%s\n[%s]\n' % (ts, co, te)
    return '[%s]%s%s\n\n' % (t1, content1, content2)

def srt_file_to_irc(fname):
      #  python 3
      #  with open(fname, encoding='UTF-8') as file_in:
      #  str_in = file_in.read()

    with open(fname, 'rb') as file_in:
        str_in = file_in.read().decode("utf-8") # the original srt file encode with utf-8 ,  so this place we decode it with utf-8   
        blocks_in = str_in.replace('\r\n', '\n').split('\n\n')
        blocks_out = [srt_block_to_irc(block) for block in blocks_in]

      #  print('all blocks_out: \n %s' % (blocks_out) )


        if not all(blocks_out):
            err_info.append((fname, blocks_out.index(None), blocks_in[blocks_out.index(None)]))
        blocks_out = filter(None, blocks_out)
        str_out = ''.join(blocks_out) 
      # 卧槽  python 用 对齐方式 判断 作用域的 因为 有了中文注释,源文件是 ascii编码的。所以报错 说 出现 非ASCII字符
      # SyntaxError: Non-ASCII character '\xe5' in file Test1.py on line 8, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
      # 解决方法 python的默认编码文件是用的ASCII码,将文件存成了UTF-8,编译就可以通过。或在在py文件开头(必须是第一行)加入




      #  python3 
      #  with io.open(fname.replace('srt', 'lrc'), 'w', encoding='UTF-8') as file_out:
      #  file_out.write(str_out )

        with open(fname.replace('srt', 'lrc'), 'w') as file_out:
            file_out.write(str_out.encode('utf-8'))


"""

Python–方法: 
1.根据长度判断 
长度为0时,表示空。(其中”判断条件”成立时(非零),则执行后面的语句)

lst = []
if len(lst):
    print 'c'
else:
    print 'cc'

2.根据逻辑判断 
由于一个空 list 本身等同于 False

lst = []
if lst:
    print 'c'
else:
    print 'cc'

"""

if __name__ == '__main__':
    err_info = []
    for file_name in glob.glob('*.srt'):
        srt_file_to_irc(file_name)
    if err_info:
        print('success, but some exceptions are ignored:')
        for file_name, blocks_num, context in err_info:
            print('\tfile: %s, block num: %s, context: %s' % (file_name, blocks_num, context))
    else:
        print('success')

只需将 此 python 脚本,放入待转换的 srt字幕 文件夹里面就行。
然后 命令行 运行该 python 脚本就行。可以 修改 python脚本 的正则表达式,修改srt  解码格式。
脚本文件下载

 

python入门概述

今天查了很多资料,梳理一下Python的知识面。

Python 的语法非常简洁,写起来就像写英语一样,不仅简单而且可以高效地实现面向对象编程。与 C/C++/Java 相比,可以用很少的代码写出同样的程序,跨平台,一次编写到处运行,无须编译,直接运行,还有很多框架包可以选择。

它可以用来进行网络开发、GUI开发、图形开发、Web开发、游戏开发、手机开发、数据库开发,大数据分析等等。

网络开发,有大量的网络编程模块,支持 Socket、Email、FTP、Twisted,Jabber 等。GUI开发方面,有很多强大的GUI库,wxPython、Zope、Plone。游戏开发,例如网络游戏脚本、账号注册系统、物品交换系统、场地转换系统和攻击防御系统都是用Python写的。网站后台,有大量的成熟的框架,如 Django、Flask、Bottle、Tornado。很多知名网站都在用Python,豆瓣、知乎、Youtube、Dropbox、OpenStack等。

数据科学方面,Python也是越来越受到重视,从云计算基础设施,到网络爬虫,再到数据处理算法。私有云 OpenStack,公有云 AWS、GCE、Azure、阿里云、青云,也都提供Python SDK。Spark、Hadoop都开了Python的接口,可以用Python做大数据的mapreduce。用Python写爬虫非常简单,库很健全,而且基于它发展起来了很多并发库,网络爬虫才真正可以达到大数据规模,爬取数据之后,还有自然语言处理程序包NLTK可以做分词处理。

Python在做科学计算方面还有三大神器:Numpy、Spicy、Matplotlib。NumPy 和 SciPy 给其他高级算法打了非常好的基础,用已经封装好的包,可以快速迭代,优化各种参数。Matploglib 可以用来画Matlab那样的图。还有 scikit-learn、pattern、jieba、pybrain 实现了很多机器学习深度学习的算法。

还可以用Python做一些很好玩的事情,比如大神们用21行Python写出的拼写检查器,用微信控制灯泡等等,听着就很是乐趣无穷。

作者:不会停的蜗牛
链接:https://www.jianshu.com/p/108cfb8f6d4b

计算机硬件-科普-主板概述

来自:http://tieba.baidu.com/p/2955636909

BIOS英文”Basic Input Output System”的缩略语,直译过来后中文名称就是”基本输入输出系统”。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。也就是说,在没有装系统之前只能使用这个基层系统。
=========================================================
PC硬件组成:CPU,主板,内存条,显示器,机箱,散热器,电源,光驱,硬盘,固态硬盘
———————————————————–
【主板相关知识】
———————————————————–
【入门篇】
基础知识扫盲贴,PC主机的基石-电脑主板基本篇
http://tieba.baidu.com/p/2636055098 
一篇帖子10分钟教你如何选购主板
http://tieba.baidu.com/p/2191761624 

【进阶-装机篇】
主板硬盘灯、电源灯、重启、开关机接线
http://tieba.baidu.com/p/2206266199 
装机教程
http://tieba.baidu.com/p/2239070608 
电脑组装之接口线缆安装细节图解
http://tieba.baidu.com/p/2235652864 

【进阶-用料篇】
教你看主板上的电容(推荐连下面的帖子一起看)
http://tieba.baidu.com/p/2671593790 
教你分辨日、台系电容
http://tieba.baidu.com/p/2191471094 

【其他知识】
有关主板的多相供电的原理
http://tieba.baidu.com/p/2191774388 
看型号选主板之“微星”篇
http://tieba.baidu.com/p/2458320295 
看型号选主板之“技嘉”篇
http://tieba.baidu.com/p/2458129754 
==================点击切入正题======================

一.主板各部件名称以及各功能粗解

声卡、网卡:主板有集成,有特殊需要的用户可以另行购买独立声/网卡。
南桥芯片:南桥芯片负责I/O总线之间的通信,如PCI总线、USB、LAN、ATA、SATA、音频控制器、键盘控制器、实时时钟控制器、高级电源管理等。
I/O芯片:I/O控制电路,它负责提供串行、并行接口及软盘驱动器控制接口。
CPU插槽:放置中央处理器(CPU)的插槽(在其四周有四个孔洞,那个是固定散热器的位置)。
内存插槽:插内存条的地方,不同的主板型号需要查看其说明书,是否支持双通道以及内存的频率(内存主流频率:1333/1600/1866/2133/2400MHz),注意,光是主板支持也不行行,因为北桥控制内存(北桥芯片已整合进CPU内),所以,也必须在北桥支持的内存频率内,否则频率再高也只能是北桥所支持的最大频率。(北桥在下文有讲解)
双通道:双通道可以提供双倍内存带宽。也可理解为单位时间内的双倍数据交换量。
SATA接口:连接硬盘的接口,需要注意的是,SATA3.0的传输读写速率是SATA2.0的两倍,所以最好优先连接3.0接口(需要查看主板说明,因为有些主板的标记用法不同)。
8Pin电源接口:供电作用,也可4pin+4pin或单4PIN直接接上去使用。
24PIN电源接口:主板供电作用。
USB3.0目前主板的标配,其传输速率是USB2.0的8倍(理论速率),需要支持USB3.0的配件才能使用USB3.0,前置USB3.0需要机箱也支持USB3.0,但后置可以使用。
CPU散热器接口:简称CPU_FAN,一般在主板边缘。(位于主板中间位置的两个散热器接口,称CHN_FAN那个一般是机箱风扇的接口)
PCIE16x:(全称:PCI Express),一般为显卡插槽,除开X倍率还分1.0(淘汰)/2.0(H61以下还在使用)/3.0(B75以上全部普及),具体速率差距如下图:

PCI接口:普通玩家一般用不上的扩展插槽,可插接显卡、声卡、网卡、内置Modem、内置ADSL Modem、USB2.0卡、IEEE1394卡、IDE接口卡、RAID卡、电视卡、视频采集卡以及其它种类繁多的扩展卡。PCI插槽是主板的主要扩展插槽,通过插接不同的扩展卡可以获得电脑能实现的几乎所有功能。
PCI-E 1x:也可以插声卡 网卡,也有这种接口的电子配件,而且貌似都是比较贵的才是这种接口,不过也算是“淘汰”很久了,现在的普通玩家几乎用不上这种插槽。
=========================================================
串口连接插座~系统控制面板排针(从上至下):俗称(跳线),连接机箱的各种线,配置数据清除排针一般不接。

内存条 ,双通道的速率是单通道的两倍。双通道,就是在北桥(又称之为MCH)芯片级里设计两个内存控制器,这两个内存控制器可相互独立工作,每个控制器控制一个内存通道。在这两个内存通CPU可分别寻址、读取数据,从而使内存的带宽增加一倍,数据存取速度也相应增加一倍。


I/O接口方面:
PS/2接口:市面上的键盘鼠标(支持PS/2的一般都很低端)等都和PS/2及USB键盘兼容。
VGA接口:显卡所处理的信息最终都要输出到显示器上,显卡的输出接口就是电脑与显示器之间的桥梁,它负责向显示器输出相应的图像信号。CRT显示器因为设计制造上的原因,只能接受模拟信号输入,这就需要显卡能输出模拟信号。VGA接口就是显卡上输出模拟信号的接口,VGA(Video Graphics Array)接口,也叫D-Sub接口。虽然液晶显示器可以直接接收数字信号,但很多低端产品为了与VGA接口显卡相匹配,因而采用VGA接口,转换数字信号需要DVI转接头(具体自行百度)。
DVI接口 :以传输数字信号为主,有DVI-A、DVI-D和DVI-I三种不同的接口形式。DVI-D只有数字接口,DVI-I有数字和模拟接口,目前应用主要以DVI-D为主,转换VGA需要dvi转vga转接头(具体自行百度)。
HDMI接口:高清晰度多媒体接口(英文:High Definition Multimedia Interface,HDMI)是一种数字化视频/音频接口技术,是适合影像传输的专用型数字化接口,其可同时传送音频和影音信号,最高数据传输速度为5Gbps。同时无需在信号传送前进行数/模或者模/数转换。HDMI可搭配宽带数字内容保护(HDCP),以防止具有著作权的影音内容遭到未经授权的复制。HDMI所具备的额外空间可应用在日后升级的音视频格式中。而因为一个1080p的视频和一个8声道的音频信号需求少于4Gbps,因此HDMI还有很大余量。这允许它可以用一个电缆分别连接DVD播放器,接收器和PRR(具体自行百度)。

网络接口:网线接入口,不同主板一般接口型号不同。
音频接口:自行看主板说明书,一般分布颜色不用代表的工具也不同(如麦克风,喇叭)。

另附:一个已经被取消的部件——北桥芯片
北桥芯片:(全称:NorthBridge)是主板芯片组中起主导作用的最重要的组成部分,也称为主桥(HostBridge)。负责与CPU的联系并控制内存(仅限于Intel除Core系列以外的cpu,AMD系列cpu在K8系列以后就在cpu中集成了内存控制器,因此AMD平台的北桥芯片不控制内存)、AGP数据在北桥内部传输,提供对CPU的类型和主频、系统的前端总线频率、内存的类型(SDRAM,DDR SDRAM以及RDRAM等等)和最大容量、AGP插槽、ECC纠错等支持,整合型芯片组的北桥芯片还集成了图形处理器。
(目前的主板均已取消北桥,因为已被整合进CPU了)

 

二.主板板型:(非原创,仅整理)
ATX:(俗称:“大板”
采用7个I/O插槽,CPU与I/O插槽、内存插槽位置更加合理。优化了软硬盘驱动器接口位置。提高了主板的兼容性与可扩充性。采用了增强的电源管理,真正实现电脑的软件开/关机和绿色节能功能。Micro ATX保持了ATX标准主板背板上的外设接口位置,与ATX兼容。
MATX(Micro ATX)结构主板:(俗称:“小板”)
Micro ATX主板把扩展插槽减少为3-4只,DIMM插槽为2-3个,从横向减小了主板宽度,其总面积减小约0.92平方英寸,比ATX标准主板结构更为紧凑。按照Micro ATX标准,板上还应该集成图形和音频处理功能。在很多品牌机主板使用了Micro ATX标准,在DIY市场上也常能见到Micro ATX主板。(没事不建议弄这种主板)
E-ATX:服务器/工作站主板,是专用于服务器/工作站的主板产品,板型为较大的ATX,EATX或WATX,要使用专用的服务器机箱电源。
和AT电源不一样,ATX电源除了在线路上作了一些改进,其中最重要的区别是,关机时ATX电源本身并没有彻底断电,而是维持了一个比较微弱的电流。同时它利用这一电流增加了一个电源管理功能,称为Stand-By。它可以让操作系统直接对电源进行管理。通过此功能,用户就可以直接通过操作系统实现软关机,而且还可以实现网络化的电源管理。如在电脑关闭时,可以通过网络发出信号到电脑的Modem上,然后监控电路就会发出一个ATX电源所特有的+5V SB激活电压,来打开电源启动电脑,从而实现远程开机。

=========================================================

三.主板的选取科普

前要:目前主板分为intel和AMD的主板,所以,大家在购选主板的时候千万看准是支持英特尔还是AMD的板子。
在此基础上,还要看CPU针脚数目和类型以及主板CPU插槽孔数目和类型是否相同(具体可以去ZOL查看参数)
比如
intel:LGA 775/1155/1150/1556/1366/2011
AMD:Socket AM1/AM1+/AM2/AM2+/AM3/AM3+
如果符合以上条件,但仍旧无法开机或者不兼容出现异常,请尝试更新你的主板BIOS试试,如果还是不行请自行联系品牌客服走起.
———————————————————–
(1)Intel 主板芯片组目前主流介绍:
关于intel主板芯片组的区别(目前主流):
三代CPU(Ivy Bridge)的主流芯片组分为:H61(低端) B75(中低端) H77(中高端) Z77(高端,可超频)
区别如下图:

RAID 0技术:即磁盘阵列,可以加多个硬盘在一起形成一个硬盘组,增加读取速率。
优点:没有数据冗余,高可用性,很高的传输速率,大大提高储存性能
缺点:正是因为没有数据冗余,在提高性能的同时,并没有提供数据可靠性,如果磁盘失效,将影响到整个数据,一旦损坏,无法恢复。
=====================================================================
四代CPU的主流芯片组分为:H81(低端) B85(中低端) H87(中高端) Z87(高端,可超频)
区别如下图:


(破解支持:即破解后才支持。)

AHCI:AHCI本质是一种PCI类设备,在系统内存总线和串行ATA设备内部逻辑之间扮演一种通用接口的角色(即它在不同的操作系统和硬件中是通用的)。
———————————————————–
H61 B75 H77 Z77 与H81 B85 H87 Z87相比,区别如下图:

Max DIMMs:内存插槽
SRT:智能加速技术全名为“Smart Response Technology”,简称SRT。实际上,该技术完全基于软件,属于Intel RST快速存储技术驱动10.5版中的一项新特性,不过仅能在Z68芯片组上开启(还支持移动芯片组HM67、QM67)。
RST:(Rapid Storage Technology),
DSA:动态储存加速功能(Dynamic Storage Accelerator,简称DSA)
Z87(芯片组):支持超频,支持SLI或CF,支持RAID,接口丰富
H87(芯片组):不支持超频,部分只支持CF,支持RAID,接口略少
B85(芯片组):不支持超频,不支持CF或SLI,不支持RAID,接口更少
=========================================================
目前旗舰级的CPU芯片组为:X79(最高端)
只支持Intel的CPU 插槽类型为LGA 2011的CPU

关于AMD的主板芯片组:
(由于AMD的CPU以及主板实在太乱了,我就简短说说)
首先,AMD平台当前CPU可分为三大类,一类是以强力的整合显示核心为卖点的APU平台,一类是以多核心、超频为卖点的推土机平台,此外还有一些残余的羿龙II系列CPU
FM1 CPU和FM1主板是绑定死的,只能这样搭配

APU主板目前有A75和A55两种,A75具备原生的SATA3.0和USB3.0接口,而A55则没有,性能和扩展性方面,两者都是一样的,
需要搭配A4/A6/A8 APU或者X4 641等FM1接口的新速龙II才能使用,无法搭配AM3接口的速龙II、羿龙II使用。实际上为了市场划分的需要,很多A55都会做成双内存插槽,扩展性能相对A75会差一些,价格略低一点。
对于选择APU和新速龙II X4 641等FM1接口产品的用户,A75是最佳的选择,因为它在比A55略贵50~100元的基础上提供了速度快10倍的原生USB3.0接口。
=========================================================
FM2/FM2+ CPU和FM2/FM2+ 主板,属于淘汰以及极端冷门级别,脑子没问题就不要去配了。
虽然AM2/AM2+ CPU已经是5~6年前的产品,但是一些用户还是在使用它们,比如用作下载机或者放在家里给长者上网使用。这么用下来其实也没啥问题,因为这些场合对CPU性能要求并不高.
老CPU的最佳选择:AM2+接口780G/790G等

AMD AM2和AM2+两种接口有着比较好的交叉兼容性,AM2 CPU可以支持AM2+接口主板,AM2+ CPU也可以在AM2主板上使用,不过它们两者都只能支持DDR2内存,因此,对于还持有AM2/AM2+ CPU的用户,换主板最佳选择是采用DDR2内存插槽的AM2+主板。
=========================================================
FM3/FM3+ CPU和FM3/FM3+ 主板

推土机平台采用AM3的改进版AM3+接口,和AM2/AM2+关系相似,AM3/AM3+也有很好的互换性,AM3 CPU可以在AM3+主板上用,而AM3+ CPU也能在AM3上使用,只是会有一些限制。
AM3+主要有三种主板,从最低端到最高端分别为970、990X和990FX,主要区别在于多卡支持,970不支持多卡,990X是x8+x8双卡,而990FX则是x16+x16双卡,目前市场主要卖的是970。此外,市面还有一些870、880G之类旧芯片组用AM3接口提供推土机支持的主板,不过由于供电设计较弱、需要刷新BIOS,而且AM3供电能力可能不能完美满足8核级别推土机,因此并不推荐给主流用户。
对于选择用X4 955或者FX-6200级别CPU装机的用户,最值得推荐的是AMD的970主板,它能提供原生SATA3.0接口、RAID功能、高频内存支持和更好的CPU供电支持,而如果用户使用FX-4100这些功耗不高的产品,并且不超频,那么用刷新了BIOS的880G/870也是可以的,只是这个级别的推土机不大值得推荐。
对于APU和推土机CPU来说,大家分别选择A75和970主板即可,他们都是新东西,配新主板应该不难理解。比较容易糊涂的是新速龙II,AM3接口的速龙II目前已经停产退市了,现在的速龙II X4 641、速龙II X4 651K之类CPU实际是屏蔽了显示部分的APU,因此必须搭配A75搭配,大家不要买了AM3/AM3+主板来搭配。

=========================================================

买APU或者X4 641之类FM1接口CPU,必选A75主板;买推土机CPU,最好选AM3+接口的970主板;老CPU换主板,AM2+主板是最佳选择;AM2+老主板升级新CPU,需要有BIOS支持和DDR3内存插槽;AM3老主板升级新CPU,羿龙II X4 955和羿龙II X6 1090T是好选择。
=========================================================
小结:最好选AM3+接口“以上”的970主板。其实除了FX4XXX/FX6XXX。别的就是FX8XXX我更推荐970以上 的主板。

计算机硬件-入门-硬件总体认知

一、计算机硬件分类


对于计算机软件,我们知道可以分为  系统软件 、应用中间件、  应用软件 三大类。通过这个层面的 认知,我们可以进一步去了解,相应的软件,这样有利于系统性了解。

在计算机硬件领域,整体认知 可以分为  主板,和外设  两大块。

1、电脑机箱主板,又叫主机板(mainboard)、系统板(systemboard)或母板(motherboard);它分为商用主板和工业主板两种。它安装在机箱内,是微机最基本的也是最重要的部件之一。主板一般为矩形电路板,上面安装了组成计算机的主要电路系统,一般有BIOS芯片、I/O控制芯片、键和面板控制开关接口、指示灯插接件、扩充插槽、主板及插卡的直流电源供电接插件等元件。

主板采用了开放式结构。主板上大都有6-15个扩展插槽,供PC机外围设备的控制卡(适配器)插接。通过更换这些插卡,可以对微机的相应子系统进行局部升级,使厂家和用户在配置机型方面有更大的灵活性。总之,主板在整个微机系统中扮演着举足轻重的角色。可以说,主板的类型和档次决定着整个微机系统的类型和档次。主板的性能影响着整个微机系统的性能。

2、外设就是 连接主板的 各种外接 设备。包括 键盘 ,显示器,音响。外设和主板之间需要接口进行通信。一些接口直接,集成在了主板上,外设只需用线连接就行。比如集成显卡(集成显示器接口卡),已经集成在了主板上,只需用显示器的线连上就行。还有一些,需要购买 接口卡,插在主板的扩展槽上,才能让外设连上。比如声卡(声音接口卡),独立显卡等。

【主板上的扩展槽,如 ISA槽,PCI槽,AGP槽,SATA槽,等等】

二、主板上的三个核心


主板上最重要的就是 :CPU、南桥、北桥。

 

 

CPU负责: 数据计算 和 设备控制

北桥负责:北桥芯片负责与CPU的联系并控制内存(仅限于Intel除Core系列以外的cpu,AMD系列cpu在K8系列以后就在cpu中集成了内存控制器,因此AMD平台的北桥芯片不控制内存)、AGP数据在北桥内部传输,提供对CPU的类型和主频、系统的前端总线频率、内存的类型(SDRAM,DDR SDRAM以及RDRAM等等)和最大容量、AGP插槽、ECC纠错等支持,整合型芯片组的北桥芯片还集成了图形处理器

北桥在电脑里起到的作用非常明显,在电脑中起着主导的作用,所以人们又称为主桥(Host Bridge)。 一般来说,芯片组的名称就是以北桥芯片的名称来命名的,

备注:显卡是一定有GPU的,最开始,北桥芯片集成了显卡,叫做集成显卡,与cpu共享内存,但是性能一般,后来就出现了独立显卡,比如AGP插槽。要单独购买显卡,然后插在AGP槽上面。后来,显卡集成到了CPU上面,叫做核芯显卡,简称 核显。

南桥芯片(South Bridge)是主板芯片组的重要组成部分,一般位于主板上离CPU插槽较远的下方,PCI插槽的附近,这种布局是考虑到它所连接的I/O总线较多,离处理器远一点有利于布线。相对于北桥芯片来说,其数据处理量并不算大,所以南桥芯片一般都没有覆盖散热片。南桥芯片不与处理器直接相连,而是通过一定的方式(不同厂商各种芯片组有所不同,例如英特尔的英特尔Hub Architecture以及SIS的Multi-Threaded“妙渠”)与北桥芯片相连。

南桥芯片主要是负责I/O接口等一些外设接口的控制、IDE设备的控制及附加功能等等。

总结:北桥负责与处理器对接,主要功能包括:内存控制器、PCI-E控制器、集成显卡、前/后端总线等,都是速度较快的模块;而南桥则负责外围周边功能,速度较慢,主要包括:磁盘控制器、网络端口、扩展卡槽、音频模块、I/O接口等等。

后端总线(BSB,Back Side Bus)是指带有L2L3缓存(Cache)的计算机中,负责中央处理器和外部缓存(经常为第二级缓存)之间的数据传递的数据通道。
=====================================
后来,北桥被合并到了CPU中。

Intel与AMD的新一代处理器,已经将传统北桥的大部分功能都整合在了CPU内部,Intel的Clarkdale与Sandybridge处理器则是完全整合北桥芯片,与其搭配的P55/H55/P67/H67等芯片组其实就是一颗南桥。

目前市场上热卖的Core i3 5XX和Core i5 6XX处理器就是基于Clarkdale核心的产品,它们首次整合北桥芯片(包括集成显卡),但整合的方式比较特别:
Clarkdale核心包括CPU和GPU两个部分,CPU部分使用了新一代32nm工艺制造,是双核心四线程设计;GPU部分就是传统意义上的北桥,为45nm工艺制造,内含双通道DDR3内存控制器、PCI-E控制器和集成显卡。

CPU部分和GPU部分是各自独立的,微观上通过QPI总线相连(随着技术的发展:QPI  取代了 前端总线(FSB)  。但是两种的功能是一样的。),宏观上被封装在了一起,接口是与Lynnfield相同的LGA1156。整体上来看Clarkdale不仅整合了内存控制器和PCI-E控制器,还整合了显示核心,看似更加先进。

实际上,Clarkdale只是将原本放在主板上的北桥芯片,挪到了CPU的铁盖下面,本质上并没有整合任何东西(包括显卡和内存控制器)。但是与之搭配的H55芯片组,确实只剩下了一颗南桥。北桥的发热量远高于南桥,由于北桥位于处理器上面,因此用户再也不用担心主板的散热问题了。

目前市面上热卖的Core i7 8XX和Core i5 7XX处理器,就是基于Lynnfield核心的产品,这是真正意义上整合了北桥的处理器。

******************************

FSB的历史发展:

FSB总线:英文Front Side Bus,是将CPU连接到北桥芯片的总线。

由于FSB不够用,设计上先天不足(这个时候的内存控制器在北桥芯片组内,CPU和内存交换数据总要通过北桥,相当于两个人说话,总要通过第三方,很不方便),因此intel想了个办法,把内存控制器做到了CPU内部,让CPU通过PQI总线直接和内存通讯,不再通过北桥芯片组,这很明显加快了速度(如图)

后来intel发现,CPU通过北桥与显卡相连也很麻烦,不如直接通信方便,这样数据交换更加方便,于是干脆把PCI-E控制器也整合了进了CPU内部,这样一来,相当于北桥芯片组整个都集成到了CPU内部,主板上不再需要这个芯片组了,只剩下了南桥,这时CPU直接与“南桥”相连,他们之间的总线叫做DMI。(如图)


备注:qpi总线是从i7开始使用的,而i5后出来,有很多人发晕就在这里。

经过FSB—QPI—DMI总线的发展,CPU内部集成了内存控制器和PCI-E控制器,实现了直接和内存及显卡进行数据传输,而由于南桥则整合了几乎所有的I/O功能,因此CPU具备的DMI总线有多高频率意义已经不大了,因为磁盘类设备的速率无法跟上,再高的DMI总线也没有用。

来自:http://www.365pcbuy.com/article-373.html

=============================

三、主板与外设的关系


主板上,有些外设接口已经集成了,可以直接和外设相连,比如主板上面集成的USB接口。有些没有集成,需要相应的外设接口卡,插在对应的主板扩展槽上。比如独立网卡等。

四、总线的介绍


什么是总线?
总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。总线是一种内部结构,它是cpu、内存、输入、输出设备传递信息的公用通道,主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。在计算机系统中,各个部件之间传送信息的公共通路叫总线,微型计算机是以总线结构来连接各个功能部件的。

总线的工作原理
当总线空闲(其他器件都以高阻态形式连接在总线上)且一个器件要与目的器件通信时,发起通信的器件驱动总线,发出地址和数据。其他以高阻态形式连接在总线上的器件如果收到(或能够收到)与自己相符的地址信息后,即接收总线上的数据。发送器件完成通信,将总线让出(输出变为高阻态)。

总线按地域分:

1、CPU内部:叫CPU总线
2、连接到   CPU、南北桥、三个核心的总线:叫系统总线,又称微机总线。 
各种扩展槽 (如PCI槽等)连接到 上面三个核心的,总线也算系统总线。
3、各种扩展槽及和扩展槽连接的外设接口卡:叫局部总线(或者叫扩展总线)

系统总线,即通常意义上所说的总线。可以分为以下三种
1、数据总线DB(Data Bus)
2、地址总线AB(Address Bus)
3、控制总线CB(Control Bus)

有的系统中,数据总线和地址总线是复用的,即总线在某些时刻出现的信号表示数据而另一些时刻表示地址;而有的系统是分开的。51系列单片机的地址总线和数据总线是复用的,而一般PC中的总线则是分开的。

数据总线的位数是微型计算机的一个重要指标,通常与微处理的字长相一致。例如Intel 8086微处理器字长16位,其数据总线宽度也是16位。需要指出的是,数据的含义是广义的,它可以是真正的数据,也可以是指令代码或状态信息,有时甚至是一个控制信息,因此,在实际工作中,数据总线上传送的并不一定仅仅是真正意义上的数据。

ISA是非常老的总线,最多支持16bit,数据带宽较低;EISA是ISA的增强,数据带宽有提升,这两种总线已经淘汰了。PCI是应用最广泛的总线,支持32bit、64bit数据,支持33MHz~66MHz,数据带宽较高,但也是比较旧的的,最新的,有PCI-E等等。

在概念上,PCI Express总线是较旧的PCI/ PCI-X总线的高速串行替换。PCI Express总线与旧PCI之间的主要区别之一是总线拓扑。 PCI使用共享并行总线架构,其中PCI主机和所有设备共享一组通用的地址,数据和控制线。 相比之下,PCI Express基于点到点拓扑,单独的串行链路将每个设备连接到根系统(主机)。 由于其共享总线拓扑,可以对单个方向上的PCI总线进行仲裁(在多个主机的情况下),并且一次限制为一个主机。 此外,旧的PCI时钟方案将总线时钟限制在总线上最慢的外设(不管总线事务中涉及的设备如何)。 相比之下,PCI Express总线链路支持任何两个端点之间的全双工通信,同时跨多个端点的并发访问没有固有的限制。

pc/104 是嵌入式的扩展总线。
isa 是pc的扩展总线。

计算机硬件-科普-总线的分类串行与并行

一、并行总线

并行总线,就是并行接口与计算机设备之间传递数据的通道。采用 并行传送方式在 微型计算机与 外部设备之间进行 数据传送的接口叫并行接口,它有2个主要特点;一是同时并行传送的二进位数就是数据宽度;二是在计算机与外设之间采用应答式的联络信号来协调双方的数据传送操作,这种联络信号又称为握手信号。

1、简单的并行接口 简单的并行接口分0线握手并行接口、1线握手并行接口和2线握手并行接口等多种。
(1)0线握手并行接口所谓0线握手(连络),即接口电路中不含协调数据传送的连络信号,这是并行接口的最简形式,它又分输入并行接口和输出并行接口以及输入/输出双向并行接口 3种形式。 0线握手 输入接口 在输入量比较稳定的情况下(输入的状态信息在一个的时间内不改变,如开关量输入),可采用三态门直接读取。 0线握手输出接口 当输出数字量无需锁存时,可采用三态门直接输出。 0线双向输入/输出接口当外设与CPU之间需要利用 数据总线进行双向传送信息时,I/O设备即能发送信息,又能接收信息。

(2)1线握手并行接口 1线握手并行接口是在0线握手并行接口的基础上,增加了一条握手信号线。 1线握手方式总是假设发送方式所发送的数据已经就绪,接收方可以接收。

2、可编程并行接口 可编程并行接口芯片种类较多,Intel公司的8255A(PPI),Motorola公司的MC6820(PIA)和Zilog公司的Z80-PIO 都属于这一类器件。

3、计算机常见的并行总线:STD、PC总线、IEEE488总线。

  (1)PC总线

PC总线是IBM PC及 PC/XT机上使用的总线,又称XT总线或8位ISA总线。它不是CPU引脚的延伸,经过8282锁存器、8286发送接收器、8259中断控制器、8237DMA控制器以及其他逻辑的重新驱动和组合控制二形成,又称I/O通道。它共有62引脚,其中,数据线8根、地址线20根、控制线21根、状态线2根,还有时钟、电源、地线,如图。

  (2)IEEE488总线

1) 数据传输速率≤1 MB/s。

2) 连接在总线上的设备 (包括作为主控器的微型机)≤15个。

3) 设备间的最大距离≤20 m。

4) 整个系统的电缆总长度≤220 m,若电缆长度超过220 m,则会因延时而改变定时关系,从而造成工作不可靠。这种情况应附加调制解调器

5) 所有数据交换都必须是数字化的。

6) 总线规定使用24线的组合插头座,并且采用负逻辑,即用小于+0.8V的电平表示逻辑“1”;用大于2V的电平表示逻辑“0”。很好

二、串行总线

计算机常见的串行总线:I2C、SPI、RS232、UART、USB

  (1)I2C

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下主机负责产生定时时钟和终止数据传送。

  (2)SPI

SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议,比如AT91RM9200。

SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。

1)SDI – SerialData In,串行数据输入;

2)SDO – SerialDataOut,串行数据输出;

3)SCLK – Serial Clock,时钟信号,由主设备产生;

4)CS – 从设备使能信号,由主设备控制。

  (3)RS232

RS-232-C是美国电子工业协会EIA(Electronic Industry AssociaTIon)制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写,232为标识号,C表示修改次数。RS-232-C总线标准设有25条信号线,包括一个主通道和一个辅助通道。

在多数情况下主要使用主通道,对于一般双工通信,仅需几条信号线就可实现,如一条发送线、一条接收线及一条地线。

  (4)UART

UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。

  (5)USB

USB,是英文Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。

 

来自:http://www.elecfans.com/emb/jiekou/20171113578385.html

 

计算机硬件-组装-台式电脑教程(三)

机箱支持USB3.0接口的话,机箱跳线会有USB.3.0连接线,我们找到主板上对应的USB3.0接口,一般主板上都有会标注USB3.0,如下图所示。

 

再找到机箱上的AUDID音频接口,主板与连接线上会有AUDID的标注,直接插入,插反都是插不了的,所以不要硬插,如下图所示:

再找到机箱跳线的USB连接线,主板和连接线上也均有标注USB,优先接USB_1这个位置,如下图所示:


下面就是H.D.DLED、PPower LED、Power SW、RESET SW这几个单独的机箱跳线了,对于不少装机用户来说,这个步骤很难。其实并不难,我们先了解一下这几个机箱跳线吧。

H.D.DLED硬盘指示灯

PPower LED 电源指示灯

Power SW 开机接口

RESET SW 重启接口

方法很简单,主板上会有与连接线同样的标注,彩色的线为正极,白色的线为负极,负极一般靠右边。如下图所示,按照主板的跳线标注,对应插入。

跳线接法图解

跳线接法图解

注:由于每一个主板的型号不同,跳线的接法也会有所不同,对应主板的标注来连接即可,注意正负极。

下面我们再来为机械硬盘连接线,SATA接口的机械硬盘或者固态硬盘一般会有两根线,一个为sata数据线,另一个为sata供电线,首先我们找到电源上的sata供电线进行连接,如下图所示。

再从主板盒中取出SATA线,将机械硬盘接入SATA线,如下图所示:


而再将SATA线的另一头连接主板的SATA接口中。

而SATA接口的固态硬盘连接方法与机械硬盘一致,请按照连接机械硬盘的方法来进行操作,再两个硬盘的情况下,建议将固态硬盘接入SATA0接口中,而机械硬盘接入SATA1接口中。

最后,我们再来安装独立显卡,并给显卡进行供电,如果显卡不支持供电,请忽视。先拿出独立显卡,如下图所示:

找到主板的PCI-E显卡插槽,如下图所示:


我们将显卡插入主板的显卡插槽中,如下图所示:

将显卡的金手指完全插入主板显卡插槽中之后,找到PCI-E的供电线,一般接口上会有标注。所下图,显卡是6Pin供电的,我们插入6Pin供电接口,如下图所示。

使用大号螺丝将显卡与机箱固定,如下图所示:

最后,一台电脑就完成组装了,我们来看看机箱的背部走线情况,(装机之家)如下图所示:

我们将组装完成的电脑主机连接显示器,需要注意的是有独立显卡的主机,请将显示器连接到独立显卡的显示接口上,千万不要连接主板上的显示接口。此外,插上键鼠,我们就可以进行点亮,并安装系统。

以上就是装机之家分享的DIY小白装机最新最详细的台式电脑组装教程图解,自己组装电脑的用户可以参考一下安装步骤,其实只要您有耐心,多多学习组装知识,相信组装一台电脑对您来说十分简单。

 

计算机硬件-科普-cpu的位数判别

处理器架构就是处理器的硬件架构,称为微架构。是一堆硬件电路,去实现指令集所规定的操作运算。

是的,指令集决定了处理器的架构,因为处理器架构就是用硬件电路实现指令集。但是具体用什么样的处理器架构,设计怎样的硬件电路,每个人设计的都可以不一样。


Intel从8086开始,286、386[开始32位cpu]、486、586、P1、P2、P3、P4都用的同一种CPU架构,统称X86。 其中的  MMX,SSE 指令集 是扩展指令集, 用作补充。
IA-32为Intel Architecture 32-bit简称,即英特尔32位体系架构,在英特尔公司1985年推出的80386微处理器中首先采用。
Intel早在1990年代就与HP合作提出了一种用在安腾系列处理器中的独立的64位架构,这种架构被称为IA-64。IA-64是一种崭新的系统,和x86架构完全没有相似性;不兼容 IA 32,市场差。
2003年AMD对于这个架构发展了64位的扩充,并命名为AMD64。后来Intel也推出了与之兼容的处理器,并命名为Intel 64【EM64T】。两者一般被统称为x86-64或x64,开创了x86的64位时代。

英特尔推出X86架构已满40年了,同486相比,Pentium向前迈进了一大步, 而PⅡ的前进步伐则没有这么大了,X86 CPU的发展似乎已到了尽头。英特尔非常清楚,是X86指令集限制了CPU性能的进一步提高,因此,他们正同惠普共同努力开发下一代指令集架构(Instruction Set Architecture ,ISA): EPIC(Explicitly Parallel Instruction Computing,显性并行指令计算)。对英特尔而言, IA-64(英特尔的64位架构)是下一个10到15年的架构。

英特尔80386SX 【32位 但16位数据总线】

80386SX是80386DX芯片的“精简”版本。它只使用16位数据总线,外部总线宽度与80286相同。它也只能处理16 MB内存,如80286.事实上,386芯片的SX版本在DX之后很好地发布了,在某些方面,它旨在使市场远离286,因为它具有大致相同的接口但性能更好。它实际上是 在DX之后几年推出的。

注意: 80386SX可以代替286主板中的80286,这是一个常见的神话。虽然芯片在外部接口方面是兼容的,但它们使用不同的封装。如果使用适当的适配器,可以将386SX放入286主板。

与同等速度的386DX相比,386SX较窄的数据总线宽度使性能降低约20-25%; 有显着差异但不过分。80386SX芯片是第一款小型笔记本电脑的热门选择,特别是386SL型号为英特尔系列引入了SMM电源管理功能。386SX内部仍然是一个32位处理器,将运行32位软件(非常慢:^))。它的速度范围为16至33 MHz; 没有为SX生产40 MHz版本,也可以从AMD和Cyrix的克隆版本中获得。

如今,386SX芯片已被淘汰。


计算机中的位数指的是CPU一次(即一个时钟周期内)能处理的最大位数(数据数量),这和CPU中寄存器的位数对应。

古老的故事中:处理器对内存的最小寻址单位是字节,

记得intel的8086芯片,是16位的,但当时intel工程师给这处理器配置了20位的地址总线(用段:偏移量 这种方式寻址),使得处理器可以访问1048576字节的地址。


  • 段寄存器学计算机组成原理的时候也学过,但是如果16位CPU支持20位地址,那写C语言的时候指针长度有限用不到20位地址怎么办呢,比如16位系统C语言指针占2字节16位,那永远访问不到介于16位和20位之间的地址了?(emmm回旧贴抱歉啊,因为搜到了这后产生一些疑问)

  • 8086/8088 存储器分段概念, 先弄明白为什么要分段。
  • 嗯嗯,我理解的是分段就是为了扩大能寻址到的物理内存的空间呗?我的疑问是即使cpu扩大了寻址空间,应用层比如c语言指针还是只能寻址16位的内存地址,cpu扩大的寻址空间用不上呀

CPU为了实现其功能一般设计了指令集,即是CPU的全部指令,这就是机器语言。计算机的所有功能都是基于CPU的指令集。指令集和CPU的位数是有联系 的。如Intel 8086 CPU 是16位,其指令集也是16位。如Intel 80386DX CPU 是32位,其指令集也是32位,但它也保持原16位指令集,这是为了向上兼容。
操作系统的位数是说其所依赖的指令集的位数。
计算机系统一般都应有向上兼容性,所以也可有64位CPU上运行32位操作系统、32位CPU上运行16位操作系统的情况。

操作系统位数应该是根据指针类型的位数来定的。整数类型不一定跟位数相等,CPU位数准确地说应该是CPU一次能够并行处理的数据宽度,一般就是指数据总线宽度。

从计算机硬件层面来看, CPU位数指的是一个时钟周期内CPU同时寄存和处理的二进制位数。对于CPU位数有如下关系:CPU位数 = CPU中寄存器的位数 = CPU一次并行处理的数据宽度。CPU位数越多,则寻址位数越多,处理能力就越强。

从计算机软件层面来看, 操作系统位数的概念是基于CPU的位数的,且操作系统的位数是依赖于指令集的位数的。一般,操作系统位数有如下关系:操作系统位数 = 其所依赖的指令集位数 <= CPU位数

32位计算机的CPU一次最多能处理32位数据,例如它的EAX寄存器就是32位的,当然32位计算机通常也可以处理16位和8位数据。

需要注意的是,(a)、32位CPU只能安装32位操作系统,32位操作系统支持的内存最多为2的32次方,就是4G,在windows 32位操作系统中最大只识别3.25-3.75之间,根据windows版本不同而不同。(b)、64位CPU可以安装32位操作系统,也可以安装64位操作系统。64位操作系统的寻址能力就是2的64次方,即理论上是17179869184G,实际中是不可能用到这么大的内存,目前64位windows系统最大只支持128G,而当前主流主板只能加到16G。。现在软件兼容性已基本没有任何问题,如果计算机安装内存超过4G,比如到6G或更多,就必须考虑安装64位操作系统,不然发挥不出硬件的所有性能,如内存相当于白装了。64位系统向下兼容32位软件,64位系统是今后发展的方向。

 


字长

字长并非一个十分严格的概念。在一个 CPU 指令集中,每条指令都可以处理长度不同的操作数。这时就把大多数指令能处理的最长长度但是又不花费额外周期的操作数长度称为字长。比如说,大多数指令都能处理 8 位,16 位,32 位数据,但是处理 32 位数据要花费更多的时钟周期,而处理 8 位和 16 位的时间一样,那么就称字长是 16 位。

其实,CPU 指令集众多,各种例外是难免的。比如,8088 处理 16 位操作数的时候,只要不涉及主内存(只是立即数或者寄存器)就不花费额外周期,否则花费额外周期。所以称为准 16 位。再比如,如今的支持 SSE 指令集的 CPU,所称的字长从历史角度考虑,根本就没把 SSE 这种单指令多数据的情况算进去。

而且,字长还经常会从地址总线宽度,数据总线宽度这类概念借用过来。总之,说 64-bit CPU,32-bit CPU 的时候,明白自己指什么就好,不必拘泥于字长这个概念。


CPU的字宽和总线的数据宽度是不同的,总线的数据宽度通常是大于CPU的字宽的,所以当CPU发起一个load操作,如果地址属性不是设备类型(也就是说,是内存类型的),总线基本上会合并为一个Burst来取,我认识的情况大部分一个Burst的长度和一个Cacheline的长度是相同的。这样就算你读一个32位的值,实际上总线上拿走的是128位的内容,并且填充到你的Cache中,然后CPU再从Cache中取走需要部分的数据,具体怎么取,这完全是CPU自己的问题,反正符合指令要求即可。如果是设备内存,那会有另一套协议控制,就要看那个协议的具体Spec了。

参考:

https://www.zhihu.com/question/20536161/answer/15410344

https://www.zhihu.com/question/61067876/answer/215969586