情人节2019

行香子•情人节2019

柔语婉清,玉脸圆盈。颜开处、雁落城倾。妻怡夫悦,琴瑟和鸣。共万般爱、千种情、一片心。

子亥在孕,爱心无尽。语喃时、日雏月新。亲慈子孝,天地同音。愿一身劲、千山越、万里行。

行香子•情人节2009

世间蹀躞,权且抛却。无爱时、把酒对月。情深情浅,与我无缘。只在乎那、杯中物、甘与甜。

腹中万卷,怒马仗剑。铩羽似、只在红颜。酒重人浮,踉跄嗟呼。作草间花、花中蕊、蕊上蝶。

十载须臾去,嗟叹隙中驹。两时遥相应,两境情不同。

菩萨蛮•戊戌腊月二十五

菩萨蛮•戊戌腊月二十五

戊戌腊月二十五,食在西单菩提府。菌蔬烩道深,常羡出家人。

心仁道易悟,禽畜不加斧。道者不须问,雨润草木春。

七绝•找个借口享美食

七绝•找个借口享美食
戊戌腊月二十一,霜刃未成莫自唏。
且以美食慰其志,势似红日徐徐起。

今日收到年终奖,遂自惭无甚成绩,戚戚然。美食可解,因作此诗。食后坦荡荡,舒畅畅,雄赳赳,气昂昂,其效甚显。

关于WordPress的权限设置

WordPress在更新时有时会出错,多数情况下是文件权限问题。比如

“因为我们不能复制一些文件,升级未被安装。这通常是因为存在不一致的文件权限。: wp-admin/includes/update-core.php”即是文件权限的原因。

这里介绍一种方便安全的wordpress文件权限设置方法。

  • 安装wordpress及其更新时:

chown www-data:www-data -R *   # Let Apache be ownerfind .

-type d -exec chmod 755 {} \;   # Change directory permissions rwxr-xr-xfind .

-type f -exec chmod 644 {} \;   # Change file permissions rw-r--r--

  • 安装及更新完成后

chown root:root -R *          # Let your useraccount be owner

chown www-data:www-data -R wp-content # Let apache be owner of wp-content

原因在这里有详细的解释。

在Windows系统上安装WAMP[Windows/Apache/MySQL/PHP]

查看计算机的基本信息

在“控制面板-系统和安全-系统”中查看计算机的基本信息如下。

0-pc-info

下载WAMP

在如下网页可下载WAMP:https://bitnami.com/stack/wamp/installer。

1-download-wamp登录Bitnami,可选直接下载。

2-go-downloading选择下载位置,开始下载。

3-start-downloading开始安装

运行下载的安装文件,会提示有杀毒软件在运行,可能降低安装速度。

4-installing-question

傻瓜式安装,点击下一步。

5-installing-setup

选择安装的附加组件,点击下一步。

6-installing-select

选择安装目录。

7-installing-folder

设定MySQL的root用户的初始密码,一定要牢记。

8-installing-mysql-pass

同步到云端,可不选择。

9-installing-cloud

安装进行中。

10-installing-inprocess

安装完成。

12-installing-finish

运行WAMP

运行WAMP Manage Tool,可开启Apache/MySQL如下。

13-wamp-run

在VPS[Vultr,768M,CentOS6x64]上安装phpMyadmin教程

上一篇文章中我已介绍如何在VPS上搭建LAMP平台,本篇文章介绍如何安装配置phpMyAdmin。

首先,我们要了解什么是phpMyAdmin

phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web界面管理MySQL数据库。借由此Web界面可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量数据的导入及导出更为方便。其中一个更大的优势在于由于phpMyAdmin跟其他PHP程序一样在网页服务器上运行,但是您可以在任何地方使用这些程序产生的HTML页面,也就是于远程管理MySQL数据库,方便的创建、修改、删除数据库及数据表。也可借由phpMyAdmin创建常用的php语法,方便编写网页时所需要的sql语法正确性。

简单地讲,phpMyAdmin能够让我们在网页上以图形界面的形式操作数据库、查看数据库,而不必再为SQL语法所烦恼。所以说,它是一个非常好的工具,非常值得安装。

本篇文章的产生主要参考了Justin Ellingwood的一篇文章,来自digital ocean社区。

phpMyAdmin的安装同样十分简单,只需输入一句命令:yum install phpmyadmin即可。大致显示如下。

[root@vultrjp ~]# yum install phpmyadmin
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
 * base: mirrors.kernel.org
 * epel: mirrors.kernel.org
 * extras: mirrors.kernel.org
 * updates: mirrors.kernel.org
Resolving Dependencies
--> Running transaction check
---> Package phpMyAdmin.noarch 0:4.0.10.12-1.el6 will be installed
--> Processing Dependency: php-mcrypt >= 5.2.0 for package: phpMyAdmin-4.0.10.12-1.el6.noarch
--> Processing Dependency: php-mbstring >= 5.2.0 for package: phpMyAdmin-4.0.10.12-1.el6.noarch
--> Processing Dependency: php-gd >= 5.2.0 for package: phpMyAdmin-4.0.10.12-1.el6.noarch
--> Processing Dependency: php-xmlwriter for package: phpMyAdmin-4.0.10.12-1.el6.noarch
--> Processing Dependency: php-tcpdf-dejavu-sans-fonts for package: phpMyAdmin-4.0.10.12-1.el6.noarch
--> Processing Dependency: php-tcpdf for package: phpMyAdmin-4.0.10.12-1.el6.noarch
--> Processing Dependency: php-php-gettext for package: phpMyAdmin-4.0.10.12-1.el6.noarch
--> Running transaction check
---> Package php-gd.x86_64 0:5.3.3-46.el6_6 will be installed
--> Processing Dependency: libXpm.so.4()(64bit) for package: php-gd-5.3.3-46.el6_6.x86_64
---> Package php-mbstring.x86_64 0:5.3.3-46.el6_6 will be installed
---> Package php-mcrypt.x86_64 0:5.3.3-4.el6 will be installed
--> Processing Dependency: libmcrypt.so.4()(64bit) for package: php-mcrypt-5.3.3-4.el6.x86_64
---> Package php-php-gettext.noarch 0:1.0.11-12.el6 will be installed
---> Package php-tcpdf.noarch 0:6.2.11-1.el6 will be installed
--> Processing Dependency: php-tidy for package: php-tcpdf-6.2.11-1.el6.noarch
--> Processing Dependency: php-posix for package: php-tcpdf-6.2.11-1.el6.noarch
--> Processing Dependency: php-bcmath for package: php-tcpdf-6.2.11-1.el6.noarch
---> Package php-tcpdf-dejavu-sans-fonts.noarch 0:6.2.11-1.el6 will be installed
--> Processing Dependency: dejavu-sans-fonts for package: php-tcpdf-dejavu-sans-fonts-6.2.11-1.el6.noarch
---> Package php-xml.x86_64 0:5.3.3-46.el6_6 will be installed
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.24)(64bit) for package: php-xml-5.3.3-46.el6_6.x86_64
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.22)(64bit) for package: php-xml-5.3.3-46.el6_6.x86_64
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.18)(64bit) for package: php-xml-5.3.3-46.el6_6.x86_64
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.13)(64bit) for package: php-xml-5.3.3-46.el6_6.x86_64
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.11)(64bit) for package: php-xml-5.3.3-46.el6_6.x86_64
--> Processing Dependency: libxslt.so.1()(64bit) for package: php-xml-5.3.3-46.el6_6.x86_64
--> Processing Dependency: libexslt.so.0()(64bit) for package: php-xml-5.3.3-46.el6_6.x86_64
--> Running transaction check
---> Package dejavu-sans-fonts.noarch 0:2.33-1.el6 will be installed
--> Processing Dependency: dejavu-fonts-common = 2.33-1.el6 for package: dejavu-sans-fonts-2.33-1.el6.noarch
---> Package libXpm.x86_64 0:3.5.10-2.el6 will be installed
---> Package libmcrypt.x86_64 0:2.5.8-9.el6 will be installed
---> Package libxslt.x86_64 0:1.1.26-2.el6_3.1 will be installed
---> Package php-bcmath.x86_64 0:5.3.3-46.el6_6 will be installed
---> Package php-process.x86_64 0:5.3.3-46.el6_6 will be installed
---> Package php-tidy.x86_64 0:5.3.3-46.el6_6 will be installed
--> Processing Dependency: libtidy-0.99.so.0()(64bit) for package: php-tidy-5.3.3-46.el6_6.x86_64
--> Running transaction check
---> Package dejavu-fonts-common.noarch 0:2.33-1.el6 will be installed
--> Processing Dependency: fontpackages-filesystem for package: dejavu-fonts-common-2.33-1.el6.noarch
---> Package libtidy.x86_64 0:0.99.0-19.20070615.1.el6 will be installed
--> Running transaction check
---> Package fontpackages-filesystem.noarch 0:1.41-1.1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================================================================================================================================================
 Package                                                      Arch                                    Version                                                    Repository                                Size
================================================================================================================================================================================================================
Installing:
 phpMyAdmin                                                   noarch                                  4.0.10.12-1.el6                                            epel                                     4.1 M
Installing for dependencies:
 dejavu-fonts-common                                          noarch                                  2.33-1.el6                                                 base                                      63 k
 dejavu-sans-fonts                                            noarch                                  2.33-1.el6                                                 base                                     2.2 M
 fontpackages-filesystem                                      noarch                                  1.41-1.1.el6                                               base                                     8.8 k
 libXpm                                                       x86_64                                  3.5.10-2.el6                                               base                                      51 k
 libmcrypt                                                    x86_64                                  2.5.8-9.el6                                                epel                                      96 k
 libtidy                                                      x86_64                                  0.99.0-19.20070615.1.el6                                   base                                     127 k
 libxslt                                                      x86_64                                  1.1.26-2.el6_3.1                                           base                                     452 k
 php-bcmath                                                   x86_64                                  5.3.3-46.el6_6                                             updates                                   39 k
 php-gd                                                       x86_64                                  5.3.3-46.el6_6                                             updates                                  111 k
 php-mbstring                                                 x86_64                                  5.3.3-46.el6_6                                             updates                                  459 k
 php-mcrypt                                                   x86_64                                  5.3.3-4.el6                                                epel                                      19 k
 php-php-gettext                                              noarch                                  1.0.11-12.el6                                              epel                                      22 k
 php-process                                                  x86_64                                  5.3.3-46.el6_6                                             updates                                   44 k
 php-tcpdf                                                    noarch                                  6.2.11-1.el6                                               epel                                     2.7 M
 php-tcpdf-dejavu-sans-fonts                                  noarch                                  6.2.11-1.el6                                               epel                                     315 k
 php-tidy                                                     x86_64                                  5.3.3-46.el6_6                                             updates                                   40 k
 php-xml                                                      x86_64                                  5.3.3-46.el6_6                                             updates                                  107 k

Transaction Summary
================================================================================================================================================================================================================
Install      18 Package(s)

Total download size: 11 M
Installed size: 43 M
Is this ok [y/N]: y
Downloading Packages:
(1/18): dejavu-fonts-common-2.33-1.el6.noarch.rpm                                                                                                                                        |  63 kB     00:00
(2/18): dejavu-sans-fonts-2.33-1.el6.noarch.rpm                                                                                                                                          | 2.2 MB     00:00
(3/18): fontpackages-filesystem-1.41-1.1.el6.noarch.rpm                                                                                                                                  | 8.8 kB     00:00
(4/18): libXpm-3.5.10-2.el6.x86_64.rpm                                                                                                                                                   |  51 kB     00:00
(5/18): libmcrypt-2.5.8-9.el6.x86_64.rpm                                                                                                                                                 |  96 kB     00:00
(6/18): libtidy-0.99.0-19.20070615.1.el6.x86_64.rpm                                                                                                                                      | 127 kB     00:00
(7/18): libxslt-1.1.26-2.el6_3.1.x86_64.rpm                                                                                                                                              | 452 kB     00:00
(8/18): php-bcmath-5.3.3-46.el6_6.x86_64.rpm                                                                                                                                             |  39 kB     00:00
(9/18): php-gd-5.3.3-46.el6_6.x86_64.rpm                                                                                                                                                 | 111 kB     00:00
(10/18): php-mbstring-5.3.3-46.el6_6.x86_64.rpm                                                                                                                                          | 459 kB     00:00
(11/18): php-mcrypt-5.3.3-4.el6.x86_64.rpm                                                                                                                                               |  19 kB     00:00
(12/18): php-php-gettext-1.0.11-12.el6.noarch.rpm                                                                                                                                        |  22 kB     00:00
(13/18): php-process-5.3.3-46.el6_6.x86_64.rpm                                                                                                                                           |  44 kB     00:00
(14/18): php-tcpdf-6.2.11-1.el6.noarch.rpm                                                                                                                                               | 2.7 MB     00:00
(15/18): php-tcpdf-dejavu-sans-fonts-6.2.11-1.el6.noarch.rpm                                                                                                                             | 315 kB     00:00
(16/18): php-tidy-5.3.3-46.el6_6.x86_64.rpm                                                                                                                                              |  40 kB     00:00
(17/18): php-xml-5.3.3-46.el6_6.x86_64.rpm                                                                                                                                               | 107 kB     00:00
(18/18): phpMyAdmin-4.0.10.12-1.el6.noarch.rpm                                                                                                                                           | 4.1 MB     00:00
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                                           2.4 MB/s |  11 MB     00:04
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : php-mbstring-5.3.3-46.el6_6.x86_64                                                                                                                                                          1/18
  Installing : php-php-gettext-1.0.11-12.el6.noarch                                                                                                                                                        2/18
  Installing : libmcrypt-2.5.8-9.el6.x86_64                                                                                                                                                                3/18
  Installing : php-mcrypt-5.3.3-4.el6.x86_64                                                                                                                                                               4/18
  Installing : php-bcmath-5.3.3-46.el6_6.x86_64                                                                                                                                                            5/18
  Installing : libxslt-1.1.26-2.el6_3.1.x86_64                                                                                                                                                             6/18
  Installing : php-xml-5.3.3-46.el6_6.x86_64                                                                                                                                                               7/18
  Installing : php-process-5.3.3-46.el6_6.x86_64                                                                                                                                                           8/18
  Installing : libtidy-0.99.0-19.20070615.1.el6.x86_64                                                                                                                                                     9/18
  Installing : php-tidy-5.3.3-46.el6_6.x86_64                                                                                                                                                             10/18
  Installing : libXpm-3.5.10-2.el6.x86_64                                                                                                                                                                 11/18
  Installing : php-gd-5.3.3-46.el6_6.x86_64                                                                                                                                                               12/18
  Installing : php-tcpdf-6.2.11-1.el6.noarch                                                                                                                                                              13/18
  Installing : fontpackages-filesystem-1.41-1.1.el6.noarch                                                                                                                                                14/18
  Installing : dejavu-fonts-common-2.33-1.el6.noarch                                                                                                                                                      15/18
  Installing : dejavu-sans-fonts-2.33-1.el6.noarch                                                                                                                                                        16/18
  Installing : php-tcpdf-dejavu-sans-fonts-6.2.11-1.el6.noarch                                                                                                                                            17/18
  Installing : phpMyAdmin-4.0.10.12-1.el6.noarch                                                                                                                                                          18/18
  Verifying  : php-xml-5.3.3-46.el6_6.x86_64                                                                                                                                                               1/18
  Verifying  : php-tcpdf-6.2.11-1.el6.noarch                                                                                                                                                               2/18
  Verifying  : php-tcpdf-dejavu-sans-fonts-6.2.11-1.el6.noarch                                                                                                                                             3/18
  Verifying  : phpMyAdmin-4.0.10.12-1.el6.noarch                                                                                                                                                           4/18
  Verifying  : php-mcrypt-5.3.3-4.el6.x86_64                                                                                                                                                               5/18
  Verifying  : fontpackages-filesystem-1.41-1.1.el6.noarch                                                                                                                                                 6/18
  Verifying  : php-gd-5.3.3-46.el6_6.x86_64                                                                                                                                                                7/18
  Verifying  : libXpm-3.5.10-2.el6.x86_64                                                                                                                                                                  8/18
  Verifying  : libtidy-0.99.0-19.20070615.1.el6.x86_64                                                                                                                                                     9/18
  Verifying  : php-process-5.3.3-46.el6_6.x86_64                                                                                                                                                          10/18
  Verifying  : dejavu-fonts-common-2.33-1.el6.noarch                                                                                                                                                      11/18
  Verifying  : php-php-gettext-1.0.11-12.el6.noarch                                                                                                                                                       12/18
  Verifying  : php-mbstring-5.3.3-46.el6_6.x86_64                                                                                                                                                         13/18
  Verifying  : dejavu-sans-fonts-2.33-1.el6.noarch                                                                                                                                                        14/18
  Verifying  : libxslt-1.1.26-2.el6_3.1.x86_64                                                                                                                                                            15/18
  Verifying  : php-tidy-5.3.3-46.el6_6.x86_64                                                                                                                                                             16/18
  Verifying  : php-bcmath-5.3.3-46.el6_6.x86_64                                                                                                                                                           17/18
  Verifying  : libmcrypt-2.5.8-9.el6.x86_64                                                                                                                                                               18/18

Installed:
  phpMyAdmin.noarch 0:4.0.10.12-1.el6

Dependency Installed:
  dejavu-fonts-common.noarch 0:2.33-1.el6          dejavu-sans-fonts.noarch 0:2.33-1.el6              fontpackages-filesystem.noarch 0:1.41-1.1.el6              libXpm.x86_64 0:3.5.10-2.el6
  libmcrypt.x86_64 0:2.5.8-9.el6                   libtidy.x86_64 0:0.99.0-19.20070615.1.el6          libxslt.x86_64 0:1.1.26-2.el6_3.1                          php-bcmath.x86_64 0:5.3.3-46.el6_6
  php-gd.x86_64 0:5.3.3-46.el6_6                   php-mbstring.x86_64 0:5.3.3-46.el6_6               php-mcrypt.x86_64 0:5.3.3-4.el6                            php-php-gettext.noarch 0:1.0.11-12.el6
  php-process.x86_64 0:5.3.3-46.el6_6              php-tcpdf.noarch 0:6.2.11-1.el6                    php-tcpdf-dejavu-sans-fonts.noarch 0:6.2.11-1.el6          php-tidy.x86_64 0:5.3.3-46.el6_6
  php-xml.x86_64 0:5.3.3-46.el6_6

Complete!

然后我们还需配置一下phpMyAdmin,方法是输入命令:nano /etc/httpd/conf.d/phpMyAdmin.conf

这里用到了nano编辑phpMyAdmin.conf文件,现在我们应该发现,nano比vi更加好用。

phpMyAdmin.conf文件中,我们需要改动的地方分为两种:

  1. 修改ip。要将其中“127.0.0.1”形式的ip全部修改为VPS的ip。VPS的ip的查看方法之前的文章中有说明。
  2. 将“<Directory /usr/share/phpMyAdmin/>”范围内的所有“Deny from All”注释掉,注释的方法是在行前加“#”。关于这一条,如果不修改,会出现“You don’t have permission to access /phpmyadmin on this server”这样的错误,如下图,可参考此处

vultr-phpmyadmin-forbidden

以上两处改完后,保存退出phpMyAdmin.conf文件。

然后重新启动Apache即可。

这时,在浏览器中输入“VPS的ip/phpmyadmin”就能看到如下界面。

vultr-phpmyadmin-ok

然后输入之前为Mysql配置好的账号密码就可进入phpMyAdmin的界面了。

在VPS[Vultr,768M,Centos6x64]上搭建LAMP[Apache,Mysql,PHP]教程

本篇文章主要介绍如何在VPS上搭建LAMP[Apache,Mysql,PHP]。

这里用到的VPS平台是在之前一篇文章中介绍的VULTR的768M、Centos6x64、位于日本的VPS。

本篇文章主要参考了Etel Sverdlov女士的这一篇教程

1. 获得VPS初始root密码

关于如何在Vultr中部署一个VPS在前一篇文章中已经说明,这时,在个人页面MyServers标签下将会看到已经部署好的主机,如下图。

vultr-myservers

我们可以看到包括主机ip地址、位置、状态以及收费等信息。点击Manage,进入主机详细信息页面。如下图。

vultr-serverinfo

在上图中我们可以看到root用户的初始密码。

有了这个密码,我们就可以通过SSH链接VPS后台了。

2.下载安装配置SSH软件

服务器的操作一般无法在图形界面下进行,Linux系统提供了一种叫做SSH(Secure Shell)的方法,让我们可以远程以命令的方式控制服务器。

那么在我们的个人电脑上就需要一个客户端,以接受我们的控制指令的输入并显示服务器的相关信息。当然,现在也有基于Browser的SSH客户端,不过一般的,为了更好的人机交互和安全性,我们使用专用的SSH软件。

在Mac OS X系统上,由于与Linux的血缘关系,可以直接通过terminal连接服务器,其具备了OpenSSH的功能;而在Windows系统上,则需要安装专用的SSH软件。

这里我推荐MobaXterm这款软件,当然其它如PuTTY等都很好,这里有一个各种SSH软件的对比。

首先,打开MobaXterm软件,点击左上角工具栏中的Session按钮,弹出Session配置对话框,如下图。

vultr-mobaxterm-session

选择SSH标签,在对话框中填入Remote host的ip地址,如果直接用root登录,则不用勾选Specify username,点击OK按钮。

然后在主工作区就会出现命令行界面显示让输入root的密码,输入上一节中的root初始密码,即可连上服务器。如果是第一次连接服务器,会提示问是否保存密码,可以点击保存,这样以后就不需要再输入密码了。

登陆成功后如下图所示。

vultr-mobaxterm-login

建议更改root用户的密码。

方法是直接输入passwd,按提示输入原密码、新密码即可。

3.Apache

3.1 安装Apache

在安装新程序前,一般我们会先检查一下更新。

方法是输入:yum check-update

如果显示需要更新,则输入:yum update

以更新系统及全部程序。

安装Apache的方法很简单,只需输入yum install httpd即可,然后在询问是否确定安装时输入y并回车即可。

大致流程如下:

[root@vultrjp ~]# yum install httpd
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
 * base: mirrors.kernel.org
 * epel: mirrors.kernel.org
 * extras: mirrors.kernel.org
 * updates: mirrors.kernel.org
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.2.15-47.el6.centos.1 will be installed
--> Processing Dependency: httpd-tools = 2.2.15-47.el6.centos.1 for package: httpd-2.2.15-47.el6.centos.1.x86_64
--> Processing Dependency: apr-util-ldap for package: httpd-2.2.15-47.el6.centos.1.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.2.15-47.el6.centos.1.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.2.15-47.el6.centos.1.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.2.15-47.el6.centos.1.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.3.9-5.el6_2 will be installed
---> Package apr-util.x86_64 0:1.3.9-3.el6_0.1 will be installed
---> Package apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 will be installed
---> Package httpd-tools.x86_64 0:2.2.15-47.el6.centos.1 will be installed
---> Package mailcap.noarch 0:2.1.31-2.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=================================================================================================================================================================================================
 Package                                        Arch                                    Version                                                   Repository                                Size
=================================================================================================================================================================================================
Installing:
 httpd                                          x86_64                                  2.2.15-47.el6.centos.1                                    updates                                  830 k
Installing for dependencies:
 apr                                            x86_64                                  1.3.9-5.el6_2                                             base                                     123 k
 apr-util                                       x86_64                                  1.3.9-3.el6_0.1                                           base                                      87 k
 apr-util-ldap                                  x86_64                                  1.3.9-3.el6_0.1                                           base                                      15 k
 httpd-tools                                    x86_64                                  2.2.15-47.el6.centos.1                                    updates                                   77 k
 mailcap                                        noarch                                  2.1.31-2.el6                                              base                                      27 k

Transaction Summary
=================================================================================================================================================================================================
Install       6 Package(s)

Total download size: 1.1 M
Installed size: 3.6 M
Is this ok [y/N]: y
Downloading Packages:
(1/6): apr-1.3.9-5.el6_2.x86_64.rpm                                                                                                                                       | 123 kB     00:00
(2/6): apr-util-1.3.9-3.el6_0.1.x86_64.rpm                                                                                                                                |  87 kB     00:00
(3/6): apr-util-ldap-1.3.9-3.el6_0.1.x86_64.rpm                                                                                                                           |  15 kB     00:00
(4/6): httpd-2.2.15-47.el6.centos.1.x86_64.rpm                                                                                                                            | 830 kB     00:00
(5/6): httpd-tools-2.2.15-47.el6.centos.1.x86_64.rpm                                                                                                                      |  77 kB     00:00
(6/6): mailcap-2.1.31-2.el6.noarch.rpm                                                                                                                                    |  27 kB     00:00
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                            668 kB/s | 1.1 MB     00:01
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : apr-1.3.9-5.el6_2.x86_64                                                                                                                                                      1/6
  Installing : apr-util-1.3.9-3.el6_0.1.x86_64                                                                                                                                               2/6
  Installing : httpd-tools-2.2.15-47.el6.centos.1.x86_64                                                                                                                                     3/6
  Installing : apr-util-ldap-1.3.9-3.el6_0.1.x86_64                                                                                                                                          4/6
  Installing : mailcap-2.1.31-2.el6.noarch                                                                                                                                                   5/6
  Installing : httpd-2.2.15-47.el6.centos.1.x86_64                                                                                                                                           6/6
  Verifying  : httpd-tools-2.2.15-47.el6.centos.1.x86_64                                                                                                                                     1/6
  Verifying  : httpd-2.2.15-47.el6.centos.1.x86_64                                                                                                                                           2/6
  Verifying  : apr-util-ldap-1.3.9-3.el6_0.1.x86_64                                                                                                                                          3/6
  Verifying  : apr-1.3.9-5.el6_2.x86_64                                                                                                                                                      4/6
  Verifying  : mailcap-2.1.31-2.el6.noarch                                                                                                                                                   5/6
  Verifying  : apr-util-1.3.9-3.el6_0.1.x86_64                                                                                                                                               6/6

Installed:
  httpd.x86_64 0:2.2.15-47.el6.centos.1

Dependency Installed:
  apr.x86_64 0:1.3.9-5.el6_2    apr-util.x86_64 0:1.3.9-3.el6_0.1    apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1    httpd-tools.x86_64 0:2.2.15-47.el6.centos.1    mailcap.noarch 0:2.1.31-2.el6

Complete!

显示完成后Apache就安装完成了。

Apache安装好后,我们要让它运行,方法是输入service httpd start,如下。

[root@vultrjp ~]# service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for vultrjp
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]

显示OK则表示Apache已成功运行。

3.2 检验Apache是否安装好

检验的方法很简单,就是在浏览器地址栏输入VPS的ip地址即可。

使用Vultr的VPS的朋友会发现,此时在浏览器页面上显示的是类似如下的页面。

vultr-http-conecting-overtime

显示连接超时。其原因是,Vultr的VPS默认关闭了80端口,而这个80端口就是网页http协议的默认端口。

所以,我们要设法让服务器打开这一端口。

首先,我们要确定是不是真的是因为80端口被屏蔽的原因而不是其他如网络故障等等。方法是,输入:

/etc/init.d/iptables status

显示大致如下:

[root@vultrjp ~]# /etc/init.d/iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:10101010
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
6    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

我们并未发现80端口的相关信息,说明80端口的确被屏蔽了。那么,我们就要设法取消这一限制了。

方法是,在/etc/sysconfig/iptables文件中添加一行

iptables -A INPUT -p tcp -m tcp –dport 80 -j ACCEPT

具体方法是,输入

vi /etc/sysconfig/iptables

其中vi的意思是用vi这一编辑软件打开这一文件,关于如何使用vi,可参考这篇文章

再加入以上一行之后,需要重启iptables服务,以让新加内容生效,方法是输入

service iptables restart

然后再次查看iptables的状态,即可发现80端口已经可以使用,大致如下。

[root@vultrjp ~]# service iptables restart
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]

[root@vultrjp ~]# /etc/init.d/iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:10101010
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
7    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

然后我们在浏览器地址栏再次输入VPS的ip地址,则会出现让人欣喜的Apache页面,如下。

vultr-apache-install-ok

4.Mysql

4.1 安装Mysql

安装Mysql只需输入一句命令

yum install mysql-server

即可。同样会显示很多状态信息和确认信息在界面上,大致如下。

[root@vultrjp ~]# yum install mysql-server
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
 * base: mirrors.kernel.org
 * epel: mirrors.kernel.org
 * extras: mirrors.kernel.org
 * updates: mirrors.kernel.org
Package sudo-1.8.6p3-20.el6_7.x86_64 already installed and latest version
No package service available.
No package mysqld available.
No package start available.
Resolving Dependencies
--> Running transaction check
---> Package mysql-server.x86_64 0:5.1.73-5.el6_6 will be installed
--> Processing Dependency: mysql = 5.1.73-5.el6_6 for package: mysql-server-5.1.73-5.el6_6.x86_64
--> Processing Dependency: perl-DBI for package: mysql-server-5.1.73-5.el6_6.x86_64
--> Processing Dependency: perl-DBD-MySQL for package: mysql-server-5.1.73-5.el6_6.x86_64
--> Processing Dependency: perl(DBI) for package: mysql-server-5.1.73-5.el6_6.x86_64
--> Running transaction check
---> Package mysql.x86_64 0:5.1.73-5.el6_6 will be installed
---> Package perl-DBD-MySQL.x86_64 0:4.013-3.el6 will be installed
---> Package perl-DBI.x86_64 0:1.609-4.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================================================================================================================================================
 Package                                               Arch                                          Version                                                  Repository                                   Size
================================================================================================================================================================================================================
Installing:
 mysql-server                                          x86_64                                        5.1.73-5.el6_6                                           base                                        8.6 M
Installing for dependencies:
 mysql                                                 x86_64                                        5.1.73-5.el6_6                                           base                                        894 k
 perl-DBD-MySQL                                        x86_64                                        4.013-3.el6                                              base                                        134 k
 perl-DBI                                              x86_64                                        1.609-4.el6                                              base                                        705 k

Transaction Summary
================================================================================================================================================================================================================
Install       4 Package(s)

Total download size: 10 M
Installed size: 29 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): mysql-5.1.73-5.el6_6.x86_64.rpm                                                                                                                                                   | 894 kB     00:00
(2/4): mysql-server-5.1.73-5.el6_6.x86_64.rpm                                                                                                                                            | 8.6 MB     00:00
(3/4): perl-DBD-MySQL-4.013-3.el6.x86_64.rpm                                                                                                                                             | 134 kB     00:00
(4/4): perl-DBI-1.609-4.el6.x86_64.rpm                                                                                                                                                   | 705 kB     00:00
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                                           4.7 MB/s |  10 MB     00:02
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : perl-DBI-1.609-4.el6.x86_64                                                                                                                                                                  1/4
  Installing : perl-DBD-MySQL-4.013-3.el6.x86_64                                                                                                                                                            2/4
  Installing : mysql-5.1.73-5.el6_6.x86_64                                                                                                                                                                  3/4
  Installing : mysql-server-5.1.73-5.el6_6.x86_64                                                                                                                                                           4/4
  Verifying  : perl-DBD-MySQL-4.013-3.el6.x86_64                                                                                                                                                            1/4
  Verifying  : mysql-5.1.73-5.el6_6.x86_64                                                                                                                                                                  2/4
  Verifying  : mysql-server-5.1.73-5.el6_6.x86_64                                                                                                                                                           3/4
  Verifying  : perl-DBI-1.609-4.el6.x86_64                                                                                                                                                                  4/4

Installed:
  mysql-server.x86_64 0:5.1.73-5.el6_6

Dependency Installed:
  mysql.x86_64 0:5.1.73-5.el6_6                                      perl-DBD-MySQL.x86_64 0:4.013-3.el6                                      perl-DBI.x86_64 0:1.609-4.el6

Complete!

显示Complete!则说明安装完成。

同样,安装完成后我们需要启动Mysql,方法是输入

service mysqld start

即可。初次运行可能Mysql会进行一些初始化,最后会显示启动OK,大致如下。

[root@vultrjp ~]# service mysqld start
Initializing MySQL database:  WARNING: The host 'vultrjp' could not be looked up with resolveip.
This probably means that your libc libraries are not 100 % compatible
with this binary MySQL version. The MySQL daemon, mysqld, should work
normally with the exception that host name resolving will not work.
This means that you should use IP addresses instead of hostnames
when specifying MySQL privileges !
Installing MySQL system tables...
OK
Filling help tables...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h vultrjp password 'new-password'

Alternatively you can run:
/usr/bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:
cd /usr ; /usr/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd /usr/mysql-test ; perl mysql-test-run.pl

Please report any problems with the /usr/bin/mysqlbug script!

                                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

之后,我们还要进行一些配置,如设定root用户的初始密码等等,方法是输入

/usr/bin/mysql_secure_installation

命令即可。设定过程大致如下。

[root@vultrjp ~]# /usr/bin/mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

//为root设定密码吗?
Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!

By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

//删除匿名用户吗?
Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

//阻止root远程登录吗?
Disallow root login remotely? [Y/n] y
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

//移除测试用数据库和其连接吗?
Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

//重新载入设定吗?
Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...


All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

一般全部输入y(Yes)即可。直到显示“Thanks for using MySQL!”,说明配置结束。

至此Mysql安装完成。

5. PHP

5.1 安装PHP

安装php也很简单,只需输入

yum install php php-mysql

命令即可。大致显示如下。

[root@vultrjp ~]# yum install php php-mysql
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
 * base: mirrors.kernel.org
 * epel: mirrors.kernel.org
 * extras: mirrors.kernel.org
 * updates: mirrors.kernel.org
Resolving Dependencies
--> Running transaction check
---> Package php.x86_64 0:5.3.3-46.el6_6 will be installed
--> Processing Dependency: php-common(x86-64) = 5.3.3-46.el6_6 for package: php-5.3.3-46.el6_6.x86_64
--> Processing Dependency: php-cli(x86-64) = 5.3.3-46.el6_6 for package: php-5.3.3-46.el6_6.x86_64
---> Package php-mysql.x86_64 0:5.3.3-46.el6_6 will be installed
--> Processing Dependency: php-pdo(x86-64) for package: php-mysql-5.3.3-46.el6_6.x86_64
--> Running transaction check
---> Package php-cli.x86_64 0:5.3.3-46.el6_6 will be installed
---> Package php-common.x86_64 0:5.3.3-46.el6_6 will be installed
---> Package php-pdo.x86_64 0:5.3.3-46.el6_6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================================================================================================================================================
 Package                                            Arch                                           Version                                                Repository                                       Size
================================================================================================================================================================================================================
Installing:
 php                                                x86_64                                         5.3.3-46.el6_6                                         updates                                         1.1 M
 php-mysql                                          x86_64                                         5.3.3-46.el6_6                                         updates                                          86 k
Installing for dependencies:
 php-cli                                            x86_64                                         5.3.3-46.el6_6                                         updates                                         2.2 M
 php-common                                         x86_64                                         5.3.3-46.el6_6                                         updates                                         529 k
 php-pdo                                            x86_64                                         5.3.3-46.el6_6                                         updates                                          79 k

Transaction Summary
================================================================================================================================================================================================================
Install       5 Package(s)

Total download size: 4.0 M
Installed size: 13 M
Is this ok [y/N]: y
Downloading Packages:
(1/5): php-5.3.3-46.el6_6.x86_64.rpm                                                                                                                                                     | 1.1 MB     00:00
(2/5): php-cli-5.3.3-46.el6_6.x86_64.rpm                                                                                                                                                 | 2.2 MB     00:00
(3/5): php-common-5.3.3-46.el6_6.x86_64.rpm                                                                                                                                              | 529 kB     00:00
(4/5): php-mysql-5.3.3-46.el6_6.x86_64.rpm                                                                                                                                               |  86 kB     00:00
(5/5): php-pdo-5.3.3-46.el6_6.x86_64.rpm                                                                                                                                                 |  79 kB     00:00
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                                           2.0 MB/s | 4.0 MB     00:02
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : php-common-5.3.3-46.el6_6.x86_64                                                                                                                                                             1/5
  Installing : php-pdo-5.3.3-46.el6_6.x86_64                                                                                                                                                                2/5
  Installing : php-cli-5.3.3-46.el6_6.x86_64                                                                                                                                                                3/5
  Installing : php-5.3.3-46.el6_6.x86_64                                                                                                                                                                    4/5
  Installing : php-mysql-5.3.3-46.el6_6.x86_64                                                                                                                                                              5/5
  Verifying  : php-mysql-5.3.3-46.el6_6.x86_64                                                                                                                                                              1/5
  Verifying  : php-5.3.3-46.el6_6.x86_64                                                                                                                                                                    2/5
  Verifying  : php-pdo-5.3.3-46.el6_6.x86_64                                                                                                                                                                3/5
  Verifying  : php-common-5.3.3-46.el6_6.x86_64                                                                                                                                                             4/5
  Verifying  : php-cli-5.3.3-46.el6_6.x86_64                                                                                                                                                                5/5

Installed:
  php.x86_64 0:5.3.3-46.el6_6                                                                         php-mysql.x86_64 0:5.3.3-46.el6_6

Dependency Installed:
  php-cli.x86_64 0:5.3.3-46.el6_6                                     php-common.x86_64 0:5.3.3-46.el6_6                                     php-pdo.x86_64 0:5.3.3-46.el6_6

Complete!

5.2 测试PHP

在测试PHP之前,我们先把Apache和Mysql设定为随服务器一起启动,方法是输入如下两条命令

chkconfig httpd on

chkconfig mysqld on

然后重新启动Apache,即输入命令

service httpd restart

测试PHP是否OK的方法是在Apache的网络文件目录中,新建一个叫info.php的文件,其文件内容是<?php phpinfo(); ?>即可。

方法是输入命令

nano /var/www/html/info.php

上面这条命令中,nano是一个编辑程序,和上面的vi类似,nano的具体操作方法可以参考这篇文章。而其中“/var/www/html/info.php”则是新建的文件及其路径(如果该文件不存在的话则自动新建)。Linux系统中Apache的默认网站文件目录是“/var/www/html”。

当我们在“info.php”文件中添加“<?php phpinfo(); ?>”引号中的内容后,在浏览器中输入“VPS的ip/info.php”,回车,就会看到我们喜闻乐见的phpinfo页面,这就表示PHP我们也安装好了。如下图。

vultr-phpinfo

最珍贵的品质是勇敢—-读《追风筝的人》有感

这本书也是在亚马逊上买到Kindle里的。

大概从2015年12月中旬开始读,那时候刚到新的单位,而且发现工作和想象中的很不一样,压力也比较大,只是每天晚上睡前看一点。

之前也读过几本很不错的书,像东野圭吾的《解忧杂货店》、大冰的《乖,摸摸头》,但是都没能让我产生决心要写一个读后感或者做点读书笔记。但是这本书真的不一样,觉得不写会有负罪感。

虽然也知道自己可能连这样简单的读后感都写不好,但是就像这篇文章的题目一样,我还是应该勇敢一点。

最珍贵的品质是勇敢,这是我读完这本书并且根据我的人生体会得到的结论。

心理念叨这句话的时候,我又想起阿米尔的父亲说的话:

世界上的罪行只有一种。只有一种, 那就是盗窃。其他的罪行都是盗窃的变种。

当你杀害一个人时,你偷走一条性命,你偷走他妻子身为人妇的权利,夺走他子女的父亲。当你说谎时,你偷走别人知道真相的权利。当你诈骗时,你偷走公平的权利。

没有比盗窃更十恶不赦的事情了。

类似的,我想说,人最珍贵的品质是勇敢,其他品质都是勇敢的延伸:诚实,意味着勇敢地拒绝谎言带来的好处或是承受真话带来的伤害;宽容,就是勇敢地原谅别人的错误和承受自己的委屈;善良,当然要勇敢地和邪恶斗争要勇敢地自我牺牲。

每次人性光辉的闪耀和泯灭,都是由于勇敢这一品质的在与去。

失去了勇敢的人,就是有罪的人。有罪的人要获得救赎,必须自己先找回勇敢。

阿米尔失去了勇敢,所以不愿承认哈桑是朋友;阿米尔失去了勇敢,所以在好兄弟被欺负时逃跑;阿米尔失去了勇敢,所以不能向任何人坦白罪行;阿米尔失去了勇敢,所以赶走了哈桑和阿里;阿米尔失去了勇敢,所以数十年活在痛苦之中。

直到拉辛汗说:

那儿有再次成为好人的路。

阿米尔知道,好人的路不好走,那多年前就未存在的勇敢能找到吗,自己还能被救赎吗,神还会眷顾有罪之人吗?

只要勇敢,一切都会变好,要勇敢地相信这一点。

阿米尔找回了勇敢,所以他接受了哈扎拉族的兄弟和侄儿;阿米尔找回了勇敢,所以他面对阿瑟夫以命相搏;阿米尔找回了勇敢,所以他与神灵签订契约;阿米尔找回了勇敢,所以他能够数年如一日用温暖唤回索拉博心中的精灵。

书中说:

当罪行导致善行,那就是真正的获救。

其实不尽然。阿米尔的爸爸一生行善无数,但是至死他仍未获救。因为至死他都没有勇敢地承认他与莎娜芭有染,没有勇敢地承认他有个哈扎拉儿子。

哈桑是勇敢的。

他说

如果你要求,我会的。

是勇敢的;

他说

为你,千千万万遍。

是勇敢的;

他说

你要成为独眼阿塞夫。

是勇敢地;

他说

我梦到我的儿子长大成人,成为一个好人,一个自由的人……我梦到花儿再次在喀布尔街头盛开……风筝再次在天空飞翔……

是勇敢的。

朋友,现在你是否觉得,勇敢是最珍贵的品质?

Vultr日本VPS开通与50美元优惠券的获得方法

本篇文章介绍如何开通VULTR日本机房的VPS和如何获得其50美元的酷捧

1. 为什么选择Vultr

对于需要开通日本机房VPS的朋友来说,目前可选择的服务提供商并不多。

主要有美国公司Linode和Vultr,以及日本本土的VPS服务商如Sakura、GMO internet旗下的Conoha和Z.com、KDDI等等。

Linode一贯价高质好,广受好评,最低10$/mo(约66RMB/mo),但由于东京机房容量有限,仍供不应求,甚至有朋友写了抢日本机房空间的脚本,以待一旦有人退出马上买入,可见其热门。但是,也有朋友反应Linode日本机房的ip很有可能已经被墙,这让许多想搭SS的朋友却步。

SakuraのVPS最低685JPY/mo(约38.5RMB/mo),另外还有一个初期费用(一次性开通费)为1080JPY(约60.7RMB),配置大概是1core的CPU,512M内存,20G的SSD硬盘空间,不限流量,100M共享出口带宽。但是最重要的一点,Sakura的VPS只有身在日本(有日本住址)才能使用,如下图。

sakura-japan-address-limitation

Conoha和Z.com都属GMO Internet旗下,没有Sakura那样必须身在日本的限制,而且有中文界面,支持支付宝付款,可以说是非常看重中国市场的。Conoha最低900JPY/mo(约50RMB/mo),2core的CPU,1G内存,50G的SSD硬盘,不限流量。Z.com与Conoha基本一致。

Vultr日本机房最低5$/mo(约33RMB/mo),配置是1core的CPU,768M内存,15G的SSD硬盘空间,和1000G/mo的流量。

此外,有些服务商分别推出了不同的优惠政策,Sakura是2周免费试用,Z.com是赠送1000JPY的优惠券,Vultr的力度最大,送50USD的优惠券。

2. Vultr日本机房VPS的开通和50USD优惠券的获取方法

2.1 关于50USD优惠券的说明和获取方法

获取50USD优惠券的页面在此处。点击后如下图所示。

Vultr-coupon-page

其中第一条即为新注册用户50USD的优惠券,第二条是已注册人员可获得20USD的优惠券。

注意其中黑体字部分的说明,首先这50USD的有效期限是60天,及60天后如果有剩全部清除,所以不要试图试用5USD/mo的VPS十个月;第二必须绑定一张信用卡,之前有人说vultr会向该卡申请一个2.5$的预授权以证明信用卡有效,然后会在非常短的时间内撤除,所以并不会扣钱,本人绑定了一张有效信用卡,但并未发现有这一预授权的操作,可能撤销得比较快,并未被我发觉,应为本人信用卡并无短信提醒功能。

点击第一条50USD的链接,进入下一页。

vultr-try-50usd-for-30days

再点击链接即进入注册页面。

2.2 开通Vultr日本机房VPS

注册完成后,到deploy页面,即可开通一个VPS,如下图。

vultr-deploy-1

都是图形界面操作,非常方便。Location选择Tokyo Japan即可。

其他内容根据需要自行选择。

2.3 关于Vultr日本机房ip的说明

开通日本机房VPS后,在myservers页面可以查看已建好的VPS。

这时候VPS的ip已经显示出来了。

但是,一般地,如果我们立即在whois等ip位置查询网站查看ip所在地的话,会发现这个ip地址被认为在美国。

原因是vultr使用了ip广播,需要过一段时间才会将ip地址的实际位置更新到日本,这个时间长则数月短则数天。

最后附一张vultr的ping speed作为参考。

vultr-ping-speed

将进酒-the Angilent Band

2015.5.31 午后 镜山公园

与友小聚,箕踞啸歌,甚欢。

友名敏,吾名杰,故为敏杰之意,自号”the Agilent Band”。

Agilent, agile(敏) + excellent(杰), 又名“安捷伦”,哈哈哈。
IMG_2831IMG_2837IMG_2839IMG_2841

iOS编程之UIScrollView的使用[AutoLayOut+NavigationBar+Keyboard](Xcode6.3 iOS8.x Swift Storyboard)

本篇文章介绍IOS编程中如何使用UIScrollView,包括UIScrollView的基本原理、AutoLayOut以及视图内容被Keyboard遮挡时的自动滚动等等。

1. Understanding UIScrollView

关于IOS中各种内容是如何显示到屏幕上的,即视图渲染(rendering)的过程,这篇文章有详细的介绍;关于UIScrollView的基本原理(可能用原理这个词不太适合)比如各种尺寸(size)、偏移(offset)等等的定义,这篇文章中有非常深入详细生动的讲解;关于UIScrollView的各种方法属性等等,可以查看apple的相关开发文档。以上参考内容是本节的主要依据。

1.1 Rasterization and Composition

这小节的内容主要是说明在IOS中视图(view)是如何显示到屏幕上的,即Rendering(渲染)的过程。

首先,IOS中界面的Rendering(渲染)过程由Rasterization(光栅化、点阵化)和 Composition(合成)组成。Rasterization的含义是:

Rasterisation (or rasterization) is the task of taking an image described in a vector graphics format (shapes) and converting it into a raster image (pixels or dots) for output on a video display or printer, or for storage in a bitmap file format.

即将矢量图形转化成点阵图形的过程。Composition(合成)则是将不同的内容的图形进行叠加组合的过程。

第二,任意要显示的内容(视图、按钮等等)都具有两个非常重要的矩形边界量:bounds和frame。在布置界面的时候,我们通过frame来定义内容的位置和尺寸。一般情况下,frame和bounds大小一样,但原点通常不同。这两个矩形边界是UIScrollView工作的核心内容。

在Rasterization的时候,我们并不关心一个显示内容会在Composition阶段被怎样合成,所以,frame矩形此时没有作用。内容的Rasterization通过drawRect方法实现,drawRect的边界即以bounds矩形定义,由左上角点{x:0, y:0}和右下角点{x:width, y:hight}共同决定。

在Composition的时候,各个内容点阵化画得图形叠加到其上级内容的点阵化图形上,这时候就需要通过frame来确定各个内容之间的位置关系。首先是frame的原点,它表示子内容相对其上级内容在左上角位置上的偏移量,比如,一个{x:20, y:15}的偏移量表示该子内容的左上角原点相对于其上级内容往右、下分别偏移了20和15个像素点;然后是frame的尺寸,一般和bounds中的尺寸相同,即为{x:width, y:hight}。

下图是以UIButton为子内容UIView为上级内容时的一个例子。

ios-uniscrollview-bounds-frame

UIButton的bounds矩形为{x:0, y:0, w:80, h:30},UIView的bounds矩形为{x:0, y:0, w:110, h:70},由于UIButton的原点相对UIView的原点有一个右20下15的偏移量,所以,UIButton的frame矩形为{x:20, y:15, w:110, h:70}。

这里UIButton只有一个上级内容—-UIView,所以关系比较简单,如果UIView还有上级内容(当然UIView的上级只能是View级别的内容),则继续向上嵌套,如滚雪球一般(snowball effect)。

上面提到的那篇文章为了解释后面的UIScrollView,定义了两个公式:

CompositedPosition.x = View.frame.origin.x – Superview.bounds.origin.x;

CompositedPosition.y = View.frame.origin.y – Superview.bounds.origin.y;

这两个公式定义得非常难以理解,所以我将其修改为:

CompositedPosition.x = This.frame.origin.x + Super.frame.origin.x;

CompositedPosition.y = This.frame.origin.y + Super.frame.origin.y;

对照上图中的例子,This即是指UIButton,Super则是指UIView,于是:

This.frame.origin.x = 20;

This.frame.origin.y = 15;

Super.frame.origin.x = 0;

Super.frame.origin.y = 0;

所以,Composition后UIButton的原点位置就是{x:20, y:15}。

进一步,如果UIView还有一个上级的UIView,那么,UIButton的直接上级UIView的frame的原点就可能不是{x:0, y:0}了,就需要先计算出来。

1.2 UIScrollView的各种尺寸

首先,UIScrollView本身对于IOS的rendering来说,也是一个上文所述的“内容”,所以,它也首先具有bounds和frame所定义的矩形,其中bounds主要定义其尺寸,而frame定义其在上级“内容”(这里当然只可能是一个View级别的内容)中的位置。

当UIScrollView的尺寸位置确定后,就可以进一步确定其内容(content)的尺寸和位置。这里和前文所述的确定子内容的frame的方法有所区别,这里UIScrollView的子内容一般不用bounds和frame来定义其尺寸和位置,而是直接通过使用UIScrollView的专门方法来定义。这些方法主要有:contentSize、contentOffset和contentInset,下图非常清楚地展示了各个方法的含义。

ios-uiscrollview-contentsize-contentoffset-contentinset

图中以一张图片作为UIScrollView的子内容(其实这个子内容是UIImageView,也是一个View,所以当然也有bounds和frame,但是一般不关心它们),其中:

contentSize包含两个项目width和hight,意为子内容的宽度和高度;

contentOffset包含两个项目x和y,意为子内容原点相对UIScrollView原点的左方和上方的距离(注意这里的取值正负,在以左以上为正);

contentInset包含四个值top、left、bottom、right,意为Edge insets,即对内容在四个边上的缩小(负值)或扩大(正值)。

2. Manipulating UIScrollView

此节结合实例,介绍UIScrollView的具体用法,例子中由于需要在一个界面上布置很多文本和输入框,而屏幕高度不够,所以需要使用UIScrollView。主要涉及AutoLayOut(Dashboard),弹出键盘(Keyboard)时被遮挡内容自动滚动等。

2.1 创建名为IosUIScrollViewDemo的project

具体操作此处略去,参考这篇文章

2.2 将View嵌到Navigation Controller中

为了说明如何使UIScrollView在Navigation Controller中正确显示,故将View嵌入Navigation Controller中。方法是选中View,点击工具栏Editor->Embed In->Navigation Controller。如下图所示。

ios-editor-embbed-in-navigation-controler

添加Navigation Item,并修改名称为“Navigation Bar”,如下图。

ios-Navigation-bar-item-change-name

2.3 修改View的名称、尺寸

一般我们保留初始的View,把UIScrollView等其他内容布置到这个View上,为了不致混淆,我们将这个在Dashboard中的document outline中显示为View的视图改名为Main View,如下图。

ios-uiscrollview-change-view-to-main-view
为了能够容纳足够的内容,需要将Main View的尺寸改变,方法是选中View Controller,选择Size inspector,改simulated size为free form,并修改hight值为800。如下图。

ios-uiscrollview-change-view-controller-simu-size

2.4 添加UIScrollView

从Object library中选择UIScrollView拖拽到Main View中,如下图。

ios-uiscrollview-add

调整UIScrollView的尺寸和位置,并添加AutoLayout约束,如下图。

ios-UIScrollView-autolayout-constraints

2.5 添加Content View

由于我们需要在UIScrollView中滚动显示众多内容,一般地选择将这些内容先一起放到一个View中,然后再把这个View放到UIScrollView中。可以直接从Object library中拖拽一个View到UIScrollView中,也可以全部选中已经放到UIScrollView中的各种内容,然后点击工具栏Editor->Embed In->View,这里我们先在UIScrollView中添加一个View,并在Dashboard中的document outline中修改其名称为Content View。如下图。

ios-UIScrollView-ContentView-change-name

我们将Content View的尺寸调整到与Scroll View一样,即宽高各为600、736。然后为Content View添加AutoLayout约束。如下图。

ios-UIScrollView-Contentview-autolayout-contraints

由于Content View的尺寸与Scroll View一样,故各方向边距为0。

2.6 补全AutoLayout尺寸constraints

我们觉得已经为Scroll View和Content View都添加好了约束,于是应该一切就绪了,但是却发现还有Issue在,于是我们点开Issue navigator,查看到下图中的问题。

ios-UIScrollView-issue

Issue的意思是有两个view的水平方向尺寸定义不明,可是我们看上图右侧Scroll View和Content View不是都完整地定义了四个约束了吗?由于UIScrollView的特殊性,ios中不能通过Scroll View和Content View与Main View的相对位置关系让系统推断其各自的实际大小,必须明确指定出来。但是有意思的是,我们可以指定Content View与Main View和Main View等宽,方法是在上图右侧所显示的document outline中,选中Scroll View或Content View,按住右键移动鼠标到Main View上释放,然后在弹出选项中选择equal with,如下图。

ios-UIScrollView-scrollview-mainview-equal-width

设定好宽度后,我们发现Issue又变成有1个View的高度尺寸模糊不清。没错,这里的View指的就是Content View,他的高度可以直接指定具体的数值,比如736。于是,经过新添3个约束,Issue终于全部消失了。最终Scroll View和Content View的约束如下图。

ios-UIScrollView-view-final-constraints

2.7 Navigation Bar对Scroll View的影响

这个时候我们运行程序,却发现Scroll View和上面的Navigation Bar之间存在一个空白的区域,原因是Xcode自以为聪明地替我们完成了让Scroll View避开Navigation Bar这样的工作,但是却完成地不好。解决这个问题的方法是,选中View Controller,在其Attributes Inspector中将Adjust Scroll View Insets不选中,如下图。
ios-UIScrollView-uncheck-adjsut-insets
至此,Scroll View已经可以愉快地工作了。

2.8 布置若干textField及Keyboard的遮挡效果

为了说明textField内容被遮挡时UIScrollView自动滚动的方法,我们先在Content View内布置若干的textField。为让显示更清楚,将Content View的背景设定为dark grey,并添加两个黄色背景的Label,定义各自的constraints。效果如下图。
ios-UIScrollView-textfields-uncovered

这时如果点击一个textField输入文字,keyboard的出现会遮挡了下方部分的内容,如下图,这是非常影响体验的一个问题,所以必须解决它。

ios-UIScrollView-textfields-covered

我们会想到一种非常直接的解决方法,那就是让Content View自动向上滚动一段距离。但是,仔细想想,这里存在一个问题,就是:Content View最下面的一个textField怎么办?无论怎么滚动它都不可能跑到Keyboard的上面去。这个时候我们就能理解为什么UIScrollView有个contentInset的方法了,这是一个非常聪明的解决办法。

3. UIScrollView contentInset for Keyboard

解决Keyboard遮挡内容的问题的思路是这样的,首先,一个textField被点击,于是系统知道Keyboard要弹出来,然后需要判断Keyboard是否会对当前textField产生遮挡,如果不遮挡,则无需其他动作,如果产生遮挡,则将Scroll View的contentInset的bottom置为Keyboard的高(至于为什么下面详述),用户输入完成时(点击界面空白处或回车),系统明白Keyboard即将消失,于是将contentInset的bottom再置为初始值。

3.1 关于Keyboard即将出现和即将隐藏的消息

根据上面的过程,Keyboard即将出现和即将隐藏是非常重要的两个时间点,所以我们需要定义这两个消息的响应函数。方法如下:

    func registerForKeyboardNotifications() {
        let notificationCenter = NSNotificationCenter.defaultCenter()
        notificationCenter.addObserver(self, selector: "keyboardWillBeShown:", name: UIKeyboardWillShowNotification, object: nil)
        notificationCenter.addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)
    }

根据上面的代码,可以看出,我们将Keyboard即将出现(UIKeyboardWillShowNotification)这一消息的处理函数定义为keyboardWillBeShown(注意书写时需要在引号中函数名后加一个冒号);将Keyboard即将隐藏(UIKeyboardWillHideNotification)这一消息的处理函数定义为keyboardWillBeHidden。

在View Controller初始化时调用这个函数即可,如:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.registerForKeyboardNotifications()
}

然后在Main View消失时我们需要注销这个通知中心(notificationCenter),代码如下:

override func viewDidDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

这样我们就定义好了Keyboard即将出现和即将隐藏这两个消息的响应函数,当这两个消息出现时就会执行keyboardWillBeShown和keyboardWillBeHidden这两个函数。这两个函数也写在Main View的Class中,我们先写两个空的函数,内容之后再添加,这两个函数如下:

func keyboardWillBeShown(sender: NSNotification) {
}
func keyboardWillBeHidden(sender: NSNotification) {
}

3.2 知道哪个textField正被编辑

在滚动Scroll View前,我们还需要知道哪个textField正在被编辑,以及它的位置,从而判断Keyboard的出现是否会对其产生遮挡效果,实现这一方法的过程如下。

首先,我们需要为所有的textField指定delegate,方法是;

  1. 在Main View的Class名称后添加“UITextFieldDelegate”,代码如下:
    import UIKit
    
    class ViewController: UIViewController, UITextFieldDelegate {
    // codes...
    }
    
  2. 在storyboard中选中一个textField,点开右侧的Connection inspector,点击outlet下的delegate,拖拽鼠标至storyboard中view controller的icon上,如下图:ios-UIScrollView-set-textField-delegate然后为所有textField重复这个过程即可。

然后,我们需要定义一个UITextField的变量,用来标记当前被编辑的UITextField,代码如下:

var activeTextField: UITextField?

最后,需要在某个textField被编辑时将当前的textField赋值给activeTextField,这不需要定义消息处理函数,因为UITextField的delegate有现成的method,代码如下:

func textFieldDidBeginEditing(textField: UITextField) {
    activeTextField = textField
}
func textFieldDidEndEditing(textField: UITextField) {
    activeTextField = nil
}

3.3 keyboard出现和隐藏时的处理

最后,我们将keyboardWillBeShown和keyboardWillBeHidden这两个函数补充完整。代码如下:

// Called when the UIKeyboardDidShowNotification is sent.
func keyboardWillBeShown(sender: NSNotification) {
    let info: NSDictionary = sender.userInfo!
    let value: NSValue = info.valueForKey(UIKeyboardFrameBeginUserInfoKey) as! NSValue
    let keyboardSize: CGSize = value.CGRectValue().size
    let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0)
    scrollView.contentInset = contentInsets
    scrollView.scrollIndicatorInsets = contentInsets
    
    //If active text field is hidden by keyboard, scroll it so it's visible
    var aRect: CGRect = self.view.frame
    aRect.size.height -= keyboardSize.height
    let activeTextFieldRect: CGRect? = activeTextField?.frame
    let activeTextFieldOrigin: CGPoint? = activeTextFieldRect?.origin
    if (!CGRectContainsPoint(aRect, activeTextFieldOrigin!)) {
        scrollView.scrollRectToVisible(activeTextFieldRect!, animated:true)
    }
}

// Called when the UIKeyboardWillHideNotification is sent
func keyboardWillBeHidden(sender: NSNotification) {
    let contentInsets: UIEdgeInsets = UIEdgeInsetsZero
    scrollView.contentInset = contentInsets
    scrollView.scrollIndicatorInsets = contentInsets
}

最终的效果如下图:

ios-uiscrollview-keyboard-autoscroll-final-demo

iOS编程之UITableView的使用(Xcode6.3 iOS8.x Swift Storyboard)

1. 创建新的project

打开Xcode,点击“create a new Xcode project”,如下图。

ios-demo-create-new-xcode-project

 

填写“project name”等相关信息,如下图。

 

ios-demo-create-new-xcode-project-input-name

 

2. 在ViewController中定义TableView的一个outlet

共有两种方法:

  1. 直接在ViewController的Class中以如下语句定义
    @IBOutlet var mainTableView: UITableView!
    
  2. 先在视图中创建一个TableView,然后右键拖拽其到ViewController中释放,定义outlet。

这里采用第一种方法。

3. 在视图中创建一个TableView

方法是在“object library”中找到TableView,左键点击按住,拖拽其到视图上释放,如下图。

ios-demo-insert-tableview

4. 连接TableView和outlet

需要将TableView和它的outlet连接起来,首先,点击ViewController的图标,在右侧选择显示“Connections Inspector”,我们发现在2中定义的outlet已经被显示出来,如下图:

ios-demo-tableview-outlet

连接的方法是点击outlet中“mainTableView”右侧的空心圆圈,按住左键,拖动鼠标至TableView上后释放,如下图:

ios-demo-tableview-define-outlet

5. 定义TableView的dataSource和delegate

除outlet外,还需定义TableView的dataSource和delegate,分两步进行:

  1. 在ViewController的Class中声明,即在
    class ViewController: UIViewController {...}
    

    处加入“UITableViewDelegate, UITableViewDataSource”使之成为

    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {...}
    
  2. 需要连接dataSource和delegate到ViewController,方法是首先在视图中选中TableView,然后在右侧的“Connections Inspector”中可以看到其dataSource和delegate,如下图ios-demo-tableview-attributes,之后点击dataSource和delegate右侧的空心圆圈,按住鼠标左键,拖动鼠标至ViewController图标上释放,如下图ios-demo-tableview-datasource-outlet

完成以上两步后,dataSource和delegate的定义完成。

6. 相关代码编写

完成以上操作后,即可在ViewController中编写代码,控制TableView显示的内容等等,代码如下:

//
//  ViewController.swift
//  TableViewDemo
//
//  Created by Xu Jie on 15/5/1.
//  Copyright (c) 2015年 J.Xu. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    // 定义TableView的outlet,可自由定义,不一定必须是“tableView”
    @IBOutlet var mainTableView: UITableView!
    
    // 需要显示的内容
    var items: [String] = ["武汉","上海","北京","深圳","广州","重庆","香港","台海","天津"]

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 定义cell的类
        self.mainTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
    }
    
    // 指定TableView共有多少行
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count;
    }
    
    // 设定TableView列表每个单元(行)的内容
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        var cell:UITableViewCell = self.mainTableView.dequeueReusableCellWithIdentifier("cell") as! UITableViewCell
        cell.textLabel?.text = self.items[indexPath.row]
        
        return cell
    }
    
    // 选中某行时执行
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        println("You selected cell #\(indexPath.row)!")
    }
    
    // 删除某行时执行
    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath){
        var index=indexPath.row as Int
        self.items.removeAtIndex(index)
        self.mainTableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)
        NSLog("删除\(indexPath.row)")
    }
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

iOS编程之UnwindSegue的使用(Xcode6.3 iOS8.x Swift Storyboard)

1. 什么是UnwindSegue以及UnwindSegue的基本用法

1.1 UnwindSegue 的基本概念

关于UnwindSegue的基本概念可以在Apple的document中查看,同时,在stack overflow上也有关于它的详细例子。
以下是apple的ios开发文档中对UnwindSegue的说明。

Unwind segues give you a way to “unwind” the navigation stack back through push, modal, popover, and other types of segues. You use unwind segues to “go back” one or more steps in your navigation hierarchy. Unlike a normal segue, which create a new instance of their destination view controller and transitions to it, an unwind segue transitions to an existing view controller in your navigation hierarchy. Callbacks are provided to both the source and destination view controller before the transition begins. You can use these callbacks to pass data between the view controllers.

大意是:UnwindSegue可以让我们以push, modal, popover等其他segue的形式“放松地(自由地)”在导航堆列中跳转。我们用UnwindSegue“回跳”至navigation层级中得一个或多个界面前的一个界面。与一般的segue不同的是,UnwindSegue开创了一种新的(定义)目的视图控制器的方法并跳转到那个视图,当然,这个视图必须存在于navigation层级中。在跳转开始前,为源视图和目的视图均提供了Callback函数,我们可以通过这些Callback函数来传递数据。

从以上信息中我们可以看出,UnwindSegue和一般的Segue的最大区别是:

  1. UnwindSegue可以跳转到之前的一个或多个视图,其实也就是之前的任意一个视图,当然,这个视图必须在navigation堆列(stack)之中;而一般的Segue只能跳转到相邻的一个视图。
  2. UnwindSegue只能跳转到已经在navigation stack中存在的视图,还未创建的视图无法跳转;而一般的Segue则无此限制。

所以,一般的,在需要跳转到前两个或三个以上的视图时才需要用到UnwindSegue。

1.2 UnwindSegue的用法

