关于git的理解2

ajax默认的是异步的 ,即$.ajax({....})选项中async的默认值是true. 当设置async:false即设置同步时, 会收到警告信息:
'ajax XMLHttpRequest on the main thread is deprecated because of it detrimental affect to the end user's experience', 是因为设置了async: false导致
ajax的执行采用了同步执行.

要"查看, 回顾, 审查"原来的评教结果, 使用 review关键字.

什么叫 "字体图标"?
就是指这些bs图标, 像字体font一样, 可以根据自己的需要, 在css中重新指定/定义它们的css格式, 从而改变这些图标的大小, 颜色, 字体等样式!

php如何永久保存某个设置信息?

  • php中的超全局变量\(_REQUEST虽然可以代替\)_GET 和$_POST, 但是最好不要用它, 避免产生安全问题??
  • 使用对象Application: Application('name')='abc';像这种设置是在asp中可以的, 而php是不可以,也不存在Application这样的全局变量的.
  • 那么在php~mysql中, 要保存应用程序级别的全局信息, 要使用 "保存在数据库/数据表中" 或保存在 xml/text等文件中 的 两种方法. 但是(不管数据量的大小如何)通常还是用数据库来
    保存这些全局信息!

ajax的调试要通过firebug的 network来

  • ajax在一次执行中可能有多个ajax有多个请求
  • 实际上, ajax : 调试php后台的错误: 也是很容易的: 通过查看network的param和response, 查看到传递到后台php的参数, 和后台返回的信息,可能是正确的返回信息
    ,也可能是 后台的错误信息提示(实际上是一个完整的 html错误提示文件), 所以在这个错误信息文件中,你就能知道后台php文件的错误了,所以不必去调试php文件
<!DOCTYPE html...
 <title>系统发生错误</title>
<style type="text/css">
 *{ padding: 0; margin: 0; }
 </style>
</head>
<body>
 <div class="error">
 <h1>1064:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'pj_2019p' at line 1
  [ SQL语句 ] : show tables like pj_2019p</h1>  /* 由此可以看出,错误原因就是 这里的 pj_2019没有写引号! */
  <div class="content">
   <div class="info">
	<div class="title">
	      <h3>错误位置</h3>

'通常情况下,为了方便linux下的文本处理思想, linux所有命令的输出 都是 "行格式", 都是一行一行的信息格式,不管是信息的描述/多个信息的分段排列/错误的输出等, 都是按行的格式
来输出到 控制台的', 因此, 以后我们自己写linux下的自定义命令, 也要有"这种输出 行信息 行格式"的思想

查看vim是否支持clipboard?

  • 是用vim --version命令, 而不是看:set, 虽然两者有重叠
  • 是否支持, 看 +clipboard 还是 -clipboard
  • 要想vim支持clipboard,必须安装vim-enhanced

实际上即使终端的vim不支持剪贴簿, 也可以不用安装gvim, 因为终端terminal 是支持 ctrl_shift_c和ctrl_shift_v来进行复制和粘贴系统剪贴板的
几个firefox下的快捷键: ctrl_r = f5刷新, ctrl_shift_r 是强制刷新; firebug的切换键: ctrl_shift_q/或者 chtrl_Shift_c, ctrl_shift_d: 切换firebug的下方/右方排列

如何在ajax中获取外部变量的值? 方法是: 设置ajax的async:false.

  • 因为默认的ajax是 异步的,或显式的设置async: true, 这时js的ajax执行和后台的php是异步的, 即js不会等到php执行完毕,返回数据后,再执行, 它会直接执行success中的语句, 很可能(很多时候都是这样)php的后台文件还没有执行完毕, 数据respoonse还没有返回, js语句就执行过了
    相当于两者走路 就错过了. 这样php返回的数据js就没有获取到, 或着说js获取到的后台数据就老是空''字符串, 这样比较的话,当然就会出错了.

  • 而同步的话, ajax会锁定整个浏览器, -> 会暂停js 的执行, -> 直到php后台返回数据后, -> js获得后台数据后, 才继续执行后续的语句, 所以再js中总是能获得respon字符串并进行比较
    所以不会出错, 虽然设置同步时, 会报警告: synchronous XmlHttpRequest on the main thread is deprecated because of its detrimental affects to the end user's experience.但是
    这个不会说是错误.

  • 那为什么会出现 firebug中调试时是正确的,而不设置断点不调试直接执行时, js会报错呢? 正是上面第2条的原因: 在断点调试执行时,js正是在断点/一步一步执行的,它暂停/等到php后台执行
    完,并返回数据后, js才f10再执行下一条语句, 这就无形中正好执行了 同步的操作,所以总是(/但是有时候也不能完全确保)php后台能"及时"地返回数据. 所以你看到的 调试执行时通常能js
    正常执行, 不报错, 而取消断点不调试执行时总是报错

  • 那为什么"ajax在network中看到后台php确实是返回了正确的respon, 而js仍然出错, 没有走success而走error呢?" 这个其实正是ajax的 异步执行的一个 时间差! 你再调试后在network标签卡中
    看到的response , 其实是在js 已经执行完成后 后台php才返回的值, 就是说js在执行时, 在进行字符串结果比较时, php还没有返回数据, 等到js执行完成后, 这个response才"慢吞吞"地返回来,
    返回到network中,所以你看到的network中的response其实是一个假相!它是"马后炮" ,没用的. 所以这个是非常具有"迷惑性的!" 参考https://blog.csdn.net/fangqun663775/article/details/58643116

  • 参考https://blog.csdn.net/nb7474/article/details/79046619, 查看XMLHttpRequest的属性

