2015年2月

Xcode 是苹果官方推出的用于开发运行于苹果产品(如 iPadiPhoneMac 等)中的应用的集成开发环境,Xcode 提供了管理整个开发工作流的所有工具——从创建应用到测试、优化以及推荐应用至 App Store

Xcode 一览

Mac 打开 App Store 应用,搜索 Xcode ,然后下载最新版本,它是一个免费的应用,当下载完成之后,系统会自动安装它,然后就可以在 Launchpad 中找到它的启动图标了,如下图所示:

XcodeIcon_2x.png

单窗口操作界面

Xcode 在一个工作窗口中整合了代码编辑、用户界面设计、资源文件管理、测试以及调度等所有功能,同时窗口中的所有组件都可以根据你的自身喜好进行自定义,比如文件选择器在一个区域中,然后将文件的文件编辑器放在另一个区域中,当你选择一个用户对象时,它的文档同时出现在其旁边等。

您还可以让整个界面只显示出你需要显示的,将其它无关你项目的功能隐藏,比如你可以让整个窗口只显示你的源代码树以及你的用户界面布局,或者你还可以让一个窗口的功能分成多个窗口显示,或者在一个窗口中通过 Tabs 方式进行功能的划分。

XC_O_WrkspaceWindow_nocallout_2x.png

带辅助功能的代码编辑

不管你使用的是 Objective-CSwiftCC++ 还是多种语言都有使用,Xcode 都会自动的对你的代码进行检测,并猜测出你所当前编辑的语言,当发现你的代码存在一个错误时,代码编辑器会自动的高亮该错误,若可能,它还会给出修改意见,Xcode 还提供了快速且高效的代码提示出自动完成功能,同时还提供了很多拿来即用的代码片段或者源代码文件模板,对于 Swift 语言,您还可以在不构建或运行应用的前提下直接在 Playground 里面运行并在可视化的环境下实时预览结果。

你可以很方便的让代码编辑器同时显示一个文件的多种视图或者在一个视图中一次性查看多个文件,Search-and-replace (翻译与替换)让你可以快速且安全的在整个项目中搜索并替换代码。

CodeFolding_2x.png

可视化的 UI 设计

Interface Builder 是一个 Xcode 整合的视觉设计编辑器,使用 Interface Builder ,你可以创建与设计 iOS 或者 Mac 应用的窗口、视图、控制器、菜单以及其它任何在库中预配置的元素对象以及您创建的元素。而另一个强大的功能就是,通过 Storyboards,可以让你在可视化的界面下直观的设计应用的流程以及不同界面间切换的动画,以可视化的方式连接你在代码所实现的对象与动画。

StoryboardIB_2x.png

通过自动布局功能(Auto Layout),当你设定好界面元素的限制后,软件会自动地根据屏幕尺寸、窗口尺寸或者语言自动对其进行布局,配合 Size Classes,让你的应用可以智能的自动适应屏幕尺寸以及屏幕方向——根据设定,自动进行布局、添加或删除视图甚至更改字体等。

SC_H_preview_2x.png

Xcode 中的资源文件目录可以让你管理各种你将在应用中使用的图片,比如图标、设计图、启动图片等,同时,粒子动作编辑器(Particle emitter editor)可以让你快速的编辑 iOS 或者 Mac 游戏中的特效,比如雪花飞舞、烟雾效果等,对于 Mac应用SceneKit 编辑还可以帮助你在 3D 场景下创建场景并导出为数字资产交换格式文件(Digital Asset Exchange, DAE)。

LeafParticles_2x.png

集成的调试工具

当 Xcode 以调试模式(Debug Mode)启动应用时,它会自动的立马启动一个调试会话(Debugging Session),若您启动的是一个 iOS 应用,它会在 iOS 模拟器(Simulator)中或者一个你选择的连接至 Mac 的 iPhone 中启动应用,若您启动的是 Mac 应用,则其会直接在当前的 Mac 中启动它。

AdventureLaunchediPhone_2x.png

您可以直接在代码编辑器的进行调试,要查看任何一个变量的值,只需要将鼠标移动到那个变量的名称上面即可,调试器可以让你在检查代码时,细致的控制其执行,同时,为了更加细致的控制,命令面板还提供了通过命令行访问调试器的功能。

XC_O_debug_overview_2x.png

调试压力表显示你的应用程序的资源消耗以帮助在应用正式上线之前找到更多影响性能的问题。

CPUReport_2x.png

Testing and Continuous Integrations

测试和持续集成

为了帮助您建立一个更好的应用程序,Xcode中提供了一个功能及性能测试框架。你可以通过测试用例导航运行你的测试用例及查看测试结果,而性能测试可以让你更加清楚自己应用的运行性能,这可以在你应用上线后,尽可能降低用户的运行效率与等待时间。

运行在测试导航测试,看看结果,并进行必要的测试通过的任何变化。您可以使用Xcode的服务,在OS X Server中可用,自动化测试的执行。在Xcode上开发的Mac,你创建一个单独的服务器上运行,以定期或在每次源代码提交执行单元测试机器人。

Run your tests in the test navigator, look at the results, and make any changes needed to pass the tests. You can use the Xcode service, available in OS X Server, to automate the execution of tests. From Xcode on your development Mac, you create bots that run on a separate server to execute your unit tests either periodically or on every source code commit.

bot_viewer-tests_2x.png

In addition to running unit tests, bots automatically perform static analysis on your code, build your app, and archive it for distribution to testers or the App Store. While performing these continuous integrations of your app, bots report build errors and warnings, static analyzer problems, and unit test failures.

自动保存、项目快照以及代码控制

当你工作时,Xcode 会自动为您定期的保存文件与代码的理性,这个功能不需要任何设置,因为 Xcode 会连续的跟踪你对文件的改动,同时,你又可以使用返回与重置(Undo & Revert)功能返回至上一个状态或者恢复下一个状态。

除了文件外,你还可以直接通过恢复快照命令(Restore Snapshot command)将整个项目恢复至某一个你知道版本的历史快照,在使用时候,点击菜单栏中的 文件(File) » 创建快照(Create Snapshot) 即可为你的项目创建一个快照,同时,你还可以配置让 Xcode 根据你的规则自动的创建快照。

OrganizerSnapshots_2x.png

若要对文件的修改进行更好的跟踪,您还可以使用 Xcode 代码管理功能, Xcode 支持两个有名的代码管理系统—— GitSubversion,您可以同时访问远程的 Git 或者 Subversion 代码仓库,也可以在本地创建 Git 代码仓库,通过 OS X Server 使用 Xcode 服务,你还可以创建你自己的 Git 服务。

ChooseRemoteGit_2x.png

集成的文档功能

在你编写代码时, Xcode 会根据你当前所编写的代码自动智能的从文档库中查询想关的SDK或者API文档,以方便你快速的调出查阅。

BookmarkArea_2x.png

分发应用至测试用户或者 App Store

Most of your development time is spent on coding tasks, but to develop for the App Store, you need to perform a number of administrative tasks throughout the lifetime of your app. In addition to Xcode, you’ll use the Member Center web tool to manage developer program accounts and entitlements, and you’ll use the iTunes Connect web tool to check the status of your contracts, set up tax and banking information, obtain sales and finance reports, and manage metadata about the app.

Xcode project configurations help prepare your app for distribution to beta testers and for submission to the App Store. Submitting your app is a multistep process that begins when you sign into iTunes Connect and supply necessary product information. In Xcode, you create an archive of your project and submit it to the store. When your app is approved, you use iTunes Connect to release it by setting the date. (If you are distributing your Mac app outside the store, you follow a slightly different process.)

Phalcon\Mvc\View 为基于 Phalcon 框架的应用提供了 Mvc 模式中的视图层,视图代表了应用程序中的用户界面. 视图通常是在 HTML 文件里嵌入 PHP 代码,这些代码仅仅是用来展示数据。 视图的任务是当应用程序发生请求时,提供数据给 web 浏览器或者其他工具。

集成视图到控制器(Integrating Views with Controllers)

当一个控制器执行完成之后, Phalcon 会自动的调用 View 组件,从 views 目录中查找与执行的 Controller同名的文件夹以及 Action 同名的模板文件,然后填充相应的数据后返回给浏览器,比如:http://localhost/item/view/1,Phalcon会将前面的这个Uri地址映射为:

服务器地址:        localhost
控制器:            item
动作:              view
参数:              1

调度器(Dispatcher)会查找名为 ItemController.php 的控制器文件,该文件中的内容应该如下:

<?php

class ItemController extends \Phalcon\Mvc\Controller {
    
    public function indexAction() {}

    public function showAction($itemId) {
        $item = Item::findFirstById($itemId);
        $this->view->setVar('item', $item);
    }
}

同时,调度器会执行 showAction,并将 1 作为参数传递给该方法,该方法中,$this->view->setVar() 方法向 view 中注入了一个名为 item 的对象,该对象的值为 $item,然后我们即可以在:/path/to/views/item/show.phtml 模板文件中以 $item 调用该对象的值或者方法。

Phalcon\Registry 是一个用于在应用中存储全局变量的容器,当向其实例存储了某个对象后,该对象将在整个应用中都可被访问,该类实现了 ArrayAccessIteratorTraversableSerializableCountableJsonSerializable 接口。

<?php

    // 实例化一个 \Phalcon\Registry 对象
    $registry = new \Phalcon\Registry();

    // 向 $registry 存储一个对象 something,其值为一个字符串: something
    $registry->something = 'something';
  
    // 以数组的方式存储一个对象
    $registry['something'] = 'something';

    // 获取前面存储的值
    $value = $registry->something;
    // 若以数据的键的方式访问
    $value = $registry['something'];

    // 检测是否存在某个对象
    $exists = isset($registry->something);
    // 或者以数组的方式检测
    $exists = isset($registry['something']);

    // 删除某个值
    unset($registry->something);
    // 若以数组的键的方式删除
    unset($registry['something']);

权力的游戏紧紧围绕《冰与火之歌》系列的故事情节,作者马丁表示该剧非常忠于自己的著作。故事设置在维斯特洛的七个王国,那里“夏天持续数十年,冬天能持续一辈子”,权力的游戏主要讲述王国的七个贵族家族争夺铁王座的权力斗争;在剧集之初,来自维斯特洛北部区域的冰雪以及狭海以东大陆的威胁逐步加重。下面四张图是我收集的该电视剧的完整版地图。

Game of Thrones Kings landing map

Game_of_Thrones_Kings_landing_map.gif

北部地区 The North

map_north.jpg

南部地区 The South

map_south.jpg

完整地图 Speculative Map

speculative_map.jpg

要申请苹果开发者帐号要求先有一个苹果帐号,如果还没有,需要先注册一个,若已经有了,可以直接访问 https://developer.apple.com/cn/ ,移动至该页面最下方,找到“ 成为会员,注册 Apple Developer Program,获取开发和分发 App 所需的一切资源。了解详情 ”,点击了解详情链接,此时会打开 Apple Developer Programs 页面,在该页面,您可以看到,苹果将开发者帐号分为 iOSMac 两种,这两种帐号是不同的,前者只能开发与发布 iOS 应用,后者只能开发与发布 Mac 应用,再次移动到页面的最底部,找到 开发者计划比较 ,点击该链接,打开 https://developer.apple.com/cn/programs/which-program/ 页面,至此,可以查看到所有开发者帐号类型,根据自己的需要选择一个即可,若要同时开发多种应用,则需要多次购买。

我选择的是 iOS 开发者帐号,申请地址为:https://developer.apple.com/cn/programs/ios/,当前的价格是 688RMB/年,点击当前页面的 立即注册 按钮,然后点击继续,此时会要求你登录你的 AppleID:

注册或创建 AppleID.jpg

若您已经在前面注册了 AppleID 了,点击 登录 即可,若您还没有注册,点击下方的 创建 AppleID,我点击登录,因为我已经有一个AppleID了,此时,您需要选择是注册个人帐号还是公司帐号,如下图所示:

Are you enrolling as an individual or organization.jpg

我注册的是个人帐户,若是企业帐户,需要的DUNS等,比个人的麻烦,点击 Individual

登录.jpg

登录成功后,需要输入个人的联系信息,分别需要输入中文与英文联系方式。

Enter Your Contact Information.jpg

保存之后选择帐户的功能,选择 iOS Developer Program 即可,接着点击右下角的 Continue

Select Your Program.jpg

之后需要同意苹果的协议:

Program License Agreement.jpg

然后,就得开始支付了:

Complete your purchase on the apple online store.jpg

需要有一张可以进行支付的信用卡,现在只支持 Visa 或者 MastCard

付款.jpg

输入完付款信息后,填写发票信息:

发票.jpg

接着同意 条款与条件 即可预览订单:

订单预览.jpg

确认下单后,会自动跳转至 Apple Store 完成支付:

正在处理您的订单.jpg

完成支付后,整个购买过程结束,现在回到自己的开发者中心,即可以看到帐户正在等待激活:

Your Purchase Is Pending.jpg

迅雷上网加速器.jpg

迅雷上网加速器是迅雷与电信合作推出的一项上网加速服务,技术原理为将用户现有物理宽带提高,让上网速度更快,让你在看视频、游戏、购物、下载文件等享受大带宽畅快加速。

支持运营商:

暂仅支持电信

可使用用户:

迅雷白金会员、钻石会员用户(非子账号)、非白金会员可领取免费试用进行提速尝试

应用环境:

当前带宽在30M以下,且线路支持提速的电信家庭宽带,不支持企业宽带

覆盖省份:

福建、江西、安徽、湖南、重庆、浙江、宁夏、四川、海南、山东、西藏、天津、贵州、辽宁、广西、北京、云南、甘肃、陕西、山西(仅限太原)、湖北(仅限武汉)、新疆,河北(仅限光纤)、河南(仅限光纤),等省份陆续增加中,敬请期待。

支持宽带类型:

河北、河南仅支持可提速光纤用户,其他省份支持可提速光纤和ADSL。

提速效果:

光纤用户平均带宽可提升30%-50%,ADSL用户因受线路材质影响,提升幅度较小乃至没有效果,具体视用户网络环境及当地电信政策而定,请谨慎使用。

注:加速器不提宽带上行。

使用手册:

  1. 安装迅雷上网加速器,安装过程软件会自动检测该宽带环境是否支持提速,不可提速环境暂不支持安装
  2. 可提速网络环境用户登录迅雷白金或钻石会员最高可将宽带提升至30M
  3. 登录成功后,即可享受流畅上网加速,无需额外操作
  4. 退出软件,上网加速服务停止,宽带降至原有宽带大小

本文所讲解的是我本人在安装配置 CentOS 7 桌面办公环境时所得到的经验,若您不需要安装配置 CentOS 7 的桌面办公环境,那么本文对您而言,没有任何用处,若您需要配置,则您需要先载最新版本的 CentOS 7 安装DVD。

基本的系统安装

插入安装光盘或者安装U盘之后,直接选择 Install CentOS 7 即可。

CentOS 7 Desktop.png

选择系统语言:

CentOS 7 Desktop选取系统语言.png

在安装信息摘要面板中,如下图所示,绝大多数配置系统已经自动完成,但是我们需要设置以下几点:

  1. 软件选择
  2. 安装位置
  3. 网络和主机名

CentOS 7 Desktop本地化.png

系统默认的软件选择为最小安装,此安装会不带桌面,同样的肯定不会安装桌面软件了,若要做为桌面系统使用,您需要选择 GNOME 桌面 或者 KDE Plasma Workspaces 或者 开发及生成工作站,我在此处选择的是 开发及生成工作站

CentOS 7 Desktop 软件选择.png

同时安装了以下软件:

  • 附加开发
  • 兼容性程序库
  • 开发工具
  • 电子邮件服务器
  • EMacs
  • FTP 服务器
  • 图形生成工具
  • 硬件监控工具
  • 传统X Windows 系统的兼容性
  • 办公套件和生产率
  • 平台开发
  • 科技写作

其它的如PHP、MariaDB、PostgresQL等软件我将在系统安装完成之后再安装最新版本的,选择完成之后,点击左上角的 完成 按钮,接着选择安装位置。

