二进制相关智力问题

题目1:有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?

个人解答:显然需要参考二进制的表示方法,但是腾讯面试当时纠结在时间只有一个星期,而喝下毒药死亡也需要一个星期,似乎只能验证一次。实际上,这个限制正说明我们确实只能利用这10只小白鼠验证一次。于是问题就简单了。将1000瓶水按照二进制编码的顺序给对应的小白鼠喝,比如编号3的水(二进制表示为11)就喂给编号1与编号2小白鼠喝。这样,一星期后看哪几只小白鼠死亡就可以判断哪个编号的水有毒。这个结论成立的前提是只有一瓶毒药,这样只有对应编号的小白鼠才会不幸死亡。

进一步题目:如果你有两个星期的时间,为了从 1000 个瓶子中找出毒药,你最少需要几只老鼠?注意,在第一轮实验中死掉的老鼠,就无法继续参与第二次实验了。

个人解答:有两个星期就可以进行两次实验,每个没死成的小白鼠就能再喝一次,也就是说一个小白鼠可以表示3个状态:第一周死,第二周死,最终也没死。显然就是参考三进制,于是需要3^7 > 1000,即最少7只。方法与之前类似,先给三进制表示为2的位对应的小白鼠喝,再实验三进制表示为1的位对应的小白鼠即可。

结论:类似地,我们可以证明, n 只小白鼠 t 周的时间可以从 (t+1)^n 个瓶子中检验出毒药来。


题目2:100个开关控制100个灯,开关在一个房间灯在一个房间,最少走几趟能够确定他们的一一对应关系


个人解答:据说3的情况,只要一次即可(需要引入热这种状态。。。即存在亮,热,不亮三种状态)

Wordpress摘要相关开发

主题开发时又出现使用more标签显示摘要与使用excerpt摘要相关filter出现混淆的问题。

Wordpress主题开发中有两种显示摘要的方法,一种是利用more标签<!--more-->,该方法需要作者在文章适当位置中插入该标签;另一种是正宗的摘要使用函数the_excerpt显示,该方法既可以在文章编辑页面中填入,也会自动生成摘要。

第一种方法可以在调用函数the_content时通过传入参数来定义“阅读更多”链接样式,而与excerpt摘要相关filter完全无关。

第二种方法可以使用多种filter进行“阅读更多”链接定义,使用excerpt_length来定义自动生成摘要的长度(系统默认为55),使用excerpt_more定义自动生成摘要时“阅读更多”链接的样式,使用get_the_excerpt定义手动添加摘要时“阅读更多”链接的样式。

出自jquery作者简单js模板中的技巧

短短的一段代码,看懂之后能真正认识javascript语言中的各种技巧 来自JavaScript Micro-Templating