如前文中提及的Apple的documentstack overflow中的例子,均有对UnwindSegue用法的详细解说,这里稍作总结。

使用UnwindSegue大概可分为以下几步:

    1. 在目标视图中创建一个action,以提供给源视图作为识别和接口。代码形如
      @IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
      }
      
    2. 在源视图中定义exit的关联项目,这个项目一般是一个按钮,方法是在exit图标上按右键,这时会弹出一个选择目标视图action的列表,这个action即是1中定义的action,点击对应的action后面的空心小圆圈,按住左键拖拽到按钮上释放,源视图中这个按钮到目标视图的UnwindSegue就建立起来了非常方便,如下图UnwindSegue-exit-button
    3. 当然,2中的那个项目不一定是个按钮,也可以是其它东西,也可以没有这个项目,比如,我们想在源视图控制器中做个判断,当满足一定条件时就进行UnwindSegue,那么这个时候的操作是,在exit上按住右键拖拽到视图控制器图标上释放,如下图UnwindSegue-exit-vc这时,这个UnwindSegue就创造出来了,但是,我们还需要指定这个UnwindSegue的id,然后我们在源视图控制器中就可以通过这个id来执行这个UnwindSegue,语法是:
      self.performSegueWithIdentifier("unwindtoDestinationVC", sender: self)

      其中unwindtoDestinationVC即是UnwindSegue的id。

2. 在UnwindSegue前执行一些任务的方法

有时候我们需要在UnwindSegue前进行一些操作,比如,从当前视图转出时,需要先将当前视图中的某些输入的内容存入数据库,然后再执行跳转。此时,就需要注意各种操作和语句执行的时序。

2.1 UnwindSegue与普通按钮关联

当exit与一个UnwindSegue和一个按钮绑定起来的时候,如1.2中2所表示的那样,这时候的执行顺序是这样的:

  1. 按钮被按下,向系统发送这一事件消息;
  2. 执行按钮的action;
  3. 执行prepareForSegue;
  4. 执行UnwindSegue。

2.2 UnwindSegue与toolbar上的item关联

在实践中发现,当exit与一个UnwindSegue和一个toolbar(底部toolbar/顶部navigation bar)按钮绑定起来的时候,执行的顺序和视图中的普通按钮有所不同,具体是这样的:

  1. 按钮被按下,向系统发送这一事件消息;
  2. 执行prepareForSegue;
  3. 执行UnwindSegue。

也即是说,该bar上的按钮所绑定的action并不会被执行,也就是说他们是segue优先的。那么如果非得在此之前执行一点儿任务怎么办呢?

可以这么做:

  1. 在目标视图控制器中创建一个unwindsegue;
  2. 将源视图的exit绑定到view上,而非一个具体的按钮;
  3. 定义bar按钮的action;
  4. 在bar按钮的action中先执行一定的任务,然后在合适的位置执行
    self.performSegueWithIdentifier("unwindtoDestinationVC", sender: self)

这样,即能实现在unwindsegue前完成一定的任务。


相关代码

 

Matlab中的日期和时间

1. Matlab中的三种日期/时间格式

1.1 字符串式(Date String)。

如“14-Apr-2015 10:54:00”,“2015-04-14 10:54”,“2015-04-14 10:54 AM”等等。

具体的格式可以自由定义,但是需要遵从Matlab中的相关规则。

规则1,日期/时间的各组成部分的符号标识(Symbolic Identifier)。

Symbolic Identifier Description Example
yyyy Year in full 1990, 2002
yy Year in two digits 90, 02
QQ Quarter year using letter Q and one digit Q1
mmmm Month using full name March, December
mmm Month using first three letters Mar, Dec
mm Month in two digits 03, 12
m Month using capitalized first letter M, D
dddd Day using full name Monday, Tuesday
ddd Day using first three letters Mon, Tue
dd Day in two digits 05, 20
d Day using capitalized first letter M, T
HH Hour in two digits
(no leading zeros when symbolic identifier AM or PM is used)
05, 5 AM
MM Minute in two digits 12, 02
SS Second in two digits 07, 59
FFF Millisecond in three digits 057
AM or PM AM or PM inserted in date string 3:45:02 PM

可以使用以上标识符自由定义显示出来的字符串式的日期。

规则2,Matlab中预定义的字符串式日期/时间格式,即Matlab中有现成的预定义的(predefined)显示格式,共33种,每一种以一个数字标识(Numeric Identifier)指示,如下表。

Numeric Identifier Date String Format Example
-1 (default) 'dd-mmm-yyyy HH:MM:SS' or 'dd-mmm-yyyy' if'HH:MM:SS'= 00:00:00 01-Mar-2000 15:45:17 or 01-Mar-2000
0 'dd-mmm-yyyy HH:MM:SS' 01-Mar-2000 15:45:17
1 'dd-mmm-yyyy' 01-Mar-2000
2 'mm/dd/yy' 03/01/00
3 'mmm' Mar
4 'm' M
5 'mm' 03
6 'mm/dd' 03/01
7 'dd' 01
8 'ddd' Wed
9 'd' W
10 'yyyy' 2000
11 'yy' 00
12 'mmmyy' Mar00
13 'HH:MM:SS' 15:45:17
14 'HH:MM:SS PM' 3:45:17 PM
15 'HH:MM' 15:45
16 'HH:MM PM' 3:45 PM
17 'QQ-YY' Q1-01
18 'QQ' Q1
19 'dd/mm' 01/03
20 'dd/mm/yy' 01/03/00
21 'mmm.dd,yyyy HH:MM:SS' Mar.01,2000 15:45:17
22 'mmm.dd,yyyy' Mar.01,2000
23 'mm/dd/yyyy' 03/01/2000
24 'dd/mm/yyyy' 01/03/2000
25 'yy/mm/dd' 00/03/01
26 'yyyy/mm/dd' 2000/03/01
27 'QQ-YYYY' Q1-2001
28 'mmmyyyy' Mar2000
29 'yyyy-mm-dd'
(ISO 8601)
2000-03-01
30 'yyyymmddTHHMMSS'
(ISO 8601)
20000301T154517
31 'yyyy-mm-dd HH:MM:SS' 2000-03-01 15:45:17

1.2 向量式(Date Vector)。

日期时间向量是由1*6个双精度型(double-precision)数值组成的一个行向量。其中除“秒”对应的元素可为分数外,其余值均为整型。时间表示为24小时制,无AM/PM表示信息。

日期时间向量中的各元素按如下顺序表示:

year month day hour minute second

如,10:45:07 AM on October 24, 2012 按向量式则为:

[2012 10 24 10 45 07]

1.3 连续日期数(Serial Date Number)。

连续日期数的意义是,一个代表了相对January 0, 0000的天数的数值。注意,该数值不可表示公元前,其负值并不表示公元前而表示相对公元10000-Jan-00前的天数。

比如,数值0表示公元0000年01月00日,数值1表示0000年01月01日,数值1.5表示0000年01月01日12:00:00,2015-04-14 12:00用连续日期数表示为:736068.5000。

当然使用这个数值还有一个问题,就是时区,该数值以ISO 8601下0时区为标准,如果需要转换为当地时间则要加上或减去响应的时区差对应的天数,比如,中国处于东八区,即UTC +08:00时区,那么在此数值上需要加上8/24=0.3333这样一个值,因为提前的八个小时相当于0.3333天。

2. Matlab中各种日期时间格式之间的转换

2.1 转换为连续日期数(to serial date number):datenum

datenum这个函数可以将其他两种形式的日期时间格式转换为连续日期数的形式,语法规则如下:

DateNumber = datenum(DateString)

这个函数将字符串式转换为连续日期数式

DateNumber = datenum(DateString,formatIn)

这个函数将字符串式转换为连续日期数式,同时通过”formatIn“这个变量明确了字符串式的具体形式,”formatIn“变量本身也是一个字符串,须对应1.1中的相关规则

DateNumber = datenum(DateVector)

这个函数将向量式转换为连续日期数式

DateNumber = datenum(Y,M,D)/datenum(Y,M,D,H,MN,S)

这个函数将向量式转换为连续日期数式。同时指定信息完整度,可见最少要完整到天

2.2 转换为向量式(to vector of components):datevec

datevec这个函数可以将其他两种形式的日期时间格式转换为向量式的形式,语法规则如下:

DateVector = datevec(DateNumber)

这个函数将连续日期数式转换为向量式

DateVector = datevec(DateString)

这个函数将字符串式转换为向量式

DateVector = datevec(DateString,formatIn)

这个函数将字符串式转换为向量式,同时通过”formatIn“这个变量明确了字符串式的具体形式

2.3 转换为字符串式(to string format):datestr

datestr这个函数可以将其他两种形式的日期时间格式转换为字符串式的形式,语法规则如下:

DateString = datestr(DateVector)

这个函数将向量式转换为字符串式

DateString = datestr(DateNumber)

这个函数将连续日期数式转换为字符串式

DateString = datestr(___,formatOut)

这个函数将其他形式转换为字符串式,同时通过”formatOut“变量指定转化后的字符串的具体形式,”formatIn“变量本身也是一个字符串,须对应1.1中的相关规则

DateString = datestr(DateStringIn)

这个函数将通过”DateStringIn“变量表示的一种字符串式转换为以”day-month-year hour:minute:second“形式表示的字符串式

DateString = datestr(___,’local’)

这个函数将其他形式转换为字符串式,同时以当前使用的系统日期时间显示标准来显示,如:

 >>datestr(now,'local')

ans =

14-4月-2015 12:39:38

 


本文结束。