分类 文章 下的文章

作为PHP C拓展形式的Phalcon,需要一个略微不同于传统php的库或框架的安装方法。你可以选择一个当前系统的一个二进制包下载,或者使用源代码构建它。

Phalcon 可编译在PHP 5.3.1及以上版本,但是因为老PHP版本错误导致内存泄漏,官方强烈推荐你使用PHP 5.3.11或更高版本。

PHP 5.3.9版本以前有几个安全漏洞,不建议在生产网站中使用。点击学习更多

在 Windows 上安装 Phalcon

要在Windows上使用Phalcon,你可以下载一个DLL库。编辑php.ini文件,并且在最后附加上:

extension=php_phalcon.dll

重启你的Web服务器。

在 XAMPP 下安装 Phalcon PHP

XAMPP是一个易于安装的Apache发行版,其中包含MySQL、PHP和Perl。仅仅需要下载并启动安装程序。但是需要注册的是,XAMPP 总是只发行 32 位的版本,所以,您同样需要下载 32 位版本的 Phalcon。您可以从下面的网址中下载正确的 Phalcon:

下载完成之后,解压下载得到的压缩包,此时您可以得到一个名为 php_phalcon.dll 的文件,将该文件移动至 path\to\xampp\php\ext 目录下,之后打开 \path\to\xampp\php\php.ini 文件,在该文件的最末尾加上下面这一行:

extension=php_phalcon.dll

然后通过 xampp 控制面板重启 apache 服务器即可完成安装,此时打开 http://localhost ,查看 phpinfo 信息即可看到,PHPINFO 信息中已经存在了 Phalcon 章节。这表示 Phalcon 已经安装成功。

在 WAMP 中安装 Phalcon

在 WAMP 中安装Phalcon 与在 XAMPP 中安装类似,只是需要注意几个目录位置是不同的,PHP的扩展库目录为:\path\to\wamp\bin\php\phpVERSION\etx\php.ini 的目录是 \patho\to\wamp\apache\ApacheVERSION\bin\php.ini,在上面的两个目录地址中,需要将 VERSION 替换为相应软件的版本号。

在 Linux/Solaris/Mac 下安装

在Linux/Solaris/Mac系统下,你能很轻易从源代码编译和安装这个拓展:

基本要求(Requirements)¶

必要的包:

  • PHP 5.3.x/5.4.x/5.5.x development resources
  • GCC compiler (Linux/Solaris) or Xcode (Mac)
  • Git (如果不是已经安装在你的系统,且你没有从Github上下载这个包并通过FTP/SFTP上传到你的服务器上)

通用平台下安装指定的软件包:

#Ubuntu
sudo apt-get install gcc make git-core libpcre3-dev php5-dev

#Suse
sudo yast -i gcc make php5-devel
#or
sudo zypper install gcc make php5-devel

#CentOS/Fedora/RHEL
sudo yum install git gcc make pcre-devel php-devel

#Solaris
pkg install gcc-45 php-53 apache-php53

编译

创建扩展:

git clone git://github.com/phalcon/cphalcon.git
cd cphalcon/build
sudo ./install

添加扩展到你的php配置文件:

#Ubuntu: Add this line in your php.ini
extension=phalcon.so

#Centos/RedHat: Add a file called phalcon.ini in /etc/php.d/ with this content:
extension=phalcon.so

重启Web服务器.

Phalcon自动检测你的系统架构,然而,您可以强制编译为一个特定的架构:

sudo ./install 32bits
sudo ./install 64bits
sudo ./install safe

在 FreeBSD 上安装

对于FreeBSD,仅仅只需要简单的命令进行安装:

pkg_add -r phalcon

或者

export CFLAGS="-O2 -fno-delete-null-pointer-checks"
cd /usr/ports/www/phalcon && make install clean

Movable Type 的静态发布还是我见过的可以静态发布的内容管理系统中做得最好的,所以,虽然现在Movable Type已经是收费软件了,但是我还是想玩这个,毕竟有很多东西是可以学习的,要下载最新版本的 Movable Type,你需要登录 MovableType 日文站,现在据我所知道的,还只有日文站是可以免费下载的。

下载Movable Type

点击这里 打开下载页面下载最新版本的 Movable Type,日文请自行翻译。

上传程序文件至服务器

我将会把Movable Type系统安装至 mt.oakeric.com 域下,根据我的服务器设置我将上传该文件至服务器,然后解压至 /home/www/mt.oakeric.com 目录下。

安装必要的库

以下几个库是必须安装的

  • FCGI
  • CGI
  • Image::Size
  • File::Spec (Version 0.8 or higher)
  • CGI::Cookie

以下库必须至少安装一个

  • DBI (version 1.21 or higher)
  • DBD::mysql (version 2.9005 or higher)
  • DBD::Oracle (version 1.15 or higher)
  • DBD::ODBC (version 1.13 or higher)
  • DBD::SQLite - Deprecated in MT5
  • DBD::SQLite2 - Deprecated in MT5
  • DBD::Pg (version >= 1.32) - Deprecated in MT5

以下的库是可选安装的

  • Archive::Tar
  • Archive::Zip
  • Crypt::DSA
  • Crypt::SSLeay
  • Digest::MD5
  • Digest::SHA1
  • File::Temp
  • GD
  • HTML::Entities
  • HTML::Parser
  • Image::Magick
  • IO::Compress::Gzip
  • IO::Socket::SSL - New in MT5
  • IO::Uncompress::Gunzip
  • IPC::Run
  • List::Util
  • LWP::UserAgent
  • Mail::Sendmail
  • MIME::Base64
  • Net::LDAP - New in MT5
  • Safe
  • Scalar::Util
  • SOAP::Lite (Version 5.0 or higher)
  • Storable
  • Text::Balanced (Necessary for searches within a blog)
  • XML::Atom
  • XML::Parser
  • XML::SAX

Fastcgi Wrapper

编辑 /usr/bin/fastcgi-wrapper.pl 文件,复制以下代码即可

#!/usr/bin/perl

use FCGI;
use Socket;
use POSIX qw(setsid);

require 'syscall.ph';

&daemonize;

#this keeps the program alive or something after exec'ing perl scripts
END() { } BEGIN() { }
*CORE::GLOBAL::exit = sub { die "fakeexit\nrc=".shift()."\n"; }; 
eval q{exit}; 
if ($@) { 
    exit unless $@ =~ /^fakeexit/; 
};

&main;

sub daemonize() {
    chdir '/'                 or die "Can't chdir to /: $!";
    defined(my $pid = fork)   or die "Can't fork: $!";
    exit if $pid;
    setsid                    or die "Can't start a new session: $!";
    umask 0;
}

sub main {
    #$socket = FCGI::OpenSocket( "127.0.0.1:8999", 10 ); #use IP sockets
    $socket = FCGI::OpenSocket( "/var/run/perl-fastcgi.sock", 10 ); #use IP sockets
    $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket );
    if ($request) { request_loop()};
            FCGI::CloseSocket( $socket );
}

sub request_loop {
    while( $request->Accept() >= 0 ) {

       #processing any STDIN input from WebServer (for CGI-POST actions)
       $stdin_passthrough ='';
       $req_len = 0 + $req_params{'CONTENT_LENGTH'};
       if (($req_params{'REQUEST_METHOD'} eq 'POST') && ($req_len != 0) ){ 
            my $bytes_read = 0;
            while ($bytes_read < $req_len) {
                    my $data = '';
                    my $bytes = read(STDIN, $data, ($req_len - $bytes_read));
                    last if ($bytes == 0 || !defined($bytes));
                    $stdin_passthrough .= $data;
                    $bytes_read += $bytes;
            }
        }

        #running the cgi app
        if ( (-x $req_params{SCRIPT_FILENAME}) &&  #can I execute this?
             (-s $req_params{SCRIPT_FILENAME}) &&  #Is this file empty?
             (-r $req_params{SCRIPT_FILENAME})     #can I read this file?
        ){
    pipe(CHILD_RD, PARENT_WR);
    my $pid = open(KID_TO_READ, "-|");
    unless(defined($pid)) {
        print("Content-type: text/plain\r\n\r\n");
                    print "Error: CGI app returned no output - ";
                    print "Executing $req_params{SCRIPT_FILENAME} failed !\n";
        next;
    }
    if ($pid > 0) {
        close(CHILD_RD);
        print PARENT_WR $stdin_passthrough;
        close(PARENT_WR);

        while(my $s = <KID_TO_READ>) { print $s; }
        close KID_TO_READ;
        waitpid($pid, 0);
    } else {
                foreach $key ( keys %req_params){
                   $ENV{$key} = $req_params{$key};
                }
                # cd to the script's local directory
                if ($req_params{SCRIPT_FILENAME} =~ /^(.*)\/[^\/]+$/) {
                        chdir $1;
                }

        close(PARENT_WR);
        close(STDIN);
        #fcntl(CHILD_RD, F_DUPFD, 0);
        syscall(&SYS_dup2, fileno(CHILD_RD), 0);
        #open(STDIN, "<&CHILD_RD");
        exec($req_params{SCRIPT_FILENAME});
        die("exec failed");
    }
        } 
        else {
            print("Content-type: text/plain\r\n\r\n");
            print "Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not ";
            print "exist or is not executable by this process.\n";
        }

    }
}

Fastcgi init 与控制脚本

编辑 /etc/rc.d/init.d/perl-fastcgi 文件,并复制以下代码:

#!/bin/sh
#
# nginx – this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /opt/nginx/conf/nginx.conf
# pidfile: /opt/nginx/logs/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

perlfastcgi="/usr/bin/fastcgi-wrapper.pl"
prog=$(basename perl)

lockfile=/var/lock/subsys/perl-fastcgi

start() {
    [ -x $perlfastcgi ] || exit 5
    echo -n $"Starting $prog: "
    daemon $perlfastcgi
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    stop
    start
}

reload() {
    echo -n $”Reloading $prog: ”
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}
rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
    esac

设置相应的权限并启动 Perl Fastcgi Wrapper

chmod +x /usr/bin/fastcgi-wrapper.pl
chmod +x /etc/rc.d/init.d/perl-fastcgi
/etc/rc.d/init.d/perl-fastcgi start
chkconfig --add perl-fastcgi
chkconfig perl-fastcgi on

站点的 Nginx 配置文件

