您正在查看: 技术Note 分类下的文章

pip install scrapy 中遇到的一些坑

想下个scrapy去加深自己的爬虫功力,结果在pip3.4 install scrapy 的时候遇到问题了

首先在执行时输出了这句

Requirement already satisfied (use --upgrade to upgrade)

也就是需要去更新

pip3.4 install --upgrade scrapy

此时弹出错误

ERROR: b'/bin/sh: xslt-config: command not foundn'

通过参考 点击此处跳转 得到了启发

先执行 whereis xslt-config 查看是否有此命令

发现 xslt-config: ,也就是冒号后面是空的

执行
yum install libxslt-devel

再次查看
whereis xslt-config

发现此时有了数据了

再执行
pip3.4 install xml

pip3.4 install scrapy

以上是Linux的,Windows下要如何解决呢?

stackoverflow

这个方法也就是去官方下载 whl 通过 pip install 安装就成功了

想下个scrapy去加深自己的爬虫功力,结果在pip3.4 install scrapy 的时候遇到问题了

首先在执行时输出了这句

Requirement already satisfied (use --upgrade to upgrade)

也就是需要去更新

pip3.4 install --upgrade scrapy

此时弹出错误

ERROR: b'/bin/sh: xslt-config: command not foundn'

通过参考 点击此处跳转 得到了启发

先执行 whereis xslt-config 查看是否有此命令

发现 xslt-config: ,也就是冒号后面是空的

执行
yum install libxslt-devel

再次查看
whereis xslt-config

发现此时有了数据了

再执行
pip3.4 install xml

pip3.4 install scrapy

以上是Linux的,Windows下要如何解决呢?

stackoverflow

这个方法也就是去官方下载 whl 通过 pip install 安装就成功了

yum 更新 git 到1.8.3版本

yum update git 时发现源比较落后,便开始寻求更新方法(以前就弄过太久没弄又忘了。。。)

得出了以下的解决方法

1、下载repo, -o 也就是 --output-file, 把下面链接下载的放到某位置上

wget -O /etc/yum.repos.d/PUIAS_6_computational.repo https://gitlab.com/gitlab-org/gitlab- recipes/raw/master/install/centos/PUIAS_6_computational.repo

2、这个是下载GPG KEY

wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-puias http://springdale.math.ias.edu/data/puias/6/x86_64/os/RPM-GPG-KEY-puias && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-puias

3、验证key是否安装成功

rpm -qa gpg*

4、验证yum是否正常

yum repolist

这步过后可能会出现异常情况,显示 Cannot retrieve repository metadata (repomd.xml) for repository: nginx

假若出现这个,执行 yum clean all 和 yum makecache即可

接着 yum update

yum update git

git --version #1.8.3

yum update git 时发现源比较落后,便开始寻求更新方法(以前就弄过太久没弄又忘了。。。)

得出了以下的解决方法

1、下载repo, -o 也就是 --output-file, 把下面链接下载的放到某位置上

wget -O /etc/yum.repos.d/PUIAS_6_computational.repo https://gitlab.com/gitlab-org/gitlab- recipes/raw/master/install/centos/PUIAS_6_computational.repo

2、这个是下载GPG KEY

wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-puias http://springdale.math.ias.edu/data/puias/6/x86_64/os/RPM-GPG-KEY-puias && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-puias

3、验证key是否安装成功

rpm -qa gpg*

4、验证yum是否正常

yum repolist

这步过后可能会出现异常情况,显示 Cannot retrieve repository metadata (repomd.xml) for repository: nginx

假若出现这个,执行 yum clean all 和 yum makecache即可

接着 yum update

yum update git

git --version #1.8.3

ik分词器的安装

一、IK简介

IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开 始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词 歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。

IK Analyzer 2012特性:

1.采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和智能分词两种切分模式;

2.在系统环境:Core2 i7 3.4G双核,4G内存,window 7 64位, Sun JDK 1.6_29 64位 普通pc环境测试,IK2012具有160万字/秒(3000KB/S)的高速处理能力。

3.2012版本的智能分词模式支持简单的分词排歧义处理和数量词合并输出。