error: function(XMLHttpRequest, textStatus, errorThrown){
  alert(XMLHttpRequest.readyState + XMLHttpRequest.stauts + XMLHttpRequest.responseText);  // 另外,xhr的比较重要的只读属性是: onReadyStateChange....
}

通常只是在: error, beforeSend, complete的回调函数中会传入 XMLHttpRequest对象,而在success函数中不会传入XMLHttpRequest. 在error的回调函数中的参数,不一定必须写成

XMLHttpRequest, 因为是形参,所以可以写成任意的变量,比如xhr, 甚至是abc都可以

关于drop table 语句?

正确的语法是: 'drop table if exists tbl_name;' 第一tablname在语句的最后面,其次, exists: 不是exist, 也不是existed
vim有一个比较好的"命令/输入"提示功能: 当你在输入一些 "组合"命令的时候, 光标会改变形状, 比如变成"高度一半/变矮", 提示你输入后续的命令字符!
在vim中, s字符命令和c字符命令的区别?
:s命令是替换的意思, 但是如果在normal模式下,按s字符命令则是: 替换光标所在的"字符",并开始插入; S 则是删除所在的行并插入状态, 相当于:cc, 或者dd+i/dd+o/dd+O, 所以要在合适
的时候,多用s/S 字符命令, 提高效率.
c则是组合命令.

在php~mariadb中, 如果sql语句过长, 如何换行? ::: 根本就不需要所谓的"换行", 直接在下一行接着写sql语句就好了.
对于像 create/drop table... create/drop database等"创建/销毁等操作",在tp中要用execute语句, 也就是说, 除了select 查询语句用query语句外, 其余的都用execute语句,
否则query语句虽然会执行, 但是还是会报错!

特别注意的是: tp的 $model -> execute(....) 如果成功返回的是 "整数0", 不是字符'0', 所以要用 if(0 === $model->execute(...)) 来判断.

对于当前笔记本, f10是"笔记本屏幕|投影屏幕", f3是"喇叭+"

mysql中有bool或boolean类型,但是在存储时会自动转化成tinyint(1)的0和1表示, 0=false, 1=true(而且这种转化不会给出任何警告或出错信息),但是通常对逻辑变量用char(1)来存储, 用Y 或N 表示

在用firefox中的调试工具network标签中可以看到用户向后台提交的用户名和密码等敏感信息怎么办?

  • 其实,这个是不用怕的, 因为在network中看到ajax调试敏感信息的是, 是你自己,不是别人,你不用告诉别人就是了
  • 为了防止php和mysql中的密码被人查看, 需要在php和mysql中存储数据库时对密码进行加密,加密方法有php的crypt函数+md5函数, mysql的md5函数. 通常用md5函数加密,md5加密
    比crypt加密都是单向性,但md5强度更高,原文有细小的变化都会引起md5加密文明显的变化,

php 有加密的软件, 好像比较好的是 EnPHP, github上可以拉取

js的函数, 分成 函数声明, 函数表达式和匿名函数, 其中匿名函数是(属于)函数表达式, 但跟函数表达式之间有很大区别 : 参考: https://m.jb51.net/article/50967.htm

  • 函数声明可以提升函数声明的作用域,function declaration hoisting, 所以可以在函数声明之前调用函数(比如: fnName(); function fnName(){....})
    但是函数表达式(通常是匿名函数)必须在变量赋值后调用: (比如:fnName(); var fnName = function (){...}会出错 )
  • 函数声明后面加括号,不会立即执行, 只是会忽略这个括号, 比如: function fnName(){... }() 这里会忽略最后的括号, 还是认为是函数声明.
    而匿名函数后面想要加括号立即执行,必须将 匿名函数变成 函数表达式, 就是将匿名函数作为 js表达式的一部分, 方法是: 在 匿名函数后面或前面加上js运算符,包括:
    ()小括号, +加号, -减号, 逻辑非! , 甚至是逗号, 比如:
(function (param){console.log(param)}) (123);
(fucntion (p){...} (123));
+function(p){...}(123);

js的对象new Obj 和 new Obj()的区别? 参考 https://segmentfault.com/q/1010000011576064

  • 这两个如果对象没有构造函数,那它们就没有区别, 如果有构造函数,就有区别(构造函数和普通函数的区别, 通常构造函数首字母大写), 区别是::::
    new Obj, 得到的就是对象Obj(的一个实例), function Obj(){var getName= function(){...}; }在这里就是对象的定义, 其成员或属性就是Obj中的成员或属性;
    而new Obj(), 得到的不是对象Obj, 而是另外的匿名对象, 比如newObj, 那么函数function Obj(){....} 在这里不是对象的定义, 只是匿名对象比如newObj的构造函数,其成员应该不是Obj中
    的成员或属性, 而是其原型中的var.... 是: Obj.prototype.varName....

  • 一个js函数: 有两种性质或身份, 既是window对象的全局普通函数(如果函数没有返回值,将函数给变量赋值时得到undefined), 也是一个对象(的构造函数),这时候这个对象是隐含对象.
    比如: function foo(){console.log(...); return this;} new foo()时返回的是一个对象.
    因为是隐含对象, 所以可以用点号来引用 成员属性或方法.

  • 那么 new foo.getName() 和 new foo().getName()的区别?
    new foo.getName = (new foo).getName(), 先new 一个foo对象, ....
    new foo().getName() = (new foo()).getName(), 是先new 一个新的对象 比如newfoo这样的匿名对象, 由于newfoo这样的 匿名对象没有getName()这样的成员方法,
    所以就会找它的原型 foo.prototype.getName= function(){...}, ...

function Foo(){
  getName = function(){alert(1);}
    return this;  // 这里的this 表示的是js全局对象 window
    }
    
    Foo.getName = function (){alert(2);}
    Foo.prototype.getName=function(){alert(3);}

    var getName = function(){alert(4);}
    function getName(){alert(5);}
    
    /// 写成下面的输出结果
    //
    Foo.getName(); // 2  对象Foo变量的成员属性
    getName();  // 4 优先执行的函数表达式
    
    Foo().getName();  // 1  这里不是对象, 而是函数了,先执行Foo()函数 , 执行后 this指向window,其中的 getName变成了alert(1);
    getName();        // 1    
    
    new Foo.getName();  // 2 
    new Foo().getName();  // 3  new Foo()使用构造函数创建了一个匿名的新对象 比如newFoo, 然后利用原型prototype定义了新对象的成员属性...
    
    function bar(){alert('函数声明bar');}
    var bar = function(){alert('匿名函数, 函数表达式的bar');}
    
    bar(); // 这里输出的是: alert('匿名函数, 函数表达式的bar');的结果

也就是说, 如果有同名的函数声明和同名的匿名函数表达式变量, 这时候,不管它们的先后顺序是什么, 最后执行的都是这个 匿名函数赋值的 函数表达式变量()执行优先!!

tp中系统变量的输出?

  • 哪些是系统变量? $_SERVER, $_GET, $_SESSION之类的, 和 常量const, 和配置参数
  • 输出格式: 和普通常量的方式类似: 普通常量的输出是: {\(varName} 即用 {\) ....}, 系统变量的输出也是用 {\(}输出, 只不过要用Think.来引用 比如: {\)Think.server.server_var_name}, {\(Think.get.getVar},配置参数 {\)Think.config.config_var_name}

必须接受 "输入法为中文的" 状态了,因为随时都需要中文或英文...

tp是支持内存缓存的,比如memcache, memcached缓存, 默认的是file文件缓存. 但是要对服务器安装memcached等服务和配置...!
缓存用S 函数. 在Think/Cache/Driver/目录中有派生缓存类, 继承于 Think/Cache类

tp可以输出二维数组, 用volist或foreach(其中volist的循环变量是id=..., foreach的循环变量是item=...) ,
但是, tp也可以输出一维数组的, 还是用 volist /foreach的. 只是此时循环中的id或item就不再是一维数组, 而是直接的数组元素,直接输出就是了