CentOS 7 Desktop 安装位置.png

我使用的是整块磁盘,然后让其自动分区。

点击可以点击右下角的开始安装按钮,即可开始安装系统。如下图所示:

CentOS 7 Desktop 开始安装.png

在系统的安装过程中,您还可以设置 root 帐户的密码以及创建一个新的用户,如下图所示:

CentOS 7 Desktop 设置 Root 帐户密码.png

CentOS 7 Desktop 创建新用户.png

安装完成之后,点击右下角的重启按钮,重新引导系统。

CentOS 7 Desktop 重启.png

重新启动之后,系统会要求您接受许可协议,如下图所示:

CentOS 7 Desktop 许可协议.png

CentOS 7 Desktop 阅读并接受许可协议.png

接受之后,点击页面右下角的 完成配置,接着进行 KDump 配置,我们使用自动的即可。

CentOS 7 Desktop Kdump.png

完成之后,即可登录系统了,如下图所示,我们在前面创建的用户就可以在此处登录了,同样的,你也可以使用 root 帐户登录,在此处,我使用我在前面创建的 pantao 这个帐户登录。

CentOS 7 Desktop Login.png

CentOS 7 Desktop Login As.png

登录完成之后,系统会要求我们完成 Gnome-initial-setup ,即 `GNOME 初始化配置,首先选择语言:

CentOS 7 Desktop Set Language.png

在此处我们选择了简体中文,然后设置输入源,系统默认仅提供了拼音输入法,在此处注意,若我们选择任何一个输入源,那么在 上一项 的这个按钮上方的键盘图标旁边将会出现一个新的图标,此新图片即可用于对您选中的输入源进行更详细的配置。

CentOS 7 Desktop Input Source.png

完成输入源配置之后,我们即可以开始使用 CentOS Linux 系统了。

CentOS 7 Desktop Start Using CentOS Linux.png

办公软件安装

安装完成基本系统之后,接下来我们安装 办公软件,包括但不限于下面这些:

  • 图形图像处理

    • GIMP - 用于替换我们在 OS X 或者 Windows 系统中的 Photoshop 软件;
    • Shotwell Photo Manager - 可应用于 GNOME 桌面环境的全功能的个人照片管理软件,可替换 Photoshop Lightroom
    • Pencil - 替换 Windows 系统下的 VISIO 的应用;
    • Inkscape - 开源的矢量图绘制工具;
  • 网络应用

    • FirefoxOperaGoogle Chrome - 网页浏览器;
    • Flash Player - Flash 播放器;
    • FileZilla - 多进程的 FTP 客户端;
    • ThunderBird - 邮箱与新闻客户端;
    • Evolution
    • Transmission BitTorrent Client - BT下载客户端;
    • Pidgin - Pidgin 协议插件,可联系至 MS Office Communicator;
  • 办公工具

    • LibreOffice Writer - 替换 Microsoft Word;
    • LibreOffice Calc - 替换 Microsoft Excel;
    • Document Viewer - PDF阅读工具;
    • Scribus - 开源桌面版发布工具(DTP);
  • 声音与视频

    • Amarok - 音频播放工具
    • Totem - 媒体播放工具(视频与音频)
    • Brasero - CD/DVD 烧录工具
    • K3B - CD/DVD 烧录工具
  • 程序开发工具

    • Sublime Text - 优化编辑神器
    • Bluefish - 文本编辑器
    • VirtualBox - Oracle 推出的虚拟化软件,可以让你将 Windows 系统运行在虚拟环境下,这样,在必要的时候,你还可以使用一些只能在Windows 下面使用的软件。

要确定 Phalcon Engine 应该具备哪些特性,首先就得确定我准备让 Phalcon Engine 应用于哪些业务场景下,我所经历的最多的项目包括企业网站、移动App开发、企业内部系统(OA、ERP)以及微信服务平台的开发,那我也将 Phalcon Engine 的业务场景限制在上面所述的这些业务里面。

安装扩展软件源

rpm -Uhv http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

更新软件仓库

yum -y update

安装必要的库

yum install glibc gcc gcc-c++ autoconf automake libtool git make nasm pkgconfig
yum install SDL-devel a52dec a52dec-devel alsa-lib-devel faac faac-devel faad2 faad2-devel
yum install freetype-devel giflib gsm gsm-devel imlib2 imlib2-devel lame lame-devel libICE-devel libSM-devel libX11-devel
yum install libXau-devel libXdmcp-devel libXext-devel libXrandr-devel libXrender-devel libXt-devel
yum install libogg libvorbis vorbis-tools mesa-libGL-devel mesa-libGLU-devel xorg-x11-proto-devel zlib-devel
yum install libtheora theora-tools
yum install ncurses-devel
yum install libdc1394 libdc1394-devel
yum install amrnb-devel amrwb-devel opencore-amr-devel 

安装 xvid

cd /opt
wget http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz
tar xzvf xvidcore-1.3.2.tar.gz
cd xvidcore/build/generic
./configure --prefix="$HOME/ffmpeg_build"
make
make install

安装 LibOgg

cd /opt
wget http://downloads.xiph.org/releases/ogg/libogg-1.3.1.tar.gz
tar xzvf libogg-1.3.1.tar.gz
cd libogg-1.3.1
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install

安装 Libvorbis

cd /opt
wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.4.tar.gz
tar xzvf libvorbis-1.3.4.tar.gz
cd libvorbis-1.3.4
./configure --prefix="$HOME/ffmpeg_build" --with-ogg="$HOME/ffmpeg_build" --disable-shared
make
make install

安装 Libtheora

cd /opt
wget http://downloads.xiph.org/releases/theora/libtheora-1.1.1.tar.gz
tar xzvf libtheora-1.1.1.tar.gz
cd libtheora-1.1.1
./configure --prefix="$HOME/ffmpeg_build" --with-ogg="$HOME/ffmpeg_build" --disable-examples --disable-shared --disable-sdltest --disable-vorbistest
make
make install

安装 Aacenc

cd /opt
wget http://downloads.sourceforge.net/opencore-amr/vo-aacenc-0.1.2.tar.gz
tar xzvf vo-aacenc-0.1.2.tar.gz
cd vo-aacenc-0.1.2
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install

安装 Yasm

yum remove yasm
cd /opt
wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
tar xzfv yasm-1.2.0.tar.gz
cd yasm-1.2.0
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
make install
export "PATH=$PATH:$HOME/bin" 

安装 Libvpx

cd /opt
git clone http://git.chromium.org/webm/libvpx.git
cd libvpx
git checkout tags/v.1.3.0
./configure --prefix="$HOME/ffmpeg_build" --disable-examples
make
make install

安装 X264

cd /opt
git clone git://git.videolan.org/x264.git
cd x264
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static 
make
make install

配置库

export LD_LIBRARY_PATH=/usr/local/lib/
echo /usr/local/lib >> /etc/ld.so.conf.d/custom-libs.conf
ldconfig

编译 FFmpeg(configure 应该在一行中)

cd /opt
git clone git://source.ffmpeg.org/ffmpeg.git
cd ffmpeg
git checkout release/2.2
PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig"
export PKG_CONFIG_PATH
./configure --prefix="$HOME/ffmpeg_build" --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --bindir="$HOME/bin" --extra-libs=-ldl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvpx --enable-libfaac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libvo-aacenc --enable-libxvid --disable-ffplay --enable-gpl --enable-postproc --enable-nonfree --enable-avfilter --enable-pthreads
make
make install

测试

ffmpeg -i YosemiteNationalParkPresents.mp4 YosemiteNationalParkPresents.webm

计划得慢慢的做。

建立并完善 Phalcon Engine 社区

2015年的头等大事儿是基于 Phalcon 开发 Web App 开发框架 Phalcon Engine,以及同时上线其同时社区 Phalcon Engine。Phalcon Engine 社区的核心并非推广 Phalcon Engine 引擎,而是为Phalcon 中文用户提供一个优秀的交流平台。

Oak Commerce 系统上线

这个是计划了一两年的事儿了,可是一直因为这种原因没有将其付之实施,而现在不想再拖下去了,所以这个必须要推出 。3月中旬应该上线。

学习使用 XCode + Swift 进行原生的 iOS 应用开发

办法很简单,看官方文档以及帮助文档,然后自己一边看一边练习,争取一个月拿下这东西,再争取一年之内,达到完全可以进行产品开发的程度。

同时,将 XCode 以及 iOS 开发的官方文档翻译成中文。

我们假设系统目录结构如下:

/path/to/app/
    controllers/
    models/
    views/
    public/
        css/
        js/
        img/
        index.php

index.php 为入口文件。

Apache

.htaccess 文件存放在 /path/to/app/public/ 目录下,同时编辑该文件,内容如下:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>

一个完整的虚拟主机配置文件示例:

<VirtualHost *:80>

    ServerAdmin admin@example.host
    DocumentRoot "/path/to/app/public"
    DirectoryIndex index.php
    ServerName example.host
    ServerAlias www.example.host

    <Directory "/path/to/app/public">
        Options All
        AllowOverride All
        Allow from all
    </Directory>

</VirtualHost>

Nginx

index index.php index.html index.htm;
try_files $uri $uri/ @rewrite;

location @rewrite {
    rewrite ^/(.*)$ /index.php?_url=/$1;
}

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php;
}

location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
    root $app_root/public;
}

location ~ /\.ht {
    deny all;
}

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

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

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

在 Windows 上安装 Phalcon

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

extension=php_phalcon.dll

重启你的Web服务器。

在 XAMPP 下安装 Phalcon PHP

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

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

extension=php_phalcon.dll

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

在 WAMP 中安装 Phalcon

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

在 Linux/Solaris/Mac 下安装

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

基本要求(Requirements)¶

必要的包:

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

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

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

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

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

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

编译

创建扩展:

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

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

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

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

重启Web服务器.

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

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

在 FreeBSD 上安装

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

pkg_add -r phalcon

或者

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

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

下载Movable Type

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

上传程序文件至服务器

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

安装必要的库

以下几个库是必须安装的

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

以下库必须至少安装一个

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

以下的库是可选安装的

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

Fastcgi Wrapper

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

#!/usr/bin/perl

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

require 'syscall.ph';

&daemonize;

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

&main;

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

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

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

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

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

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

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

    }
}

Fastcgi init 与控制脚本

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

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

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

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

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

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

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

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

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

restart() {
    stop
    start
}

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

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

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

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

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

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

站点的 Nginx 配置文件

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

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

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

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

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

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

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

安装 Movable Type

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

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

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

系统需求与安装前的准备

添加必要的软件仓库

wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 https://www.fedoraproject.org/static/0608B895.txt
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget -O /etc/yum.repos.d/PUIAS_6_computational.repo https://gitlab.com/gitlab-org/gitlab-recipes/raw/master/install/centos/PUIAS_6_computational.repo
wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-puias http://springdale.math.ias.edu/data/puias/6/x86_64/os/RPM-GPG-KEY-puias
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-puias

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

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

添加 Gitlab 的用户 git

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

其它准备工作

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

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

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

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

安装最新版本的Git

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

安装最新版本的 Ruby

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

创建 GitLab 使用的数据库

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

安装并配置 redis

yum install redis

编辑 /etc/redis.conf

port 0

同时添加下面两行:

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

然后重新启动:

service redis restart
usermod -aG redis git

安装 Gitlab

克隆 gitlab 代码至服务器

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

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

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

编辑 config/unicorn.rb 文件:

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

编辑 config/database.yml 文件:

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

安装 bundlersgems

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

安装 init 脚本:

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

设置 logrotate

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

设置 nginx

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

生成 SSL

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

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

数据结构

-- Table: catalog_category

-- DROP TABLE catalog_category;

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

字段说明

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

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

定义

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

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

商品的类型

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

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

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

  1. 品牌
  2. 货号

库存管理

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

  1. 颜色
  2. 尺码

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

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

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

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

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

对商品的描述属性

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

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

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

  • icon.png
  • splash.png

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

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

ionic resources

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

ionic resources --icon

ionic resources --splash

图片尺寸要求

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

其它要求

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

npm install -g ionic
npm install -g cordova

splash.zip
splash-header.jpg