// Simple JavaScript Templating
// John Resig - http://ejohn.org/ - MIT Licensed
(function(){
  var cache = {};
  // tmpl解析函数,参数str通常为模板tag的id,参数data为传入的数据
  this.tmpl = function tmpl(str, data){ 
   //首先判断传入str第一个字符是否为非单词字符,\W等价于[^A-Za-z0-9_],注意判断条件取反
    var fn = !/\W/.test(str) ? 
      //为真,说明开头字符为单词字符,即str表示id,则首先查找缓存中的模板函数
      cache[str] = cache[str] || 
        //未缓存则并取出模板中的内容运行tmpl解析函数,由于未传入data参数,故返回模板函数指针进行缓存
        tmpl(document.getElementById(str).innerHTML) : 

      // 为假,说明开头字符为非单词字符,即str表示模板内容,则创建相应的模板函数fn对象
      new Function("obj", //fn接受一个参数obj,实质即data
         //函数内容,p为需要显示的内容以数组形式保存,内部函数print即调用p的push方法将所有参数压入(该函数用法不明)
        "var p=[],print=function(){p.push.apply(p,arguments);};" + 

        //使用with关键字,将参数obj即data带入到执行环境中,这样模板中的变量即可使用
        "with(obj){p.push('" +
        // 在创建fn函数对象时即将str模板内容转换为完全的js代码,
        // 例子:<i class='a'><%=user.id%></i>
        str
        // 先清除各种换行符以方便后面作为替代符号进行使用
          .replace(/[\r\t\n]/g, " ")
        // 将模板开头标志替换为缩进符,
        // 例子:<i class='a'>\t=user.id%></i>
          .split("<%").join("\t")           
        // 模板中非脚本部分(即html标签)中的单引号替换为换行符,其中$1即正则中小括号能匹配的内容
        // 例子:<i class=\ra\r>\t=user.id%></i>
          .replace(/((^|%>)[^\t]*)'/g, "$1\r")
        // 将模板中直接显示的变量提取出来,用单引号与逗号进行分隔,由于字符串使用单引号,故而上一步需要记录
        // 例子:<i class=\ra\r>',user.id,'</i>
          .replace(/\t=(.*?)%>/g, "',$1,'")
        // 将代替模板开头标志的缩进符替换为push调用结束,注意例子中的\t在上一步已被删去
          .split("\t").join("');")
        // 将模板结束标志替换为p.push调用开始,意为模板标志之间的html标签即以字符串的形式压入p数组
        // 注意例子中的%>也在显示变量那步被删除
          .split("%>").join("p.push('")
        // 还原模板中原有字符串部分的单引号
        // 例子:<i class=\\'t\\'>',user.id,'</i>
          .split("\r").join("\\'")
        // fn函数返回最终拼接的字符串,p.push('<i class=\\'t\\'>',user.id,'</i>');,注意push方法是可以压入多个元素的
      + "');}return p.join('');");

    //如果传入data,则返回运行模板函数后的最终结果,否则返回模板函数fn指针
    return data ? fn( data ) : fn; 
  };
})();

WordPress相关轻博客主题开发经验

轻博客类型的主题已经是现今个人站的设计风尚,不少大型设计博客站点也投入轻博客风格的怀抱,典型的就是Smashing Magzine,其站点的样式充分体现了目前实用类博客的结构设计思路,其结构可归纳为:

导航栏 nav.toplevel

主内容区 div#container > div.sidebar+div.main(fluid)

博客导航区 div#wpsidebar

底部功能区 div#footer

实际上,设计时需要正确理解轻博客的意图,要知晓该风格主题定制性一般不如博客。sidebar功能中小工具功能不可能充分发挥(一般除广告外,只能放置一到两个widget,否则就会拥挤),menu的功能一般也归放到边栏sidebar展示,而很少像以前一样出现在站点中间位置。(网站Smashing Magzine即放到边栏的博客导航区)

本站的最新设计就尽量在经典博客与轻博客风格中寻找一种平衡,但是设计出发点总是信息的有效传达。设计博客的关键在于阅读体验好,在于查找内容方便,所以目前sidebar还是使用了多个widget,menu也仍然放在站点中间。

轻博客主题的另一大特色就是Responsive design,即一次设计必须能够自适应多种阅读终端设备。虽然本人很早就接触过这些内容,但只在本站制作过程中才真正开始使用这些内容。个人感觉自适应设计最关键的技术点在两个地方:一个是字体大小的安排,一个是media query的安排。

字体的大小安排在目前的主题中有两种风格,一种是默认主题twentyeleven中使用的em组织方式,另一种是最新默认主题twentytwelve中使用的rem组织方式。前一种方式的问题主要是使用em为单位需要叠加计算字体大小(可以使用body{font-size:62.5%;}将默认的1em=16px调整为10px,这样计算就方便一些),布局使用的margin或padding也都必须使用百分比或em,故而比较复杂,但是浏览器兼容较好。后一种方法使用了CSS3中加入的rem单位,即相对于根标签html的字体大小,最新默认主题twentytwelve中即使用html{ font-size: 87.5%;}将默认的1rem=16px调整为14px,于是其他所有属性如margin等都以14px=1rem为标准进行编写。但是可惜的是该单位ie8以下都不认识,所以还是必须用px进行兼容,于是还是必须写出body { font-size: 14px; font-size: 1rem;}这样的代码来。

media query的安排必须了解各个阅读终端的屏幕尺寸,下面这个视频对了解苹果系列产品的分辨率及尺寸很有帮助。本站选择了800px与480px两个分界线,来分别对应平版终端(通常需要处理的是竖着拿的情况)与手机终端(横竖都必须处理)。



有关响应式设计与开发可以参考这篇文章

正确理解Wordpress设置API

Wordpress设置API使用起来并不算太方便,很多地方都容易混淆,因此在本人读懂并改写了主题相关的设置类之后,就想把相关容易混淆的地方详细说明一下。

函数register_settingsettings_fields为一组,它们之间使用参数option_group进行关联,另外函数register_setting注册了get_option函数所需要的参数option_name。这两个函数一个用于注册设置信息,一个用于显示设置信息(实际即一组hidden属性的input标签,显示时使用参数option_group)。

函数add_settings_sectionadd_settings_fieldadd_[theme或options]_page为一组,它们之间使用参数menu_slug进行关联,由该参数可知这些函数只与某个特别的page相关,用于注册表单展示信息。使用函数do_settings_sections来渲染展示表单(显示时使用参数menu_slug)。

关于settings的状态栏使用<?php settings_errors(); ?>,该函数即可显示黄色的状态栏。更多状态栏相关开发参考这个链接

 

PHP魔术函数集锦

1。construct()
实例化对象时被调用,
construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。

2。__destruct()

当删除一个对象或对象操作终止时被调用。

3。call()
对象调用某个方法,
若方法存在,则直接调用;
若不存在,则会去调用
call函数。

4。get()
读取一个对象的属性时,
若属性存在,则直接返回属性值;
若不存在,则会调用
get函数。

5。set()
设置一个对象的属性时,
若属性存在,则直接赋值;
若不存在,则会调用
set函数。

6。__toString()

打印一个对象的时被调用。如echo $obj;或print $obj;

7。__clone()

克隆对象时被调用。如:$t=new Test();$t1=clone $t;

8。__sleep()

serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。

9。__wakeup()

unserialize时被调用,做些对象的初始化工作。

10。__isset()
检测一个对象的属性是否存在时被调用。如:isset($c->name)。

11。__unset()
unset一个对象的属性时被调用。如:unset($c->name)。

12。set_state()
调用var_export时,被调用。用
set_state的返回值做为var_export的返回值。

13。__autoload()
实例化一个对象时,如果对应的类不存在,则该方法被调用。

魔术常量

1。LINE
返回文件中的当前行号。

2。FILE
返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,FILE 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。

3。FUNCTION
返回函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

4。CLASS
返回类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

5。METHOD
返回类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

Post Series插件(更名为SimplePostSeries)正式发布

Post Series插件改名为Simple Post Series正式在Wordpress插件官网发布,可以自由下载使用

Simple Post Series为Wordpress增加按照专题管理文章并展示的功能,集所有类似插件功能之所长,设置选项完善。

融合所有类似插件的相关功能:

  • *可以在文章编辑页面通过按钮与面板添加shortcode以展示某个专题下的文章列表,支持文章与页面,
  • *可以设置自动在文章页或主页上显示某个专题下的文章列表,可以设置展示摘要或缩略图,
  • *可以在管理员文章管理页面上对某个专题进行筛选,文章管理更加方便,
  • *2.0最新版支持文章拖拽添加到专题的功能,页面特别参考eg-series插件。
    专题文章的拖动管理页面,这是极其方便的管理页面,用户可以在该页面上自由拖动文章到某个专题,或是删除某个专题下的文章,或是改变文章的排序等。

待完善:(BUG列表)

1.页面无法在专题展示中列出

Description

simple-post-series allows you to insert series short code for displaying a bunch of posts in the same serie.
This plugin allows to include posts into series, to create, delete or rename series. It also includes widgets and shortcodes to display list of series, or the list of posts belonging to the series of the current post.

With this plugin, you can:

    • Add / Delete a post from a serie,
    • Create / Rename / Delete series,
    • Display the list of series in a post, or display this list in sidebar, with widgets for exemple,
    • Filter posts by a special serie in your admin post managent page,
    • Automatically insert the list of posts of a specific serie, without using shortcode.
      simple-post-series is TinyMCE Integrated. That means you don’t need to learn the shortcode syntax. The plugin add a button in the tinymce toolbar. You just have to click on this button, choose parameters/options, and click insert. That’s all, the shortcode will be insert into your post with the right parameters.

You can find latest source code in github project.

This plugin is enlighted by Tuts+ and their Sessions. You can find a very helpful cource in NetTuts+ to figure out how this plugin works in Wordpress.

Installation

  1. Uzip the simple-post-series.zip folder.
  2. Upload the simple-post-series folder to your /wp-content/plugins directory.
  3. In your WordPress dashboard, head over to the Plugins section.
  4. Activate Post Series.

Usage

simple post series adds two administration pages, a widget and shortcode.

Customize your theme

simple-post-series uses now a specific taxonomy to implement series. It means

    • You can build / customize a specific page in your theme to display the content of a serie.
      You can customize your theme by creating page like ‘taxonomy-series.php’ which overrides default archive page to display the content of a serie.
      A sample archive page template is located in ‘[simple-post-series]/template/taxonomy-series.php’ and you can freely modified it and place in your own theme.

Administration pages

  • * Series gives ability to change or rename series,
  • * Settings/Post Series contains all options of the plugin. In this page, you can activate the auto display feature.

Shortcodes

To display the list of series: [series options], with the following options:

  • * id of the series. Default ‘ ‘,
  • * slug of the series. Default ‘ ‘,
  • * title of the list. Default ‘ ‘,
  • * limit: number of series to display in the list. Default: -1 to display all series,
  • * show_future: displays unpublish posts in the series. Default: on,
  • * class_prefix: of the list section. Default ‘post-series’.

Screenshots

  1. Post Editing page: TinyMCE integration and additional metabox to quickly choose or add a serie 加入专题设置模块,
  2. List of posts in a serie 在文章页面展示专题列表,
  3. Easily manage series 拖拽管理专题下所属文章,
  4. TinyMCE window to choose shortcodes options, and insert shortcodes 文章编辑方便插入short code,
  5. Insert short code in edit post 插入short code的结果,
  6. Options page 插件设置页面,

Changelog

= 2.1 =

  • New: Fix bugs and improve code robustion

= 2.0 =

  • New: Add admin series bulk edition page for drag and drop posts to serie

= 1.3 =

  • New: Add option to choose where to display lists
  • New: Add option to choose to display excerpt
  • New: Add option to choose to display thumbnail

= 1.2 =

  • New: Add series filter in admin’s edit.php
  • New: optional load of the stylesheet
  • New: sample archive page for displaying series taxonomy in custom theme

= 1.1 =

  • New: add widget for post series with many options

= 1.0 =

  • Plugin released. Everything is new! Have to change name from post-series to simple-post-series.

WordPress专题系列文章管理插件Post Series发布

本人第二个WordPress个人制作插件Post Series也完成了。功能是显示一个系列文章的列表,需求很常见,但是搜到的插件要么功能过于复杂,要么就得收费

当然这个插件主要的展示代码逻辑也是来自一个Nettuts+教程《Adding Post Series Functionality to WordPress With Taxonomies》,但是本人将其发扬光大,为其加入了编辑器按钮及界面,还加入插件设置界面以及相应小工具,而且可以设置自动在文章页面展示系列文章列表,彻底省去添加short code的烦恼。

目前可定制性算是够强,下一步是参考其他Series插件继续完善一些功能。当然目前的第一步是发布到WordPress官网供大家下载。

首先是学习免费插件EG-Series

优点:其同样支持编辑器按钮(支持系列文章展示short code与展示所有系列的short code),可以用拖放的方式管理系列下的文章,为管理员导航栏增加菜单。居然使用的各种short code及tax设置都与本人写的通用。。。要好好学习。。。

缺点:默认样式很一般,勉强可以用

其次是参考免费插件Organize Series,其可以升级为付费版,只有付费版才支持short code与custom post type

优点:普通版可以完整设置展示的template(全部HTML代码都可以更改,这个定制性过强)设置使用默认css样式表,可以为系列添加特色图标,为文章管理页面加上系列一栏(展示系列名称与文章数目),可以进行filter筛选,同样可以为文章自动添加系列展示等(设置使用checkbox input可以学习),可以改变文章在系列中的序数(比较麻烦)。

缺点:默认样式很丑,默认展示位置很诡异,根本不适用,果然是逼人用付费版啊。

优化点Todo:

  1. 文章管理页面加上系列的filter,系列支持特色图标
  2. 设置是否使用默认css样式表,其他都改用checkbox来展示
  3. 增加系列展示的各种设置,如是否显示thumbnail或excerpt
  4. 增加系列内的导航,增加show all按钮
  5. 系列展示可以使用list或select,改变sort order
  6. 拖放的方式管理(同时可以参考收费插件)*
  7. 设置short code的名称*
  8. 设置自动展示的页面类型与位置及样式设置*
  9. 增加更多的模板编码*
  10. 设置界面分为几个section*

PHP合并数组元素的两种方法与区别



array_merge():
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。(数字键名会被重新分配,总会变成从零开始的。。)

对于使用“+”合并数组:
如果数组中有相同的字符串键名(不管是不是数字),则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉。

参考:php里面合并数组array_merge和加号有什么不同

本站总访问量