关于git的理解

umount一个目录 等同于 umount一个设备device

公钥和私钥是一种非对称加密,你的公钥可以发给很多人,便于别人向你发送文件(用公钥加密),你接到密文后用私钥解密.由于私钥只有你自己拥有,所以其他人即使截取到密文和公钥,但是没有私钥所以也不能解密密文文件, 从而增强了传送文件的安全
明文---(公钥)--->密文---传送网络 ---->解密明文(私钥)

umount /目标target is busy?

lvm卷组管理, 是把所有的磁盘设备/dev/sda或分区/dev/sda1等, 统一地组合成卷组vg, 然后在卷组的基础上统一划分lvm.所以不允许 一部分磁盘空间在卷组内, 另一部分磁盘空间没有在卷组内, 也就是说, 卷组和非卷组独立分区不能共存

要调整物理磁盘空间(非lvm)?

  • 要卸载该分区 umount /dev/sda5
  • 检查文件系统是否工作正常 e2fsck -f /dev/sda5?
  • 更改空间大小 resize2fs /dev/sda5 200G

在lvm分区管理命令中, xxs == xxdisplay s相当于show显示
比如 pvs = pvdisplay, vgs=vgdisplay, lvs=lvdisplay

=============================================

关于win的长短文件名?
短文件名是在 dos+fat12/fat16时代, 命名规则是8.3: 8是文件名表示8个字节(8个字符), 文件名超过8个字节在dos中不会被时别
扩展名超过3个也不能被dos时别
而fat32则完全支持长文件名
当创建一个长文件名时,系统会自动加上对应的短文件名,原则是:
取长文件名的前6个字符加上~1形成短文件名,扩展名不变
如果这个...~1文件名已经存在, 则在~后的数字递增, 比如...~2, ...~3,直到5
如果存在老os或程序无法读取的字符, 换以"_"

关于mount的选项
mount的文件系统类型:
fat16 msdos
fat32 vfat
ntfs
光盘 iso9660

-o 是指定mount时的选项, 可以有多个选项(一个选项可能有多个等式,比如字符集选项), 用逗号隔开
常用的选项有: mount -o rw,remount 等 (remount重新安装已经存在的文件系统)
支持中文: 在选项中指定mount -o codepage=936 iocharset=gb2312, 一般使用一个选项 mount -o iocharset=cp936 /dev/hda5 /mnt/hda5 就可以了 如果还是有乱码,就使用utf8编码
mount后, 普通用户不能写? 设置选项 mount -o umask=000
mount后分区中的文件名都变成短文件名? 是因为文件系统类型挂载错误, 将fat32挂载成fat16了, 要先umount, 然后重新挂载: mount -t vfat /dev/hda5 /mnt/hda5
mount可以直接使用iso文件? 可以,将*.iso文件挂载到一个目录上: mount -o loop linux.iso /mnt/iso

mount挂载的目录可以不为空, 但是要是一个当前已经存在的目录! 挂载上新设备后,原来的目录内容将不可用, 直到umount
挂载目录时, 为了方便和好记忆, 统一将挂载目录 创建在/mnt/...下, 而且目录名称就和设备名称相对应: /mnt/want_mounted_devname

vim的help很有用, lnix文本文件的格式可以是很"自由"但是很有分隔隔行等规律/韵律的! folds under the cursor是折叠当前光标下的(可以折叠的内容)(判断当前光标下的内容是否有折叠, 很直观的,你直接就可以看出了,如果有空格/tab等缩进就表示可以折叠),
如果内容是顶格的,就不能折叠.
under the cursor: 是指当前光标所在的(行), 这里的under并不是"在...之下"的意思.当前光标所在的行将被 折叠(被包含在折叠中)!
zc是 close one fold under the cursor. 只折叠当前光标所在行的(及以下行) 的区域, zC则要递归折叠,所以 凡是跟 当前行平级的 其上+其下的行都将被折叠
zo是 open one fold under the cursor. 意思就是如果当前折叠下还有折叠, 那么只会打开当前折叠,折叠下的折叠不会打开

如果不急于卸载该文件系统,可以使用 -l --lazy选项, detach the filesystem now, clean up things later , 在设备不忙,不被其他进程所使用的时候, 再umount. 但是一般好像不行, 得需要用
fuser, lsof, -k等终止进程后, 再umount

mount到一个目录后, 原来目录中的内容只是暂时被遮盖,(就像就用窗帘遮住窗户一样, umount后拉开窗帘后,原来目录中的内容又会显示出来)
默认的mount是挂载到内存中的, 重器后mount条目就丢失无效了. 要开机自动挂载,就是将mount项写到/etc/fstab文件中

  • / 下关于系统/信息的两个挂载目录 是 /sys, /proc,还有/tmp, 等
  • 关于文件系统挂载的列表, 在 /etc/mtab, --> /proc/self/mounts文件中

关于时间日期的一贯写法
Something on Mon Dec 10 15:08 2019
(on短格式星期, 短格式月份+数字日期 时间 年份)

关于mount的一些重要参数
-a --all (mount all filesystems mentioned in fstab)不是auto的意思, --a就是手动挂载一次fstab中的项目,通常用于测试fstab的配置
-n --no-mtab don't write to /etc/mtab (这个只是一个加速选项,跟noauto类似,其实没有多大用处)
-L, -U 是指用label或uuid来指定挂载设备, 比如: mount -L /1 /mnt/test1 标签的表示方法这里用的是 /1:: 因为分区名称的格式是 /dev/...以斜杠开头 所以,LABEL也可以用斜杠开头命名,比如: e2label /dev/sda2 /DATA
-B --bind (mount subtree somewhere else) 把一个子目录mount到其他地方? 如果不加-B 会提示"...is not a bolck device" 如果要把一个目录mount到另一个目录写入到fstab, /etc/dir1 /mnt/dir1 none bind 0 0
如果没有fs类型,或不需要指定的话, 就直接用none. 目录绑定的options用 bind.
为什么要使用-B选项,为什么要将目录mount到另一个目录呢? 主要是在一些特殊的场合: 比如 ftp服务器,你设置了一个共享目录 sharedir. 此时你想临时共享另一个目录tmpsharedir, 那么
这时你就可以不用修改共享设置, 而是将tmpsharedir 临时挂载到sharedir: mount --bind tmpsharedir sharedir

