修复yum

手欠在服务器上卸载了python,结果悲剧了。yum直接跪了。(yum是python编写的工具)

网站搜索一下,真有和我一样手欠的。记录下修复方法。

首先找到centos的光盘或ISO文件,只要系统版本一样即可。拷贝如下文件到系统中:

1
2
3
4
5
6
7
8
9
python-2.6.6-36.el6.x86_64.rpm
python-urlgrabber-3.9.1-8.el6.noarch.rpm
python-devel-2.6.6-36.el6.x86_64.rpm
python-libs-2.6.6-36.el6.x86_64.rpm
yum-3.2.29-40.el6.centos.noarch.rpm

如果本地没有系统版可以在相应的镜像网站下载(http://mirrors.163.com、http://mirrors.sohu.com/)。

  • 安装python

具体版本号,根据系统盘或ISO提供为准。拷贝如下目录:

1
#/usr/local/src/Python-2.6.6

执行安装

1
#cd /usr/local/src/Python-2.6.6

下载依赖包进行安装,

1
2
3
4
#wget http://mirror.centos.org/centos/6/os/x86_64/Packages/{rpm-4.8.0-47.el6.x86_64,rpm-libs-4.8.0-47.el6.x86_64,gpgme-1.1.8-3.el6.x86_64,nss_compat_ossl-0.9.6-1.el6.x86_64,pygpgme-0.1-18.20090824bzr68.el6.x86_64,python-iniparse-0.3.1-2.1.el6.noarch,python-pycurl-7.19.0-8.el6.x86_64,python-urlgrabber-3.9.1-9.el6.noarch,rpm-python-4.8.0-47.el6.x86_64,yum-3.2.29-69.el6.centos.noarch,yum-metadata-parser-1.1.2-16.el6.x86_64,yum-plugin-fastestmirror-1.1.30-30.el6.noarch}.rpm
#rpm -Uvh --replacepkgs *.rpm
#python -v
  • 安装yum

    1
    2
    3
    4
    5
    6
    7
    #wget http://yum.baseurl.org/download/3.4/yum-3.4.3.tar.gz
    #tar xzfv yum-3.4.3.tar.gz
    #cd yum-3.4.3
    #python yummain.py install yum
    #yum check-update
    #yum update
    #yum clean all

    至此yum已经恢复正常。^_^


    参考:https://my.oschina.net/u/1414906/blog/296759

python文字发音

安装python 配置环境变量,使用pip安装pyttsx

# coding=utf-8

#@see http://pyttsx.readthedocs.org/en/latest/engine.html#examples
import pyttsx
engine = pyttsx.init()

#语速
rate = engine.getProperty('rate')
#print rate

#音量
volume = engine.getProperty('volume')
#print volume

engine.setProperty('rate', 100)
engine.setProperty('volume',  2000)

#语音类别
voices = engine.getProperty('voices')
engine.say(u'李洋是逗比')

'''
for voice in voices:
   engine.setProperty('voice', voice.id)
   print voice.id
'''

engine.runAndWait()

mysql多值查询

现有如下标签和文章对象表fy_content_tag 如下:

CREATE TABLE `fy_content_tag` (
    `id` INT(11) NOT NULL,
    `tagid` INT(11) NOT NULL
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB;

插入数据

INSERT INTO `fy_content_tag` (`id`, `tagid`) VALUES
    (1, 1),(1, 2),(1, 3),(1, 4),
    (2, 2),(2, 3),(2, 4),(2, 5),(2, 6),
    (3, 3),(3, 4), (3, 5),(3, 6),(3, 7),
    (4, 4),(4, 5),(4, 6),(4, 7),(4, 8),(5, 5),(5, 6),(5, 7),(5, 8),(5, 9);

需要查询tagid同时包含2、3、4的id

##使用sql行变列

SELECT id, SUM(CASE tagid WHEN 2 THEN 1 WHEN 3 THEN 1 WHEN 4 THEN 1 ELSE 0 END) AS tag_id
FROM fy_content_tag
WHERE 1
GROUP BY id
HAVING tag_id = 3;

使用sphinx的多值

配置

参考sphinx设置多属性过滤的方法
在sphinx 配置文件source 内添加多值属性定义:

sql_attr_multi = uint tagid from query;\
    SELECT id,tagid FROM fy_content_tag

使用phpapi查询

//查出拥有标签2的文档
$sphinx->setFilter('tagid', array(2));

查出同时拥有标签2,3,4的文档
$sphinx->setFilter('tagid', array(2));
$sphinx->setFilter('tagid', array(3));
$sphinx->setFilter('tagid', array(4));

如果标签值(tagid)为1,2,3也可以设置为

sql_attr_multi = uint tagid from filed

php的匿名函数

1
2
3
4
5
匿名函数
匿名函数(Anonymous functions),也叫闭包函数(closures),
允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。
当然,也有其它应用的情况。

闭包的写法

5.2本版以下

看起来好怪异

<?php
$newfunc  =  create_function('$a, $b',
  'return "ln($a) + ln($b) = " . log($a * $b);' 
);
echo  "New anonymous function:  $newfunc \n" ;
echo  $newfunc ( 2 ,  M_E ) .  "\n" ;
 // outputs
// New anonymous function: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?> 

##5.3版本以上
和js很相像。

<?php
$greet  = function( $name )
{
     printf ( "Hello %s\r\n" ,  $name );
};

 $greet ( 'World' );
 $greet ( 'PHP' );

打印$greet变量结果一下

object(Closure)#1 (1) {
  ["parameter"]=>
  array(1) {
    ["$name"]=>
    string(10) "<required>"
  }
}

可以看出$greet其实一个Closure对象实例。
$greet()其实执行的是魔术方法__invoke()

代码如下:

<?php

/**
 * 
 */
class Obj
{
    /**
     * [__invoke description]
     * @param  [type] $name [description]
     * @return [type]       [description]
     */
    public function __invoke($name)
    {
        printf ( "Hello %s\r\n" ,  $name );
    }

    /**
     * [test description]
     * @return [type] [description]
     */
    public function test()
    {
        return function($name){
            printf ( "Hello %s\r\n" ,  $name );
        };
    }
}

$greet = new Obj();
$greet("World"); //Hello World
$hello = $greet->test();
$hello('zhang san'); //Hello zhang san

##作用域
匿名函数闭包使用use关键字使用外部变量。

<?php
class Obj
{
    public function hello()
    {
        $name = 'zhangsan';
        $greet = function($prefix) use ($name) {
            echo "{$prefix}, {$name}";
        };

        $greet('hi');
    }
}


$obj = new Obj();
$obj->hello(); //hi, zhangsan

$this是一个特殊变量不能直接使用(作用域的原因参考js的this 的工作原理)。可以使用如下代码:

<?php
class Obj
{
    public $name = 'zhangsan';

    public function hello()
    {
        $that = $this;
        $greet = function($prefix) use ($that) {
            echo "{$prefix}, {$this->name}";
        };

        $greet('hi');
    }
}


$obj = new Obj();
$obj->hello(); //hi, zhangsan

##绑定函数到一个对象
绑定使用的是Closure::bind/bindTo — 复制一个闭包,绑定指定的$this对象和类作用域。

<?php
$f = function()
{
    return $this->value + 2;
};

class NewValueHolder
{
    public $value;
}

$vh = new NewValueHolder();
$vh->value = 3;
$c = $f->bindTo($vh);
var_dump($c()); //Fatal error: Cannot access protected property NewValueHolder::$value

上述代码会报错是因为$this的作用并没有发生变化。

1
2
3
4
public Closure Closure::bindTo ( object $newthis [, mixed $newscope = 'static' ] )
newscope
关联到匿名函数的类作用域,或者 'static' 保持当前状态。如果是一个对象,则使用这个对象的类型为心得类作用域。 这会决定绑定的对象的 保护、私有成员 方法的可见性。

修改bindTo为$c = $f->bindTo($vh, $vh);则可以按照预期运行。

带你穿越带你飞~,一秒钟PHP变JS =^ =!!!这篇文章有更淫荡的用法。

闭包的应用

  1. 作为回调函数(array_map, array_reduce,array_walk等)

    <?php
    $data [] = array( 'volume'  =>  67 ,  'edition'  =>  2 );
    $data [] = array( 'volume'  =>  86 ,  'edition'  =>  1 );
    $data [] = array( 'volume'  =>  85 ,  'edition'  =>  6 );
    $data [] = array( 'volume'  =>  98 ,  'edition'  =>  2 );
    $data [] = array( 'volume'  =>  86 ,  'edition'  =>  6 );
    $data [] = array( 'volume'  =>  67 ,  'edition'  =>  7 );
    
    $volumes = array_map(function($row){
        return $row['volume'];
    }, $data);
    
$volumeSum = 0;
$volumeSum = array_reduce($volumes, function($volumeSum, $current){
    $volumeSum += $current;
    return $volumeSum;
});

print_r($volumes); //volume列的所有值

print_r($volumeSum); //volume列的总和
  1. 复用函数或方法的代码片段

    <?php
    
    /**
     * 
     */
    class Obj
    {
        public function calc($num)
        {
            $space = function($num) {
                return $num + 1;
            };
    
            if(逻辑1) {
                $num1 = $space($num);
            } elseif(逻辑2) {
                $num2 = $space($num2);
            }
        }
    }
    

参考

Closure 类

匿名函数

$this in PHP closures