4.采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符

5.优化的词典存储,更小的内存占用。支持用户词典扩展定义。特别的,在2012版本,词典支持中文,英文,数字混合词语。

二、安装IK分词插件

假设读者已经安装好ES,如果没有的话,请参考ElasticSearch入门 —— 集群搭建。安装IK分词需要的资源可以从这里下载,整个安装过程需要三个步骤:

1、获取分词的依赖包

通过git clone https://github.com/medcl/elasticsearch-analysis-ik,下载分词器源码,然后进入下载目录,执行命令:mvn clean package,打包生成elasticsearch-analysis-ik-1.2.5.jar。将这个jar拷贝到ES_HOME/plugins/analysis-ik目录下面,如果没有该目录,则先创建该目录。

2、ik目录拷贝

将下载目录中的ik目录拷贝到ES_HOME/config目录下面。

3、分词器配置

打开ES_HOME/config/elasticsearch.yml文件,在文件最后加入如下内容:

index:
analysis:

analyzer:      
  ik:
      alias: [ik_analyzer]
      type: org.elasticsearch.index.analysis.IkAnalyzerProvider
  ik_max_word:
      type: ik
      use_smart: false
  ik_smart:
      type: ik
      use_smart: true

index.analysis.analyzer.default.type: ik

ok!插件安装已经完成,请重新启动ES,接下来测试ik分词效果啦!

三、ik分词测试

1、创建一个索引,名为index。

curl -XPUT http://localhost:9200/index

2、为索引index创建mapping。

curl -XPOST http://localhost:9200/index/fulltext/_mapping -d'
{

"fulltext": {
         "_all": {
        "analyzer": "ik"
    },
    "properties": {
        "content": {
            "type" : "string",
            "boost" : 8.0,
            "term_vector" : "with_positions_offsets",
            "analyzer" : "ik",
            "include_in_all" : true
        }
    }
}

}'

3、测试

curl 'http://localhost:9200/index/_analyze?analyzer=ik&pretty=true' -d '
{
"text":"世界如此之大"
}'

显示结果如下:

{
"tokens" : [ {

"token" : "text",
"start_offset" : 4,
"end_offset" : 8,
"type" : "ENGLISH",
"position" : 1

}, {

"token" : "世界",
"start_offset" : 11,
"end_offset" : 13,
"type" : "CN_WORD",
"position" : 2

}, {

"token" : "如此",
"start_offset" : 13,
"end_offset" : 15,
"type" : "CN_WORD",
"position" : 3

}, {

"token" : "之大",
"start_offset" : 15,
"end_offset" : 17,
"type" : "CN_WORD",
"position" : 4

} ]
}

一、IK简介

IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开 始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词 歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。

IK Analyzer 2012特性:

1.采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和智能分词两种切分模式;

2.在系统环境:Core2 i7 3.4G双核,4G内存,window 7 64位, Sun JDK 1.6_29 64位 普通pc环境测试,IK2012具有160万字/秒(3000KB/S)的高速处理能力。

3.2012版本的智能分词模式支持简单的分词排歧义处理和数量词合并输出。

4.采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符

5.优化的词典存储,更小的内存占用。支持用户词典扩展定义。特别的,在2012版本,词典支持中文,英文,数字混合词语。

二、安装IK分词插件

假设读者已经安装好ES,如果没有的话,请参考ElasticSearch入门 —— 集群搭建。安装IK分词需要的资源可以从这里下载,整个安装过程需要三个步骤:

1、获取分词的依赖包

通过git clone https://github.com/medcl/elasticsearch-analysis-ik,下载分词器源码,然后进入下载目录,执行命令:mvn clean package,打包生成elasticsearch-analysis-ik-1.2.5.jar。将这个jar拷贝到ES_HOME/plugins/analysis-ik目录下面,如果没有该目录,则先创建该目录。

2、ik目录拷贝

将下载目录中的ik目录拷贝到ES_HOME/config目录下面。

3、分词器配置

打开ES_HOME/config/elasticsearch.yml文件,在文件最后加入如下内容:

index:
analysis:

analyzer:      
  ik:
      alias: [ik_analyzer]
      type: org.elasticsearch.index.analysis.IkAnalyzerProvider
  ik_max_word:
      type: ik
      use_smart: false
  ik_smart:
      type: ik
      use_smart: true

index.analysis.analyzer.default.type: ik

ok!插件安装已经完成,请重新启动ES,接下来测试ik分词效果啦!

三、ik分词测试

1、创建一个索引,名为index。

curl -XPUT http://localhost:9200/index

2、为索引index创建mapping。

curl -XPOST http://localhost:9200/index/fulltext/_mapping -d'
{

"fulltext": {
         "_all": {
        "analyzer": "ik"
    },
    "properties": {
        "content": {
            "type" : "string",
            "boost" : 8.0,
            "term_vector" : "with_positions_offsets",
            "analyzer" : "ik",
            "include_in_all" : true
        }
    }
}

}'

3、测试

curl 'http://localhost:9200/index/_analyze?analyzer=ik&pretty=true' -d '
{
"text":"世界如此之大"
}'

显示结果如下:

{
"tokens" : [ {

"token" : "text",
"start_offset" : 4,
"end_offset" : 8,
"type" : "ENGLISH",
"position" : 1

}, {

"token" : "世界",
"start_offset" : 11,
"end_offset" : 13,
"type" : "CN_WORD",
"position" : 2

}, {

"token" : "如此",
"start_offset" : 13,
"end_offset" : 15,
"type" : "CN_WORD",
"position" : 3

}, {

"token" : "之大",
"start_offset" : 15,
"end_offset" : 17,
"type" : "CN_WORD",
"position" : 4

} ]
}

jquery中$.each的用法

之前经常需要用到遍历,但莫名其妙的获取不了数值之类的情况

让我们看看正常的代码

        $.each($("#select option"), function(i, n){
            alert("index: "+i+" value:"+n.text);
        });

假若需要获取option的value,用n.val()会报错提示没有此方法

正确的做法是

        $.each($("#select option"), function(i, n){
            alert($(this).val());
        });

大部分情况下都是使用$(this)来获取值等jquery操作,只用获取文本才使用n.text

之前经常需要用到遍历,但莫名其妙的获取不了数值之类的情况

让我们看看正常的代码

        $.each($("#select option"), function(i, n){
            alert("index: "+i+" value:"+n.text);
        });

假若需要获取option的value,用n.val()会报错提示没有此方法

正确的做法是

        $.each($("#select option"), function(i, n){
            alert($(this).val());
        });

大部分情况下都是使用$(this)来获取值等jquery操作,只用获取文本才使用n.text

批量添加linux用户shell脚本

 #!/bin/bash
for name in `more users.list`
do
    if [ -n "$name" ]
then
    useradd -d /home/dev/$name -g dev -m $name
    echo
    echo $name"123" | passwd --stdin "$name"
    echo
    echo "User $username's password changed!"
else
echo
    echo 'The username is null!'
fi
done
 #!/bin/bash
for name in `more users.list`
do
    if [ -n "$name" ]
then
    useradd -d /home/dev/$name -g dev -m $name
    echo
    echo $name"123" | passwd --stdin "$name"
    echo
    echo "User $username's password changed!"
else
echo
    echo 'The username is null!'
fi
done

centos 命令行管理用户

先增加一个叫dev的用户群,id为52

groupadd -g 52 dev

增加一个叫hanson的用户,id是520,用户目录/public/hanson 用户群是dev

useradd -u 501 -d /home/hanson -g dev -m hanson

查看hanson密码

cat /etc/shadow| grep hanson

使用-d选项删除密码

passwd -d hanson

直接设置密码123,或者输入 passwd 用户名

echo "123" | passwd --stdin user3



先增加一个叫dev的用户群,id为52

groupadd -g 52 dev

增加一个叫hanson的用户,id是520,用户目录/public/hanson 用户群是dev

useradd -u 501 -d /home/hanson -g dev -m hanson

查看hanson密码

cat /etc/shadow| grep hanson