server {
    listen       80;
    server_name  mt.oakeric.com;
    set $app_root '/home/www/mt.oakeric.com'; 
    error_log /home/www/mt.oakeric.com/logs/error.log;
    charset utf-8;

    root $app_root/public;
    index mt.cgi index.cgi index.html;

    location = /favicon.ico {
            log_not_found off;
            access_log off;
    }

    location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
    }

    if (-f $request_filename/index.html){
        rewrite (.*) $1/index.html break;
    }

    location ~ .*\.cgi(\/.*)*$ {
        gzip off;
        include fastcgi_params;
        fastcgi_pass  unix:/var/run/perl-fastcgi.sock;
        fastcgi_index mt.cgi;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ \.pl$ {
        gzip off;
        include fastcgi_params;
        fastcgi_pass  unix:/var/run/perl-fastcgi.sock;
        fastcgi_index mt.pl;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

安装 Movable Type

重新加载 Nginx 配置文件后,即可访问 http://mt.oakeric.com 即可开始安装脚本了。

GitLab,是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。

它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。

系统需求与安装前的准备

添加必要的软件仓库

wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 https://www.fedoraproject.org/static/0608B895.txt
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
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
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

更新系统,移除不需要的软件包,同时安装必要的软件包

yum update -y
yum remove git httpd sendmail -y
yum -y install nginx zlib-devel openssl-devel git redis perl-CPAN ncurses-devel gdbm-devel glibc-devel tcl-devel curl-devel byacc db4-devel sqlite-devel libxml2 libxml2-devel libffi libffi-devel libxslt libxslt-devel libyaml libyaml-devel libicu libicu-devel system-config-firewall-tui sudo wget crontabs gettext perl-Time-HiRes cmake gettext-devel readline readline-devel libcom_err-devel.i686 libcom_err-devel.x86_64 expat-devel logwatch logrotate patch

添加 Gitlab 的用户 git

adduser --shell /bin/bash --home-dir /home/git/ git

其它准备工作

编辑 /etc/sudoers 文件,添加 /usr/local/bin 至文件中下面这一行的末端:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

编辑完成后的文件看上去像下面这样的:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

安装最新版本的Git

mkdir /tmp/git
cd /tmp/git
wget https://www.kernel.org/pub/software/scm/git/git-2.1.3.tar.gz 
tar -xzvf git-2.1.3.tar.gz
cd git-2.1.3/
./configure
make
make prefix=/usr/local install

安装最新版本的 Ruby

mkdir /tmp/ruby
cd /tmp/ruby
wget ftp://ftp.ruby-lang.org/pub/ruby/2.1/ruby-2.1.5.tar.gz 
tar -xzvf ruby-2.1.5.tar.gz
cd ruby-2.1.5
./configure --disable-install-rdoc
make
make prefix=/usr/local install

创建 GitLab 使用的数据库

mysql -u root -p 
CREATE USER 'git'@'localhost' IDENTIFIED BY 'PaSsWoRd';
CREATE DATABASE `gitlabdb` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
GRANT ALL ON `gitlabdb`.* TO 'git'@'localhost';

安装并配置 redis

yum install redis

编辑 /etc/redis.conf

port 0

同时添加下面两行:

unixsocket /var/run/redis/redis.sock
unixsocketperm 0775

然后重新启动:

service redis restart
usermod -aG redis git

安装 Gitlab

克隆 gitlab 代码至服务器

cd /home/git
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 7-4-stable gitlab
cd /home/git/gitlab
sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml

编辑 config/gitlab.yml 配置文件:

sudo -u git -H nano config/gitlab.yml

编辑 config/unicorn.rb 文件:

sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb
sudo -u git -H nano config/unicorn.rb

编辑 config/database.yml 文件:

sudo -u git cp config/database.yml.mysql config/database.yml
sudo -u git -H nano config/database.yml
sudo -u git -H chmod o-rwx config/database.yml

安装 bundlersgems

gem install bundler
cd /home/git/gitlab
sudo -u git -H bundle install --deployment --without development test postgres aws
sudo -u git -H bundle exec rake gitlab:shell:install[v2.1.0] REDIS_URL=unix:/var/run/redis/redis.sock RAILS_ENV=production
restorecon -Rv /home/git/.ssh
sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production GITLAB_ROOT_PASSWORD=YourPassword

安装 init 脚本:

wget -O /etc/init.d/gitlab https://gitlab.com/gitlab-org/gitlab-recipes/raw/master/init/sysvinit/centos/gitlab-unicorn
chmod +x /etc/init.d/gitlab
chkconfig --add gitlab

设置 logrotate

cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab
sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production
sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production
service gitlab start

设置 nginx

get -O /etc/nginx/conf.d/gitlab.conf https://gitlab.com/gitlab-org/gitlab-ce/raw/master/lib/support/nginx/gitlab-ssl

生成 SSL

mkdir /etc/nginx/ssl
cd /etc/nginx/ssl/
openssl genrsa -des3 -out gitlab.key 1024
openssl req -new -key gitlab.key -out gitlab.csr
cp gitlab.key gitlab.key.org
openssl rsa -in gitlab.key.org -out gitlab.key
openssl x509 -req -days 365 -in gitlab.csr -signkey gitlab.key -out gitlab.crt

商品类目用于确定商户添加的某种商品是什么类型的,具有哪些特定的销售属性、描述属性或者关键属性,系统在获取一个商品的完整数据前,需要先读取其所属的类型数据,根据类型数据再从数据库中获取其有哪些数据属性。

数据结构

-- Table: catalog_category

-- DROP TABLE catalog_category;

CREATE TABLE catalog_category
(
  id serial NOT NULL, -- ID
  uuid uuid NOT NULL, -- 全局唯一标识
  parent_id integer NOT NULL DEFAULT 0, -- 父级ID
  location character varying(255) NOT NULL DEFAULT '0'::character varying, -- 位置,若为顶级类型,则为 0,否则路径为通过 '/' 连接上级类型的路径与上级的ID而成的字符串,比如ID为 1 的类型的路径为 0,它有一个子分类ID为2,那么子分类2的路径就为 0/1,若该子分类还有一个ID为3的子分类,那么3的位置即为:0/1/2
  name character varying(32) NOT NULL, -- 类型名称
  description character varying(255) DEFAULT ''::character varying, -- 介绍说明
  icon character varying(255) DEFAULT ''::character varying, -- 图标,直接填写图标名称即可
  cover character varying(255) DEFAULT ''::character varying, -- 类型封面图片,图片的URI地址,
  is_parent boolean NOT NULL DEFAULT false, -- 是否为父级分类,若分类有下级分类,则该值为 true,否则为 false,默认为 false。
  is_editable boolean NOT NULL DEFAULT true, -- 是否可编辑
  is_usable boolean NOT NULL DEFAULT true, -- 是否可用
  create_time timestamp with time zone, -- 创建时间
  update_time timestamp with time zone, -- 最后更新时间
  CONSTRAINT catalog_category_pkey PRIMARY KEY (id),
  CONSTRAINT catalog_category_parent_id_fkey FOREIGN KEY (parent_id)
      REFERENCES catalog_category (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT catalog_category_name_key UNIQUE (name)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE catalog_category
  OWNER TO postgres;
COMMENT ON TABLE catalog_category
  IS '商品类型';
COMMENT ON COLUMN catalog_category.id IS 'ID';
COMMENT ON COLUMN catalog_category.uuid IS '全局唯一标识';
COMMENT ON COLUMN catalog_category.parent_id IS '父级ID';
COMMENT ON COLUMN catalog_category.location IS '位置,若为顶级类型,则为 0,否则路径为通过 ''/'' 连接上级类型的路径与上级的ID而成的字符串,比如ID为 1 的类型的路径为 0,它有一个子分类ID为2,那么子分类2的路径就为 0/1,若该子分类还有一个ID为3的子分类,那么3的位置即为:0/1/2';
COMMENT ON COLUMN catalog_category.name IS '类型名称';
COMMENT ON COLUMN catalog_category.description IS '介绍说明';
COMMENT ON COLUMN catalog_category.icon IS '图标,直接填写图标名称即可';
COMMENT ON COLUMN catalog_category.cover IS '类型封面图片,图片的URI地址,';
COMMENT ON COLUMN catalog_category.is_parent IS '是否为父级分类,若分类有下级分类,则该值为 true,否则为 false,默认为 false。';
COMMENT ON COLUMN catalog_category.is_editable IS '是否可编辑';
COMMENT ON COLUMN catalog_category.is_usable IS '是否可用';
COMMENT ON COLUMN catalog_category.create_time IS '创建时间';
COMMENT ON COLUMN catalog_category.update_time IS '最后更新时间';

字段说明

  • uuid : 全局唯一标识,在系统中暂时没有任何用处,只为备用
  • parent_id : 对应系统类型 CatalogCategory 中的 parentId,关键至 catalog_category 表中的 id 字段,用于指定类型的父类型;
  • location : 记录当前类目在类目树中的位置,它是以 / 符号连接的所有父级分类的ID串,若为顶级类型,则为 0,否则路径为通过 ''/'' 连接上级类型的路径与上级的ID而成的字符串,比如ID为 1 的类型的路径为 0,它有一个子分类ID为2,那么子分类2的路径就为 0/1,若该子分类还有一个ID为3的子分类,那么3的位置即为:0/1/2;
  • name :类目的名称
  • description :类目的介绍
  • icon:用于指定类目的图标
  • cover:类目的封面图片地址
  • is_parent:是否为父级类目,若有一个或者多个类目将 parent_id 设置为类目的ID,则这个类目 parent_id 所指定的类目的 is_parent 属性即为 true,否则为 false
  • is_usable:这是系统级的属性,用于确定某一个类目是否可用,若某一个类目的 is_usable 属性为 false,则该类目下面的所有子类目均不可用,因系统的开发过程中,需要考虑到此项。
  • create_time:类目的创建时间
  • update_time:类目信息最后更新时间

最近一直在忙着自己第一个完整的产品,叫 Oak Commerce,橡果电子商务系统,该系统是一个基于平板电脑的提供给线下时尚产业零售和批发商使用的进销存、财务以及客户关系管理系统,系统里面还融合了现在流行的微信营销系统以及在线电子商城系统,该系统中商品类型包括了鞋、帽、衣、裤、围巾等,对于商品数据结构的设计,在我看来,放在了整个系统中的重中之重的地位,为了能帮助自己完全的理清思路,所以,也见解了很多优秀的开源电子商务系统,在自己的博客里,就慢慢地记录这整个过程,这一系列的文章会一直更新到我完成这个数据结构的设计,本文是该系列日志的第一篇,介绍我所需要满足的真实的业务需求。

定义

引用淘宝商品类目数据结构设计中的对属性的归类,商品的属性分为以下三种:

  1. 关键属性:能够确认唯一产品的属性,可以是一个,或者多个关键属性的组合,比如:相机的"品牌""型号"能确定唯一的产品,服装的"品牌""货号"能确定唯一的产品
  2. 销售属性:组成SKU的特殊属性,它会影响买家的购买和卖家的库存管理,如服装的"颜色"、"套餐"和"尺码",注意这里的SKU,淘宝销售属性组合成SKU
  3. 非关键属性:就是商品属性了,一些对商品进行描述的属性

商品的类型

时尚产业中,最常见的商品类型包括下面这几种:

  1. 衣服
  2. 裤子
  3. 鞋子
  4. 帽子
  5. 袜子
  6. 内衣
  7. 内裤
  8. 手套
  9. 帽子
  10. 其它

以上这些商品类型的关键属性均包括以下两个:

  1. 品牌
  2. 货号

库存管理

进销丰系统中的首要任务就是库存管理,而库存受销售属性的影响,根所系统中所有可能出现的商品类型,系统的销售属性可能有下面两个:

  1. 颜色
  2. 尺码

由于品牌的不同,所遵循的尺码标准也不同,所以,系统除了可以根据颜色可尺码对商品进行库存管理外,还需要满足一个条件,那就是尺码可以根据所执行的标准不同而归组,常见的尺码组有下面这些:

  • 中国 160-165/84-86、165-170/88-90、167-172/92-96、168-173/98-102、170-176/106-110
  • 国际 XS、S、M、L、XL
  • 美国 2、4-6、8-10、12-14
  • 欧洲 34、34-36、38-40、42、44

商户在建立任何一种商品的档案时,都可以为该商品自由的指定一种尺码组,而且还可以设定该商品的尺码属性(即有哪些尺码,现实业务中,不可能任何衣服的尺码都从XS 到 XL,有可能XS厂家就不生产),尺码组只要确定,则该商品就不能再选择其它的尺码组了。

同样的颜色具有两种添加方式,一种是单色商品可以直接从系统中选择一种颜色,另一种是多色商品,商户可以选择花色,但是由于一种商品可能出现多种花色,而不同的花色同时有可能也需要进行库存管理,所以,颜色还可以让用户进行自定义,自己起名或者拍照,将一种花色的商品拍照设置成为商品的颜色。

不管是尺码还是颜色,在档案建立之后,均可以添加,但是对于尺码而言,只允许在商品档案现在的尺码组中添加,不允许添加其它尺码组中的尺码。

对商品的描述属性

这些属性不属于关键属性,而是属于描述商品特征的属性,不同的商品类型之间可能有公共的描述属性,也可能有属于某一个类型的特殊描述属性,为了系统的合理性,我们放弃更多的自由度,即商户在选择了商品类型之后,描述属性必需按照系统所制定的标准描述属性添加(可以留空,但不允许添加自定义的描述属性)

  1. 使用明确、统一的标明和列名,例如 School, SchoolCourse, CourceID。
  2. 数据表名使用单数而不是复数,例如 StudentCourse,而不是StudentCourses。
  3. 数据表名不要使用空格。
  4. 数据表名不要使用不必要的前缀或者后缀,例如使用School,而不是TblSchool,或者SchoolTable等等。
  5. 数据库中的密码要加密,到应用中再解密。 (其实就是散列存储、单向加密)
  6. 使用整数作为ID字段,也许现在没有这个必要,但是将来需要,例如关联表,索引等等。
  7. 使用整数字段做索引,否则会带来很大的性能问题 。
  8. 使用 bit 作为布尔字段,使用整数或者varcha是浪费。同时,这类字段应该以“Is”开头。
  9. 要经过认证才能访问数据库,不要给每一个用户管理员权限。
  10. 尽量避免使用“select *”,而使用“select [required_column_list]”以获得更好的性能。
  11. 假如程序代码比较复杂,使用ORM框架,例如hibernate,iBatis。ORM框架的性能问题可以通过详细的配置去解决。
  12. 分割不常使用的数据表到不同的物理存储以获得更好的性能。
  13. 对于关键数据库,使用安全备份系统,例如集群,同步等等。
  14. 使用外键,非空等限制来保证数据的完整性,不要把所有的东西都扔给程序。
  15. 缺乏数据库文档是致命的。你应该为你的数据库设计写文档,包括触发器、存储过程和其他脚本。
  16. 对于经常使用的查询和大型数据表,要使用索引。数据分析工具可以帮助你决定如何建立索引。
  17. 数据库服务器和网页服务器应该放在不同的机器上。这回提高安全性,并减轻CPU压力。
  18. Image和blob字段不应该定义在常用的数据表中,否则会影响性能。
  19. 范式(Normalization)要按照要求使用以提高性能。Normalization做的不够会导致数据冗余,而过度Normalization 会导致太多的join和数据表,这两种情况都会影响性能。
  20. 多花点时间在数据库设计上,否则你将来会付出加倍的时间来偿还。

从现在开始, ionic 增加了一条 resources 命令,这使得我们可以直接通过本地的命令即可自动创建出所有当前项目已添加了的 platform 可用的图标与启动画面,我们只需要在项目的根目录下面新建一个名为 resources 的目录,然后在该目录下保存两张图片即可,图片名称分别为:

  • icon.png
  • splash.png

除了 .png 格式外,你还可以直接使用 .psd 或者 .ai 文件,因为 ionic resources 命令并不是在本地运行,而是将图片文件上传至 ionic 的服务器,由它创建好了所有版本的图片之后再更新至本地,所以,在运行该命令时,你还得保存当前的开发计算机处于联网状态。

以下命令会同时生成图标与启动画面:

ionic resources

若不想同时生成两者,可以单独指定要生成的内容,命令分别为:

ionic resources --icon

ionic resources --splash

图片尺寸要求

不同的系统都有着各自不同的图片尺寸,为了能达到最好的效果,建议图标的尺寸为不小于 192x192px 的正方形图片,同时不需要再圆角,各个系统都会自动的为图片加上自己的圆角。而启动画面则要求尺寸至少为 2208 x 2208px,若你刚好选择的是该尺寸,则将主内容区块限定在该图片绝对居中的 1200x1200px 大小的区域中,这可以保证图片在经过各种裁切后,主要内容不丢失。下载splash.zip示例图上

其它要求

使用 ionic resources 命令要求 cordova CLI 版本为 3.6 或者更高,你可以使用以下命令更新升级:

npm install -g ionic
npm install -g cordova

splash.zip
splash-header.jpg

Nginx、MySQL 与 PHP 可以联合使用成为一个强大的动态内容服务器,这三者在不同的系统上面有不同的名称,本文所要讲解的是如何在 FreeBSD 上面搭建该环境,我们称之为 FEMP。我所使用的 FreeBSD 版本为 10.1。

第一步:安装这些软件

使用下面的命令即可完成软件的安装:

sudo pkg install nginx mysql56-server php56 php56-mysql

在安装完成之后,若您使用的是系统默认的 tcsh ,我们需要立即运行 rehash 命令。

若使用 CentOS 官方软件源的版本,直接使用下面的命令即可:

yum update
yum install postgresql postgresql-server 

但是,官方的源可能并不会提供最新版本的 postgresql 软件,所以,本文并不是使用 CentOS 官方的软件源安装,而是使用 postgresql 官方提供的 yum 源来安装最新版本的软件,在我写这篇文章时(也就是我服务器上安装的版本)为 postgresql 9.4

安装 postgresql

访问 PostgreSQL Repository 下载页面,根据自己服务器系统的版本选择添加适合自己的软件源。

对于 CentOS 6.x 32位 系统:

rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-6-i386/pgdg-centos94-9.4-1.noarch.rpm

对于 CentOS 6.x 64位 系统:

rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.noarch.rpm

对于 CentOS 7 64位 系统

rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.4-1.noarch.rpm

使用下面的命令更新软件列表:

yum update

到现在为止,已经可以使用下面的命令安装 postgresql 了:

yum install postgresql94-server postgresql94-contrib

接着使用下面的命令初始化数据库:

CentOS 6.x 系统上:

service postgresql-9.4 initdb

CentOS 7.x 系统上:

/usr/pgsql-9.4/bin/postgresql94-setup initdb

接系统 postgresql 服务,并让其在每一次系统启动时,自动启动服务:

CentOS 6.x 系统上:

service postgresql-9.4 start
chkconfig postgresql-9.4 on

CentOS 7.x 系统上:

systemctl enable postgresql-9.4
systemctl start postgresql-9.4

调整 iptablesfirewall

调整 iptables 与 防火墙设置以让数据库服务器可以被远程系统访问。

CentOS 6.x 系统上:

vi /etc/sysconfig/iptables

添加下面这些行:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

保存,然后重启 iptables 服务:

service iptables restarton

CentOS 7.x 系统上:

firewall-cmd --permanent --add-port=5432/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

访问 PostgreSQL 命令提示符

默认的数据库名称与数据库用户名均为 postgres,通过 postgres 用户进行一些 postgresql 相关的操作:

su - postgres

要登录到 postgresql 服务器,输入下面这个命令:

psql

您会得到类似下面这样的提示符:

psql (9.4.0)
Type "help" for help.

postgres=#

输入 \q 退出 postgresql 命令提示符界面。

设置 postgres 用户的密码

通过下面命令登录到 postgresql 命令提示符:

su - postgres

psql

接着通过下面的命令设置 postgres 用户的密码:

postgres=# \password postgres 
Enter new password: 
Enter it again: 
postgres=# \q

要安装 PostgreSQL Adminpack,在 postgresql 命令提示符界面下输入下面命令:

postgres=# CREATE EXTENSION adminpack;
CREATE EXTENSION

创建新用户与数据库

作为示例,我们现在添加一个名为 eric 的用户,其密码为 password,然后再添加一个数据库,其名为 eric_db

su - postgres

创建用户 eric

$ createuser eric

创建 eric_db 数据库:

$ createdb --encoding=UTF8 eric_db

现在登录至 psql 命令行,设置密码,并授予 eric 访问 eric_db 的权限:

$ psql
psql (9.4.0)
Type "help" for help.

postgres=# alter user eric with encrypted password 'password';
ALTER ROLE

postgres=# grant all privileges on database eric_db to eric;
GRANT
postgres=#

删除用户与数据库

su - postgres

输入下面命令删除数据库:

$ dropdb <database-name>

输入下面命令删除用户:

$ dropuser <user-name>

配置 PostgreSQL-MD5 方式验证

MD5 验证 提供了一种以 Md5 方式加密密码的密码验证方式,要使用该功能,需要编辑 /var/lib/pgsql/9.4/data/pg_hba.conf 文件:

vi /var/lib/pgsql/9.4/data/pg_hba.conf

编辑或者修改下面这些行:

[...]
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             192.168.1.0/24          md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
[...]

使用下面的命令重启 postgresql 服务以更新配置文件:

CentOS 6.X 系统上:

service postgresql-9.4 restart

d CentOS 7 系统上:

systemctl restart postgresql-9.4

配置 PostgreSQL TCP/IP

默认的,TCP/IP 是关闭的,所以,若用户地人另外的服务器访问某台 postgresql 数据库服务器是不被允许的,若要启用该功能,您需要编辑 /var/lib/pgsql/9.4/data/postgresql.conf 文件:

vi /var/lib/pgsql/9.4/data/postgresql.conf

找到下面这些行:

[...]
#listen_addresses = 'localhost'
[...]
#port = 5432
[...]

取消注释,然后将 localhost 修改为您将允许的客户端IP地址,若要允许所有的客户端的联系,则使用 \* 即可:

listen_addresses = '*'
port = 5432

使用下面的命令重启 postgresql 服务以更新配置文件:

CentOS 6.X 系统上:

service postgresql-9.4 restart

d CentOS 7 系统上:

systemctl restart postgresql-9.4

第一步:添加 MongoDB 软件仓库的配置信息:

sudo touch /etc/yum.repos.d/mongodb.repo

vi /etc/yum.repos.d/mongodb.repo

若为64位系统,则使用以下配置:

[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

若为32位系统,则使用下方配置:

[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686/
gpgcheck=0
enabled=1

第二步:安装 MongoDB

sudo yum install mongo-10gen-server

第三步:配置 MongoDB

vi /etc/mongod.conf

内容如下:

# fork and run in background
fork = true

bind_ip = 127.0.0.1
port = 27017

运行 MongoDB

mongod --config /etc/mongod.conf

添加第三方软件源

PHP-FPM 在 CentOS 的官方程序库中不存在,所以我们首先得添加第三方扩展软件源。

rpm --import https://fedoraproject.org/static/0608B895.txt 
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

yum install yum-priorities

然后编辑:vi /etc/yum.repos.d/epel.repo

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
baseurl=http://mirrors.aliyun.com/epel/6/$basearch
        http://mirrors.aliyuncs.com/epel/6/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

接着:vi /etc/yum.repos.d/remi.repo

[remi]
name=Les RPM de remi pour Enterprise Linux 6 - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/6/remi/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/6/remi/mirror
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

安装 Nginx、MySQL以及PHP

#安装MySQL服务器
yum install mysql mysql-server

#安装Nginx
yum install nginx

#安装PHP及相关组件
yum install php-fpm php-cli php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-magickwand php-magpierss php-mbstring php-mcrypt php-mssql php-shout php-snmp php-soap php-tidy php-pecl-apc

待所有安装结束后,使用以下命令启动服务:

#启动MySQL
chkconfig --levels 235 mysqld on
service mysqld start

#启动Nginx
chkconfig --levels 235 nginx on
service nginx start

#启动PHP-FPM
chkconfig --levels 235 php-fpm on
service php-fpm start

若 Nginx 启动失败,则有可能是因为 Apache httpd 服务占用了该接口,这时,要么我们修改 Nginx 的坚挺端口,要么修改Apache httpd的或者直接删除 Apache httpd。

apachectl stop
yum remove httpd
chkconfig --level 235 httpd off

配置Nginx、MySQL与PHP-FPM

运行 mysql_secure_installation 命令,提升 MySQL 服务器的安全性,要求您要输入数据库 root 帐户密码,若您是新安装,则直接回车即可,接着立马设置新密码。

配置 PHP

打开 PHP 配置文件:vi /etc/php.ini

设置 cgi.fix_pathinfo=0

[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]

设置 upload_max_filesize 最大文件上传尺寸为 upload_max_filesize16MB

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 16M

设置 post_max_size32MB

; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; http://php.net/post-max-size
post_max_size = 32M

打开:vi /etc/php-fpm.d/www.conf

;listen = 127.0.0.1:9000
listen = /var/run/php-fpm.sock;

以及:

listen.owner = www
listen.group = www
listen.mode = 0660

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = www
; RPM: Keep a group allowed to write in log dir.
group = www

不知道 Cordova 、Ionic、AngularJS 为何物的,请点击下方链接自行恶补:

需求

最后开始接触一些基于 Ionic + Cordova + AngularJS技术的移动App的开发,然后就遇到了很多都是需要有一个分享功能的,尤其是微信的分享,这也是第一次搞这种事情啊,没办法,折腾了好多天,解决了这个问题之后发现,原来是如此的简单。

准备好你的App

我在这里创建一个名为 WechatShareDemoApp 的新的App,在工作目录中运行如下命令:

ionic start WechatShareDemoApp tabs

这会使用 Ionic Tabs Seed 创建一个基于标签导航的空的App,创建成功之后,使用任何一个你喜欢的编辑器编辑该项目,我使用的是 WebStorm。

DashCtrl 增加一个 share(title,desc,url,thumb) 文法

share(title,desc,url,thumb) 方法用来打开一个 ActionSheet 面板,在该面板中,会提供两个分享按钮,一个用于分享内容至朋友圈,一个用于分享至会话,代码如下:

// 上面代码省略
.controller('DashCtrl', function($scope, $ionicActionSheet) {
    $scope.share = function(title, desc, url, thumb) {
        $ionicActionSheet.show({
            buttons: [
                { text: '<b>分享至微信朋友圈</b>' },
                { text: '分享给微信好友' }
            ],
            titleText: '分享',
            cancelText: '取消',
            cancel: function() {
                // 取消时执行
            },
            buttonClicked: function(index) {
                if(index == 0) {
                    $scope.shareViaWechat(WeChat.Scene.timeline, title, desc, url, thumb);
                }
                if(index ==1 ) {
                    $scope.shareViaWechat(WeChat.Scene.session, title, desc, url, thumb);
                }
            }
        });
    };
})
// 下面代码省略

share(title,desc,url,thumb) 的运行方式是,点击该方法被调用时,打开一个 ActionSheet ,点击 分享至微信朋友圈 按钮被点击时,执行 $scope.shareViaWechat(WeChat.Scene.timeline, title, desc, url, thumb),点击 分享给微信好友 时,执行 $scope.shareViaWechat(WeChat.Scene.session, title, desc, url, thumb),前者分享内容至朋友圈,后者分享内容至会话,但是,$scope.shareViaWechat 方法本身是不存在的,所以,我们还需要添加该方法。

DashCtrl 添加 $scope.shareViaWechat 方法

该方法使用了第三方的 Cordova 插件提供的方法 WeChat.share,该方法可以将内容分享至微信中,代码如下:

// 前面代码省略
.controller('DashCtrl', function($scope, $ionicActionSheet, $ionicPopup) {

    //......        

    $scope.shareViaWechat = function(scene, title, desc, url, thumb) {
        // 创建消息体
        var msg = {
            title: title ? title : "行者无疆",
            description: desc ? desc : "A real traveller's province is boundless.",
            url: url ? url : "https://pub.ofcrab.com",
            thumb: thumb ? thumb : null
        };

        WeChat.share(msg, scene, function() {
            $ionicPopup.alert({
                title: '分享成功',
                template: '感谢您的支持!',
                okText: '关闭'
            });
        }, function(res) {
            $ionicPopup.alert({
                title: '分享失败',
                template: '错误原因:' + res + '。',
                okText: '我知道了'
            });
        });
    };
})
// 后面代码省略

在上面的代码中, WeChat 是由第三方插件提供的,至现在为止,分享功能已经做完,我们现在需要在 views 中添加分享功能的激活按钮。

添加分享按钮

打开 templates/tab-dash.html,在 ion-content 结束前,添加如下代码:

<button class="button button-assertive button-outline button-block" ng-click="share()">分享</button>

该按钮会打开分享的 ActionSheet,我们不需要传任何参数,因为在上面的分享方法中,对没有设定的参数已经提供了默认的内容了。

此时,应用的界面如下图所示:

微信分享 ActionSheet.jpg

添加微信分享插件

虽然样子已经成型了,但是还是不能进行分享的,我们需要安装一个插件,该插件使用到了微信官方的第三方开发库,需要先在微信开放平台申请一个AppId,然后还需要使用 Gen_Signature_Android221cbf.zip 插件从手机中根据包名获取一个 Signature Code,该代码还必须填写进入开放平台中,在该过程中,若我们的App是运行在Android平台的话,还涉及到 keystore 的问题,这里不做过多的阐述,若我们的项目为新项目的话,还需要先生成一个Android安装包(必须生成 Apk 包之后安装),安装至某一个手机中,然后在该手机中使用上面的 Gen_Signature_Android221cbf 应用获取 Signature 值,再填入开放平台的相应设置中。

您在申请了AppID之后,还需要了解到你需要将你的包名也设置进入开放平台中,该包名在 Ionic 项目中的, config.xml 文件中可以进行设置。

该插件必须在 Platform 添加之后安装,所以我们先添加一个 Platform,比如 Android

ionic platform add android

在 App 的根目录下使用下面的命令即可:

cordova plugin add com.wordsbaking.cordova.wechat --variable APP_ID=[你的APPID]

上面的 APP_ID 为你在微信开放平台申请的 App ID,安装该插件时,必须添加至命令中。

打包并安装使用

将新生成的项目专稿 Eclipse 中,打包并安装测试。

\Phalcon\Text 是 Phalcon 框架提供的字符处理工具类,该类中定义了如下这些工具方法:

public static function camelize($str){ }
public static function uncamelize($str){ }
public static function increment($str, $separator=null){ }
public static function random($type, $length=null){ }
public static function startsWith($str, $start, $ignoreCase=null){ }
public static function endsWith($str, $end, $ignoreCase=null){ }
public static function lower($str){ }
public static function upper($str){ }

camelize($str)

该方法用于将字符串转换为驼峰式字符串,原始字符串要求以下划线 _ 相连,使用示例如下:

echo \Phalcon\Text::camelize('coco_bongo'); //CocoBongo

uncamelize($str)

该方法将驼峰式的字符串转换为以下划线相连的字符串,使用示例如下:

echo \Phalcon\Text::uncamelize('CocoBongo'); //coco_bongo

increment($str, $separator=null)

给字符串后面增加一个数字后缀,同时对该后缀进行递增操作,若原始字符串还未被设置过,则在字符串后面增加之,若已定义过,则给该数字加1,使用示例如下:

echo \Phalcon\Text::increment("a"); // "a_1"
echo \Phalcon\Text::increment("a_1"); // "a_2"
echo \Phalcon\Text::increment("a","-); // "a-1"

第二个参数用于定义数字与字符串的分隔符。

random($type, $length=null)

根据给定的类型生成相应类型的随机字符串,类型是以 RANDOM_ 为前缀的常量, Phalcon提供了如下几个随机类型常量:

const RANDOM_ALNUM = 0; // 包含英文字母与数字的随机字符串
const RANDOM_ALPHA = 1; // 仅包含英文字母的随机字符串
const RANDOM_HEXDEC = 2; // 
const RANDOM_NUMERIC = 3; // 纯数字随机字符串
const RANDOM_NOZERO = 4; // 无0的随机纯数字字符串

第二个参数用于定义生成的随机字符串的长度。

startsWith($str, $start, $ignoreCase=null)

检测 $str 字符串是否以 $start 字符串开始,$ignoreCase 定义是否忽略大小写,使用示例如下:

echo \Phalcon\Text::startsWith("Hello", "he", false); // true
echo \Phalcon\Text::startsWith("Hello", "he"); // false
echo \Phalcon\Text::startsWith("Hello", "He"); // true

endsWith($str, $end, $ignoreCase=null)

startsWith 使用方法一致,其功能为检测是否以 $end 字符串结尾,使用示例如下:

echo \Phalcon\Text::endsWith("Hello", "LLO", false); // true
echo \Phalcon\Text::endsWith("Hello", "LLO"); // false
echo \Phalcon\Text::endsWith("Hello", "llo"); // true

lower($str)

$str 字符串转换为纯小写,若 mbstring 函数可用,lower 函数会优先选择 mbstring 函数。

upper($str)

$str 字符串转换为纯大写,功能与 lower 函数类似。

最近越来越发现自己变懒了,没有以前那么强的追根问底的勇气了,最近这几个月腾讯云一直在做活动,三折起,我买了两台服务器,配置也还不错,最高的配置的那一台现在是做为公司的备用服务器在使用,而还有一个配置稍低一些的,则做自己的个人使用了,对于个人这一台,我最开始是安装的SUSE作为服务器操作系统,然后,发现软件版本的各种老啊,如果是以前的话,可能我会通宵达旦地把这软件给升级咯,可是现在却选择了一个更简单的方法,把SUSE换成了CentOS,然后同样的问题出现了,然后,我又回到了Ubuntu的怀抱。

从各种网站上面是各种搜索,只是为了想知道,到底CentOS、Suse与Ubuntu哪一个发行版做服务器更好,最后的结果是没有人能告诉我一个确切的答案,公说公有理,婆说婆有理,索性,咱回到业务的出发点,不就是为了要一台服务器么,只要能实现我的需求,那就行,然后在各种比较之后,我还是选择了最易用的Ubuntu 12.04 LTS,然后,再一次开始这个环境的安装与配置。

安装 Nginx、MySQL、PHP

如果想运行最新版本的Nginx(版本一般会高于Ubuntu官方的),需要先运行下面两行命令:

aptitude install python-software-properties
add-apt-repository ppa:nginx/stable

直接运行下面整段命令即可完成所有必须软件的安装,对于PHP,我还安装了一些功能库:

apt-get update
apt-get upgrade
apt-get install nginx mysql-client mysql-server memcached php5-common php5-dev php5-cgi php5-fpm php-apc php5-mysql php5-pgsql php5-sqlite php5-curl php5-gd php5-intl php-pear php5-mcrypt php5-memcache php5-ming php5-recode php5-tidy php5-xmlrpc php5-xsl php5-mcrypt php5-imap
注意:安装过程中,需要输入 MySQL 服务器 root 用户的密码。

安装完成之后,各服务就会自动启动了,直接访问服务器的IP即可访问,各配置文件分别保存在:

  • /etc/php5/fpm/php.ini
  • /etc/nginx/

这些目录下。

建议

  1. 将PHP-FPM 默认监听的 127.0.0.1:9000 改成了 /var/run/php5-fpm.sock,改了之后,需要把 nginx.conf 添加以下代码片段:

    upstream php {

      server unix:/var/run/php5-fpm.sock;

    }

  2. 我的 nginx 虚拟机路径都被设置为 /home/www/PRIMARY_DOMAIN_NAME/public ,需要把 PRIMARY_DOMAIN_NAME 修改成为虚拟主机主域名。

本文将告诉你如何使用 HomeBrew 在Mac OS X上安装 PHP、MySQL与Nginx环境。

安装 PHP5.6 (带FPM)

搜索 PHP FormulasFormulas 就像 Apititude 里面的包一样)。

brew search php

这会返回一个很长的列表,包括了 5.2/5.3/5.4/5.5/5.6 等等的,我们这里就安装最新版本的 5.6

brew tap josegonzalez/php
brew tap homebrew/dupes

这里需要注意,如果你不安装 homebrew/dupes,你将得到下面这样的错误信息:

   `No available formula for zlib.`

在安装 PHP 5.6 之前,我们可以先看看它的安装配置,使用下面这个命令:

brew options php56

我们再按下面这个配置安装它:

brew install php56 --with-fpm --with-imap --without-apache --with-debug

在一个很漫长的等待之后,我们可以使用 php -vphp-fpm -v 来查看安装是否成功以及安装的软件的版本。

添加 PHP-FPM 为系统启动项

你可以在 /usr/local/Cellar/php56/ 目录中查看其 plist 文件。

安装 MySQL

使用下面命令安装

brew install mysql --enable-debug

安装完成之后使用下面命令进行一次MySQL 的安装设置:

mysql_secure_installation

安装 Nginx

brew install nginx

今天由智者科技运营的智者教学平台正式上线了,使用的是开源的在线学习系统——Moodle,我们的服务器使用的是 Nginx ,Moodle 的配置文件如下:

server {
    listen 80;
    server_name school.ofsz.com;
    autoindex on;
    root /srv/sites/school.ofsz.com/public;
    error_log /srv/logs/school.ofsz.com.error.log;
    access_log /srv/logs/school.ofsz.com.access.log;
    index index.php index.html index.htm;
    location ~ \.php {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        fastcgi_param  PATH_INFO      $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED    $document_root$fastcgi_path_info;
     
        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;
     
        fastcgi_param  SCRIPT_NAME    $fastcgi_script_name;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  REQUEST_URI    $request_uri;
        fastcgi_param  DOCUMENT_URI       $document_uri;
        fastcgi_param  DOCUMENT_ROOT      $document_root;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;
     
        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx;
     
        fastcgi_param  REMOTE_ADDR    $remote_addr;
        fastcgi_param  REMOTE_PORT    $remote_port;
        fastcgi_param  SERVER_ADDR    $server_addr;
        fastcgi_param  SERVER_PORT    $server_port;
        fastcgi_param  SERVER_NAME    $server_name;
     
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index  index.php;
    }


    location / {
        try_files $uri $uri/ /index.html;
    }

}

GitLab,是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。

它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。

系统需求与安装前的准备

操作系统

Gitlab 官方提供支持的操作系统有:

  • Ubuntu Linux
  • Debian/GNU Linux

需要给官方支付费用而支持的操作系统有:

  • Red Hat Enterprise Linux (RHEL)
  • CentOS
  • Oracle Linux

官方不提供支持,但是可以已经得到第三方支持的操作系统有:

  • Arch Linux
  • Fedora
  • Gentoo

其它的如 FreeBSD 、Mac OS X等操作系统现在已经有成功配置的案例了,但是在BSD或者Unix系统上的安装配置流程相当的繁琐,如果你确定要在这些操作系统上面安装的话,请一定要做好耐心的准备。

Ruby

GitLab 是基于 Ruby on Rails 开发的程序,至本文撰写止(2014/01/12),GitLab最新版本要求Ruby 的版本达到 1.9.3 或者 2.0+ ,对于类似 JRuby 或者 Rubinius 等非原生的 Ruby 版本,也有安装成功的案例,但是同样需要你做大量的工作,因为 GitLab 使用了大量的原生 Gem。

硬件要求

CPU 要求

  • __100__用户以下,单核心CPU即可满足要求
  • 超过__100__用户,推荐至少使用双核心CPU
  • 超过__1000__用户,推荐至少使用4核心CPU
  • 超过__10000__用户,推荐至少使用8核心CPU

内存要求

  • GitLab最低要求(运行缓慢) 512MB 内存,同时还需要 250MB swap
  • 768MB 的内存能保证 GitLab 刚刚可以以正常的速度运行,但是不推荐
  • 1GB 内存 + 250MB swap 可以支持约100个用户的使用
  • 2GB 内存可以支持约1000名用户的使用
  • 4GB 内存可以支持约 10000名用户的使用

存储

可用存储空间的大小最终取决于你的项目大小与多少,但是要GitLab正常使用,你至少需要保证可用磁盘空间是你项目所占用空间的两倍,考虑到Git是一个只增不减的体系,所以建议你对磁盘使用LVM架构,以方便后期增加更多的磁盘。

依赖包

在Debian中, sudo 默认是没有安装的,这需要你手工安装,然后更新并升级系统至最新版本(以 root 帐户运行):

apt-get update -y
apt-get upgrade -y
apt-get install sudo -y

在整个 GitLab 的安装过程中,有一些文件需要编辑,所以你还需要带一个你熟悉的编辑器,比如你习惯使用 vim ,那么可以使用下面的命令安装它(安装并设置为默认编辑器):

sudo apt-get install -y vim
sudo update-alternatives --set editor /usr/bin/vim.basic

接下来安装必要的依赖包:

sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl openssh-server redis-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev logrotate

安装成功之后,我们需要您确定安装了正确的 Python 版本(要求 Python 2.5+3.0 还没有被支持):

sudo apt-get install -y python
python --version
sudo apt-get install -y python2.7
python2 --version
sudo ln -s /usr/bin/python /usr/bin/python2
sudo apt-get install -y python-docutils

确定你的系统上已经安装了正确版本的 Git (GitLab要求Git的版本为 1.7.10 或者更高,比如 1.7.12 或者 1.8.4):

sudo apt-get install -y git-core
git --version

如果系统上安装的Git版本过低,请按下面的操作移除老版本的 Git ,并安装新版本的:

sudo apt-get remove git-core
sudo apt-get install -y libcurl4-openssl-dev libexpat1-dev gettext libz-dev libssl-dev build-essential
cd /tmp
curl --progress https://git-core.googlecode.com/files/git-1.8.4.1.tar.gz | tar xz
cd git-1.8.4.1/
make prefix=/usr/local all
sudo make prefix=/usr/local install

注意: ,如果要让系统可以接收邮件通知,你需要安装一个邮件服务器,默认的,不管是 Ubuntu 还是 Debian 都没有提供这样的软件,如果你需要安装,推荐你使用Postfix,你可以使用下面的命令它:

sudo apt-get install -y postfix

Ruby

移除老版本的 Ruby 1.8(如果存在的话):

sudo apt-get remove ruby1.8

下载并安装新的Ruby:

mkdir /tmp/ruby && cd /tmp/ruby
curl --progress ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p353.tar.gz | tar xz
cd ruby-2.0.0-p353
./configure --disable-install-rdoc
make
sudo make install

然后安装 Bundler Gem:

sudo gem install bundler --no-ri --no-rdoc

系统用户

创建一个名为 git 的系统用户,GitLab 将以它来运行:

sudo adduser --disabled-login --gecos 'GitLab' git

GitLab shell

GitLab Shell 是专门为 GitLab 开发的用来进行SSH访问与项目仓库管理的软件,我们通过下面的方式安装它:

# 进入Git的家目录
cd /home/git
# 克隆GitLab Shell
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-shell.git -b v1.8.0
cd gitlab-shell
sudo -u git -H cp config.yml.example config.yml

# 编辑配置文件,修改 gitlab_url 
# 比如: 'http://git.ofsz.com/'
sudo -u git -H editor config.yml

# 安装
sudo -u git -H ./bin/install

数据库

GitLab 支持以下数据库:

  • MySQL
  • PostgreSQL

你可以任选其一为 GitLab 使用,它们的配置方式如下:

使用 MySQL

# 如果服务器上还没有安装 MySQL,使用下面这一行命令安装它
sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev

# 运行MySQL安全安装脚本,为数据库 root 帐户设置一个密码
# 然后再一次输入你设置的密码以验证其正确性
sudo mysql_secure_installation

# 以 root 身份登陆数据库
mysql -u root -p

# 为 GitLab 创建一个新的用户
# 在运行下面的命令时,请将 $password 修改成为你真正的密码
mysql> CREATE USER 'git'@'localhost' IDENTIFIED BY '$password';

# 数据GitLab的产品环境数据库
mysql> CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;

# 为 Gitlab 的数据库用户设定必须的权限
mysql> GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'git'@'localhost';

# 退出MySQL
mysql> \q

# 尝试连接
sudo -u git -H mysql -u git -p -D gitlabhq_production

# 如果你看到下面这样的提示符则表示你的数据库配置是正确的
mysql> \q

# 现在可以进入GitLab的下一步安装了

使用PostgreSQL

# 如果服务器还没有安装 PostgreSQL,使用下面的命令安装
sudo apt-get install -y postgresql-9.1 postgresql-client libpq-dev

# 登陆至 PostgreSQL
sudo -u postgres psql -d template1

# 创建一个Gitlab使用的PostgreSQL用户
template1=# CREATE USER git;

# 创建GitLab使用的数据库,并为用户设定必须的权限
template1=# CREATE DATABASE gitlabhq_production OWNER git;

# 退出PostgreSQL命令行
template1=# \q

# 尝试连接是否正确
sudo -u git -H psql -d gitlabhq_production

GitLab

我们可以将 GitLab 安装至使用一个你想安装的目录下,推荐你安装在 /home/git/ 目录:

cd /home/git

克隆 GitLab 源代码

# 克 GitLab 代码
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 6-4-stable gitlab

# 进入 Gitlab 目录
cd /home/git/gitlab

配置 GitLab

cd /home/git/gitlab

# 复制 Gitlab 的示例配置文件
sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml

# 注意修改 `localhost` 至你真正的域名
# 如果你是从 Git 源代码安装的 Git,请修改 bin_path 至 /usr/local/bin/git
sudo -u git -H editor config/gitlab.yml

# 确定 Gitlab 可以写入 log/ 与 tmp/ 目录
sudo chown -R git log/
sudo chown -R git tmp/
sudo chmod -R u+rwX  log/
sudo chmod -R u+rwX  tmp/

# 为 satellites 创建目录
sudo -u git -H mkdir /home/git/gitlab-satellites

# 为 sockets/pids 创建目录,并且确定 GitLab 可以写入这些目录
sudo -u git -H mkdir tmp/pids/
sudo -u git -H mkdir tmp/sockets/
sudo chmod -R u+rwX  tmp/pids/
sudo chmod -R u+rwX  tmp/sockets/

# 创建 public/uploads 目录
sudo -u git -H mkdir public/uploads
sudo chmod -R u+rwX  public/uploads

# 复制 Unicorn 示例配置文件
sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb

# 开启集群模式,如果你需要一个支持高并发量的GitLab应用
# 比如在 2GB 内存的服务器上可以修改为 3
sudo -u git -H editor config/unicorn.rb

# 复制示例的 Rack attack 配置文件
sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb

# 配置 git 用户的全局设置,这对于你通过Web编辑的时候是十分有用的
# 编辑 user.email 为你在 gitlab.yml 中设置的邮箱地址
sudo -u git -H git config --global user.name "GitLab"
sudo -u git -H git config --global user.email "gitlab@localhost"
sudo -u git -H git config --global core.autocrlf input

__重要提示__: 确定 gitlab.ymlunicorn.rb 中的配置都是一样的。

配置 GitLab 数据库设置

使用 MySQL 数据库

sudo -u git cp config/database.yml.mysql config/database.yml
sudo -u git -H editor config/database.yml

使用 PostgreSQL 数据库

sudo -u git cp config/database.yml.postgresql config/database.yml
sudo -u git -H chmod o-rwx config/database.yml

安装 Gems

cd /home/git/gitlab

# 使用 MySQL 数据库
sudo -u git -H bundle install --deployment --without development test postgres aws

# 使用 PostgreSQL
sudo -u git -H bundle install --deployment --without development test mysql aws

在这一步骤中,如果出现以下错误:

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

很有可能是 MySQL 的开发包不存在,使用下面的命令安装一般都能解决问题:

sudo apt-get install mysql-client libmysqlclient-dev

初始化数据库,并激活高级功能

sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production

脚本运行完成之后,会得到如下的登陆帐户与密码:

login.........admin@local.host
password......5iveL!fe

安装 Init 脚本

下载 init 脚本(保存至 /etc/init.d/gitlab):

sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
sudo cp lib/support/init.d/gitlab.default.example /etc/default/gitlab

让 GitLab 随系统启动而启动:

sudo update-rc.d gitlab defaults 21

设置 Logrotate

sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab

检测应用状态

sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production

启动 GitLab 实例

sudo service gitlab start
# 或者
sudo /etc/init.d/gitlab restart

编辑静态文件

sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production

Nginx

Nginx 默认受GitLab官方支持。

安装 Nginx

如果你还没有安装 Nginx,可以使用以下命令直接安装它:

sudo apt-get install -y nginx

网站配置

下载 Nginx 默认配置文件

sudo cp lib/support/nginx/gitlab /etc/nginx/sites-available/git.ofsz.com
sudo ln -s /etc/nginx/sites-available/git.ofsz.com /etc/nginx/sites-enabled/git.ofsz.com

编辑 配置文件以使得它符合你的配置

sudo editor /etc/nginx/sites-available/git.ofsz.com

重启Nginx

sudo service nginx restart

完成

至现在为止,所有的安装已经完成,我们使用下面命令再一次检测安装运行环境是否正确:

sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production

初始化登陆

登陆你设置的网络地址,使用下面的用户名与密码登陆:

admin@local.host
5iveL!fe

登陆成功之后,请立马访问你的个人资料页面修改这些信息。

说明

关于智者科技

智者科技是一家专业从事于基于最选进的互联网技术的一站式解决方案供应商,我们向客户提供网站建设、SEO优化、移动应用开发、电子商务平台开发、品牌网站建设、微信二次开发等。

智者的每一位成员都有着超过五年的行业从业经验,或是来自大型企业的优秀设计师,或是在行业内有很高名望的怪才,我们因爱好而组合到一起,我们的理想是在这杂乱无章的互联网技术环境下,为企业带来真正能提升自身品牌形象、帮助自身成长的互联网产品。

联系方式

  • 网站地址:http://www.ofsz.com
  • 电话号码:18374888188 / 13973333488
  • QQ号码:54778899 / 425602
  • 邮箱地址:54778899 [at] qq.com

PhoneGap是一个用基于HTML,CSS和JavaScript的,创建移动跨平台移动应用程序的快速开发平台。它使开发者能够利用iPhone,Android,Palm,Symbian,WP7,Bada和Blackberry智能手机的核心功能——包括地理定位,加速器,联系人,声音和振动等,此外PhoneGap拥有丰富的插件,可以以此扩展无限的功能。

本文介绍的方法是一个用来创建简单的手机应用的PhoneGap简单实现,其步骤为:

  1. 创建类似为App的手机网页(这个就是把网页做得和手机应用的风格差不多,为的是给人的感觉是这个是个应用即可) 创建一个引导页
  2. index.html ,打开该文件可以直接跳转到手机网页即可 在 PhoneGap 上面注册个应用,上传包文件即可创建
  3. 手机网站本文就不再阐述了,index.html 文件的代码如下:
    <!DOCTYPE html>
    <html lang="zh-CN">
        <head>
            <meta charset="utf-8" />
            <title>Sage Wind · PhoneGap App</title>
            <meta http-equiv="refresh" content="5;http://wind.ofsz.com" />
        </head>
        <body>
        </body>
    </html>

上面这段HTML代码的作用其实很简单,就是打开该文件之后,不作任何的待立马跳转至 http://wind.ofsz.com 这个网址,然后把这个文件放在一个空的名为 www 的目录下,再把 www 整个目录打包成为一个www.zip文件。 到这一步之后,我们剩下的工作就全部得在PhoneGap的Build网站上进行了,打开 http://build.phonegap.com/ 网页,注册一个新的帐户,如下图所示,点击网页右上角的 Register 链接:选择 completely Free。

PhoneGap Choose You Plan.jpg

然后选择 AdobeID,如果你已经有了AdobeID,那么这里直接登陆即可,如果没有,需要重新注册一个新的,注册表单如下:

  • Adobe ID (Email Address) -- 填写Adobe ID,也就是你以后使用的帐号,是一个邮箱地址
  • Password 与 Retype Password -- 你的密码
  • First Name 与 Last Name 你的名和姓
  • Country/Region 是你的国家或者地区

填写完成之后,点击Create即可创建成功,登陆成功之后会进入下面这个页面:

Start Building an App.jpg

这里我们可以直接把 Github 上面的项目地址复制到这里,但是这不简单,看到右边有一个 Upload a .zip file,还记得我们前面的那个 www.zip 文件的话,就知道了下一步该怎么做了,点击这个按钮,上传前面的 www.zip 文件,跳转到下面这个网页:

PG Build App.jpg

这里,我们需要填写App的名称以及介绍,还可以设置App的图标,如下是我填写的信息:

Build App Sage Wind.jpg

点击右下方的 Ready to Build 按钮,即可跳转到Sage Wind页面,我们会看到如下页面:

Sage Wind App Pending.jpg

这个页面所展示的信息包括:

  • 当前这个App使用的PhoneGap版本
  • App ID与App版本
  • App的所有者等等

通过此页面,即可直接下载App的打包文件,iOS 的的在提供iOS sign key 之前是无法打包的,但是其它的系统一般都是可以使用的,通过上面的操作,我现在下载打好包的应用,只需要点击每一系统右侧的那个下载链接即可,本文至此为止创建的App包可以点击下面这个下载链接下载:

SageWindAppStarter.zip

接下来我这里不再上传除Android系统之外的其它版本,反正都一样。

到现在为止我们的应用只是可以跑通而已,点击上面截图中的 Settings 标签页,还可以对应用进行设置,设置分为 Basic 与 Configuration,前者就是我们在创建完这个应用时候的设置,页下面的Configuration如下图所示:

PhoneGap App Configuration.jpg

我的设置如下:

PhoneGap App Configuration Wind.jpg

修改配置之后需要重新构建应用,点击应用下方的 Rebuild all 按钮即可生成新的应用:

SageWind-debug-Concifugrated.zip

前段时间从某个网站上面整了好多的商业程序(破解的),然后在自己的本地测试着,昨天晚上玩到 ThinkSNS,十分强大,十分不错啊,不过是商业软件,对于这种收费的东西,我一般都是不会有什么好感的,好在系统确实很好用,所以就还是喜欢了一把,关键在于,我在玩ThinkSNS 的过程中,不知如何的跑到了某个网站上面去,一看特别喜欢,就往下翻,一看———— Powered By PHPWind。

立马就去了 PHPWind 官网,一看,这算是从我上次看PHPWind以来的一次大改版吧,这种系统的程序与界面的设计风格是正合我意的,所以,把我的智者清风(社区)就搭上了,我以前是没有使用过PHPWind的,不过这个晚上因为有了PHPWind的初始体验,感觉很爽,这不,一下子就整到快凌晨六点了。

智者清风社区首页截图

从此再也不用去对着Discuz审美疲劳了,有可能很多朋友会认为PHPWind与Discuz都是同样的臃肿,但是至少对于我这个初级用户来讲,PHPWind之于Discuz就像Typecho之于WordPress,我更喜欢的是前者,因为它能满足我几乎所有需求,同时没有给我提供我不需要的功能,最主要的是,它的使用足够的合理和简单。

至少它有什么功能,我这里也不知道多说,大家可以直接移步我的 智者清风社区 即可,基本功能和Discuz相似,只是我这里需要讲的是,它的功能实现比Discuz优雅得多。

它的导航条与论坛列表页,这种方式是现在流行的,也是我最喜欢的,而在Discuz中,整个头部显得太过于臃肿,加上其模板系统的复杂,改起来都不方便。

PHPWind Forum List.jpg

顶部的导航条最右侧一个一直存在的 发贴 按钮很是方便,让整个论坛的会员在任何时候都可以快速的发布新的贴子。

PHPWind New Topics Button.jpg

前台的其它功能也不多说了,再说一个我最喜欢的就是那个很牛B的界面设计器,这个在Discuz里面也有,不过不知道怎么滴,更喜欢PHPWind的一些:

PHPWind Apperence Designer.jpg

后台的话也是直接带了云平台:

PHPWind Cloud Platform Apps Center.jpg

更多其它的特性欢迎大家访问 智者清风社区 了解,这个社区是智者科技一直要运营的一个技术交流与优质资源分享的网站,在这里面你将来将可以享受到价格数十万元的优质资源。

所谓外贸公司,就是拥有自营进出口权的贸易公司。最近正好要做一些涉及这方面的事情,所以就在网上找了些个资料,整理了一下下,开一家外贸公司的流程大概如下:

一、公司成立

  1. 租好办公室。
  2. 想好公司的名字,到工商局名称核准(市级到市工商局,省级到省工商局),到工商局领表,填表,并按. 3. 规定准备材料,主要是股东身份证复印件、授权书、简历等,很简单。
  3. 拿到名称核准通知书后,到银行开立临时账户,将注册资金打进去。
  4. 拿到名称核准通知书后,到银行开立临时账户,将注册资金打进去。
  5. 拿到名称核准通知书后,到银行开立临时账户,将注册资金打进去。
  6. 找一会计师事务所,出验资报告。
  7. 拿到名称核准通知书后,到银行开立临时账户,将注册资金打进去。
  8. 拿到验资报告后,到工商局办理营业执照。
  9. 拿到名称核准通知书后,到银行开立临时账户,将注册资金打进去。
  10. 到技术监督局办理代码证及IC卡。
  11. 拿到名称核准通知书后,到银行开立临时账户,将注册资金打进去。
  12. 到国税、地税办理税务证并申请一般纳税人资格。
  13. 拿到名称核准通知书后,到银行开立临时账户,将注册资金打进去。
  14. 公司成立

二、办理进出口经营权。

  1. 网上申请进出口经营权资格,提交后按要求准备材料交到区外经委,转市外经委,转省外经委批准,取得2. 进出口经营资格。
  2. 到工商局作经营范围变更。
  3. 到税务局作经营范围变更。
  4. 到当地海关备案。
  5. 到外汇管理局办理进、出口核销登记并开立美元帐户。
  6. 盗税局办理退税登记,领取退税证。
  7. 你电子口岸登记,先到技术监督局审核盖章,再到工商局审核盖章,再到税务局审核盖章,再到海关领取操作系统、读卡器、IC卡等。再拿IC卡到外经委、外汇管理局办理IC卡备案,到海关备案,到电信局买17999上网卡。
  8. 到进出口检验检疫局办理登记,申请产地证、普惠制产地证注册。
  9. 在网上申请核销单,再到外汇管理局买核销单。
  10. 到海关买报关单。
  11. 可以开展业务了。

三、需要准备的材料

其间需准备的材料种类繁多,公章无数,最好将各种证件原件、公章带在身边,并复印无数证件,我就把需准备的材料简述一下:

认定增值税一般纳税人

  • 《申请办理增值税一般纳税人的报告》
  • 《营业执照》(副本)复印件
  • 《税务登记证》(副本)复印件
  • 《银行开户许可证》复印件
  • 经营场所产权证明或房屋租赁合同复印件
  • 企业法人、经办人、办税人员和主要财务人员身份证复印件,以及年检合格的主要财务人员《会计证》复印件,以上人员非本市人口需提供《暂住人口居住证明》
  • 《专用发票保管措施情况说明〉
  • 《财务核算办法》和《专用发票使用、保管制度》
  • 保险柜的发票复印件
  • 固定电话的安装及交纳话费的发票复印件
  • 所需其他材料

海关注册

  • 企业基本情况登记表(向海关申领)
  • 《营业执照》复印件
  • 《税务登记证》复印件
  • 《银行开户许可证》复印件
  • 经营场所产权证明或房屋租赁合同复印件
  • 《进出口经营资格证书》
  • 董事会成员名单、委任书、身份证及个人简历
  • 财务制度、帐薄设置情况、财务人员名单
  • 《全国组织机构代码证》
  • 报关专用章、法人章
  • 管理人员情况登记表(法人代表、主管会计师各一份)

申请进出口经营权

  • 企业申请书
  • 《进出口经营资格盛情表》(网上申报并打印)
  • 《营业执照》复印件
  • 《税务登记证》复印件
  • 《全国组织机构代码证》
  • 法定代表人身份证复印件
  • 验资报告复印件

退税登记

  • 《营业执照》复印件
  • 《一般纳税人资格认定证书》
  • 《税务登记证》复印件
  • 《银行开户许可证》复印件
  • 《企业报关注册登记证明书》
  • 《进出口经营资格证书》
  • 《全国组织机构代码证
  • 《企业出口退(免)税登记申请书》
  • 《公司章程》
  • 法定代表人急办税员身份证复印件
  • 授权书
  • 其他材料

外贸公司可以同时做国内的生意,就是没有退税而已。

Sublime Text 是一款支持OS X、Windows、Linux等各种平台的代码编辑器,它支持但不限于 C, C++, C#, CSS, D, Erlang, HTML, Groovy, Haskell, HTML, Java, JavaScript, LaTeX, Lisp, Lua, Markdown, Matlab, OCaml, Perl, PHP, Python, R, Ruby, SQL, TCL, Textile and XML 等主流编程语言的语法高亮,除此之外,还提供了只有你想不到没有它做不到的太多强大的功能,作为一个Sublime Text 的忠实用户,我将它推荐给每一个和我一样每天劳作在电脑面前的码农们。

Sublime Text 2 软件界面截图

代码编辑器或者文本编辑器,对于程序员来说,就像剑与战士一样,谁都想拥有一把可以随心驾驭且锋利无比的宝剑,而每一位程序员,同样会去追求最适合自己的强大、灵活的编辑器,相信你和我一样,都不会例外。本人用过的代码编辑工具很多,从入门时用了不到一个月的DreamWeaver再到后来包括现在某些时候也还在使用的NotePad++,还有VIM、EMacs、BBEdit、Coda……不管曾经用过什么神器,最终的结果都是(至少在新的神器出现之前)以Sublime Text 为终点。

Sublime Text 现在还处于更新的频繁期,而且 Sublime Text 3的测试版也都已经出来了,其官方网站地址是:http://www.sublimetext.com/,通过官方网站就可以下载到任何一个适合你的操作系统的版本,而且 Sublime Text 2 与 Sublime Text 3可以同时下载得到。

Sublime Text 本身是一个收费软件,价格对于用导了盗版的我们来说真不地道:

1 license: USD $70
10+ licenses: USD $60 / license
25+ licenses: USD $55 / license
50+ licenses: USD $50 / license

我购买的时候还只是 $59,其实算算,和其功能比较一下,这个价格其实并不算贵,当然了,如果不想用盗版(其实这个软件真心没有盗版的必要),也不想花钱,你下载安装就可以使用,只不过有一个很不高频率会提醒你还木有购买,完全不会影响它的使用。

软件及其包管理工具安装

Sublime Text 的优点并不仅限于它本身的功能,而在于它还有一个强大的插件体系,在我们安装完成Sublime Text 之后,打开软件,按下 Ctrl + ~ 键(反引号键) 即可开启命令行工具,然后按你安装的版本复制下面的代码至命令行工具中并点击回车运行它。

Sublime Text 2 包管理器安装脚本

import urllib2,os; pf='Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler( ))); open( os.path.join( ipp, pf), 'wb' ).write( urllib2.urlopen( 'http://sublime.wbond.net/' +pf.replace( ' ','%20' )).read()); print( 'Please restart Sublime Text to finish installation')

Sublime Text 3 包管理器安装脚本

import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())

安装完成之后,你需要重启 Sublime Text 才能使安装生效。为了方便你搜索、查找插件,你可以直接访问 https://sublime.wbond.net/browse 网站。

手工安装包管理器

如果在为某些变态的原因,命令行工具无法成功安装包管理器,你还可以手工安装:

  1. 点击 Preferences » Browse Packages... 菜单,这会打开包存储目录;
  2. Packages 目录的父文件夹中,有一个名为 Installed Packages 目录,进入 Installed Packages 目录;
  3. 下载 Package Control.sublime-package 包,然后移动至 Installed Packages/ 目录下;
  4. 重启 Sublime Text 即可。

初步窥探 Sublime Text

Sublime Text 的使用

Sublime Text 本身就只是一个编辑器而已,所以使用它,无非就是打开它,创建新文件,然后输入即可,基本的快捷键与其它的编辑器类似,都属于系统黑夜的,比如 Ctrl + S 是保存等等。

创建一个新项目

在 Sublime Text 中,一个项目就是一个文件夹,创建方式也很简单:

  1. 在电脑上创建一个新的文件夹
  2. 把这个文件夹拖动到 Sublime Text 程序界面(在OS X下可以直接拖动到图标上)即可创建一个新的项目

一个Sublime Text 进程可以同时打开多个文件夹,也就是可以创建多个项目,但是对于新建的文件默认都会保存在第一个项目中,也就是左侧文件夹目录最上面的那一个目录中。

Goto Anything

Goto Anything

呃,这个名头可真不小,在 Sublime Text 里面有一个小神器,就叫作 Goto Anything,它能带你随心所欲地进入任何你想进入的地方,使用起来也是十分的简单,几个快捷键即可搞定所有。

Command+P 之所以被叫做 Goto Anything 并不是虚名:

  • Command+P 可以快速跳转到当前项目中的任意文件,可进行关键词匹配。
  • Command+P@ (或是Command+R)可以快速列出/跳转到某个函数(很爽的是在 markdown 当中是匹配到标题,而且还是带缩进的!)。
  • Command+P# 可以在当前文件中进行搜索。
  • Command+P: (或是Ctrl+G)加上数字可以跳转到相应的行。
  • 而更酷的是你可以用 Command+P 加上一些关键词跳转到某个文件同时加上 @ 来列出/跳转到目标文件中的某个函数,或是同时加上 # 来在目标文件中进行搜索,或是同时加上 : 和数字来跳转到目标文件中相应的行。

深入了解 Sublime Text

自带快捷键

  • 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+上下键,可替换行

不得不用的插件

ZenCoding
: 不得不用的一款前端开发方面的插件,Write less , show more.安装后可直接使用,Tab键触发,Alt+Shift+W是个代码机器。

Alignment
: 代码对齐,如写几个变量,选中这几行,Ctrl+Alt+A,哇,齐了。

Prefixr
: 写 CSS可自动添加 -webkit 等私有词缀,Ctrl+Alt+X触发。

Tag
: Html格式化,右键Auto-Format Tags on Ducument。

Clipboard History
: 剪贴板历史记录,显示更多历史复制,Ctrl+Shift+V触发。

SideBarEnhancements
: 侧栏右键功能增强,非常实用

Theme – Soda
: 完美的编码主题,用过的都说好,Setting user里面添加”theme”: “Soda Dark.sublime-theme”

GBK to UTF8
: 将文件编码从GBK转黄成UTF8,菜单 – File里面找

SFTP
: 直接编辑 FTP 或 SFTP 服务器上的文件,绝对FTP浮云

WordPress
: 集成一些WordPress的函数,对于像我这种经常要写WP模版和插件的人特别有用

PHPTidy
: 整理排版PHP代码

YUI Compressor
: 压缩JS和CSS文件

有史以来最强大的开源内容管理系统 Drupal,有史以来最简单的应用开发框架 Phonegap(或者称之为 Cordova),当这两者相遇,就有了这强大的 DrupalGap

首先,我是一名忠实的Drupal用户,虽然Drupal很多时候让我很苦恼,但是我从来没有打算放弃过它,因为它在别的东西都解决不了问题的时候,总能帮我更快的解决,而PhoneGap(开源版本为 Cordova)我才用没到一年,但是已经感觉到,在一般的应用中,它能给我们带来更快的开发效率,虽然运行效率是差了一点点,不如原生态的,但是,对于一般的小项目,在这开发效率与运行效率之间,它能取得一个很好的平衡,这就已经完全满足我的要求了,最主要的是,HTML5+CSS3太强大了,现在的总是是我需要Drupal来做后端,Phonegap来实现前端,它们之间怎么联系?这就用到了一个杂交体 DrupalGap

需要完成的项目介绍

写本文的原因是最近要做一个手机端项目,项目的需求其实很简单:

  • 用户可以通过App查看湖南省所有高速公路广告牌(包括其状态,价格,位置,地图展示等)
  • 管理者有一个很方便使用的后台管理这些广告牌资源
  • 管理者可以通过登陆手机端来发布新的广告牌

其实解决方案很多,完全用不着用Drupal这么个东西,只是,为了统一整个公司的技术结构,总前想后的还是用了Drupal,这个项目的服务器端(包括管理程序)地址为:http://zhuoyue.projects.ofsz.com,你可以通过这个网址下载该应用。

安装 DrupalGap 模块

DrupalGap本身只是一个Drupal模块,该模块要求你的Drupal系统中已经安装了以下模块:

配置开发环境

PhoneGap 应用本身可以简单的认为是一个HTML5+CSS3+JavaScript实现的手机版网站,所以在电脑上开发PhoneGap应用的最合适的开发环境就是浏览器,当然,最好的选择肯定就是Chrome 莫属了,除了Chrome自身提供的各种各样的开发扩展工具外,PhoneGap还提供了一个强大的Chrome插件—— Emulate,通过该插件,我们可以在浏览器中模拟出移动终端,安装完该插件之后,我们可以开发部署DrupalGap的第二部分了—— Mobile Application Development Kit

下载 Mobile Application Development Kit ,将其解压并移动至你的Drupal站点根目录下,然后将其文件夹名称改为 mobile(除 appdrupalgap 外的任何名称都可以),现在,整个开发环境已经部署完了,但是在正式开发前,我们还需要对 Mobile Application Development Kit 进行一些简单的设置。

修改 Mobile Application Development Kit 配置

进入 Mobile Application Development Kit 中的 app 目录,将 default.settings.js 文件复制一个复本并命名为 settings.js ,打开 settings.js 文件,找到下面这一行:

drupalgap.settings.site_path = ''; // e.g. http://www.example.com

将其修改成为您的Drupal站点的路径,比如我在卓越广告这个项目中的开发站点地址是:http://zhuoyue.projects.ofsz.com,填写进去即可:

drupalgap.settings.site_path = 'http://zhuoyue.projects.ofsz.com'; // e.g. http://www.example.com

然后将 ripple.index.html 中的内容覆盖至 index.html 中,将 Phonegap的示例配置文件 config.xml 保存在应用的根目录中,在本例中我们的应用根目录是 mobile ,我们还需要为应用制作一个图标,保存为 icon.png 文件至 mobile 目录中。下面已经可以通过下面链接访问到你的应用了:

比如我的示例是:

[phonegap] : http://www.phonegap.com
[cordova] : http://cordova.apache.org
[drupalgap] : http://drupalgap.org

[ctools] : http://drupal.org/project/ctools
[libraries] : http://drupal.org/project/libraries
[oauth] : http://drupal.org/project/oauth
[services] : http://drupal.org/project/services
[views] : http://drupal.org/project/views
[views_datasource] : http://drupal.org/project/views_datasource

看看,已经有大半年没有写博客了,7月29号,去了珠峰科技 ,然后这一忙就直接忙到现在,这几天因为老婆生日,回株洲待个十天左右,有点点空余时间,所以把自己的博客重新弄了一下下,从WordPress又转移到了 Typecho 上面来,喜欢这个系统的简单,最主要的一点是,它支持纯粹的 Markdown,这比TextPattern 默认的 Textile 好得多(当然,也可以通过一些办法让其支持Markdown),而比WordPress和Drupal则简洁了太多太多。

从2008年开始的所有数据都转移了过来,同时去除了文章数据里面原有的Wordpress 标签,比如 [caption] 这种的,同时,把所有文件也都清理了一次,默认在WordPress里面插入的图片什么的,都带有类似 1200x800 这样的字符串,也全部都去除了,统一改成我上传的文件名,这样有一个好处,可以节省很多空间的开支,磁盘本身并不值钱,而是我可以少看到很多没用的文件而已。

这大半年用了很久的织梦,确实是一款不错的国产建站系统,但是有些时间,确实还是太差了,没有国外的系统开发来得简单,代码难看得要死,不过好在国人还有个 ThinkPHP 和 YII,这两个都很不错,也用这两个做过一些小项目,而现在自己最主要用的语言就是 Golang/PHP/JavaScript了,最后者主要就是 NodeJS/jQuery/Cordova三者。

很久没有写博客了,总是发现少点儿什么,从今住后,会继续再写起这博客,就算是个记录,也总比把一些日常应该记录下来的东西保存在不靠谱的电脑里面要好。

新的域名: 小人革面:_xrgm.wolfuck.com_