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 中,打包并安装测试。

一直都是用的 Ionic Framework做一些小的应用,但是最近发现,在所有的小米手机,甚至所有的 Miui 下面, Ionic Framework 的 Tabs 布局都有问题。

Screenshot_2015-01-08-04-04-22.png
Screenshot_2015-01-08-04-06-32.png

\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用户,不过最近这大半年因为公司太忙,所以也完全没有时间来关注Drupal的发展,不过今天因为一个项目的原因,得用一下Drupal,所以上官网看了一下,官网直接来了一条消息(也不知道是不是已经发出来很久了)——Drupal 8就要到来了,立马去看了一下,已经到了Alpha 7了,真快啊,赶紧下载下来瞧瞧。

QQ20131230-4.png

还记得很久以前测试的时候,Drupal 8 还一大堆的问题,现在居然可以直接使用了(我是一直都是使用最新版本软件的人,从来不会考虑什么兼容问题的)。

有史以来最强大的开源内容管理系统 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_

最终,还是没有忍住,今天新进了一个新的西数2T的移动硬盘,现在正在整理数据中,我的所有照片在这个硬盘上面会有一个全备份,差不多160Gb,电影美剧之类的,还没有看的也会转移到这个上面来,差不多1个多T,然后就是一些常用的文档了,2个T刚刚够用,省下来的电脑的磁盘空间就用来下载新的美剧电影之类的。

WP_20130524_001

昨天(2013/05/18)上午没事,开着车顺着株洲河西湘江风光带一直走了十几公里,顺路拍了些个照片,本来是很想去买一台 Fujifilm X-Pro1 的,不过我现在还在说服我自己不要去买,毕竟那可不是一笔小数目哈,只是万一没说服成功的话,那还是得去买一台,要不然,按我现在这种状态,除了买点儿自己喜欢的东西,我也实在是找不到其它的办法来安慰自己的生活了。

狗尾巴草

株洲河西的湘江风光带上面有很多狗尾巴草,而且有的地方是一大片一大片的,风一吹,那感觉很不错。

一城一船一落日

有很多这样的般,每天早上的时候它们都会靠边卖鱼。

花

而这样的花到是更多了。

河西的一排店

其实很喜欢吃这里面的东西,不过老婆不喜欢。

株洲市的绿色交通自行车

这一排一排的自行车在株洲随处可见,办一张市民卡就可以免费租借使用了,这个比北京当年搞的那个可是好得多得多,它的覆盖面已经达到了郊区。

河边的芦苇丛

刚回湖南的时候,这里的芦苇还只是一簇一簇的,而今,已经一大片一大片的了,维护得很不错,只是这几天下大雨,河水上长了好几米,这些本是河滩的地方都已经被水淹了。

株洲几桥?

这是几桥我也不知道,反正穿过株洲市区的不过十几公里的河道我所看到的就不下六座大桥,这是几桥也无从得知了。

狗尾巴草

狗尾巴草后的一片地

这已经到农村了,从一桥出发到这里已经走了十公里整,这是我回来的路上拍的。

垂钓是一种生活态度

垂钓是一种生活态度

垂钓是一种生活态度

垂钓是一种生活态度

垂钓是一种生活态度

下午回来,等着女儿3点半到株洲,还有两个小时的时间,我沿着河东也走一遭,垂钓也是一种生活态度,有的人两两成对划着小般到河中,有的一排一排排成行没着河岸,而有的,从桥上就直接放下线,有老有少,生活,本就应该如此吧?只是我们有几个现代人愿意去接受这样的生活?

今天接一朋友的需求,开发一个类似世纪佳缘的网站,找了一下,网站有现成的这种婚恋交友的程序可用,只是国产的软件都有一个通病,二次开发文档太少、技术太草(这里说的技术并不是程序本身,而是针对二次开发而言,根本就没有提供任何可用的接口之类的东西),所以最后还是只有两条路走——全新开发或者基于那个万能的Drupal,懒人的我还是选择基于Drupal,这样上线周期短得多,最主要还是因为它不会像全新开发那样Bug满天灰。