使用-d选项删除密码

passwd -d hanson

直接设置密码123,或者输入 passwd 用户名

echo "123" | passwd --stdin user3



Yii的urlManager使用

因为yii的连接并不优雅如,http://hanc.cc/index.php?r=site/index

yii中的 urlManager 组件可以使连接更加优雅

在config下的web.php component加上

'urlManager' => [
        'class' => 'yii\web\UrlManager',
        // Disable index.php
        'showScriptName' => false,
        // Disable r= routes
        'enablePrettyUrl' => true,
        'rules' => array(
            '/' => 'my-module/password/index',
            '/user' => 'my-module/user/index',
            '<controller:\w+>/<id:\d+>' => '<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
            '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
        ),
  ],

nginx的配置如下

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

root /usr/share/nginx/html;
index index.php index.html index.htm;

# Make site accessible from http://localhost/
server_name localhost MY-IP;

location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    # try_files $uri $uri/ =404;
    # Uncomment to enable naxsi on this location
    # include /etc/nginx/naxsi.rules

    try_files $uri $uri/ /index.php?$args;
}

location @rewrite{
          rewrite ^/(.*)$ /index.php?$args;
     }

error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }                                                                                              }

因为yii的连接并不优雅如,http://hanc.cc/index.php?r=site/index

yii中的 urlManager 组件可以使连接更加优雅

在config下的web.php component加上

'urlManager' => [
        'class' => 'yii\web\UrlManager',
        // Disable index.php
        'showScriptName' => false,
        // Disable r= routes
        'enablePrettyUrl' => true,
        'rules' => array(
            '/' => 'my-module/password/index',
            '/user' => 'my-module/user/index',
            '<controller:\w+>/<id:\d+>' => '<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
            '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
        ),
  ],

nginx的配置如下

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

root /usr/share/nginx/html;
index index.php index.html index.htm;

# Make site accessible from http://localhost/
server_name localhost MY-IP;

location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    # try_files $uri $uri/ =404;
    # Uncomment to enable naxsi on this location
    # include /etc/nginx/naxsi.rules

    try_files $uri $uri/ /index.php?$args;
}

location @rewrite{
          rewrite ^/(.*)$ /index.php?$args;
     }

error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }                                                                                              }

Sublime 快捷键

最近重新看了下快捷键感觉受益匪浅,效率也提高了,mark一下

Ctrl+Shift+P:打开命令面板
Ctrl+P:搜索项目中的文件
Ctrl+G:跳转到第几行
Ctrl+W:关闭当前打开文件
Ctrl+Shift+W:关闭所有打开文件
Ctrl+Shift+V:粘贴并格式化
Ctrl+D:选择单词,重复可增加选择下一个相同的单词
Ctrl+L:选择行,重复可依次增加选择下一行
Ctrl+Shift+L:选择多行
Ctrl+Shift+Enter:在当前行前插入新行
Ctrl+X:删除当前行
Ctrl+M:跳转到对应括号
Ctrl+U:软撤销,撤销光标位置
Ctrl+J:选择标签内容
Ctrl+F:查找内容
Ctrl+Shift+F:查找并替换
Ctrl+H:替换
Ctrl+R:前往 method
Ctrl+N:新建窗口
Ctrl+K+B:开关侧栏
Ctrl+Shift+M:选中当前括号内容,重复可选着括号本身
Ctrl+F2:设置/删除标记
Ctrl+/:注释当前行
Ctrl+Shift+/:当前位置插入注释
Ctrl+Alt+/:块注释,并Focus到首行,写注释说明用的
Ctrl+Shift+A:选择当前标签前后,修改标签用的
F11:全屏
Shift+F11:全屏免打扰模式,只编辑当前文件
Alt+F3:选择所有相同的词
Alt+.:闭合标签
Alt+Shift+数字:分屏显示
Alt+数字:切换打开第N个文件
Shift+右键拖动:光标多不,用来更改或插入列内容
鼠标的前进后退键可切换Tab文件
按Ctrl,依次点击或选取,可需要编辑的多个位置
按Ctrl+Shift+上下键,可替换行

