页面载入中..

回到页首回到页尾

一次 WP 主题设置页面不显示的问题解决

momo @ 2014.09.27 [ Wordpress ]

由于更新了主题的相关配置,所以想在主题后台去设置一下,问题来了,主题的“选项”链接不见了,以为是主题的相关代码跟最新版的wordpress不兼容,查询了N个文档,主题改来改去依然无果,插件全部禁用也是一样,使用本地wordpress启用本主题却没有任何问题,说明不是主题代码的事。
访问 wp-admin/themes.php?page=functions.php 页面时显示 “你没有权限” 访问该页面,感觉应该是文件权限的问题:

You do not have sufficient permissions to access this page themes.php functions.php

根据提示语句 Google 之,按照网上各种方法(改主题代码、改文件权限等)修改后无果,郁闷了好几天,问题依然无法得到解决。但是隐约间觉得是自己安装的一个叫做 iThemes Security 的插件造成的问题,使用的时候就发现这家伙做了不少的改动。
但是禁用这个插件并不能修复问题,后来无意中发现自己的 wp-config.php 文件多了一句

1
define( 'DISALLOW_FILE_EDIT', true );

顾名思义就是不让我在网页中修改 Theme 和 Plugin 文件嘛,干掉之,问题解决。


git rebase -i

momo @ 2014.09.17 [ Development ]

使用 Git 好几年了,还一直没有考虑过类似 commit 以后还要修改它的问题,最近遇到了,发现是有现成方案的。

最简单的方法是 git submit –amend ,Git 目录中敲入这个命令的结果是可以直接修改当前最后一条未 push 的 commit 的注释信息,:wq 保存退出即可生效。如果有其他的需求,可以在缓存区(也就是没有commit的情况下)add 一些文件,再执行 git submit –amend ,可以将后续修改合并到之前的 commit 中。

这是一个比较简单的方法,但是还不足以处理很多复杂的情况,比如当你想要合并多个 commit 或者追溯到前面几个 commit 的时候,就需要用到 git 变基了(似乎混进了一些奇怪的东西)。使用以下语句即可:

1
git rebase -i {branch}~{step}

比如想修改 master 下最近3个commit中的一个或者几个,可以输入:

1
git rebase -i master~3

然后你就会看到类似这样的东西(先盗一张别人的图吧):

其中,pick 就是默认操作,把 pick 改为 e,就可以对这个 commit 的注释信息进行修改,把多个 pick 改为 s,就可以合并这几个 commit。
修改完毕后,:wq 退出,输入命令 git rebase –continue,修改完毕。

参考资料:
https://www.atlassian.com/git/tutorial/rewriting-git-history#!rebase-i
http://git-scm.com/docs/git-rebase
https://help.github.com/articles/about-git-rebase
https://www.kernel.org/pub/software/scm/git/docs/git-rebase.html


Comfort Zone

momo @ 2014.08.29 [ Noise ]

舒适区(Comfort zone)指的是一个人所处的一种环境的状态,和习惯的行动,人会在这种安樂窩的状态中感到舒适并且没有危机感。

非常成功的人通常会走出自己的舒适区,去达成自己的目标。舒适区是一种精神状态,它导致人们进入并且维持一种不现实精神行为之中,这种情况会给人带来一种非理性的安全感。类似惰性,当人围绕自己生活的某一部分建立了一个舒适区之后,他就会开始倾向于呆在舒适区内,而不是走出舒适区。走出一个人的舒适区,他们必须在新的环境中找到新的不同的行动方式,同时回应这些新的行动方式所导致的后果。

走出舒适区会增加人的焦虑程度,从而产生应激反应,其结果是提升对工作的专注的程度。在这个区域中被称作最佳表现区——在这个区域之中,人的工作表现将会得到改善,并且他们的技巧也会被优化。但是罗伯特 耶基斯(1907)的报告中提到“焦虑可以改善工作表现,但是当超过某一最佳激励状态之后,工作表现就开始恶化”,如果一个人离开最佳表现区,他将进入一个危险区,在危险区中焦虑程度的上升或者舒适程度下降会带来工作表现的快速恶化。

