Yii2 form布局


在yii2中使用gii生成是表彰格式是完全垂直的,如果想需要label和input平等的,可以这样修改代码

use yii\helpers\Html;
use yii\widgets\ActiveForm;

$form = ActiveForm::begin([
    'id' => 'login-form',
    'options' => [
        'class' => 'form-horizontal',
    ],
    'fieldConfig' => [
        'template' => '{label}<div class="col-lg-6">{input}</div>{hint}{error}',
        'labelOptions' => [
            'class' => 'control-label col-lg-2',
        ],
    ]
]) ?>
<?= $form->field($model, 'username') ?>
<?= $form->field($model, 'password')->passwordInput() ?>

    <div class="form-group">
        <div class="col-lg-offset-1 col-lg-11">
            <?= Html::submitButton('Login', ['class' => 'btn btn-primary']) ?>
        </div>
    </div>
<?php ActiveForm::end() ?>

使用Vagrant打造统一的开发环境

  1. 列表项

标签(空格分隔): Vagrant 开发 环境 团队


目前现状

开发环境不一致,Mac,Windows,Linux,虚拟机,服务器...
导致安装升级维护浪费很多时间,不同职责的开发人员互相之间的运行环境很难复用

WHY VAGRANT?

  • Vagrant 提供易配置,复制,携带的工作环境,并且这个环境是一个最标准的
  • 提供一个标准的工作流,最大限度的提高团队的生产效率和灵活性
  • 基于Viturlbox,Vmware,AWS。学习难度小,方便安装基本软件
  • 基于文本的可描述的开发环境,很容易做版本控制

    一次性解决所以繁琐的依赖及其配置。只要配置出标准的开发环境,之后团队中其它开发人员只要使用 vagrant up,就可以创建一个相同的运行环境。 Say goodbye to "works on my machine" bugs.

安装Vagrant

下载,点击安装即可,安装完成后在终端输入 vagrant测试是否安装成功。
安装 virtualbox 。

开始

$ mkdir vagrant_php
$ vagrant init hashicorp/precise32
$ vagrant up
$ vagrant package --output intv_ubuntu.box #打包当前环境,会在当前目录下生成一个intv_ubuntu.box

基础概念

box

是对Vagrant对虚拟机镜像(image)的封装。

$ vagrant box --help #
$ vagrant box list #查看本机的所以box
$ vagrant box add yourboxname basebox #将basebox添加到本机的box中
$ vagrant box remove boxname #移除某个box
$ vagrant repackage boxname virtualbox 0 #需要是vagrantcloud上的box

https://atlas.hashicorp.com/boxes/search

配置文件 Vagrantfile

常用配置

配置端口映射
config.vm.network "forwarded_port", guest: 80, host: 8080
同步目录
config.vm.synced_folder "data/", "/srv/website"

provision

config.vm.provision "shell", inline: <<-SHELL
    echo 'hello vagrant'
SHELL

载入配置

$ vagrant reload --provision

配置多个vm

config.vm.define("web") do |config|
    config.vm.box = "apache"
end

config.vm.define("db2") do |config|
    config.vm.box = "mysql"
end

Vagrant Share

$ vagrant share #需要注册 ,可以通过URL访问
$ vagrant share --ssh #可以远程ssh , 如:vagrant connect --ssh shining-shrew-6248

高级用法

  • 自己创建 baseox
  • Vagrant 版本
  • 多个machine

docker 常用命令


启动docker服务
sudo service docker start
确认docker安装成功
sudo docker info
查看本机已有的镜像
sudo docker images
运行一个docker容器,-i -t代表一个可交互的容器
sudo docker run -i -t ubuntu /bin/bash
启动一个容器
sudo docker start cnt_name
停止一个容器
sudo docker stop cnt_name
attach到一个正在运行的容器
sudo docker attach cnt_name
查看所有容器,-a所有,不加a只现实运行状态的容器

sudo docker ps -a
sudo docker ps -n 5 #显示最后5个容器 

获取更多容器信息
sudo docker inspect cnt_name
删除容器

sudo docker rm cnt_name
sudo docker rm `sudo docker ps -a -q` #删除所有容器,-q表示只返回容器ID

从docker hub 下载镜像
sudo docker pull fedora:21
从dcoker hub 上查找镜像
sudo docker search ubuntu

docker commit 创建镜像

先创建一个容器
sudo docker run -i -t ubuntu /bin/bash
安装nginx

apt-get -yqq update
apt-get -y install nginx
exit

查看容器ID
sudo docker ps -l -q
提交该容器
sudo docker commit 6689b00fa0d2 hankdai/nginx
查看刚提交的容器

sudo docker inspect hankdai/nginx 
sudo docker push hankdai/nginx #推送到docker hub

基于Dockerfile构建镜像

创建我们的第一个Dockerfile
cd static_web
创建Dockerfile,内容如下

# Version : 0.0.1
FROM ubuntu:14.04
MAINTAINER Hand Dai "daigangbo@gmail.com"
RUN apt-get update && apt-get install -y nginx
RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html
EXPOSE 80

生成镜像

sudo docker build -t="hankdai/static_web" .

使用刚生成的镜像启动一个容器,设置80映射80,容器名为static_web,并启动nginx

sudo docker run -d -p 80:80 --name static_web hankdai/static_web:v1 nginx -g "daemon off;"

访问http://localhost可以看到

Dockerfile 指令

  • CMD
    指定一个容器启动时要运行的命令,可以被覆盖
  • ENTRYPOINT
    容器在启动时运行的命令,并且不能被覆盖,会被CMD作为
  • WORKDIR
    切换到容器内的一个目录,CMD和ENTRYPOINT命令指定的程序都会在这个目录下执行
  • ENV
    设置一个环境变量,相当于脚本语言里的var关键字
  • USER
    用户指定镜像会以哪个用户去运行
  • VOLUME
    卷功能让我们可以将数据,如源代码,数据库文件添加到镜像中而不是提交到镜像中,并且可以在多个容器中共享这些内容。
  • ADD
    用于将构建环境下的文件和目录复制到镜像中。如 ADD somefile /var/somefile 将构建目录下的somefile拷贝到容器中。
  • LABEL
    为docker镜像添加元数据
  • ...

使用docker创建一个静态网站容器

这章你需要了解nginx的基本使用
Dockerfile内容如下

# Version : 0.0.1
FROM ubuntu:14.04
MAINTAINER Hank Dai "daigangbo@gmail.com"
# 安装nginx
RUN apt-get update && apt-get install -yqq nginx
RUN mkdir -p /var/www/html
ADD nginx/global.conf /etc/nginx/conf.d/
ADD nginx/nginx.conf /etc/nginx/nginx.conf
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
EXPOSE 80

Yii2-log组件


添加log组件配置

'log' => [
    'traceLevel' => YII_DEBUG ? 3 : 0,
    'targets' => [
        'file' => [
            'class' => 'yii\log\FileTarget',
            'levels' => YII_DEBUG ? ['error','warning','info','trace','profile'] : ['error', 'warning'],
            'categories' => [],
            'logFile' => getenv('LOG_FILE_PATH')?:null,
            'logVars'=> [],
        ],
    ],

],

记录信息Yii::error,Yii::warning,Yii::info等。做开发api时可以在有错误时输出到页面。

$messages = Yii::getLogger()->messages;
print_r($messages);

使用teamviewer远程协助

QQ的远程协助我们大家都用过吧,上手非常简单,但问题是对网络要求很高,在网络一般的情况下非常卡。
下面推荐大家使用的teamviewer更适合远程协助。

teamviewer 简介

teamviwer是一个远程协作的工具,非常强大,可以用于远程协作,远程演示,视音频会议等,官网https://www.teamviewer.com/zhCN/。

teamviewer客户端分类

  • teamviewer 完整客户端
  • TeamViewer QuickSupport ,如果你只需要别人远程帮你解决你电脑的问题,那安装这个就行了
  • TeamViewer Host,用于对远程计算机进行24×7小时全天候访问,如果你希望可以随时连接到家里的电脑,那安装它吧
  • TeamViewer QuickJoin, 如果只是参加会议,安装它吧

远程协作实战

如果你的朋友小明现在想让你帮他看看电脑问题,那你需要以下几步
1. 让小明安装TeamViewer QuickSupport,下载地址 mac版本(https://download.teamviewer.com/download/TeamViewerQS.dmg),windows版本(https://download.teamviewer.com/download/TeamViewerQS_zhcn.exe),下载可能有点慢,可以使用迅雷等下载软件。
2. 你自己安装TeamViewer完整包,下载地址 mac版本(https://download.teamviewer.com/download/TeamViewer.dmg),windows版本(https://download.teamviewer.com/download/TeamViewer_Setup_zhcn.exe)。

  1. 小明安装完后启动TeamViewerQs,界面上会出现一个ID,一个密码,如下图
  2. 小明将ID和密码发送给我,你把小明的ID复制到自己的teamviewer
    ,然后点击到“连接到伙伴”,正常的话会提示你密码,填写密码就可以看到小明的桌面了。

git的一些常用高层命令

git config

  • git config --system:系统配置
  • git config --global:全局配置
  • git config --local:本地配置
  • git config -e:编辑配置文件(可与--system, --global, --local组合使用)
  • git config --unset:删除某个配置
  • git config --get:显示某个配置的值
  • git config -l --list:列出所有配置
  • git config alias
  • git config push.default
  • git config pull.rebase

git log

  • git log --stat:简要显示增改行数统计
  • git log -p --patch:展开每次提交的差异
  • git log --name-status:显示新增、修改、删除的文件清单
  • git log --graph:以一些ASCII字符串表示的简单图形,形式地展示了每个提交所在分支及其分化衍合的过程
  • git log --oneline:以单行的简要方式显示log
  • git log --format=:格式化输出日志
  • git log --grep=:搜索匹配关键字的提交
  • git log --author=:过滤出对应作者的提交
  • git log --pretty=:[oneline, short, full, fuller, raw]
  • git log --since=:某个日期之后的提交
  • git log --until=:某个日期之前的提交

git status

  • git status -s:简化方式输出当前状态信息
  • git status --ignored:显示被忽略的文件

git stage, git add

  • git stage -a:暂存所有文件
  • git stage -u:暂存更新文件(包括删除)
  • git stage -i:以互动方式暂存文件
  • git stage -p:暂存文件的部分改动

git checkout

  • git checkout:汇总显示所有状态
  • git checkout path:对于path使用暂存区的内容覆盖工作区
  • git checkout commit -- path:对于path使用commit的内容覆盖工作区
  • git checkout branch:切换分支
  • git checkout -b branch [start-point]:以start-point创建新的分支branch(默认的start-point是HEAD)

git reset

  • git reset path [reset-point]:使用reset-point的内容覆盖暂存区
  • git reset --mixed [reset-point]:重置版本库的内容为reset-point,暂存区内容也被重置,工作区内容不变(git reset的默认动作)
  • git reset --soft [reset-point]:重置版本库的内容为reset-point,暂存区和工作区的内容都不改变
  • git reset --hard [reset-point]:重置版本库的内容为reset-point,暂存区和工作区的内容均被重置

一个神奇而有用的工具(diff&patch)

diff, patch是*nix系统的工具

  • diff用来对比两个文件的差异
  • patch可以看成是patch的反操作

git diff, git apply

  • 使用git diff和git apply本质上是git对diff, patch的一次再封装
  • 使用git diff生成补丁文件
  • 使用git apply应用补丁文件
  • git diff, git apply面向的补丁文件有一个实际意义上的标准,可以在不同的版本控制软件中交流使用

git format-patch, git am

  • 分别对应git diff, git apply的批量操作
  • 使用git format-patch可以对一批commit生成多个对应的补丁文件
  • 使用git send-mail可以将这些补丁文件发送给项目管理员
  • 项目管理员可以使用git am批量应用补丁
  • 实际上这就是开源软件一种工作流

修改提交历史

使用上一次提交历史git commit --amend

在上一次提交的基础上继续修改、删除、新增文件,提交时加上--amend选项,新提交的内容就会与上次提交的更新进行合并。也可以不做任何改动,直接使用git commit --amend来修改上次提交的说明信息

修改多次提交git rebase -i

git rebase -i [start-commit]..[end-commit]可以对指定范围内的提交进行合并、修改、切割等操作

注意:不管是git commit --amend还是git rebase -i,修改过的commit都会重新计算校验和,所以一定要注意不要去修改已经推送到公共版本库的提交,否则会引起人民群众的公愤。版本库管理员为了安全起见,也可以禁止使用--force选项进行推送,避免这种情况的发生

git的一些常用的工作流

集中式工作流

搭建一个中心版本库,所有成员从这个版本库里面克隆代码。
只使用一个分支master,所有提交均推送到这个分支。
所有成员设置pull.rebase为true,避免非快进式提交。
管理员在中心版本库配置receive.denyNonfastforwards为true,拒绝非快进式的推送。
这种工作流本质上是把git当成svn这种集中式版本控制系统来使用。

  • 优点:项目提交历史完全线性化,因此项目条理十分清晰,管理也十分简单
  • 缺点:模式过于简单,无法适应复杂的开发情景与多变的项目需求
  • 很少有项目只使用这种工作流,但这种工作流常常用来与其它工作流来配合使用

金字塔式工作流

项目有多个版本库,但有一个核心的、权威的版本库。
这个核心的版本库有一小批核心管理员,这些管理员有权限直接向核心版本库推送更新。
这个核心的版本库有一大批项目贡献者,每个贡献者者隶属于某个或某几个核心管理员,核心版本库对这些贡献者开放只读权限。
项目贡献者可以克隆核心库来创建自己的版本库,然后在此版本库上生成贡献代码,或通过pull requests,或通过send mail patch将贡献代码发给核心管理员
核心管理员在审核完贡献代码后,如果代码质量通过,管理员就会将贡献代码合并到核心库的某个分支上

  • 优点:结构灵活多变,可以从横向和纵向上来拓展工作流的结构,可以适应大型项目的复杂情景
  • 缺点:对核心管理员的要求极高
  • 几乎所有的大型开源项目都是使用这种工作流或这种工作流的变种

git-flow

搭建一个中心版本库,中心版本库保持一个长期的、稳定的分支。一般是master,也有项目是stable
中心版本库还会保持一个长期的、但经常更新的分支。一般分支名称是develop
平常情况下都是develop分支在演进,如果有某个特性需要开发,便从develop上分出一条分支feature/xxx。待特性基本开发完成后并入develop分支
如果要准备发布,可以从develop上分出一条分支release/xxx。后期所有和发布相关的提交均推送到这个release分支上。待release分支开发完成,并入develop和master分支。用master分支进行部署
如果生产环境发现紧急bug,从master上切出hotfix/xxx分支,修正后将该分支并入master和develop分支,必要时也并入release分支
定期清除一些过期的feature, release, hotfix分支

  • 优点:中心版本库的主分支只有两条,条理相较简单清晰,起码在人的能力控制范围内,项目成员可以直接参与项目贡献。同时,通过feature, release, hotfix三类分支的配合使用,也能适应复杂的情景
  • 缺点:工作流流程比较复杂,上手不是很容易,同时对项目成员的能力要求比较高。如果项目部署后,经常出现紧急bug,就要频繁的建立hotfix分支,甚至是release分支,一样会扰乱分支历史,难于管理。
  • 适用于小团队的项目开发管理,能适应项目成员能力平均和不平均的情景。同时,sourcetree这款git的图形界面软件也对这种工作流进行了一定程度的封装

cherry-pick

项目中心版本库维持多个长期支持分支,每个分支对应一个测试用例,即平常我们说的测服、真服
用于部署真服的分支一般是master,其它分支名字随意,假定部署测服的分支为develop
平常代码在develop上演进,每个提交必须基于一个主题,这个主题可以是一个特性、一个bug、一个模块、一个功能等等
每个主题必须要有一个唯一性标识,并且这个唯一性标识必须体现在提交说明上
在发布时基于要发布的主题,从develop上筛选出对应的提交,把这些提交分别并入master上,然后进行部署、测试、发布

  • 优点:中心版本库只有若干条主线,并且这些主线的提交历史是完全线性的。条理十分清晰。
  • 缺点:在开发分支的演进模式偏于简单,如果项目成员数过多,会有点适应不了。同时,对提交说明的书写要求很严格,如果漏掉说明,就很难基于主题定位到这个提交。这个可以通过git的钩子系统来检查
  • 这种工作流的单个分支上其实就是集中式工作流,适用于小团队的项目开发管理

git的一些底层命令

  • git rev-parse
  • git cat-file
  • git read-tree
  • git commit-tree
  • git ls-tree
  • git update-index
  • git update-ref
  • git hash-object
  • git reflog