最近重新看了下快捷键感觉受益匪浅,效率也提高了,mark一下

Ctrl+Shift+P:打开命令面板
Ctrl+P:搜索项目中的文件
Ctrl+G:跳转到第几行
Ctrl+W:关闭当前打开文件
Ctrl+Shift+W:关闭所有打开文件
Ctrl+Shift+V:粘贴并格式化
Ctrl+D:选择单词,重复可增加选择下一个相同的单词
Ctrl+L:选择行,重复可依次增加选择下一行
Ctrl+Shift+L:选择多行
Ctrl+Shift+Enter:在当前行前插入新行
Ctrl+X:删除当前行
Ctrl+M:跳转到对应括号
Ctrl+U:软撤销,撤销光标位置
Ctrl+J:选择标签内容
Ctrl+F:查找内容
Ctrl+Shift+F:查找并替换
Ctrl+H:替换
Ctrl+R:前往 method
Ctrl+N:新建窗口
Ctrl+K+B:开关侧栏
Ctrl+Shift+M:选中当前括号内容,重复可选着括号本身
Ctrl+F2:设置/删除标记
Ctrl+/:注释当前行
Ctrl+Shift+/:当前位置插入注释
Ctrl+Alt+/:块注释,并Focus到首行,写注释说明用的
Ctrl+Shift+A:选择当前标签前后,修改标签用的
F11:全屏
Shift+F11:全屏免打扰模式,只编辑当前文件
Alt+F3:选择所有相同的词
Alt+.:闭合标签
Alt+Shift+数字:分屏显示
Alt+数字:切换打开第N个文件
Shift+右键拖动:光标多不,用来更改或插入列内容
鼠标的前进后退键可切换Tab文件
按Ctrl,依次点击或选取,可需要编辑的多个位置
按Ctrl+Shift+上下键,可替换行

Nginx配置详解

语法规则

location [=|~|~*|^~] /uri/ { … }

= 开头表示精确匹配

^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。

~ 开头表示区分大小写的正则匹配

~* 开头表示不区分大小写的正则匹配

/ 通用匹配,任何请求都会匹配到

多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):

首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

location例子

例子,有如下匹配规则:

location = / { 规则A }

location = /login { 规则B }

location ^~ /static/ { 规则C }

location ~ .(gif|jpg|png|js|css)$ { 规则D }

location ~* .png$ { 规则E }

location / { 规则F }

那么产生的效果如下:

访问根目录/, 比如http://localhost/ 将匹配规则A

访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则F

访问 http://localhost/static/a.html 将匹配规则C

访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到规则C

访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。

访问 http://localhost/category/id/1111则最终匹配到规则F,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。

- 阅读剩余部分 -

Apache多个域名绑定到不同的子目录

  1. 修改host文件

    用记事本打开C:WindowsSystem32driversetchosts文件,最末尾加上两行,保存退出:

    127.0.0.1 localhost.com

    127.0.0.1 www.localhost.com

  2. 修改Apache的配置文件

    打开httpd.conf的文件,在最下面加上

    <VirtualHost localhost.com>  
        ServerAdmin raywill@qq.com  
        DocumentRoot D:\myweb\php  
        ServerName localhost.com  
        ErrorLog logs/m-error_log.txt  
        CustomLog logs/m_log.txt common  
    </VirtualHost>  
    

然后重启Apache。

访问localhost.com,然后你就发现大功告成了

原文链接

  1. 修改host文件

    用记事本打开C:WindowsSystem32driversetchosts文件,最末尾加上两行,保存退出:

    127.0.0.1 localhost.com

    127.0.0.1 www.localhost.com

  2. 修改Apache的配置文件

    打开httpd.conf的文件,在最下面加上

    <VirtualHost localhost.com>  
        ServerAdmin raywill@qq.com  
        DocumentRoot D:\myweb\php  
        ServerName localhost.com  
        ErrorLog logs/m-error_log.txt  
        CustomLog logs/m_log.txt common  
    </VirtualHost>  
    

然后重启Apache。

访问localhost.com,然后你就发现大功告成了

原文链接