选择的现有模块有:

  • Views/CTools/Markdown Filter/Localization Update/Date / Transliteration等这些基本常用的模块
  • Private Message 模块用来完成站内信
  • geoField/Geocoder/Address Field/ China Address Field/Geofield Aliyun Map 用来实现用户的地址定位和地图展示
  • 用户的基本信息就使用Drupal 7提供的Field模块设定
  • 用户的兴趣爱好则以另外一种方式实现——Webform表单的形式,给用户看起来就是:看我参与的这些个性调查
  • Rules 这个是肯定会用到的

对于用户的信息维护和关系维护这一块儿到还是简单,最主要就是那个付费看QQ号之类的没看到哪里有过Drupal实现的案例,得研究研究。

每个人出生都是一张毫无污染的白纸;我们在人生道路上行走的过程中无意中在这张白纸上画上了:一点童真,一点任性,一点惊喜,一点浪漫,一点意外,一点刺激,一点懊悔,一点惨痛,一点寂寞,一点伤感,一点回忆,一点相思。

画在白纸人生上的那一点一点

好吧,其实我并不知道银联商务是不是国企,只是,经历了一个下午退机体验,很自然的想到这就是一标准国企式企业,呃,什么才是标准?我不知道,这个可能得问国企自己才能清楚,只是对于我来说,这已经成为了一种体制化的体验,有口难言,百闻不成,只得一见,这是一种很特别的感受,如果你曾经经历过一两次,那么当你一走进那里,就能立马感受得到这是一家什么样儿的企业。

银联商务长沙某个通知

这是贴在复印机边上的一个技术部的通知,将如何设置一个一个的截图贴着打印出来,然后旁边还有一个大大的”节约用纸“标签,算是我的错,居然没有拍进来(怕他们不让拍,所以都是藏着掩着),然后,在这个大大的节约用纸下面,眼见某位朋友把一卷还没用完的三联小票打印纸唰唰唰几下弄成下面这模样儿:

银联商务长沙节约用纸的好榜样

然后,还是漫长的等待,差不多半个小时过去了吧,除了进去有一男的问了一声干嘛的之外,就再也没有人和我们说个半句话,直到我们再一次主动去问要什么时候才能退,然后,还是那人叫我们把机器带进去,说好的要把签购单按月整理好,至少六个月的,唉,只是我拿过去的时候他看也没看,就把那一大带放一边了,问我有压金条没?我没有,问我知道什么时候办的没?我不知道,然后就开始把机器拿出袋子了。

我要退的四台刷卡机

本来还以为会作一些检查什么的,不过后来看他拿机器时的动作,我看是有戏了,根本就没看,而且是把机器直接从袋子里面倒出来的,随便摆弄了几下,就丢给仓库验收了:

银联商务长沙仓库

呃,里面机器真不少,我的已经不知去向了,不过这个效率到是很快的,然后,接下来是继续的等待,在公司里面转了几下,也随手拍了点儿公司里面的内景,很不一般哪:

中国银联商务长沙

上面这是公司的前台,从我进门到我离开没见着过一个人。

银联商务长沙退机声明

这是他们退机的统一说明,得一字不差的写出来,然后,多年没写字的我自认弱爆了,要抄四遍(一台机器写一次),我最后用十次完成,最可气的一次是多写了一个附字。

银联商务长沙某个员工的工作台

然后上面这是某位员工同志的办公桌,不见人。

银联商务长沙某个员工工作台上的植物“标本”

这个是某位古生物爱好者的办公桌上面的植物“标本”,很真识啊,连它们生长的地方一并成了永久的标本收藏。

银联商务长沙某个员工的工作台

上面这是那位标本哥(或姐或弟或妹吧)的台面。

银联商务长沙某个办公室

这是某间办公室,然后,再也没有然后了,一直到五点半,整个过程花了两个小时十五分钟,退了四台机器,取回了部分压金,然后,唯一好心情的是在长沙火车站前等红绿灯的时候看到后面的落日景色真不色,拿起手机正准备拍,发现前面已是绿灯,唉,随便整了一张,也没多想了,现在正在这里扯蛋中。

反光镜里长沙的落日

突然回想起来了,在我取钱的时候,听里面的某位工作大姐说:“看,前天取的三十万压金款,今天就有五万了!”阿弥陀佛,老天有眼哪……