[书]人生是一场修行——读《少有人走的路》

作者:bibodeng 发布于:2013-11-28 21:20 Thursday 分类:读书笔记

人生是一场修行——读《少有人走的路》

by bibodeng 2013-11-28

对自己负责

也许这种文字不太适合放到博客里面去,因为未必有人感兴趣。花几天看完了《少有人走的路》,也许该写写读后感,因为我对于书中的内容有共鸣。都说读书是从书中的世界里面发现自己,从这本书里面我看到了自己的影子。常人掌握控制意识的能力能够做出更加恰当的决策,而探索未知的潜意识更多是...

阅读全文>>

标签: 心理学 心智 成熟

评论(0) 引用(0) 浏览(1481)

重写share2SNS

作者:bibodeng 发布于:2013-11-21 10:48 Thursday 分类:web开发

重写share2SNS

by bibodeng 2013-11-20

前言

前段时间,@myunlessor 兄跟我讨论的时候提到我之前用的那个分享到SNS网站的js写得并不够优雅,有许多冗余的地方。而我最近也在看javascript的设计模式,发现代理模式非常适合这种用来发送一组GET请求的情况,尤其是参数较少的时候。于是我就试着实现一个代理模式实现的版本。 ...

阅读全文>>

标签: javascript 重构 设计模式

评论(0) 引用(2) 浏览(1503)

[转]精力的培养

作者:bibodeng 发布于:2013-11-12 11:22 Tuesday 分类:生活点滴

精力的培养

   人的精力是颇为有限的。付出的过程比获取要长很多。做任何有益于自己的,成长性的事情都需要付出精力,这也要求人们有节制的使用这一无形资本——我认为这些显而易见的道理,越早想明白越好。
   曾经有很长的一段时间我不明白为什么每当我参加一些人数众多,气氛热闹,互动频繁的活动时就会情绪低落,即使是参加大型同学聚会,面对大家欢快的讨论,我也多少有些拘谨。直...<p class="readmore"><a href="http://www.bibodeng.com/?post=142">阅读全文&gt;&gt;</a></p>

标签: 习惯 精力 爱好

评论(0) 引用(4) 浏览(1366)

latex生成各种格式电子书

作者:bibodeng 发布于:2013-11-9 23:36 Saturday 分类:资源工具

使用latex源码生成各种格式电子书

by bibodeng 2013-11-09

前言

为了让电子书能够在更多的平台上被阅读,那么则需要生成各种版本的电子书,这个过程真的有点蛋疼,但是通过各种非常有用的工具,干起来也非常快。下面主页记录一下常用的格式的生成:

PDF,mobi, epub, html

其中PDF是最容易的,latex编译默认就输出P...

阅读全文>>

标签: latex xelatex 电子书 排版 ubuntu 多屏幕

评论(0) 引用(1) 浏览(2186)

xelatex在文档处理中的使用

作者:bibodeng 发布于:2013-11-9 13:18 Saturday 分类:资源工具

xelatex在文档处理中的使用

by bibodeng 2013-11-09

latex和pdflatex的问题

使用latex来直接编译,在有\tableofcontent的情况下会出现一些怪异的unicode char \u8之这样的错误,使得目录不完整。其原因是使用的CJKutf8的宏包所包含的utf8字符是不完整的,故而有些中文字符支持不完整。...

阅读全文>>

标签: latex xelatex 电子书 排版 ubuntu 多屏幕

评论(0) 引用(0) 浏览(2083)

常用latex代码块

作者:bibodeng 发布于:2013-11-3 16:27 Sunday 分类:资源工具

常用latex代码块

by bibodeng 2013-11-3

为啥搞latex

其实接触latex也有些日子了,本来是一直打算用它来排版我们自己的简历,论文,还有我们业余写的电子书。最近和思愿在折腾这个东西,故而觉得有必要整理出一篇常用的latex代码块出来,然后结合我们的需要发挥。

宿舍一个哥们总是说我折腾,linux,latex,Qt,折腾的东西真的不少...

阅读全文>>

标签: latex 总结 代码

评论(0) 引用(0) 浏览(2453)

事件代理实现

作者:bibodeng 发布于:2013-11-3 11:26 Sunday 分类:web开发

事件代理实现

by bibodeng 2013-10-29

事件代理的原理

所谓事件代理,就是说让另外一个元素,一般是父元素来绑定事件,然后处理的是子元素被点击后的逻辑。这样的目的是减少绑定事件的消耗,因为往往一个父元素下有很多个相同的子元素,它们所绑定的事件也是一样的,故而可以将这个消耗给转移到同一个绑定中,既提升效率,也使得程序变得优雅。我在博客园找到一篇事件代理的[...

阅读全文>>

标签: javascript web 事件

评论(0) 引用(2) 浏览(1501)

初识NoSQL

作者:bibodeng 发布于:2013-10-27 17:35 Sunday

初识NoSQL

by bibodeng 2013-10-27

Not only SQL

之前就接触过NoSQL,但是从来没有再项目实践中使用过。故而,很有必要从入门之初就动手操练一下,就算不太熟练,也能知道其中精华一二。我告诫自己,要紧凑明确,对任何东西都有意识地围绕最核心的东西去发问,凡事问个为什么,不要浪费太多时间在不重要的踌躇中。我之前看过一点NoSQL,毕竟没有什么实...

阅读全文>>

评论(0) 引用(2) 浏览(1631)

梳理常见数据结构

作者:bibodeng 发布于:2013-10-25 15:38 Friday 分类:技术交流

梳理常见数据结构

by bibodeng 2013-10-25

算法数据囧

计算机最最重要的是它的硬件能够快速运算,它的软件具有抽象事物的能力。其中算法,是建立在数据结构上的,而对事物的抽象,则是建立在数据结构上的。近期笔试面试中也常考,虽然尤其是对后台的同学来讲,这方面要求会高一点。但是作为计算机学院的学生,很有必要理解一些经典的数据结构,它的最大特征,注意事项,已经常...<int,list<int,int><int,int><int,int>

阅读全文>>

标签: 笔试 面试 数据结构 STL vector list

评论(0) 引用(118) 浏览(13754)

用js实现快排加演示-js排程初探

作者:bibodeng 发布于:2013-10-25 8:27 Friday 分类:web开发

用js实现快排加演示

by bibodeng 2013-10-24

缘起

有很多时候,我们都是需要重新做一个轮子,才知道轮子究竟是什么样子的,然后就可以在下一次碰到这种情况时能够立马写出来,并且能写得很好。本来我打算写一个快排,然后在页面中进行演示,我知道已经有很牛的人实现过了,但是我做这个的时候,遇到了一些困难,使我想起了前段时间想要写某个锁机制队列的时候,后来发现...< q) // 需要排序的元素个数不为0 { x = partition(arr, p, q); // 对数组进行partion处理 qsort(arr, p, x-1); // x之前部分 x是该轮确定位置的元素 qsort(arr, x+1, q); // 2次递归 } };

var partition = function(arr, p, q)
{

    var tmp = 0,
        i   = p,
        j   = q + 1,
        base = arr[p];  // 首元素作为基准

    // 将数组分成两部分,大于base的,小于base的

    while (1)
    {

        while (arr[++i] <= base && i < q);

        while (arr[--j] >< total; i++)
    {
        myArr.push(parseInt((Math.random() * 450)));    // 0 - 450
    }

    // 绘制方格
    qsort(myArr, 0, myArr.length-1); 
});

为了能够体现出排序的可视化效果,我打算绘制一些小方格排列在一起,就像下面这样:

排序可视化

实现的代码并不麻烦,在ready中加入绘制方格的代码:

// 绘制方格
var str = '';
for (var j = 0; j < total; j++)
{
    str += "<li class='normal' style='height:"+myArr[j]+"px;'></li>< q) // 需要排序的元素个数不为0
    {
        x = partition(arr, p, q);   // 对数组进行partion处理

        setTimeout(function(){
            qsort(arr, p, x-1);     // x之前部分  x是该轮确定位置的元素
        }, 1000);

        setTimeout(function(){
            qsort(arr, x+1, q);     // 2次递归
        }, 2000);

    }

    console.log('after sort', arr);
};

并且setTimeout这东西,在循环下,是很耗费内存的,会导致页面奔溃,并且它之内将逻辑包围在一个函数参数里面,不太好。当把for循环换成setInterval调用时,元素操作效果倒是流畅了,但是排序结果却不正确了。原因是后续代码已经开始运行了。

异步的麻烦与解决办法

异步的麻烦,是真麻烦。我思考了一下,将排序算法和DOM操作混在一起是很野蛮的做法,没有做到数据加工和体现的分离。而当前状态又需要重绘,才能体现出其动态效果,但是重绘的代价也太大了,左思右想,没有想到好的解决办法,于是找到陈皓提到的日本程序员写的排序可视化,太强大了,效果也是一级棒,不过要细细剖析源码才知道它是如何实现的,这个改天再一探究竟,今天我要隆重介绍一下一个相当优雅的排程小程序,个人觉得写得相当优雅。

我们做很多编程工作时,往往想要同步(这里的同步指的是确定顺序,而不是不确定),例如在进行ajax请求时,回调结果往往要等一段时间才能返回,但是我们的程序的return却不知道要从哪里返回,如果在回调的外面,则等不到结果就返回了,如果在回调函数里面,则又返回不到正确的地方,这个时候就很有必要同步了。而一个排程的程序,对各个操作进行同步互斥,则可以让它们乖乖一个接一个按顺序执行,这就好比操作系统里面对资源的锁。具体可以参看myunlessor写的排程策略详解。直接上代码吧:

// 排程策略 - 全局定义
var schedule = (function (self) {
  var paused = false, // 标记状态
      queue  = [];     // 队列

  // 入队
  self.join = function (fn, params) {
    params = params || {};
    var args = [].concat(params.args);

    queue.push(function (_) {
      _.pause();
      setTimeout(function () {
        fn.apply(params.context || null, args);
        _.resume();
      }, params.delay || 1);
    });

    return exec();
  };

  self.pause = function () {
    paused = true;  // 忙碌
    return this;
  };

  // ready and call next
  self.resume = function () {
    paused = false; // 空闲
    setTimeout(exec, 1);
    return this;
  };

  function exec() {
    if (!paused && queue.length) {
      queue.shift()(self);  // 出队
      if (!paused) self.resume();
    }
    return self;
  }

  return self;
}(schedule || {})); // 立即执行,self就是schedule本身

我对着这个程序看了十来分钟,越看越有味道,从这个程序中可以看到javascript的很多good part,暂时没有看到缺陷,例如[],用成了活生生的队列,使用push和shift进行入队出队操作。还有闭包,直接返回一个self,本身参数传的是schedule,而schedule本身是刚刚定义的,需要赋值的,这一切看起来多么地神奇,还有返回this,强大的链式调用,有木有,额有点跑题了。下面我们就应用到我们的排序中:

var qsort =  function(arr, p, q)
{
    var x;
    if (p < q)  // 需要排序的元素个数不为0
    {
        x = partition(arr, p, q);   // 对数组进行partion处理

        schedule
        .join(qsort,{
            delay: 100,
            args: [arr, p, x-1]
        })
        .join(qsort, {
            delay: 100,
            args: [arr, x+1, q]
        });
    }
};

一切都相当优雅。当我打开浏览器测试时,发现,有了排程,而不是死板的setTimeout,动画变得流畅了很多。接下来的目标是接着优化partition里面的代码,使得这个过程也看起来很流畅。

var partition = function(arr, p, q)
{

    var tmp = 0,
        i   = p,
        j   = q + 1,
        base = arr[p];  // 首元素作为基准

    $list.attr('class', 'normal');
    schedule
    .join(showBase, {
        delay: 0,
        args: [p]
    });

    while (1)
    {

        while (arr[++i] <= base && i < q)
        {
            ;// 只要是小于base且没到结尾就一直前进
            schedule.
            join(moveSelectedRight,{
                delay: 50,
                args : [i]
            });
        }

        while (arr[--j] ><p class="readmore"><a href="http://www.bibodeng.com/?post=135">阅读全文&gt;&gt;</a></p>

标签: 算法 排序 js 异步 同步

评论(0) 引用(1) 浏览(2694)

Powered by emlog 京ICP备16017775