当需要在不同的目录位置使用相同的文件时, 不必在每一个地方放一个相同的文件,只需要在一个地方放置一个文件,其他地方创建软链接就可以了, 不必重复占用磁盘空间
在linux中很多命令(程序)具有相同/类似/惯例的选项,比如: -l(表示列表, list), -c(表示命令command)等,而一个命令中, 选项和参数是不同的,选项在中间,参数(一般是最后的)表示命令的动作对象
比如: ln -s /path/to/source.file /path/to/link.file

mount的概念理解
磁盘被分区/格式化/安装os后,里面就有文件内容了, 但是, 我们如何去访问它(磁盘中的内容)? 就是要通过一个目录mount去访问. 在os中创建一个目录(只是一个符号而已),让磁盘mount到这个目录, 这时这个
目录就相当于一个访问磁盘内容的入口, 相当于一扇门, 可以从这扇门进入到磁盘. 至于这扇门放在哪里都是可以的,所以, 你将磁盘mount到哪个目录都是可以的. 磁盘不mount到目录你是无法访问的,因为没有访问入口.

win下给磁盘分区一个盘符c/d/e就相当于mount, upan退出就相当于umount

===========================================================

硬盘分区和os其实是没有任何关系的, 因为在安装os之前就进行分区了.
能不能不分区, 直接安装操作系统? 不行, os在启动时要通过mbr来获得os所在的分区, 所以一个可引导分区不必须的
你可以将磁盘分成多个分区, 比如 :/, /home, /boot, /opt, /var/www, /usr/local等,主要是为了提高管理效率, 减小每次在分区上的文件检索量
分区符号是sda, 还是hda, 不是根据是否机械硬盘, 而是根据你分区的类型比如你选择scsi, 则机械硬盘的分区还是/dev/sda, /dev/sda123

linux操作系统, 根目录必须安装在主分区上.
挂载就是 将 分区<--->目录 关联起来: win是将分区和盘符cde等映射,而linux是把分区和目录映射起来.

为什么要用LABEL / UUID来代替内核名称 指定fs/指定设备分区?
磁盘顺序序号,跟磁盘驱动程序和磁盘本身的启动有关.
是为了防止磁盘(是磁盘顺序,不是分区顺序)存储顺序的改变,对fstab中的挂载项造成影响,使文件系统/os系统它无法启动
比如/dev/sda磁盘由于热插拔或另外增加了一块硬盘,这时这块新增的磁盘成了/dev/sda, 而原来的/dev/sda变成了/dev/sdb, 当os启动时,加载fstab中的根目录,
由于/etc/fstab文件中记载的根目录/是挂载到/dev/sda上的,而sda是新增的这块磁盘,可能不存在或根本就没有os文件. 所以这时候机器就会启动失败.
当用LABEL或UUID时,不管你磁盘存储顺序sda/sdb如何改变 ,也不管你增加了多少块磁盘, 在整个机器中, 同一个LABEL或UUID始终指向的是 原来那个磁盘的原来分区 , 始终能保证os的根目录 /, /home, /sys, /etc 等
目录 跟 分区之间保持不变的 挂载映射关系, 从而使fstab始终能够正确挂载.

linux中的文件名后,可以跟一些 类似 "扩展名"的东西, 但不把它看成扩展名, 扩展名可以是任意字符任意个数的
输入错误根据科学统计一般都是由"无效击键"造成的

一般来说, 网站中的每个网页都应该有"不同的/相应的"网站标题, 这个标题可以完全由程序动态生成, 但一般还是由手工输入 + 程序动态

bootstrap适合做前端界面,布局美观,主要是通过css来实现,是css框架
easyui适合做后端,主要通过js来实现,是js框架.
两者都需要.

vim命令的数字是放在 命令的开头还是中间?
对于 两个相同字符的命令,比如dd, yy等, 数字是放在最前面的,这时候的数字包括所有的行 , 比如: 3dd, 4yy
如果包含 j, k等方向性的字符命令, 则数字是放在中间的, 这时候的数字不包括当前行, 比如: d2j, d3k,

为什么linux下的firefox网页文字显得那么小?
参考: https://blog.csdn.net/mythinker2/article/details/86746427
是因为 firefox的设置所致:
在浏览器中输入 about:config, 接受风险, 修改: layout.css.devPixelsPerPx 即设置 每font-size字体像素(比如14px)的设备像素分辨率, 通常设为1.3(根据自己的需要)

bootstrap包括三大类 css样式, 组件, 和js插件.
用的最多的是表单 form. 表单有三种:

  • 默认的是 <form>... 什么类都不加, 这时候, label, 和input等控件全都是 纵向排列, 一个一行
  • 其次是inline-form, <form class="form-inline">... 内联表单, 即所有的控件 全部都在一行
  • 最后是 水平表单, 这个就是平常通常使用的表单. <form class="form-horizontal">, 此时, 一个标签和其对应的input控件占一行.

一个form-group(一个表单控件组)包括 一个标签 , 一个控件等
在form-horizontal表单中(就像栅格系统的多个行/列), 一个 form-group就相当于一个栅格的row, 而且: 此时的label不再是单纯的标签了, 而是具有class="control-label"的类了
那么, 通常来说, input控件/ checkbox控件 /按钮控件 要放在单独的 div.col-md-xxx下, 而只有label不需要放在div.col-md-xxx下, 直接在 label中添加 col-md-xx类就好了.
通常一个input的属性固定写法是: <input type="text" class="form-control..." id="..." placeholder="...">

bootstrap中的checkbox和radio的固定写法:

<div class="checkbox disabled"> // 这里的div有一个checkbox的类
  <label>
     <input type="checkbox" value="11"> // 这里的input也由一个checkbox的类
     abc abc abc &mdash; abc
  </label>
</div>

<div class="radio">
  <label>
    <input type="radio" name="radios" id="radio1" value="r1">
    some text to indicate/exclaim radio
  </label>
</div>

============== 注意这些checkbox和radiobox默认时纵向排列, 每一个一行, 如果要一行多个checkbox, 则需要内联 的checkbox,
<label class="checkbox-inline"> // 注意这里没有div, 只有label
  <input type="checkbox" value="c1"> some text to explain/interpret/expound the checkbox/radio
</label>
<label class="checkbox-inline">
  <input type="checkbox" value="c2"> some text to explain/interpret/expound the checkbox/radio
</label>

在bootstrap的说明文档中,一开始就说了, 全局字体设置为14px, line-height行高设置为 1.428

虽然标题标签可以从h1~ h7,但是bs中使用时通常只有6级, 从h1, h2,到h6. 大小依次是:
h1(以及对应的标题类, .h1) 36px(6*6), h2(.h2) 30px, h3 24px h4 18px; 但是 h5: 14px h6 12px
标题标签对网站的seo权重影响很大,很多网站 的h1 仅用在 隐藏的logo中用来提升权重

jumbotron类只规定了padding-top/bottom的大小, 但是并没有直接规定其中的文字字体大小. 所以, 要在jumbotron中再写 标题标签或p标签来设置字体大小.

格式化/删除行车记录仪tf卡内容失败,提示"Read-only file system?"
:: 运行命令mount -n -o remount,rw /dev/sdb, 即重新 挂载这个文件系统,使这个只读文件系统变得可写,可格式化?

man mount对--remount这个选项有说明: attempt to remount an already-mounted filesystem.
This is commonly used to change the mount flags for a filesystem, especially to make a readonly filesystem writable.
It does not change device or mount point.
但是遗憾的是, tf卡在重新被挂载的时候, 提示 `MOUnt: cann't remount /dev/sdb1 read-write, is write-protected" 不能被重新挂载为读写模式,因为有写保护,所以也就不要再管了

为什么要穿平地软薄皮鞋开车?
因为 离合的高低/油门的大小,刹车力度的大小,都是靠脚来感知的,不然完全没有 "脚感",没法开
脚感,脚的感觉来自于脚踩这些操纵器的反馈, 操纵器的反作用力 --> 鞋底 --> 脚底神经 ---> 大脑感知. 如果鞋子不行,鞋底太厚,就没有感知.

bootstrap中的input等非闭合标签结尾不加斜杠?
:这个是html5的规范要求, 规范就是这样的,input等非闭合标签结尾不需要再加斜杠了,而不是bs的单独写法
同样,html5中的新规定,标签的"逻辑性boolean性属性,比如disabled, checked"等属性,直接写"值",不用写成数姓名=属性值的形式

对于标题h1, ~ h6, bs中有两种用法, 即可以用标签, 也可以用类, 像 .h1 ~ .h6 , 有时用标题类在写法上更方便
两者的css完全是一样的

学期怎么说?
美国的学期只分两个学期, 即spring se'mester [si'mest2], fall semester
英国的学期分三个学期, spring,summer,autumn term

跟input输入框一起排列的前后小块,叫: input-group-addon, 最重要的是, 这个addon可以是任意的内容, 不只是什么字体图标,
还可以是任意的内容,比如文字! 整个组成是:
div.input-group> label(或者span标签).input-group-addon{内容可以是图标或文字} + input.form-control[type=text]....

关于vim中的宏录制?

  1. 录制方法是: 在normal下 按qX 进入录制macro模式, X是buffer名称,可以是a-z, 0-9的任意字符,比如qm (m就是macro)
  2. 按正常操纵方法进行操纵
  3. 结束宏录制: 在非insert模式下,按q 退出宏
  4. 使用: 在任意行的位置处, 按 @X即可对该行使用录制的宏操纵了,要使用多次宏,用 数字@X, 比如: 10@m

===============================================================

关于bootstarp的datepicker使用方法

  • 是建立再bs基础之上的日期选择插件,所以要先引入bootstrap的css和js, 然后再引入bootstrap-datepicker的css和js以及locale: zh-CN.js
  • 有两个插件,一个是bootstrap-datepicker, 一个是bootstrap-datetimepicker很显然,后者是前者的扩展,可以选择日期和时间,但一般都用的是前者
  • 使用时, 只需要在input属性中添加 data-provide="datepicker或datepicker-inline"就可以了, 这个就可以选择日期了. 即使不加 js部分. 而使用js部分
    主要是为了给picker设置options选项和一些控制方法等.
  • 常用的options包括: (注意它们的写法, 这里参考: https://www.jianshu.com/p/48b2343ded54,这个里面的参数基本上是齐全和准确的~)
    language:"zh-CN" (要用中文显示,这里的属性名称是language, 注意不是locale,或许以前/有些版本是 locale,但是在这个能用的版本中是language! )
    autoclose: true(注意是autoclose, 不是 autoClose! 可以是true, 不可以是1 ~~~)
    format: "yyyy 学年" (这里如果只写了yyyy,那么即使你选择了完整的年月日,也只显示年分)

为什么在bs等一些框架中,用i标签(甚至比span标签用得更多)来表示字体图标?
i标签主要是样式, em主要是内容/语气上做强调;
i也是 icon 图标的意思,所以在一些框架中,用i标签来承载字体图标,比如 <i class="glyphicon glyphicon-search"></i>或者 用span标签也可以.
字体图标,只能单独使用, 不能和其他class和标签混合使用.

验证码和验证码点击更新的写法:

<div class="form-group">
  <div class="col-md-offset-2 col-md-5">
    <p>验证码 &nbsp;<input size="10"> 
      <a href="javascript:void(0)">
    <img src="{:U(checkcode)}" title="看不清?点击更新" onclick="this.src='/index.php/Home/Index/checkcode.html?r='+Math.random()">
      </a>
    </p>
  </div>
</div>

在vim中格式化时,可以增加/删除 行首的空格, 但是 不会"主动" 地帮你分行: 就是不会在行中 给你 添加回车换行符的!

input/select标签的 readonly, disabled, multiple 属性在html5中,不需要写成等号的形式, 直接使用就可以了, 如同一个形容词一样!
设置这些属性的方法可以有多种方法,比如: $('ele').attr('readonly', 'readonly'), 或者: $('ele').attr('readonly', true);

fedora等的空间切换: super+pageup/pagedn 是切换托盘空间; 而 shift+ super+pgup/pgdn则是将 某个程序移动到另一个托盘空间.

表单及表单元素的自动完成属性: autocomplete!
这个时html5的新属性,是指表单元素通常会基于浏览器之前用户输入的值自动填充, 这个行为字h5之前就一直存在,只是之前没有这个属性.
这个属性还是比较有用的!

  • 默认情况下, 整个表单及表单中 的元素都是自动完成的,即 autocomplete="on"
  • 对于有一些表单元素,比如input,里面的输入可能是用户比较敏感的/重要的信息, 是不希望别人在表单刷新之后还保留着的,也就是不希望是 autocomplete的
    这个时候,就需要将这个元素的属性设置为off: autocomplete="off"
  • 当然如果需要将所有的表单中的元素都设置为off, 就在form表单的属性中设置 autocomplete="off"
  • 通常的情况是: 只是将表单中的个别元素设置属性为: autocomplete="off", 其他保持默认的on. 注意: password域的autocomplete属性总是为off.
  • 特别需要注意的是, 表单input保留之前输入过的值, 跟网页设置 cache-control, no-cache, expriation, refresh 等属性好像是无关的??!

从网络上下载的firefox-72.0.1 本身就是已经包含了 可执行文件,和执行所需要的so库了,不需要再编译, 直接可以运行其中的 firefox/或 firefox-bin就可以打开并使用浏览器了
很方便的 下载的 firefox-72.0.1.tar.bz2 用 tar -jxf 来解压.

ajaxReturn不同于普通的return, 是通过ajax调用返回数据给浏览器客户端
返回的数据, 支持四种类型: 数字(0,1,2,3..),字符串('abc...'), 数组, 对象. (这四种类型的返回数据会自动识别并编码传输???)
=== $.ajax中, 一些参数的含义: dataType: 是指返回的数据的类型,有:html,script, json,text等, 其中text返回的是"字符串",如果是"数字",应该是"数字字符串!" , type: ajax请求的类型
,默认的是 get! 不是post, 这在tp中通过pathinfo方式传参时特别有用! async: 请求是异步还是同步的? 异步表示在请求时可以进行其他网页操纵,请求是非阻塞的,默认的就是异步的,但是,在
包含$.ajax的调用函数中,要给$.ajax外部的变量赋值时,要设置为同步方式,即async: false???

关于验证码的检查, 参考: https://blog.csdn.net/zengxiangxuan123456/article/details/50966202

关于程序中, 变量名和函数名的命名规则和风格?
有三种命名风格:
匈牙利命名: 用一个/少数几个小写字母表示变量的类型(缩写),然后用首字母大写单词表示变量名称: iWidth, sName...
驼峰命名: 小驼峰命名法 oldValue, 大驼峰命名法: NewValue
帕斯卡命名: 用连线或下划线连接多个单词,比如: old_value, 来源于 pascal这种语言...
---- 通常, 在win系统中,在c/C++ 中, 使用匈牙利命名法较多, 而在unix/linux系统中,使用帕斯卡命名法较多.
-----而其他 跨平台/开源/的语言中使用驼峰法则较多. 比如js和php都是使用的驼峰命名法

  1. 命名方式: 要简短!
    变量名: 名词/形容词+名词. 函数名: 动词/动词+名词(动宾短语), 但是类的成员方法一般用纯动词, 不用动宾, 因为宾语就是类名本身.
  2. 而现在开发使用的语言,js/php使用的是 小驼峰命名法!
    而只有 tp的类名/类文件名, 则使用的是 大驼峰法
  3. 如果你不清楚某种语言的命名规则, 看一看这种语言的典型文件就可以知道了.比如js看一看jquery,bs.js, php看一些tp

=======================================================

表单注册页面中,如何检测和显示错误提示信息? 以及如何让错误信息消失?

  1. 检测时, 只需要从上到下,一项一项地检测,不需要一次性地全部检测.只要前面有一项不合规定,就马上终止检测,并在相应位置处显示错误提示信息
  2. 错误信息如何消失? :: 只有该元素比如input获得焦点,才马上让错误信息消失?如果该input没有获得焦点, 其错误提示信息就一直不用消失.

错误信息格式:
.elementTip{
color: #ff5b5b;
border-color: #ff5b5b;
}

.tip{
display: block;
padding-left:20px;
background: url(...) no-repeat;
background-size: 15px 15px;
background-position: 0 1px;
(size应该是数字+单位,如果是0, 则不写px)
}

==================================

关于js中等于符号中包含着大量的隐式转换? 比如"true" == true 的结果 为什么是 false?
主要有这样几次隐式转换法则:

  1. 等式中包含布尔值时, 首先要把布尔值转换为整数值: false转换为0, true转换为1
  2. 当字符串和整数值比较时, 要把字符串 通过 Number函数 转变为整数再比较
  3. 'true'字符串转换为整数值时,结果为 NaN
  4. 当NaN和任何值比较时,结果是 NaN 不等于任何数,包括NaN 自己!
    即整个转换过程是: true --> 1, "ture" --> NaN, 所以 "true" == true 的 结果是false!

关于tp中的验证码验证问题?

  1. 感觉 ajaxReturn好像不是很好使. 今后尽量少用,麻烦?? 不如: dataType: "text", php中直接 echo.... 简单直接好使!
  2. 验证码验证时, 是将 当前用户输入的验证码和 保存在Session中的 验证码相比较!
  3. 注意的是: 一旦验证成功, 即 $verify -> check($code) 这个方法调用成功,返回true后, Session中保存的验证码就被清除了,所以 再次验证时, 得到的结果就总是验证错误了,
    即验证码 不能重复验证!

css的三种使用场合其实是有规可依的:

  1. 如果是在一个文件内部, 只是某一个元素使用的样式,那就用内联的方式,写在这个元素上面就好了
  2. 但是,如果是这个文件内部,多个元素都要使用的同一个样式,比如说, 多个input元素都要使用的错误提示类样式, 那就写在<style>内部
  3. 如果是多个文件都要使用的样式,那么就放在一个css文件中, 让多个文件去link
    总之,就是一个 "复用" 的问题.

vim中的w, dw
如果是W, 大写的W, 表示的范围是从当前单词开始,直到下一个单词前的空格! 所以有时候用dW 是很高效的.

js 数组定义和遍历?
for循环:使用变量,将长度缓存起来,避免重复获取长度,数组很大时优化效果明显

for(var j = 0,len = arr.length; j < len; j++){
    console.log(arr[j]);
}

vim在visual选择模式下, 所有的操作都成了单字母操作,比如 y, d, 缩进>, 格式化=
而在normal模式下, 上述操纵都是 双字母操作: 比如 yy, dd, 单行缩进 >>, 格式化== (单行格式化: == )

php类的静态方法和静态成员的使用?

  • public通常在static的前面,即public static $name='...'
  • 静态方法, 即可以用类来调用, 也可以用对象来调用.
    而静态成员, 就只能用类来调用
  • 在类的内部和类的外部, 类名的指代是不一样的: 类的内部,类名用self, 比如:self::$name, 而在类的外部,要用类名本身: 比如: className::$name

在表单中,可能有其他input, 还有验证码的检查,通常是把验证码的检查放在最后, 为什么呢?
因为如果前面验证码输入正确了, 检查通过了. 后面在检查其他input项,比如用户名或密码时,可能有多次重复输入,重复多次单击提交按钮, 会进行多次(全部表单元素的(包括前面
已经检查正确而通过的验证码))重复检查, 这时候, 再来检查验证码的时候, 就会出错了...(因为验证码重复检查就会出错)

首先, 要区别buffer和clipboard的不同: buffer是在vim这个单独的程序中使用的,是vim的缓冲区, 而clipboard是一个全局的剪贴板,是针对所有程序的.
其次,vim中的buffers, bp和bn并不一定是指 你前面刚刚打开的一个文件,和后面你打开的那个文件, 而是指 buffers列表中, 排列在当前buffer前面的那个文件, 排列在后面的那个文件,说明从前的
理解是错误的
nerdtree中, 刷新目录: r是刷新当前目录, R 是刷新根目录
i和gi, s和gs, o和go的区别是都是打开该文件, 但区别是 "是否 当前编辑光标 马上 跳转到该页面 文件中..."
其中打开文件的两个字母是: split 中的 s和i两个字母. s是垂直分割打开, i是水平分割打开

github上的设置,有两个层次, 一个是关于站点的层次,一个是关于仓库的层次:

  • 关于站点的层次: 地址是: https://github.com/settings/keys (这个就是设置ssh, public的地方)
  • 一个是关于仓库的设置: https://github.com/owner/repository_name/settings/ (这个是设置仓库的地方)

在tp的模型的where方法中,字符串内是严格区分"变量类型"的,如果变量是字符串类型的,则必须在外面的字符串引号内再用引号.比如: where('id=1 and type="officer"')

3.2的pathinfo url地址形式是:
http://serverName/index.php/module/controller/action/param1/val1/p2/v2, 服务器地址用serverName, 操作是 action, 不是operation

=================================================

tp中的路由:(最重要的是 第2条)

  1. 由于模块名不能被路由, 所以要在模块配置文件中去配置路由
  • (只有两个配置文件,一个是全局配置文件/应用配置文件 Appname/Common/Conf/config.phpi,一个是模块配置文件 Home/Conf/config.php):
  • 开启路由: 'URL_ROUTER_ON' => true, 'URL_ROUTE_RULES' => array(....) 路由器是否开启(所以用router), 路由规则(是具体的动作: route_rules)
  1. 深刻理解"模块名不能被路由?" 就是说即使你做了路由后, 你访问的url地址也必须包含模块名,模块名不能被省略, 也就是说你访问的url地址, 前面部分至少(包括)是:http://serverName/index.php/Home/
    实际上tp所说的"让url地址更简洁和优雅",主要是指控制器/操作部分和url动态变量这部分. 所以,你也不要对路由有太多的期望,你不可能希望url路由能够将http地址栏的地址访问
    精简到: localhost/someaction,那是不行的!
  2. '路由表达式' => '路由地址和参数'
    路由表达式表示的是: 你在浏览器地址栏中输入的url形式, 后面的路由地址表示的是: 前面的路由表达式所代表的实际地址
    路由表达式有两种: 一种是 正则表达式, 由// 开始和结尾的字符串(必须是由斜线开始的正则表达式, 即使是用##表达的正则也是无效的), 一种是规则表达式, 没有// 的字符串
    路由地址有3种: 一种是内部地址 一种是外部地址 , 一种是闭包函数(即路由到的页面内容, 由闭包函数通过echo 来生成...?)
  3. 路由地址中的"参数" 有3种:
    一是 "动态变量,用冒号开始的变量", 这些变量 在路由表达式中指定, 但是在后面的路由地址中, 是不用指定的,也不用写的,当然这些动态变量的名称和数量是不能改变的
    比如: 'new/:id' => array('News/read', 'status=1&name="he"'), 在这条规则中,前面的动态变量:id在后面的路由地址中就不必写了,但是在路由地址中,仍然是(必须)要用到的!
    也就是说, 实际地址就是: News/read/id/:1 , 而status和name同样会和 id 一样 包含在 $_GET中.
    二是, "隐藏参数,也叫额外参数", 就是在路由表达式中没有指定的"动态变量", 这些隐藏参数,就必须指定了,可以通过字符串,也可以通过array
    三是, "路由参数"就是指定路由规则生效的条件, 包括两个: array('ext'=>'html'), array('method'=>'get')
  4. 最后就是,路由规则的匹配顺序和完全匹配,
    路由规则匹配的顺序总是从上到下匹配, 一旦匹配成功,就停止检查,所以,要把 复杂的路由规则 放在最前面;
    完全匹配,就是要在动态变量的后面 加上$ 符号!

button标签?
首先,button本身就是html5中的一个标签,一个元素,如同div, p等的地位一样,它定义的是一个按钮. 但是在页面中,可以有三种方式定义一个按钮: a.btn.btn-primary(用超链接)/input[type=button]用
input表单元素/button本身的标签元素.
但是它和input[type=button]的区别是:

  • 它的显示内容更多更灵活: 在button按钮上显示的内容 是button标签之间的所有内容! (可以是button标签起止之间的文本内容, 也可以是起止之间的img图像!)
  • 但是要注意的是, bs中btn的大小只有 btn-lg, btn-sm, btn-xs三种大小, 没有btn-medium这种,如果是中等大小的按钮, 你就不用写大小了,或者也可以写btn-default就好了.
    而且大小不同,按钮所占的位置和外观的高度也会有所区别!
  • button还有一些属性,比如disabled, autofocus会使按钮在页面打开时就自动获得焦点.
  • 为什么已经是button按钮了,还要设置type=button属性呢?因为button共有三种type类型, button/submit/reset, 因为ie和其他浏览器对button的默认值不同(ie的默认值是button,
    像ff等非ie浏览器的默认值是 submit),所以, 始终要为button标签规定/设置type属性!
  • 应该注意的是,button标签尽量少和form一起使用, 因为不同的浏览器提交的内容是不同的,有的提交的是value属性值,有的提交的是button标签之间的内容。

记一记btn的7种颜色类
btn: 默认的白色
btn-primary: 浅蓝色
btn-info: 深蓝色
btn-success: 绿色
btn-warning: 黄色
btn-danger: 红色
btn-inverse: 黑色

关于html中控件的tabindex属性?

  • tabindex的值的范围是从1 到32767, 最开始键盘焦点在tabindex最小的控件上,最后在tabindex最大的控件上.如果两个控件的tabindex相同,则按它们在html中的位置先后决定顺序.
  • 如果tabindex的值为0, 则表示该控件的焦点顺序在所有的其他控件之后
  • 如果tabindex的值为负数(如-1),则表示该控件被排除在tab键的序列之外.

backdrop有两个意思: 一个是舞台布置的背景(比如modal模态框的背景); 一个是表示事件发生的"背景"
the conference took place against a backdrop of increasing diplomatic activity. 会议是在外交活动日益频繁的背景下召开的

attr和css的区别?
css是表示样式style的内容,attr是表示所有除了样式之外的所有属性
模态框的js中的选项属性 和其html中的data-???属性在效果上是一样的! 你可以在js中写, 也可以在html中写.比如:
<div class="modal fade" id="myModa" role="dialog" data-backdrop="static" data-keyboard=false> ....

关于toggle和trigger?
toggle也有"触发" 的意思! 所以 bs的js控件中经常有: data-toggle="..."
区别是:
togle用于"具有两种状态:开启/关闭"状态的 "触发" 而trigger是触发后就结束动作的.
trigger的另一种用法: 在页面一进入就触发按钮的click事件,不需要用户主动去单击,这时候就可以用trigger去触发单击事件: $('#btn').trigger('click')

关于modal?
modal的大小, modal-lg可以看到modal模态框更宽更大.

关于去除字符串两端的空白字符?
一是使用jquery的全局函数trim: $.trim(str), jquery的全局函数调用方法是用 $.global_function_name(...)
二是, 使用js的字符串本身提供的函数: str.trim()

在jquery的 addClass('className')函数中,要注意 类名className不能加 点号! 因为 如果加上点号后, 在对应的元素的 class 属性值 中, 就会 带上这个点号, 比如:
$ele . addClass('.cls_name')那么就会出现: <ele class="other_class .cls_name"> 而实际上,在元素的class属性值中, 带上这个点号就错了就无效了!

!!!!
要注意 在使用bs的js插件的时候, 虽然你可以使用data-...属性来使用插件, "不用写一行js代码", 但是实际上, data-...属性的起作用,还是要通过 bs系统的js来实现的,
所以, 在使用bs插件的时候, 必须要引入 bs的js文件: <script src="..../js/bootstrap.min.js"></script> 否则,插件是不会生效的!

se'mester [si'mester] 学期

更改alter表的时候, 可以不用 修改/重复 指定表的字段,可以只是修改表的 其他属性!

tp的查询条件:
一是等于 条件: 用 字符串或数组的方式
二是 表达式查询, 查询条件是: 字段值为不等,大于,小于,大于等于,小于等于, 用表达式方式: $data['id'] = array('gt', 10);
三是 查询条件是区间,一个范围, 则用两个表达式查询, $data['id'] = array(array('gt',10),array('lt', 100));

tp本身也提供了原生的sql语句查询, 包括: query和execute语句:

  • 如果是"读查询" , 用 query语句 $tbl -> query(...)
  • 如果 是"执行,包括插入和更新语句", 用execute语句: $tbl -> execute(...)

对于控制器而言, 因为业务的控制器中 必然的 要用自定义的action,所以必然 要定义自己的控制器.
但是 对于(数据库)的模型类而言, tp的模型类已经提供了大多数的数据库操作方法, 所以通常不需要自定义自己的模型类
只有在为了实现特殊目的(比如数据库表"字段" 的自动验证/自动完成)等, 才需要定义自己的(数据库)模型类.

对于在tp中创建$data的方式, 文档给出的方式是 用定义数组"下标"的方式来的, 比如: $data['name'] = 'somename'; $data['age'] = 20;
而实际上, 这种方式是比较效率低下的, 可以有更快的定义方式, 用array的方式也是可以的: 比如: $data = array('name' => 'somename','age' => 20 )

js和php关于字符串截取函数substr的区别?
两者的思想不同, js是用的"字符串对象"的方式: str.substr(....), 而php用的是 全局函数的方式 substr(str, ...)
js和php的substr都表示的是, 从startIndex开始, 截取length长度的子字符串.
除了substr外, 还有substring 和 slice. str.substring(starIndex, endIndex), 表示的是, 从startIndex开始, 到endIndex结束的子字符串. 包括start但不包括endIndx的.
所以都统一地 采用substr函数, 不用另外的两个函数.

关于mysqldump?

mysqldump不是mysql命令下的命令, 而是一个在命令行下的独立命令, 格式是: mysqldump -uroot -p your_dbname > dbname.sql
实际上, dbname.sql是一个文本文件, 里面主要就是每个表的 create语句和insert语句,只是多了这样几条语句:
drop table if exists certain_table; create table certaintbl....; lock tables certain_tbl write; insert into certaintbl values ().....; unlock tables;

而导入数据库的命令则是: mysql -uroot -p dbname_to_import < to_import.sql
可以创建一个 实验数据库test.db 来验证mysqldump的导出和导入!

关于在mysqldump导出文件中的"注释语句"?

  • 这个不仅仅是注释语句 它是为了将mysql的导出结果应用/移植到其他sql服务器上时保持兼容. /! .... /表示如果导出结果 应用到(导入到)mysql/mariadb服务器上时就执行这里面的代码
    如果不是,就不执行里面的代码.
  • /!40101 .... / 如果! 后面有版本号就表示只有目标数据库服务器的版本号大于等于这个指定的版本号, 才执行其中的代码. 40101表示4.1.1, 41102表示4.11.02

如何解决导入数据库时的: 'mysqldump: Got error: 1049: "Unknown database 'dbtest'" when selecting the database'?
这个还是命令错误造成的: 因为导出数据库是mysqldump, 而导入数据库的命令是 mysql. 而不是mysqldump. 正因为这个所以上面的那个错误也就好理解了
导入数据库.sql的正确操作:

  • 不管是什么方式导入, 首先要在mariadb服务器上创建好目标数据库, 目标数据库可以跟原来的数据库名称不同, 比如原来的源数据库名称是db1, 目标数据库是db2
  • 然后用mysql命令导入, 比如: mysql -uroot -p db2 < db1.sql

也可以用另外的方法来导入mysqladmin...

如何给数据库更名? (这个也是导入数据库的方法2)
没有直接的给数据库更名的命令, 即没有命令: rename database; 可以用变通的方式: 1. 创建更名后的空数据库; 2. 导出源数据库; 3. 将源数据库导入到目标数据库,并删除原来的数据库

 mysqladmin -uroot -p create targetDb
 mysqldump -uroot -p oldDb |  mysql -uroot -p targetDb , 最后 drop database oldDb;
 /// mysqladmin 是在不登入数据库的情况下,进行数据库的创建等操作. 第二个命令是使用的管道命令, 将导出的结果直接导入到目标数据库中

=====================================================================

  • 对于mariadb数据库来说, 服务器端的名字是: mariadb.service
  • 客户端的登录(和连接/管理)工具 才是 mysql, 或许作者只是 重写了服务器的代码, 客户端的代码没有变??

关于mysql和mariadb的字符集和中文乱码?

  • 设置 set character_set_database/server = utf8; 是session的, 只是在当前这一次有效, 当mariadb服务重新启动后, 就无效又恢复原样了.
  • 有四个级别的设置, server, database, table(前面三个是默认的设置?) 和 fields字段.
    查看字段的字符集设置: show full columns(fields都可以) from tbl_name, 可以看到有些表字段的字符集是lation1
  • 表字段完整的定义是: fieldname varchar(50) character set latin1 default 'abc...'
MariaDB [pjiao]> show create table pj_cursem;
+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table     | Create Table                                                                                                                                                                                                                              |
+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| pj_cursem | CREATE TABLE `pj_cursem` (
  `scame` varchar(50) CHARACTER SET latin1 DEFAULT NULL,   /* 这里看到,尽管表的字符集是utf8, 但是这个字段的字符集却还是latin1, 所以中文乱码 */
    `curyear` char(4) CHARACTER SET latin1 DEFAULT NULL,
      `cursem` char(1) CHARACTER SET latin1 DEFAULT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
       ))))]

默认的mariadb服务器的 charater_set_database是latin1, 所以, 如果创建你的数据库时,没有指定default charset时, 你创建的数据库的charset就是latin1

MariaDB [l]pj]> show create database pji;
+----------+------------------------------------------------------------------+
| Database | Create Database                                                  |
+----------+------------------------------------------------------------------+
| pji    | CREATE DATABASE `pji` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)
)]

让mysql支持中文?

  • 首先你在创建一个数据库的时候, 就要指定这个数据库的默认字符集. show create database yourdb; create database yourdb default charset=utf8;
  • 其次, 为了彻底解决中文乱码问题,需要在做数据库工作之前就对mysql做支持中文的配置,对于fedora23的mariadb 10.0配置步骤是:
    • mar 10.0的配置结构是: /etc/my.cnf(!includedir /etc/my.cnf.d),而/etc/my.cnf.d包含 client.cnf, mysql-clients.cnf, mariadb-server.cnf三个文件
    • 配置的关键是要规定utf8的字符集,不在/etc/my.cnf中配置,要在my.cnf.d下的三个文件中配置,分别是:
    • 而且,要注意这三个character配置的位置,即client, mysql, mysqld, 要注意这些配置的位置, 如果位置不对, 重启后, 可能mariadb.service服务将无法启动!!
  第一, [lee@localhost my.cnf.d]$ cat client.cnf
  #
  # These two groups are read by the client library
  # use it for options that affect all clients, but not the server

  [client]
  default-character-set=utf8    /*这个是增加的 */ 

  第二, [lee@localhost my.cnf.d]$ cat mysql-clients
  cat: mysql-clients: No such file or directory
  [lee@localhost my.cnf.d]$ cat mysql-clients.cnf 
  #
  # These groups are read by MariaDB command-line tools
  # Use it for options that affect only one utility
  #
  
  [mysql]
  default-character-set=utf8   /*这个是增加的 */

  第三, [lee@localhost my.cnf.d]$ cat mariadb-server.cnf
  ..............
  [mysqld]
  datadir=/var/lib/mysql
  socket=/var/lib/mysql/mysql.sock
  log-error=/var/log/mariadb/mariadb.log
  pid-file=/var/run/mariadb/mariadb.pid
  
  character-set-server=utf8  /*这个是增加的 */

关于character_set_database这个变量的设置, 你不用管, ??因为当设置了 character_set_server变量后, 如果character_set_database跟 server的不一样时,
这个character_set_database会自动采用character_set_server 的设置值 ??
设置完成后, 重启mariadb.service服务后 , (多刷新几次, 就会看到新的utf8字符集设置生效了.)

  • 输入 show variables like 'char%'; 命令后, 有 7个变量+1个目录
    character_set_client+connection+results, 这三个变量都是utf8, 可以用'set names utf8'来等效代替
    character_set_system+filesystem, system时utf8, filesystem是binary
    character_set_server+database都是utf8
    最后还有一个目录: character_sets_dir 是 /usr/share/mariadb/charsets ( 8 rows in set (0.00 sec) )
MariaDB [pjiao]> show variables like 'char%';
+--------------------------+------------------------------+
| Variable_name            | Value                        |
+--------------------------+------------------------------+
| character_set_client     | utf8                         |
| character_set_connection | utf8                         |
| character_set_database   | utf8                         |
| character_set_filesystem | binary                       |
| character_set_results    | utf8                         |
| character_set_server     | utf8                         |
| character_set_system     | utf8                         |
| character_sets_dir       | /usr/share/mariadb/charsets/ |
+--------------------------+------------------------------+
8 rows in set (0.00 sec)
  • 当设置完这些后, 即使在创建表时,不显式地指定表或表中字段的字符集或collation时,也能保证 中文的正常输入和显示.
    mysql的操作语句中动词后面都有一个介词, 比如from, into等, select * from... , delete from ... where..., insert into ...

在$.ajax中 一定要写 error分句, 因为如果不写这个error分句, 仅仅根据ajax所在函数的返回值 的false/true值(因为如果error了, 通常函数返回值是false)来判断后续操作,就会出错!
因为这个false, 不是因为 后台php的判断而输出的false, 而是因为ajax的错误得出的. 这样就跟实际的结论不符了,
所以对于异步判断, 通常还是要用$.ajax来处理, 不要仅仅用get, 或post, 因为它们没有error判断.

如何改变表字段的字符集?

MariaDB [pjiao]> alter table pj_cursem modify schame varchar(50) character set utf8;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

注意,这里的col_definition中, schame后面不能用 括号, 同时 字符集前面没有 default, 而character set 不能简写成 charset

tp中的getByXXX?
这里的XXX 是具体的字段名, 比如: getByName(...), 这里的Name并不是固定的单词.
重要的是, getByXXX 返回的记录是 只有最前面的第一条, 只有一条记录.因为getByxxx的函数定义中, 是通过 find() 来实现的, 所以只返回符合条件的一条记录.

表单的默认按钮, 在 C# 的winform表单中,可以使用acceptButton属性, 但是对html-php的表单是无效的.

============================================================

猜你喜欢

转载自www.cnblogs.com/bkylee/p/12330027.html
今日推荐