• 2009-12-15

    狗屎的Firefox3(火狐)的智能地址栏!

    Views: 30387 | 2 Comments

    Firefox 3的所谓的智能地址栏是这样的功能:"Firefox3的地址栏会自动完成用户的输入, 你输入的内容不仅会按照网页地址匹配, 还会按照网页关键字内容匹配". 真他妈的狗屎! Mozilla Firefox SB开发者. 有谁会在地址栏里输入关键字? 地址栏不是输入网址(URL)的吗?

    比如以前要访问百度的首页, 只需要输入"ba", 再加上常访问, 所以第一条肯定就是了, 非常方便. 输入"go"访问google, 输入"id"访问ideawu.net也是一样. 可是现在, 输入"ba", 不再出现百度的首页链接了, 甚至连URL中不包含"ba"的网站也出来了, 还把样式弄得花花绿绿的像个残花败柳的妓女, 这都是什么狗屎啊?!

    之前就因为这个狗屎SB的Firefox3智能地址栏功能, 从FF3出来到今天, 坚决不升级, 一直使用Firefox2. 最近因为firebug的问题, 才升级的. 他妈的, 如果Google Chrome的渲染引擎和Firefox的一样好, 我就使用Chrome了, 放弃Firefox.

    操Firefox 3地址栏, 别搜索URL以外的文本!
    操Firefox 3地址栏, 如何禁止SB的"智能"地址栏? 我用傻瓜相机, 方便, 只需要一个按钮就能照相; 我用全手动相机, 完全由我操控, 调焦, 光线等, 照出高质量的相片; 但哪个SB会用SB智能相机呢?! - 操作繁琐, 照出来的相片还效果不好!

    还好, 一个似乎的开发者的人, 也有自知之明, 知道别人可能会像我一样臭骂他和他开发的这个功能, 所以, 做了一些可选配置和选项:

    http://cybernetnews.com/cybernotes-firefox-3-tips-tricks/
    http://cybernetnews.com/cybernotes-understanding-tweaking-the-firefox-3-address-bar/

    但还是不行, 因为, 我只需要搜索URL, 不要搜索标题!

    这个傻逼Firefox 3的地址栏, 有两堆狗屎:

    1. 样式花花绿绿, 像妓女, 污染眼睛.
    2. 输入提示搜索URL以外的东西, 包括网页标题(关键字), 还搜索搜索夹和历史.

    有一个插件, 可以解决第一个问题: https://addons.mozilla.org/en-US/firefox/addon/7637. 让地址栏看起来清爽一些, 简洁一些.

    但第二堆狗屎, 实在是找不着方法禁用. 操他妈的Firefox 3!

    browser.urlbar.matchOnlyTyped = true // 别搜索搜索和历史, 正确
    browser.urlbar.maxRichResults=0 // 关闭了自动提示, 错误!

    都没用, 不是Firefox 2那样的, 只搜索URL!

    Fuckinig Firefox 3 BULLSHIT address bar!
    Stupid Firefox 3 Smart Location Bar!
    How to disable Firefox 3 Smart(actually Stupid and Ugly) Location Bar?!
    Fuck, you idiot! Just search the URL, not the page title or anything else!
    Annoying(Unbearable) Fiefox 3 Smart Location Bar(Awesome Bar)!

    看看别人是怎么说的(http://support.mozilla.com/tiki-view_forum_thread.php?locale=en-US&comments_parentId=70524&forumId=1):

    Marian:
    Does Firefox 3 has an option to disable awesome bar or should I stick with Firefox 2.0? Version 3 does have a lot of improvements but the awesome bar is unbearable and makes the whole browsing experience unpleasant. Tried training it for 2 weeks but without success. Hinders the browsing badly.

    Firefox 3有没有一个选项禁用那个难受的地址栏, 还是我需要坚持使用 Firefox 2.0? 版本3确实有很多改进, 但讨厌的地址栏让人无法忍受, 使上网体验变得糟糕透了. 我尝试了2个星期还是无法成功, (用Firefox 3)太妨碍上网了.

    mike:
    I have to second this. I've been trying to use it for 2 days now and it is nothing but a pain.

    必须顶. 我试着用了2天, 除了痛苦, 没有别的.

    Matt:
    Wow. I have never had anything but great feelings about Firefox until I downloaded 3.0 and was confronted with the terrible Smart Location Bar. The fact that they refer to it as the Awesome Bar at Mozilla is absolutely laughable to me! It is the worst thing since MSFT's new "Ribbon" in Office 2007. Come on, Firefox, you've got to make the Awful Bar a toggle! I shouldn't have to go into code to disable this!

    哇靠! 直到我下载了3.0, 用上了智能地址栏之前, 我对Firefox只有好感觉, 没有别的. 有人在Mozilla社区里把这个东西称作"好棒一条柴"(Awesome Bar), 这对我来说简直是太他妈搞笑了! 这是微软Office 2007中的"Ribbon"布局以来, 最糟糕的产品(译者注: Ribbon布局, 就是Office的程序占用一大半屏幕的顶部那些大按钮, 非常讨厌. 不过, 我觉得, Office 97中的那只狗"旺才", 还有包括Win95到WinXP - 其它的版本未求证 - Windows自带的搜索中的那只狗, 才是Firefox 3地址栏的祖先). 得了吧, Firefox, 你还是把这个讨厌的地址栏设置成可切换吧! 不应该是让我去修改源代码来禁用它!

    Dejan:
    Suggested solutions are not satisfactory. The real problem is not the display itself, but the search algorithm: in FF2, the suggested address list consists of addresses with the DOMAIN NAMES beggining with the typed text, and it was exactly what I expect to find; in FF3, anything that CONTAINS at ANY place in the site title or address the text you typed, will be offered in the list - this is total mess and makes the address bar unusable at all!

    回复的解决方案并不能完全解决问题. 问题的实质并不是样式本身, 而是搜索算法: 在FF2, 提示的网址是以你输入的文本开头的域名, 这就是我要找; 在FF3, 无论是地址, 还是标题, 只要是包含了你输入的文本, 就会出现在列表中 - 这很混乱, 地址栏根本没法用了!

    Posted by ideawu at 2009-12-15 14:14:32 Tags:
  • 2009-12-08

    PHP中使用foreach和引用导致程序BUG

    Views: 19160 | 1 Comment

    PHP 引用有些类似 C 语言指针, 但一些重要的特性和 C 语言指针不一样, 如果不注意, 会导致程序 BUG. foreach 操作的是数组或对象的拷贝, 但 PHP5, 可以使用引用操作对象元素本身.

    $a = array(1, 2);
    $b = array(11, 12);
    foreach($a as &$r){
    }
    foreach($b as $r){
    }
    echo $a[1]; // 输出 12
    

    两个的循环的本意可能是: 第一个循环需要在循环中修改元素的内容, 所以使用引用; 但第二个循环只是把 $r 当作一个临时变量. 可是, 为什么 $a[1] 的值发生了改变呢?

    当对 $a 的迭代完成后, $r 是 $a[1] 的引用, 改变 $r 的值, 就是改变 $a[1]. 这时, 你可以会奇怪, 代码中并没有修改 $r, 也没有修改 $a[1] 呀?

    其实, foreach 是操作的是数组的拷贝, 所以, 后一个迭代相当于:

    for($i=0; $i<count($b); $i++){
    	$r = $b[$i]; // 修改了 $r! 相当于 $a[1] = $b[$i];
    }
    

    为了避免这种情况, 应该在第一个迭代之后, 执行

    unset($r);
    

    从当前环境中删除 $r 这个变量(引用变量).

    即使不是前面的例子, 在第一个迭代之后, 仍然十分可能再执行类似的语句:

    $r = 123;
    

    循环变量一般是临时变量, 同一个变量名在代码不同的地方表示不同的东西, 但变量的作用域又存在于循环之外. 这就是这种作用域规则的坏处, 加上"变量不声明即使用"的坏外, 再加上变量无类型的坏处.

    所以, 在 PHP 中使用引用变量, 应该在引用使用完之后, 应该 unset(). 所有变量在使用之前应该先 unset().

    最好是, 不到万不得已, 不要使用引用.

    Posted by ideawu at 2009-12-08 15:22:10
  • 2009-11-23

    数据库字段设计错误导致的系统BUG

    Views: 24319 | No Comments

    Yii的AR类, 可以在rules()函数中声明验证规则. 但指定了验证规则, 也可以不使用. 在调用save()方法时, 如何第一个参数为false(默认为true), 则不进行验证. 一旦验证失败, 将立即返回, 不保存数据. Yii提供的工具可以根据数据库表定义自动生成验证规则. AR类的验证规则的另一个功能是用于自动生成HTML页面表单. 但是, 根据实际使用情况, Yii所提供的这个功能在XXX项目中几乎已经成为鸡肋, 都是在开发者不知情的情况下使用了.

    Yii的这个特性, 加上数据库表设计的失误, 以及代码逻辑问题, 导致某个功能出现BUG.

    代码的功能是这样的: 调用AR类的save()方法保存一条记录, 然后跳转到该记录的详细信息页面. 实际操作时, 偶尔出现记录未保存, 然后跳转URL里的id参数为空. 代码逻辑如下:

    if($ar->save()){
        // do something
    }
    redirect($ar->id);
    

    显然, 代码逻辑没有错误处理, 无论成功与否, 都跳转. 下面再分析保存失败的原因.

    数据库表定义中, 备注字段的类型为VARCHAR(255), 如何短的字符串类型的应用范围一般很窄, 再加上所对应的业务字段是备注信息, 往往是大段的文本, 所以, 数据库设计已经失败, 出错是必然的. 另外, 程序逻辑无论是客户端还是服务器端, 都没有再做业务层的验证给出错误提示, 而是无意地使用了Yii框架的AR类的验证机制. 综合上述原因, BUG的查找花费了不少的时间.

    总结:

    1. 数据库设计

    通过对数据库表字段的仔细选择来获取性能, 对于XXX系统, 这种方式已经过时. 一般只有如下几种数据类型: 数字, 字符串(varchar), 文本(长字符串, text), 时间.

    结合 MySQL, 数字主要使用int, 像tiny int, middle int之类的整数类型, 只是节省空间考虑, 速度上反而比int类型要慢, 当数值较大时, 使用bigint. 对XXX, 除了int和bigint, 其它的整数类型都没有必要.

    对于字符串和文本类型, 如果不建立索引作为查询条件, 一般使用text, 不要使用varchar, 如果文本较长, 则使用longtext. 如果字段对应的输入框是多行文本框, 那么就没有使用varchar的必要了. 建议原则是: 不建立索引的字符串使用text, 格式化输入框(HTML编辑控件)对应的字段使用longtext, 只有建立索引的字符串才使用varchar.

    2. AR类设计

    把AR类中的rules()函数删除.

    3. 客户端验证

    在客户端也做验证, 并在出错时提示用户. 如用户输入的文本过长, 等等.

    Posted by ideawu at 2009-11-23 16:58:12 Tags:
  • 2009-11-04

    最简单的JavaScript两级联动示例

    Views: 14921 | No Comments

    JavaScript两级联动, 比如表单里面有两个下拉菜单,实现关联,根据第一个下拉菜单选择的内容,在第二个下拉菜单中显示对应的选项. 这项功能非常有用, 但新手仍会需要示例.

    将下列代码保存到一个后缀为.html的文本文件, 然后用浏览器打开即可:

    Continue reading »

    Posted by ideawu at 2009-11-04 16:40:15 Tags:
  • 2009-08-25

    MySQL 建立外键约束

    Views: 19642 | No Comments

    MySQL 建立外键约束的语法太晦涩难懂了, 不得不记下笔记.

    1. 在建表时建立外键

    CREATE TABLE table_s (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `column_name_from` int(11) NOT NULL,
      `name` varchar(256) NOT NULL,
      PRIMARY KEY (`id`),
      INDEX k_name (`column_name_from`),
      CONSTRAINT fk_name FOREIGN KEY(column_name_from) REFERENCES other_table_name(column_name_to) ON UPDATE CASCADE
    ) engine=innodb;
    

    2. 对已有的表增加外键

    alter table table_name add constraint fk_name foreign key (column_name_from) references other_table_name(column_name_to) on update cascade;

    外键是"fk_name", 如果 column_name_to 没有索引, 则会建立一个名为"fk_name"的索引;

    3. 删除外键

    先删除外键, 再删除索引.

    alter table table_name drop foreign key fk_name;
    alter table table_name drop key fk_name;

    如果在删除外键之前删除索引, 会提示 #1025 - Error on rename of './abc/#sql-fa9_2a9a1' to './abc/table_name' (errno: 150)

    4. 查看外键的名字

    show create table table_name;

    5. 建立索引

    create index index_name on table_name (column_name);

    alter table table_name add index index_name (column_name);

    Posted by ideawu at 2009-08-25 19:13:11 Tags:
  • 2009-08-14

    JavaScript分页控件

    Views: 14522 | No Comments

    JavaScript分页控件PagerView的使用非常简单:

    <script type="text/javascript">
    <!--
    var pager = new PagerView('pager');
    pager.itemCount = 301;
    pager.size = 5;
    pager.index = 3;
    
    pager.onclick = function(index){
    	document.getElementById('info').innerHTML = '现在翻到第' + index + '页';
    };
    
    pager.render();
    
    //-->
    </script>
    

    其中, 把pager.onclick设置为一个向服务器端AJAX请求的函数, 即可实现AJAX数据分页.

    完整的示例见: http://www.ideawu.net/person/two-column-selector/two-column-selector.html

    相关阅读: 3行代码的分页算法(求起始页和结束页), 只有3行代码的分页算法, 抛弃冗长的if-else!

    Posted by ideawu at 2009-08-14 01:42:46
|<<<101112131415161718>>>| 14/28 Pages, 163 Results.