最快捷的技术提升方式叫做交流
Nov 20
思路来自网上资料:

如第一轮
数组第一个与最后一个元素对应,第二个与倒数第二个对应,其余类推
如果遇到与自身对应,则定为自身与最后一个元素对应
以上为除最后一个元素外其他元素的对应,最后一个元素的对应算法等下再说

第二轮
数组第一个元素现在将与倒数第二个元素对应,相似,第2则与倒数第3对应,其他类推,与自己对应的时候仍然遵循第一轮说到的那个处理规则

说到这里,就可以写出获取最后一个元素以前的其他元素每一轮的对阵信息了

现在来说最后一个元素的对阵信息获取
最后一个元素每轮的对阵元素有一个规律,就是除了第一轮是固定与第一个元素对应后,从第二轮开始,将整个数组除了最后一个元素和第一个元素外的其他元素拆分成两个数组,都是以在原来数组中的index的降序排列,然后以一隔一的方式合并这两个数组,如10个元素为例,拆分的两个数组为5,4,3,2和 9,8,7,6
再一隔一合并它们,变成5,9,4,8,3,7,2,6,这个8个元素就分别是原来数组中最后一个元素在除了第一轮后每轮的对阵对手了

所以,最后一个元素的对阵情况是这样获得的,如果是第一轮,它遵循其他元素的对阵获取规则,否则,按上面说的获取对阵队伍信息


--------------------------------------------------------------------------------------------------------------------------------------------------------
下面用PHP实现,处理的结果是半程的比赛,下半程比赛只需要将每场的主客场顺序换一下就可以。

//下面是赛程算法
             $nums = 20; //20个球队
    //球队临时序列
    $numsSort = array();
    for($i=1;$i<=$nums;$i++){
      $numsSort[] = $i;
    }  
  
for($i = $nums/2,$j=1;$i>1;$i--,$j++){
      $tmpArr[] = $numsSort[$i-1];
      $tmpArr[] = $numsSort[$nums-$j-1];
    }

    for ($i=1;$i<$nums;$i++){
      $tmp = $numsSort;
      $zd = 1;
      $kd = $nums-($i-1);
      echo 'NO.',$i,':';
      while ($zd<$kd) {
        echo $zd,'vs',$kd,'|';
        unset($tmp[$zd-1]);
        unset($tmp[$kd-1]);
        $zd ++;
        $kd --;
      }
      if($i!=1){
        echo $tmpArr[$i-2],'vs',$nums,'|';
        unset($tmp[$tmpArr[$i-2]-1]);
        unset($tmp[$nums-1]);
      }
      //以上规则都不匹配的剩余球队,可以直接使用 头尾元素对战
      if(!empty($tmp)){
        sort($tmp);
        $count = count($tmp);
        for($ci=0;$ci<$count;$ci++){
          if($tmp[$ci]<$tmp[$ci+$count/2])
          echo $tmp[$ci],'vs',$tmp[$ci+$count/2],'|';  
                  }
      }
      echo '<br/>';
    }
Nov 17
一、安装Coreseek
由于本机是vista,所以先安装一个coreseek win32版本
1.安装Microsoft Visual C++ 运行环境 Microsoft Visual C++ 2005 运行环境 (x86)
2.将

二、测试(我只进行mysql测试,其实coreseek还支持很多数据源,详见官网)

测试对象:mysql数据源,中文分词与搜索
对应配置:etc/csft_mysql.conf
测试数据:var/test/documents.sql
PHP程序:api/test_coreseek.php
测试说明:请先将测试数据导入数据库,并设置好配置文件中的MySQL用户密码数据库
在线说明:http://www.coreseek.cn/products-install/mysql/

1.mysql 数据源配置 (etc/csft_mysql.conf)
数据表:


CREATE TABLE IF NOT EXISTS `documents` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `content` text NOT NULL,
  `date_added` datetime NOT NULL,
  `author_id` int(11) NOT NULL,
  `group_id` int(2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;


------------------
以下为配置文件内容
------------------

source mysql
{
    type                    = mysql
    sql_host                = localhost
    sql_user                = root
    sql_pass                = 123456
    sql_db                  = blog
    sql_port                = 3306
    sql_query_pre           = SET NAMES utf8
    sql_query               = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents                
    sql_attr_uint      = group_id
    sql_attr_timestamp    = date_added      
    sql_query_info_pre      = SET NAMES utf8                                      
    sql_query_info          =  SELECT * FROM documents WHERE id=$id  
}

index mysql
{
    source            = mysql            
    path            = g:/tools/coreseek-4.1-win32/var/data/mysql
    docinfo            = extern
    mlock            = 0
    morphology        = none
    min_word_len        = 1
    html_strip                = 0
    charset_dictpath = g:/tools/coreseek-4.1-win32/etc/                            
    charset_type        = zh_cn.utf-8
}


indexer
{
    mem_limit            = 128M
}

searchd
{
    listen              =   9312
    read_timeout        = 5
    max_children        = 30
    max_matches         = 1000
    seamless_rotate     = 0
    preopen_indexes     = 0
    unlink_old          = 1
    pid_file = g:/tools/coreseek-4.1-win32/var/log/searchd_mysql.pid  
    log = g:/tools/coreseek-4.1-win32/var/log/searchd_mysql.log      
    query_log = g:/tools/coreseek-4.1-win32/var/log/query_mysql.log
    binlog_path =   g:/tools/coreseek-4.1-win32/var/log/                            
}


2.服务进程开启

//使用配置文件

bin\indexer -c etc\csft_mysql.conf --all

//开启searchd

bin\searchd -c etc\csft_mysql.conf


三、测试文件

require ( "sphinxapi.php" );

$cl = new SphinxClient ();
$cl->SetServer ( '127.0.0.1', 9312);
$cl->SetConnectTimeout ( 3 );
$cl->SetArrayResult ( true );
$cl->SetMatchMode ( SPH_MATCH_ANY);

//分页显示
$p = isset($_GET['p']) ? $_GET['p']:0;
$cl->SetLimits($p*40,40);
$res = $cl->Query ( 'php', "*" );

echo '<pre>';
print_r($res['matches']);
echo '</pre>';



运行http://localhost/test_coreseek.php
输出结果:
Array ( [error] => [warning] => [status] => 0 [fields] => Array ( [0] => title [1] => content ) [attrs] => Array ( [group_id] => 1 [date_added] => 2 ) [matches] => Array ( [0] => Array ( [id] => 3 [weight] => 1 [attrs] => Array ( [group_id] => 3 [date_added] => 1270094460 ) ) ) [total] => 1 [total_found] => 1 [time] => 0.002 [words] => Array ( [方便] => Array ( [docs] => 1 [hits] => 2 ) ) )

很明显一切都OK!

————————————总结————————————

下面对整个流程进行步骤总结:

1.下载安装Coreseek
其实只要下载好正确版本,解压到指定文件夹就可以
注意本机要有vc运行环境,一般系统都自带了,但是我的vista机子自带了2005,无奈我只有卸载了重新安装2008

2.配置数据源(记得在支持utf8编辑器下编辑)
配置文件地址:etc/csft_mysql.conf
注意点:
2.1 source{..} 中:
sql_query               = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents                 #第一个字段ID为表自增变量
sql_attr_uint   = group_id  #整数分组属性
sql_attr_timestamp   = date_added  #时间分组属性


2.2 index mysql{...}各个路径最好写绝对路径
path            = g:/tools/coreseek-4.1-win32/var/data/mysql #最后的mysql为文件前缀,一般使用索引名称

2.3  searchd{ ..} 中路径最好写绝对地址

3.运行守护脚本
3.1 编译配置文件 bin\indexer -c etc\csft_mysql.conf --all
3.2 开启搜索服务端 bin\searchd -c etc\csft_mysql.conf

4.测试脚本
运行测试脚本……


Oct 28
最近工作中接手开发了一个网站门户功能,说简单一点就是可以实现自定义页面布局,并调用当前系统数据。

门户开发主线有3条,分别是前台页面自定义的实现、后台程序对数据的处理、数据模块开发。

1.前台页面自定义开发

由于是传统的web系统,DIV+JS实现。所以前台页面自定义开发对js技术的掌握方面有一定的基础要求,
包括浏览器兼容性问题。不过也不是很难,只要有信心就能做好。


开发内容主要包括如下几点:

1.1 利用js实现模块的拖动及拖动后节点数据的存储。这里的难点是拖动div模块/布局的实现,拖动到指定位置后的节点数据处理。
很幸运,这部分已经在上一个程序人员的处理下基本完工了,我接手后对这部分只需要做简单的调整和修改,省了不少心思。
这部分的JS主要在DIY应用的 core.js 里面。

1.2 模块编辑弹框需要用到的js处理,这些处理包括定制页面管理弹出窗、弹出窗内js函数的封装。

1.3 各个模块内js函数的开发定义,如各种图片显示、ajax分页处理、其他应用json/jsonp数据的处理等。
虽然这个并不是全部模块都会用到,但是确实也是必不可少的。这部分js的编写,是需要二次开发人员自己拓展的。

我已经将大部分通用的js处理函数写到diy.js里面的Normal 对象中。
下面对这个js文件进行简单的分析和解释:

var Normal = (function(DOM,Sam){
  // 首先定义了一些对象的私有变量和方法
  // 私有变量
    var $ = DOM.get,  
    mods = {},
    fired = false,
    LOADED = 1,
    ATTACHED = 2,
    page = 'index',
    channel ='index',
    _ajaxParam = new Array(),
    _doUrlList = new Array(),
    preview = false;
  //私有方法
var registerModule=function(name,def,config){
  ...
  },
       ...
   keepButton=function(obj,rightpx){
  
    
    };
  
  //这里定义了一些供外部调用的"接口"函数
   return {
  doc:window.document,
  add:function(name,fn,config){
  ...
  },
  run:function(){
      var self = this;
      Sam.each(mods,function(item,name){
    self.use(name);
      });
  },

  DiyAdmin:function(targetName,diyId){
        Sam.ajax.post(U('diy/Index/getAdminPopup'),{page:page,channel:channel,target:targetName,diyId:diyId},function(msg){
           var pop = new Popup({
            contentType: 3,
            isReloadOnClose: false,
            isSupportDraging:true,
            noButton:true,
            width:550,
            height:'auto'
            });
           pop.info.someHiddenTag = "object,embed";
           pop.setContent("title", "参数设置");
       pop.setContent("callBack", 'previewAdmin');
           pop.setContent("confirmCon", msg);
           pop.build();
       pop.show();
        });
  },
  submit:function(form){
    if(this.preview==true){
      form.target = 'preview';
      jQuery('#main').hide();
      jQuery('#sublist').hide();
      jQuery('#prelist').show();
      jQuery('#preview').show();
      form.isPreview.value = 1;
    }else{
      form.isPreview.value = 0;
      form.target = '';
    }
    return true;
  },
  ....
  };
})(DOM,Sam)



2.后台程序对数据的处理 (DiyService)

后台程序对数据的处理,包括对js传递过来的数据进行整理及格式化存储(保存操作)、
根据存储数据对页面进行渲染(编辑和现实页面)、模块数据属性的修改。

2.1对js传递过来的数据进行整理及格式化存储,这个过程思路很简单,但过程很复杂。
我们接受到的js数据分为model和layout两个数据,前者为模块的节点数据,后者为布局的节点数据。
我们需要将两个数据合并,并整理出正确的序列,存入数据库中。具体实现过程在DiyService->saveNode中进行……

2.2根据存储数据对页面进行渲染(编辑和现实页面)
我们从数据库取出了数据,然后根据数据的属性(如是否为布局,是否为模块),由于涉及到多重嵌套和多个列,我们要确定模块/布局在页面的哪个位置,
这需要在渲染时候建立一个的模型,同时填充对应的数据进去(这里用到了抽象类的prase方法)。

2.3 模块数据属性的修改,就是在定制页面或者前台管理页面(其实后台还有个模块数据管理),对某个模块数据进行修改后,如何方便的存入数据库中。
在后台和前台管理页面,对模块数据的修改都是只修改当前模块的attr属性,再刷新对应模块缓存。
但是在定制页面中,每次修改后都需要保存整个模块,重建整个页面的模块属性、数据库数据和缓存。

2.4 还有一点就是模块缓存的处理机制,这个机制在wiki上已经有了,有兴趣的可以去看下。


3.数据模块开发

可能这个叫法不且贴,但我想的数据模块指的是对系统内外各种数据的调用,包括自定义的数据、本系统的数据、其他系统的数据。
每个模块内对数据的调用、渲染是需要独立开发的,但是系统会给定一个开发框架和规范。
下面就来说说这个模块开发。

首先有一个核心抽象类提供模块的一些基本方法的封装和定义。
其次我们的每个单独模块都可以理解为一种简单的model->view模式。
为什么没有C呢?因为我们的控制器已经结合在框架里了。
model就是我们在插件DIY目录下看到的一个个小文件夹中的main.php函数。View就是style中的各个模板。
然后我们还有一个popup.html 这个是在自定义页面的弹出窗需要用到的模板页面。
然后我们还有一个popupAdmin.html 这个是在前台管理页面的弹出框需要用到的模板页面。
然后,然后就没有然后了。这些就是数据模块开发的全部内容。



整个门户的开发思想思路基本就是这样,很明显,着并不是一个非常完善的开发方案,但是更明显的是它实现了目前的需求。
也许我们应该多参考业内的其他门户(定制页面)开发思路,如已知的淘宝旺铺、QQ空间等,
再将各种好的方法方案结合起来,取出精华、创造属于我们自己的更完美的实现方案。

要是你看完了这篇日志,thx!









Jun 16
资料:http://www.oschina.net/p/mongodb
Jun 16
参考资料:
http://wiki.ubuntu.org.cn/Squid%E9%85%8D%E7%BD%AE%E8%AF%A6%E8%A7%A3
分页: 1/4 第一页 1 2 3 4 下页 最后页 [ 显示模式: 摘要 | 列表 ]