所以在绩效管理之中管理者,或者是教练应该让人进入最佳表现区,并且维持一段足够的时间,从而达到更好的工作表现,提升他们的技巧,并且将这些表现和技巧固定下来。同样的道理,在目标设定之中改变焦虑的程度就会改变工作表现。

相关阅读:为什么要走出你的舒适区?


Quick Sort

momo @ 2014.08.26 [ Development ]

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

原理:

代码示例(PHP):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
functionquickSort($arr){
    if(count($arr)>1){
        $k=$arr[0];
        $x=array();
        $y=array();
        $_size=count($arr);
        for($i=1;$i<$_size;$i++){
            if($arr[$i]<=$k){
                $x[]=$arr[$i];
            }else{
                $y[]=$arr[$i];
            }
        }
        $x=quickSort($x);
        $y=quickSort($y);
        return array_merge($x,array($k),$y);
    }else{
        return $arr;
    }
} ?>

Javascript 闭包

momo @ 2014.07.21 [ Development ]

闭包(Closure)的官方解释晦涩难懂,他是这么说的:

「闭包」,是指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

不拿代码举例的话,谁知道这说的是个什么玩意儿?直到我看到了如下说明:

闭包是个函数,而它「记住了周围发生了什么」。表现为由「一个函数」体中定义了「另个函数」。

这样说似乎还是不大容易理解,于是 MDN 写了这个例子(demo):

1
2
3
4
5
6
7
8
function init() {
  var name = "Mozilla";
  function displayName() {
    alert(name);
  }
  displayName();
}
init();

然后我们发现其实改成这样也是可以的(demo):

1
2
3
4
5
6
7
8
function init() {
  var name = "Mozilla";
  return function() {
    alert(name);
  }
}
var func = init();
func();

这个时候 func 是一个闭包,由返回的匿名函数函数和闭包创建时存在的 “Mozilla” 字符串形成。然后我们再来加点料(demo):

1
2
3
4
5
6
7
8
9
10
11
12
function init(product) {
  var name = product;
  return function(value) {
    alert(name +'  makes '+ value);
  }
}
var mozilla = init('mozilla'),
    google = init('google'),
    apple = init('apple');
mozilla('firefox');
google('chrome');
apple('safari');

上述例子中会依次弹出「mozilla makes firefox」、「google makes chrome」、「apple makes safari」,new 了一个 class 的既视感有木有?

使用闭包还可以模拟私有属性和方法(demo):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var println = function(d){
    var el = document.createElement('p'), text = document.createTextNode(d);
    el.appendChild(text);
    document.body.appendChild(el);
},
outter = (function(){
    var private = '私有变量';
    return{
        get: function(){
            println(private);
        },
        set: function(d){
            private = d;
            println('成功设置私有变量为'+ d);
        }
    }
}());
outter.get();
println(outter.private);
outter.set('hola!');
outter.get();

这样做了以后就只有使用 setter 和 getter 才可以访问自己模拟的私有方法或属性了。

在循环中创建闭包时容易发生多个闭包共用最后一次循环时产生的数据这样的错误,MDN 给出的方案是使用更多的闭包(错误正确):

1
2
3
4
5
6
7
/* 绑定的参数错误 */
for (var i = 0; i < 5; i++) {
    var p = document.getElementsByTagName('p')[i];
    p.onclick = function(){
        alert(i);
    };
}
1
2
3
4
5
6
7
8
9
/* 修改后 */
for (var i = 0; i < 5; i++) {
    (function(j){
        var p = document.getElementsByTagName('p')[j];
        p.onclick = function(){
            alert(j);
        };
    }(i));
}

更复杂的例子

不过说了很多,其实最后发现「闭包」着实是一个比较蛋疼的技术,如果你只是常规的页面交互使用概率还是比较小的,关于此,MDN 如是说

如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。
例如,在创建新的对象或者类时,方法通常应该关联于对象的原型,而不是定义到对象的构造器中。原因是这将导致每次构造器被调用,方法都会被重新赋值一次(也就是说,为每一个对象的创建)。

参考资料:
Secrets of JavaScript Closures
闭包 – MDN