tp的find和select读取数据?

  • 通常情况下,find和select读取数据需要用where过滤条件和order排序, 但是也可以不用任何条件,直接进行输出,那么find输出的就是第一条数据.

vim中的句子和段落移动以及 文本对象

  • 哪些算一个句子? 以"?问号! 感叹号 句点. + 一个空格结束的"算一个句子, 另外 空行算一个句子.但是要注意: "enter回车"不算一个句子, enter会和它下面的一行内容看成是一个句子中.
  • 怎样算一个段落? 以空行 分隔的 上下内容, 成为一个段落. 而空行本身要算一个段落.

要注意区别 括号跳转 和 括号 "文本对象"的区别

  • vim中的w和W的区别? 像这样的 "abc abc.abc" w遇到空格或其他标点符号就停止, 而W 会把相连的字符都看成是一个"单词", 直到遇到空格为止.
  • 空号跳转,指的是 在normal状态下, 用 (, ), {, 和} 来跳转到上一个/下一个 句子/段落的开头
    而括号文本对象,是指 在 [number]+command+文本对象 时来选择的文本对象, 在文本对象中, 所有的括号包括单引号,双引号,大中小括号,反引号,尖括号等都被看成是 块block而被选中i/a,
    这里的括号文本对象,就必须是 真实存在的符号, 否则就会出错. 参考: http://zhuanlan.zhihu.com/p/24387751 其中的i表示inner, a表示"一个" 比如as : a sentence.
    而 i和a的区别仅仅是: 文本对象前后的空格/空行 是否被包括,但是 完整的文本对象本身 都是被包括的.

为什么vim并不能无限地undo和redo?

参考vim的 usr_32.txt
是因为 你可能创建了一个 undo的分支树 undo-tree (所谓undo分支是指, 当你撤销了一些操作后, 又做了一些修改, 这时原来所作的撤销修改就找不回来了, 这个就叫作 undo分支)

  • 查看undo分支树, 用命令:undolist

  • 在undo-tree中任意跳转, 用below change number, 即 :undo number_you_jumpto_below, 或从时间上来跳转: g- 或 g+ (here g stands for "go")

  • vim来回跳转: ctrl+o 和 ctrl+i, 最近两个位置之间的跳转 用'' 页面的跳转: ctrl +f/b, 半页的跳转用 ctrl+u/d (up, down) 而页面内光标的跳转, 还包括加减号 +-, 加号是下移一行,
    减号是上移一行, 可以加数字: n+ 下移n行, n- 上移n行

  • 而撤销和重做除了u和ctr_r外 还有大写的 U和ctrl_R(ctrl_shift+r) R: 表示: recovery, 或者redo

  • 查看可以撤销的改变 , 参考文章http://m.blog.chinaunix.net/uid-12348673-id-3015285.html 在这个undolist中, number列表示 可以撤销的改变编号(叶节点编号??)(undo number就是用的这个编号)
    changes列表示的是 从根结点到此 叶节点所需的改变数目, when表示此改变发生的时间,可以用 :undo number, g+/g-, 也可以用 :earlier XXs/m/h, :later XXs/m/h表示撤销到当前状态
    前/后 XX 秒/分/小时的状态. saved列表示此改变是否写入了硬盘以及 是第几次写入硬盘的 ,可以应用于:earlier和later命令中.

  • 如果使用上面的所有操作,都不能找回你之前的某个分支 的内容, 那么可能是你的 分支树 缓存被清除了??? 那就没有办法恢复了.

  • 查看可以撤销的次数 , 是设置 :set undolevels, 默认的是1000 次???

那么一个很重要的问题就是: 怎样才算一次改变呢?

  • 在一次连续输入的内容, 不管有多少个回车, 都算一次"命令", 都不算两个状态, 再多的输入内容,都可以一次性的 u掉
  • 因此,只有使用 一次"command"命令,并引起文本状态的改变时, 才算一次change. 这样的change可以用u来撤销, 比如 dd, yy, p, r, c(change), s(substitute)等.

js中的switch语句?

要点是: js的switch语句和c/c++/php等的switch完全一样; switch和case之间使用严格的 === 测试, 只有类型和值完全相同才匹配; 最后一个case不必使用break, 因为会自动结束语句; default语句不一定放在最后,如果放在前面要用break; 多个case语句可以共享一段代码: case 4: case 5: ..... break;

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

posted @ 2020-02-19 10:22  noitanym  阅读(289)  评论(0编辑  收藏  举报