月度归档:2015年12月

在Nginx下新建虚拟主机搭建wordpress(新手向)

搭建环境:

Nginx-1.8.0,安装目录:/usr/local/nginx

PHP-7.0,虚拟主机目录在/home/vhosts/

下载wordpress,建立虚拟主机目录

首先,我们进入虚拟主机目录,新建一个wordpress目录,下载wordpress并解压

cd /home/vhosts/
mkdir wordpress
cd wordpress
wget https://cn.wordpress.org/wordpress-4.4-zh_CN.zip
unzip wordpress-4.4-zh_CN.zip

然后我们把wordpress解压文件夹里面的文件移动到外面来,删除刚才下载的压缩包和wordpress-4.4-zh_CN.zip

mv wordpress/* ./
rm -rf wordpress*

然后我们把wordpress文件夹的权限和所有者更改一下(当前目录还为/home/vhosts/wordpress )

这里演示的是Nginxphp-fpm的用户和用户组均为nginx

chmod -R 755 ./
chown -R nginx.nginx ./

配置虚拟主机

然后,我们到Nginx的安装目录,到你虚拟主机的配置文件目录中增加一份配置(这里我新建了一个专门的目录来放虚拟主机配置文件,在/usr/local/nginx/vhosts 下)

cd /usr/local/nginx/vhosts
vi wordpress.conf

把下面的配置文件内容粘贴进去(用Windows的注意下回车和编码)

注意,其中的root目录为你wordpress虚拟主机的目录

server_name为监听的域名,这里用www.yourdomain.com做演示

server {
	listen			80;
	server_name		www.yourdomain.com;
	index			index.html index.htm index.php;
	root			/home/vhosts/wordpress;
	location ~ .*\.(gif|jpg|jpeg|png|bmp|ico|webp)$
	{
		expires 30d;
	}
	location ~ .*\.(woff|ttf|svg|otf|eot)$
	{
		expires 180d;
	}
	location ~ .*\.(js|css)?$
	{
		expires 12h;
	}
	location /
	{
		#支持wordpress的rewrite
		if (!-e $request_filename) { 
			rewrite ^(.*)$ /index.php/$1 last;
			break;
		}
	}
	location ~ \.php($|/)
	{
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
		include	fastcgi_params;
	}
}

接着按下Esc,输入:wq 退出vi

MySQL配置

然后我们进入mysql

mysql -u root -p

输入你的密码之后,创建wordpress数据库

create database wordpress;

接着创建一个wordpress数据库的帐号,账号名为wp,密码为123456(修改成你自己的)

grant all privileges on wordpress.* to wp@localhost identified by '123456';

完成

然后我们重载入nginx

service nginx reload

现在,访问www.yourdomain.com,用刚才创建的数据库用户名和密码安装wordpress吧

【化物语】supercell – 君の知らない物语 MP3 下载

いつもどおりのある日の事
〖如同往日一樣常有的事情〗
君は突然立ち上がり言った
〖你又突然間站起來說道〗
「今夜星を見に行こう」
〖<今晚去看星星吧>〗

「たまには良いこと言うんだね」
〖<想不到你偶然也會說些好話呢>〗
なんてみんなして言って笑った
〖就這樣大家笑著如此說道〗
明かりもない道を
〖在沒有燈光的道路上〗
バカみたいにはしゃいで歩いた
〖像笨蛋一樣邊玩鬧邊走著〗
抱え込んだ孤独や不安に
〖這都是為了不被心中的〗
押しつぶされないように
〖孤獨與不安壓破〗

真っ暗な世界から見上げた
〖從漆黑的世界中抬頭仰望〗
夜空は星が降るようで
〖夜空上的星星似乎要灑落〗

いつからだろう君の事を
〖從何時開始呢 對於你的事情〗
追いかける私がいた
〖我一直都在追逐著〗
どうかお願い
〖但願你可以〗
驚かないで聞いてよ
〖不驚訝地傾聽一下〗
私のこの想いを
〖我的這份心意〗

「あれがデネブ、アルタイル、ベガ」
〖<那是天鵝座α、牽牛星、織女星>〗
君は指さす夏の大三角
〖你指著那夏夜大三角〗
覚えて空を見る
〖仰望著熟悉的夜空〗
やっと見つけた織姫様
〖終於發現了織女星〗
だけどどこだろう彦星様
〖可是你究竟在哪裡呢牛郎星〗
これじゃひとりぼっち
〖這樣不就孤獨一人了嗎〗

楽しげなひとつ隣の君
〖看著身旁快樂的你〗
私は何も言えなくて
〖我什麼都說不出口〗

本当はずっと君の事を
〖其實我一直對於你的事情〗
どこかでわかっていた
〖在內心某處明白道〗
見つかったって
〖既然找到了〗
届きはしない
〖卻不傳達出去〗
だめだよ 泣かないで
〖是不可以的哦 不要哭泣〗
そう言い聞かせた
〖如此勸說著自己〗

強がる私は臆病で
〖逞強的我是很膽小的〗
興味がないようなふりをしてた
〖雖然裝作成毫無興趣的樣子〗
だけど
〖但是〗
胸を刺す痛みは増してく
〖刺穿心口的痛楚逐漸加深〗
ああそうか 好きになるって
〖啊啊是嗎 原來我喜歡上你了〗
こういう事なんだね
〖就是這麼一回事呢〗

どうしたい? 言ってごらん
〖想怎樣做? 試著說出來吧〗
心の声がする
〖我說出了心聲〗
君の隣がいい
〖只要能在你身邊就好〗
真実は残酷だ
〖但現實是殘酷的〗

言わなかった
〖沒有說出口〗
言えなかった
〖沒能說出口〗
二度と戻れない
〖再也無法返回〗

あの夏の日
〖那個夏日〗
きらめく星
〖閃爍的星辰〗
今でも思い出せるよ
〖直到現在也能回想起來哦〗
笑った顔も
〖歡笑的臉容〗
怒った顔も
〖生氣的臉容〗
大好きでした
〖我都最喜歡了〗
おかしいよね
〖非常奇怪吧〗
わかってたのに
〖明明早已明白〗
君の知らない
〖你所不知道的〗
私だけの秘密
〖只屬於我的秘密〗
夜を越えて
〖穿越黑夜〗
遠い思い出の君が
〖在久遠回憶中的你〗
指をさす
〖伸出了手指〗
無邪気な声で
〖用天真的聲音〗

終わり

下载地址:https://mega.nz/#!qsUElbQS

解密密钥:!85KIf6J9_oMQMua_cFjqJfchhOomr2xBv52Hq4rYsnY

htpasswd.py,用来生成Nginx或Apache密码访问数据库

#!/usr/bin/python
"""Replacement for htpasswd"""
# Original author: Eli Carter

import os
import sys
import random
from optparse import OptionParser

# We need a crypt module, but Windows doesn't have one by default.  Try to find
# one, and tell the user if we can't.
try:
    import crypt
except ImportError:
    try:
        import fcrypt as crypt
    except ImportError:
        sys.stderr.write("Cannot find a crypt module.  "
                         "Possibly http://carey.geek.nz/code/python-fcrypt/\n")
        sys.exit(1)


def salt():
    """Returns a string of 2 randome letters"""
    letters = 'abcdefghijklmnopqrstuvwxyz' \
              'ABCDEFGHIJKLMNOPQRSTUVWXYZ' \
              '0123456789/.'
    return random.choice(letters) + random.choice(letters)


class HtpasswdFile:
    """A class for manipulating htpasswd files."""

    def __init__(self, filename, create=False):
        self.entries = []
        self.filename = filename
        if not create:
            if os.path.exists(self.filename):
                self.load()
            else:
                raise Exception("%s does not exist" % self.filename)

    def load(self):
        """Read the htpasswd file into memory."""
        lines = open(self.filename, 'r').readlines()
        self.entries = []
        for line in lines:
            username, pwhash = line.split(':')
            entry = [username, pwhash.rstrip()]
            self.entries.append(entry)

    def save(self):
        """Write the htpasswd file to disk"""
        open(self.filename, 'w').writelines(["%s:%s\n" % (entry[0], entry[1])
                                             for entry in self.entries])

    def update(self, username, password):
        """Replace the entry for the given user, or add it if new."""
        pwhash = crypt.crypt(password, salt())
        matching_entries = [entry for entry in self.entries
                            if entry[0] == username]
        if matching_entries:
            matching_entries[0][1] = pwhash
        else:
            self.entries.append([username, pwhash])

    def delete(self, username):
        """Remove the entry for the given user."""
        self.entries = [entry for entry in self.entries
                        if entry[0] != username]


def main():
    """%prog [-c] -b filename username password
    Create or update an htpasswd file"""
    # For now, we only care about the use cases that affect tests/functional.py
    parser = OptionParser(usage=main.__doc__)
    parser.add_option('-b', action='store_true', dest='batch', default=False,
        help='Batch mode; password is passed on the command line IN THE CLEAR.'
        )
    parser.add_option('-c', action='store_true', dest='create', default=False,
        help='Create a new htpasswd file, overwriting any existing file.')
    parser.add_option('-D', action='store_true', dest='delete_user',
        default=False, help='Remove the given user from the password file.')

    options, args = parser.parse_args()

    def syntax_error(msg):
        """Utility function for displaying fatal error messages with usage
        help.
        """
        sys.stderr.write("Syntax error: " + msg)
        sys.stderr.write(parser.get_usage())
        sys.exit(1)

    if not options.batch:
        syntax_error("Only batch mode is supported\n")

    # Non-option arguments
    if len(args) < 2:
        syntax_error("Insufficient number of arguments.\n")
    filename, username = args[:2]
    if options.delete_user:
        if len(args) != 2:
            syntax_error("Incorrect number of arguments.\n")
        password = None
    else:
        if len(args) != 3:
            syntax_error("Incorrect number of arguments.\n")
        password = args[2]

    passwdfile = HtpasswdFile(filename, create=options.create)

    if options.delete_user:
        passwdfile.delete(username)
    else:
        passwdfile.update(username, password)

    passwdfile.save()


if __name__ == '__main__':
    main()

用法参考下面

Usage: htpasswd.py [-c] -b filename username password
    Create or update an htpasswd file

Options:
  -h, --help  show this help message and exit
  -b          Batch mode; password is passed on the command line IN THE CLEAR.
  -c          Create a new htpasswd file, overwriting any existing file.
  -D          Remove the given user from the password file.

在Nginx设置密码访问的配置

server {
        ***
        auth_basic              "Please enter the security code";
        auth_basic_user_file    /usr/local/nginx-1.8.0/htpasswd/mysql.db;
        ***
}

 

Linux编译安装PHP7

下载PHP7

这里是版本7.0.1,使用下面命令下载编译包然后解压

wget http://php.net/get/php-7.0.1.tar.gz/from/this/mirror -O php-7.0.1.tar.gz
tar zxvf php-7.0.1.tar.gz

安装必要的环境

yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel

配置

./configure \
--prefix=/usr/local/php-7.0.1 \
--with-mcrypt \
--with-mhash \
--with-openssl \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-gd \
--with-iconv \
--with-zlib \
--enable-zip \
--enable-inline-optimization \
--disable-debug \
--disable-rpath \
--enable-shared \
--enable-xml \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-mbregex \
--enable-mbstring \
--enable-ftp \
--enable-gd-native-ttf \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-soap \
--without-pear \
--with-gettext \
--enable-session \
--with-curl \
--with-jpeg-dir \
--with-freetype-dir \
--enable-opcache \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--disable-fileinfo

其中可以增加–with-mysql-sock=[dir] 来设置mysql的sock文件的位置,默认是/tmp/mysql.sock

–prefix 是你要安装的位置

编译和安装

make
make install

设置配置文件,还是刚才编译的目录中,执行

cp php.ini-production /usr/local/php-7.0.1/lib/php.ini
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
cp /usr/local/php-7.0.1/etc/php-fpm.conf.default /usr/local/php-7.0.1/etc/php-fpm.conf
cp /usr/local/php-7.0.1/etc/php-fpm.d/www.conf.default /usr/local/php-7.0.1/etc/php-fpm.d/www.conf

其中/usr/local/php-7.0.1/ 是你的安装位置,请替换成你自己的

添加服务并启动

chmod +x /etc/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on
service php-fpm start

环境变量

修改/etc/profile文件使其永久性生效,并对所有系统用户生效,在文件末尾加上如下两行代码

PATH=$PATH:/usr/local/php-7.0.1/bin
export PATH

Let’s Encrypt在XP下的支持问题

目前Let’s Encrypt在Windows XP下总共遇到了两种问题

第一种是因为不支持SNI,SNI允许HTTPS在握手的时候发送主机名,从而使得每个虚拟主机可以根据域名配置不同的证书,如下图所示

QQ图片20151222224447 - 副本 QQ图片20151222224452 - 副本

第二种,可能是因为交叉信任的原因,导致的是证书不信任,但是名称正确

QQ图片20151222224458

总之,还是淘汰XP系统吧

 

PHP7.0+Nginx-1.8.0禁止跨虚拟主机执行脚本

在你的Nginx每个虚拟主机的Server中写如下代码(貌似PHP5.3以上版本就支持了,不过我是7.0的版本)

#PHP Prohibit cross-Hosting
fastcgi_param  PHP_VALUE  "open_basedir=$document_root:/tmp/";

当然,你也可以把这段代码放在Conf的fastcgi.conf或者fastcgi_params里,这要看你在Server中include了哪个文件。

Lightswitch实现在一个表被修改后修改另一个表

最近学校有课在教学Lightswith,他是微软出品的基于数据驱动和SilverLight的快速开发框架,虽然功能强大,界面美观而且操作方便,但是感觉局限性还是很多。

其中我们项目的食品出库单详情表

QQ截图20151218152732

这个表将记录某种food出库的数量,而我们的库存表如下

QQ截图20151218152953

那么我们的需求就是在out_detail这个表之后,要让Lightswitch对storage表中的对应food_id的库存记录进行数量的修改。

下面是解决方法

首先我们要在out_detail里面编写inserted的触发器,具体方法是打开out_detail表,然后点击编写代码,找到out_detail_inserted并单击。

QQ截图2015121815295

然后跳转到代码发现out_detail_inserted被创建,这个方法将在out_detail被添加项目后触发。

partial void out_detail_Inserted(out_detailItem entity)
{
           //some code
}

然后我们在当前项目中创建一个storageRecord类用来保存从出库的记录(从哪个库出的,该食物出多少)

public class storageRecord
{
    public int storage_id;
    public int quantity;

    public storageRecord(int storage_id, int quantity)
    {
        this.storage_id = storage_id;
        this.quantity = quantity;
    }
}

然后我们在刚才触发器的类中创建下面的属性,用来保存所有出库记录

List<storageRecord> change_record = new List<storageRecord>();

然后我们还在这个类中编写进行食物出库检查和记录出库数量的方法

private object checkStorage(out_detailItem entity)
{
    int quantity = entity.quantity;
    int food_id = entity.foodItem.id;
    List<storageRecord> current_record = new List<storageRecord>();

    var storage_record = from storage in this.DataWorkspace.foodBankData.storage
                         where storage.foodItem.id == food_id
                         orderby storage.expire
                         select storage;
    foreach (storageItem record in storage_record)
    {
        int total = 0;
        total = total + record.quantity;
        if (quantity > record.quantity)
        {
            storageRecord current = new storageRecord(record.id, record.quantity);
            current_record.Add(current);
            quantity = quantity - record.quantity;
        }
        else
        {
            storageRecord current = new storageRecord(record.id, quantity);
            current_record.Add(current);
            quantity = 0;
            break;
        }
    }
    if (quantity > 0)
    {
        return null;
    }
    return current_record;
}

如果我们当前food_id对应的库存足够该次出库,上面方法返回出库的记录,否则返回null

然后我们回到inserted,编写调用checkStorage的方法

partial void out_detail_Inserted(out_detailItem entity)
{
    var result = this.checkStorage(entity);
    if (result == null)
    {
        return;
    }

    change_record = (List<storageRecord>)result;

}

这里面我们将在checkStorage方法中获取的记录放在这个类的属性中,是为了在后面的Executed方法中调用。因为在inserted中不允许我们创建额外的数据库工作空间。

然后回到out_detail表的主界面,创建SaveChanges_Executed方法,该方法将在该数据集的操作完成后调用

QQ截图20151218154342

创建完成后,我们编写代码

partial void SaveChanges_Executed()
{
    foreach (storageRecord item in change_record)
    {
        foodBankDataService db = this.Application.CreateDataWorkspace().foodBankData;
        storageItem storage_item = (from storage in db.storage
                                    where storage.id == item.storage_id
                                    select storage).FirstOrDefault();
        storage_item.quantity -= item.quantity;
        db.SaveChanges();
    }
    if (change_record.Count > 0)
    {
        change_record.Clear();
    }
}

这里调用了this.Application.CreateDataWorkspace() 来创建一个新的数据库工作空间,来执行我们对storage表的update操作。至此该功能完成

 

在CentOS6.5上用rpm方法安装mysql最新版本5.7.10

首先,下载mysql-5.7.10-1.el6.x86_64.rpm-bundle.tar

wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.10-1.el6.x86_64.rpm-bundle.tar
tar -xvf mysql-5.7.10-1.el6.x86_64.rpm-bundle.tar

你也可以到mysql的官方网站下载:http://dev.mysql.com/downloads/

QQ截图20151216190001

 

安装依赖

yum install numactl

下载完了之后进入到相应目录,执行下面的命令

rpm -ivh mysql-community-common-5.7.10-1.el6.x86_64.rpm mysql-community-libs-5.7.10-1.el6.x86_64.rpm mysql-community-client-5.7.10-1.el6.x86_64.rpm mysql-community-server-5.7.10-1.el6.x86_64.rpm mysql-community-devel-5.7.10-1.el6.x86_64.rpm

然后执行下面命令初始化,执行生会在/var/log/mysqld.log生成随机密码,最后一行可以看到

mysqld --initialize

最后别忘了启动mysqld服务,更改root密码,设置开机启动和映射管道文件(php将默认使用/tmp/mysql.sock)

chown -R mysql.mysql /var/lib/mysql
service mysqld start
/usr/bin/mysqladmin -u root -p'你的初始化密码' password '你的新密码'
chkconfig mysqld on
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock