海屿文章列表

《专业投机原理》书摘

捕获.jpg

情绪的纪律

情绪的纪律的性质与根源——执行知识的意志力。

追寻个人的自由

当美好的事物很少时,不要专注于邪恶,这个世界无需完美便能得到我的热爱。

生命中的每一项行动都应该来自于爱,它的要义是自我的施舍(giving of yourself)。所谓的施舍是指贡献与给予。将自己贡献给世界,在交易中提供你的产品与服务,贡献你的成就、生产力、精力、思想与观念:所有这一切都将在精神上和物质上丰富人的生命。

以这种方式施舍,你的回报将数以倍计——不论是以金钱衡量还是以经验的快乐来表示。这不是“给予与取得”,也不是“给予而你将得到”,而是“在交易中给予与取得”。

你没有逃避风险的自由,你没有免于恐惧的自由,你没有逃避痛苦的自由,你也没有不承受失败可能性的自由。然而,你有自由接受这一切为你生命的一部分,而且是最不重要的一部分。

交易者的特质

全心、没有虚假、在情绪上真诚、能够将自己投入感觉、工作与信念中。

财富道德观——财富是善还是恶?

自利并不代表你必须牺牲他人的利益。它不代表你必须 伤害他人,它也不代表你必须舍弃心爱的人以满足自身的需求, 它更不代表你可以为了自身利益而剥削他人。
维克·托斯波朗迪(Victor Sperandeo) with T.Sullivan Brown. 专业投机原理(珍藏版) (华章经典·金融投资系列) (Kindle 位置 6727-6729). 机械工业出版社. Kindle 版本.

唯一合理的道德观是对生命的相互尊重

📺 使用 Node 实现命令行调用播放器看斗鱼&虎牙直播

仓库地址
https://github.com/zhangchen915/live-url

斗鱼

斗鱼的解析

async function getUrl(roomId = 3484) {
    try    {
        const res = await fetch(`https://www.douyu.com/${roomId}`)
        const body = await res.text();
        const id =body.match(/live\/(\S*)_/)[1]
        return `http://tx2play1.douyucdn.cn/live/${id}.flv?uuid=`
    } catch (e) {
    }
}

调起 PotPlayer

PotPlayer播放器所在路径通常如 C:\\Program Files\\DAUM\\PotPlayer\\PotPlayerMini64.exe,通过 exe 加入真实直播 url 参数即可播放直播。

const player = cp.spawn(PotPlayer, [url],{
        detached: true,
        stdio: 'ignore'
    });
    player.unref();

单分派与双分派

images.png

面向过程 ——> 面向对象 : 提高代码的可复用性;
if语句 ——> 多态 : 提高代码的可维护和可扩展性(同时提高了程序的效率,因为工厂类创建对象后,调用该对象的方法就无需条件判断了)

何为分派

分派就是根据类型去选择调用哪个函数。

像C 或者 JAVA 这种静态语言支持多态,天然支持分派,静态语言我们只能在运行时自行判断,一个简单的例子如下。

function foo(value) {
    if(value instanceof Array) {
       // do something
    } else if(value instanceof Date) {
       // do something
    } else if (value instanceof Number || value instanceof String) {
      // do something
    } else {
        // do something
    }
}

这种不算复杂还好,但是如果多个参数,多种类型,这一个函数的 if 分支判断就会越来越多越来越难以维护。

我们可以借鉴一下 Python 中的解决方案,Python 通过单分派泛函数部分支持了方法重载。

单分派函数

我们可以实现一个简单的 singleDispatch 用 Map 存储注册的参数类型,通过 register 链式调用,来注册类型及其对应处理函数。

function singleDispatch() {
  const registry: Map<string, Function> = new Map();
  const res = (...args: any) => {
    const types = args.map((arg: any) => {
      const constructor = Object.getPrototypeOf(arg).constructor
      return Object.getOwnPropertyDescriptors(constructor)?.name?.value || ''
    });

    const dispatcher = registry.get(types.toString())
    if (dispatcher) return dispatcher?.(...args);
  }

  res.register = (types: string[], dispatch: Function) => {
    if (!Array.isArray(types)) throw Error(`${types} not array!`);
    if (typeof dispatch !== 'function') throw Error(`${dispatch} not function!`);

    registry.set(types.toString(), dispatch)
    return res
  }

  return res;
}

使用方法:

function test(name: number): number;
function test(name: string): string;
function test(name: number | string) : number | string{
  return singleDispatch().register(['Number'], () => {
    console.log('Number', name)
    return name
  }).register(['String'], () => {
    console.log('String', name)
    return name
  })
}

你可以在此基础上实现更高级的功能,比如泛函数,any 类型等等。

双分派(double dispatch)

分派过程就是确定一个方法调用的过程,双分派就是见人说人话,见鬼说鬼话,将静态绑定和动态绑定结合起来,也就是说根据运行时传入对象的类型确定方法调用的过程。
重载是静态绑定,多态是动态绑定(运行时进行),双分派把多态放在重载之前,以实现在运行时动态判断执行那个子类的方法。因为编译器知道this所指向的实例的类型,因此将其作为参数传入到函数中就可以实现。

class Man : public Base {
public:
    int getSpeakRes(SpeakBase& speak) {
        return speak.speakWord(this);  //编译器知道this是哪个类型实例
    }
}

class Ghost : public Base {
public:
    int getSpeakRes(SpeakBase& speak) {
        return speak.speakWord(this);
    }
}

class Speak : public SpeakBase {
public:
    int speakWord(Man& man) {
        return "Man"; 
    }
    int speakWord(Ghost& ghost) {
        return "Ghost"; 
    }
}
class Board {
    drawFigure(aFigure) {
        aFigure.getDrawnOn(this)
    }
    drawTriangle(aTriangle) {
        // ...
    }
    drawSquare(aSquare) {
        // ...
    }
}

class Triangle extends Figure {
    getDrawnOn(aDrawableSurface) {
        aDrawableSurface.drawTriangle(this)
    }
}

class Square extends Figure {
    getDrawnOn(aDrawableSurface) {
        aDrawableSurface.drawSquare(this)
    }
}


----

let board = new Board();
let triangle = new Triangle();

board.drawFigure(triangle)

参考文章:

https://www.cnblogs.com/loveis715/p/4423464.html
http://yaoyao.codes/c++/2015/04/26/cpp-double-dispatch
https://www.typescriptlang.org/docs/handbook/functions.html#overloads
https://www.mikealche.com/software-development/refactor-long-if-or-switch-blocks-with-double-dispatch-in-javascript

MongoDB 中的 JOIN 等效操作

703023-20161116113917935-437841031.png
MongoDB 3.2 介绍了一个新的$lookup操作,这个操作提供了一个类似于LEFT JOIN的操作。

$lookup 聚合操作

{
   $lookup:
     {
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents of the "from" collection>,
       as: <output array field>
     }
}

语法类似SQL

SELECT *, <output array field>
FROM collection
WHERE <output array field> IN (SELECT *
                               FROM <collection to join>
                               WHERE <foreignField>= <collection.localField>);

$lookup实际上是对引用集合的$in查询,其中$in的值是要查找的管道中localField值的集合。
如果索引了foreignField,则该查询的复杂性为O(log(n))。如果foreignField没有索引,则查询的复杂性为O(n)

优化

$lookup $unwind 合并

$unwind紧跟在另一个$lookup之后,$unwind$lookupas字段上运行时,优化器可以将$unwind合并到$lookup阶段。 这避免了创建大型中间文档。

$project 投影优化

聚合管道可以确定是否仅需要文档中字段的子集即可获得结果。如果是这样,管道将仅使用那些必填字段,从而减少了通过管道的数据量。

用小结果集驱动大结果集

类似SQL,将筛选结果小的表首先连接,再去连接结果集比较大的表

读《自卑与超越》

屏幕截图 2020-09-16 001859.jpg
在一位朋友的推荐下读了此书,没想到书并不厚,花费一个中午和晚饭时间也就差不多读完了。

所以在此小做总结:

What life could mean to you

全书围绕这这个疑问展开,生命于你意义何在?

去哪里寻找生命的意义

我们生存于与他人的联系,只有在一个群体中,生命才存在意义。

以一个细胞为例,确实是生命,但只有千万个细胞组成一个人,这一个细胞才有了意义,才有存在的价值,也才能存在下去。我们研究一个历史事件,也不会是孤立的,而是代入到一个朝代,一个民族中,才存在了意义。
在探讨一个事务,我们总是站在一个更高的维度,去赋予其意义。

生命的意义何在

生命的意义在于乐于关注他人,渴望成为社会大家庭的一员,梦想着为人类和社会贡献自己的力量。

所有真正“ 生命 意义” 的 真正 标志 是: 可以 与他 人 分享, 且 得到 绝大多数 人 认可。

个人没有意义,对于他人有意义的,才能算是意义。
奉献是生命的真谛,所有人最终尘归尘,留下来的只有有形建筑,工具;和无形的知识,艺术。如果一个人理想和行为都象着为他人奉献的方向并为之努力,自然也就向体现生命意义的方向发展,个体自然会进行自我管理(自省),自己的职业交际和两性问题也会迎刃而解。

一个人生命的意义体现在他的生活态度和模式,他是贯穿一个人一生的基调。

对于我自己来说,也许我能力有限,但是我能奉献自己让我爱的人和爱我的人,让她们生活的更好更开心,就是我生命的意义。

何为自卑

我们每个人都有不同程度的自卑感,因为我们都想让自己 更优秀,让自己过更好的生活。

自卑情结是指一个人在意识到他要面对一个他无法解决 的问题时,表现出的无所适从。

自卑本无所谓,自卑也是推动人类进步的动力。在遇到问题时积极寻找合理的方式解决问题,不抗拒不抱怨,依靠自己而不是他人的特殊照顾。

何为超越

人人都在追求自己独有的一种优越感,它取决于人们赋予生命的意义。

正因为有不同程度的自卑,所以没个人都在追求自己的优越感。而在追求优越感的过程中,为了他人的利益和社会发展而奋斗的人,才称得上是超越。

家庭与学校的影响

家庭和学校的影响奠定了一个人一生的基调。

家庭里是孩子与母亲的合作,学校是家庭的延伸,这里孩子学会与他人合作和竞争,教师传道授业,还要纠正家庭错误教育给孩子造成的性格弱点。

家庭和学校的责任就是把孩子培养成社会中的一员, 让他成为人类平等中的一员。

世界上的确存在挫折、罪恶、不公和困难, 但这就是我们 的世界,这是不争的事实。我们需要生活在这里,工作在这里,我们要做的是让它变得更好。

要知道自己身处的世界是历史长河中的一个小小阶段,自己属于人类过去,现在和未来的一部分。


最后我想回答作者这个设问,生命本无意义,若非要有意义,那便是我们自己努力,我们自己在一个群体中,创造价值,得到认可。只有创造出了价值,才能谈意义。