Less is more.
如何使用Time Machine备份苹果系统到NAS
如何使用Time Machine备份苹果系统到NAS 主要参考的这篇文章 如何使用 Time Machine 将文件从 Mac 备份到 Synology NAS? - Synology 知识中心
2024年阅读记录
2024年阅读记录 设计数据密集应用 一人公司起步的思维 程序员修炼之道 刘擎西方现代思想讲义 创造 程序员健康指南 做对产品 Tidy First 一人企业方法论 两个月$12000 ARR实践之路 The First 20 Hours CTO说 太白金星有点烦 福格行为模型
MacBook使用手册
Mac的知识索引 MacOS的SIP Mac快捷键 Mac设置记录 20231105 观察勿扰模式, 还是会唤醒, 16个小时消耗4%的电量 20231104 休眠还是掉电,设置了勿扰模式 20231011 关闭了SIP 删除了下列软件 iTerm: 终端 [using: **Aerial-屏幕保护程序**](https://www.notion.so/using-Aerial-4c0f1b74803347ce9fe775d6d10d332f?pvs=21) Pencil: 原型制作工具 Karabiner: 改键程序 20230930: 使用Time Machine备份Ventura 13.6; 升级到Sonoma 14.0 20231211: 参考https://github.com/paulmillr/encrypted-dns/tree/master, 安装了安全DNS, 使用的cloudflare的1.1.1.1 20231212 删除软件 AppCode Steam++ OmniFocus: 任务管理工具 Typewriter keyboard: 键盘打字声 FruitJuice: 电池管理软件 hook: 不知道什么软件引入的 安装软件 Surge5.4.3: 网络监控与代理软件 20231225 删除软件 Visual Studio AI-Chat桌面版 TripleA Klokki 20231227 删除软件 ‣ 20230108 安装软件 blackhole: 音频输入输出管理软件 lettura: 基于rust,tauri的开源RSS阅读器
克雷格的健身法
每个运动做10次,共5回,最重要的是要坚持循环训练(circuit training)的原则,最大限度地减少休息的时间。 动作要领:选择适合自己的重量,选择"扛杠铃"的方式,背部挺直,保持竖脊肌的中立位和稳定性,双腿由直立慢慢弯曲半蹲,最后再回到直立状态。 动作过程:用背阔肌的收缩力量将身体往上拉起,直到单杠触及或接近胸部。静止一秒钟,使背阔肌彻底收缩。然后逐渐放松背阔肌,让身体徐徐下降,直到回复完全下垂,重复再做。注意事项:把身体拉高时,尽量保持身体不要摆动,另外你可在腰上钩挂杠铃片来加重。 双杠臂屈伸主要锻炼胸大肌下部和肱三头肌,一个男人是否经常锻炼,看看他的胸大肌就知道了,所以双杠臂屈伸可以帮你做到这点。 动作要领: 握双杠两臂伸直支撑在双杠上,两腿自然弯曲,双脚重叠,身体放松下垂,双臂屈肘使身体降至最低点,呼吸时双臂用力,将身体撑起。如果想练习胸大肌的下部,则需要使胸大肌的下部位垂直于地面。身体保持垂直放松,不要故意挺胸。如练习肱三头肌可以抬头挺胸,通过臀部向后伸展使身体稍向后倾斜。这时力量会转移到肱三头肌上。 【丹尼尔的健身食谱】 早餐:两个水煮蛋,两片面包片 加餐:蛋白条、水果、坚果和葡萄干任选其一作为早餐与午餐间的零食 午餐:肉或者鱼,配一份糙米饭或者烤土豆 加餐:依然可以选择蛋白条 晚餐:肉或者鱼,配有绿叶蔬菜,像沙拉、莴笋、菠菜或者西兰花这样的蔬菜
我用过的手机
我用过的手机 整理网站书签的时候, 发现一个统计使用过的手机网站, 登录后, 看了一下,之前填写的手机使用数据, 蛮有意思. 主线就是NOKIA→XIAOMI→APPLE 我的主页在这https://mowned.com/jimmy-lee/, 你们也可以统计下.
2022孩子生日给孩子的一封信
2022孩子生日给孩子的一封信 五周岁了,我觉得跟你们可以沟通交流了, 因此有个想法,以后每年你们生日的时候都给你们写一封信。 不要因为别人夸你聪明就骄傲自满, 也不能因为别人说你笨而哭泣. 因为别人夸你, 可能是出于礼貌,也可能是出于客套,也有可能有所目的,需要从你这里获取一些利益. 你们需要认识到, 聪明并不是把事情做好的决定性因素, 坚持与反思才能获得进步. 很多有小聪明的人, 做不成大事, 反而是比较固执的, 在事情上下笨功夫的人, 才能获得成功. 而且, 大部分人都喜欢和普通人打交道. ⽐如我问你:“你是喜欢和聪明⼈做⽣意,还是和傻⼦做⽣意呢?”你恐怕会告诉我是后者,因为你觉得傻⼦的钱好挣。 如果很多⼈都这么想,那么笨⼈做成⽣意的机会就多了。从那以后,我恪守⼀个原则,不论对⽅挣多少 钱,我只挣⾃⼰那⼀份就好,不要贪图对⽅的任何⼀点⼉利益。这样⼀来,⽣意就能持久。你和⼩朋友 交往时,也不必怕吃亏,和⼩朋友换东⻄时,多⼀点⼉少⼀点⼉也没有关系,因为如果每⼀次都是你占 了便宜,时间⼀⻓,⼩朋友就不愿意再和你打交道了。通常,别⼈觉得你⽼实,就很放⼼地和你做朋 友,觉得你太聪明了,就会害怕和你来往. 希望你们对世界上所有的事情保持批判与怀疑精神 不要看到听到别人说对就认为是对的, 需要经过自己的思考.因为这个社会, 很多你看到的听到的, 是有些人故意想让你看到的, 比如诱人的广告, 好看的动画片, 看上去很好吃的食物, 几乎所有东西都有一个包装, 而我们需要有火眼金睛, 让目光穿过这些包装, 看到本质的东西. 比如有的食物很好吃, 其实它加了很多糖, 香料, 让食物更加美味的添加剂, 而这些东西, 没有营养, 对身体有害, 虽然有些食物尝起来并不美味, 但是它是食物本来的味道, 比如说煮鸡蛋, 煮米饭, 炒青菜. 我们不能让自己习惯这些人为添加的味道而忽略了食物的本味. 希望你们能够更加勇敢, 面对挫折, 百折不挠. 没有人可以轻易做成功任何事,都需要付出努力, 就算是走路,跑步, 都是需要学习如何走得更稳,跑得更快. 简单的事谁都会做, 那我们跟别人就没有区别. 这个世界上, 各个领域, 都是做的最好的人才能推动进步, 但是要做得最好, 就需要付出比别人多的努力. 说实话, 把事情做一般般是简单的, 大部分人都能做到这样, 而且这也是人的本性, 喜欢做简单的事, 抗拒难的事. 但是事实是, 在克服困难的过程种, 我们才能学到更多知识和技能, 而且能让我们的心更加强壮. ...
如何通过markdown生成一个在线的电子书
如何通过markdown生成一个在线的电子书 前情提要 不知道大家有没有这样的时刻. 无聊时拿出手机, 想看书发现手机里现在没有在另一台设备里的书, 因此开始看短视频. 自己写了一些关联的内容, 想归类成册, 却不知怎么办, 只能让它们杂乱的存放在笔记软件中. 互联网上收集的内容, 觉得可以归类成册. 心中有个小小的梦想, 出版一本书. TBD: 更多时刻 如果你有这样的时刻, 我觉得下面的内容你就值得观看, 因为我将在后面介绍如何快速将已有的内容发布成一本在线电子书的教程. 工具准备 npm: nodejs的包管理软件,用来安装docsify docsify: 本文的主角, 用这个软件就可以使用markdown文件生成电子书 一个文本编辑器, vscode或者其他的 物料准备 一张好看的封面图, 可以自己设计, 也可以网上搜索 自己写好的内容,或者收集的内容 实际操作 安装相关软件 先安装nodejs, 就会自动安装npm了, 参看nodejs官网的安装流程 使用各个系统的命令行软件安装docsify # 全局安装docsify, 这样在任何地方都可以使用这个命令行工具了 npm i docsify-cli -g 安装文本编辑器, 这里不再赘述 初始化项目 创建一个新的目录, 比如就叫how-to-get-rich 在命令行中切换到这个目录, 执行初始化操作 docsify init 这时候目录下就会出现以下文件或者文件夹 .nojekyll: 防止 GitHub Pages 忽略以下划线开头的文件 index.html: 入口文件 README.md : 首页内容在这编辑 这个时候,我们就可以测试运行下, 能不能跑起来了. docsify serve 如果运行后显示了,Listening at http://localhost:3000, 那说明成功了, 复制这个网址在浏览器打开, 就能看见效果了 ...
20200822-杭州永辉菜价
这些物价正常吗
使用4D工作法规划每日工作
使用4D工作法规划每日工作 概念 什么是4D工作法 对于我来说,4D工作法这个概念来源于《小强升职记》、《只管去做》的作者邹小强老师.分别是Delay it, Do it now, Don’t do it, Delegate it. Do it now: 就是需要立马去做的, 这在公司中对应着生产事故, 老板开会, 访客到访, 或者是那种两分钟内就能做完的事情, 那就直接归到这类, 完成再说. Delay it: 指那种需要比较长时间的, 比较重要, 但是不是特别紧急, 可以安排时间做的事. Delegate it: 指那种可以尽量授权别人做的事, 尤其是作为管理者, 尽量把自己已经会的东西, 教授给同事去做. 但是需要注意的事, 安排别人做的事情, 需要自己定一个提醒, 到期了去询问进度和成果. Don’t do it: 一些无意义的会议, 无效的社交, 就不要去做了. 我觉得这类事情还真的需要好好思考, 不要什么事都想去做, 把自己的时间浪费掉. 什么是工作四项限 这是在学习到4D工作法之前就看到过的概念 工作四象限这个概念的问题是,没有明确的action,我觉得不如4D工作法, 直接包含4个action, 通俗易懂. 实践 心理建设和仪式感 不管多忙, 需要养成每日规划计划的习惯, 否则不管是生活还是工作, 都像是随波逐流的浮萍, 飘到哪算哪. 从心理学的角度讲, 就像条件反射一样, 需要一些”触发器”提醒你的身体, 该开始做什么了, 将规划一天的工作, 做的像每天喝水一样, 自然就能做好. 因此, 可以在每天喝第一口水后, 开始规划今天的4D任务. ...
机器学习实战-学习笔记之Decision Trees
项目地址:http://github.com/jimersylee/MachineLearningAction 决策树(Decision Trees) 类似20个问题的游戏 参与游戏的一方在脑海里想某个事物,其他参与者向他提问题,只允许提20个问题,问题的答案只能用对或错回答,问问题的人通过推断分解,逐步缩小带猜测事物的范围.决策树的工作原理与20个问题类似,用户输入一系列数据,然后给出游戏的答案 决策树 优点:计算复杂度不高,输入结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据 缺点:可能产生过度匹配问题 适用数据类型:数值型与标称型 决策树的一般流程 收集数据:可以适用任何方法 准备数据:树构造算法只适用于标称型数据,因此数值型数据必须离散化 分析数据:可以适用任何方法,构造书完成之后,我们应该检查图形是否符合预期 训练算法:构造树的数据结构 测试算法:适用经验树计算错误率 适用算法:此步骤可以适用于任何监督学习算法,而适用决策树可以更好地理解数据的内在含义 # coding:utf-8from mathimport log import operator import matplotlib.pyplotas plt defcalcShannonEnt(dataSet): """ 计算给定数据集的香农熵,香农熵代表数据的无序程度,香农熵越大,数据集越无序 :param dataSet: 数据集 :return:香农熵的值 """ numEntries = len(dataSet)# 获得数据中实例的总数 labelCounts = {}# 声明一个字典# 为所有可能分类创建字典,它的键值是最后一列的数值for featVecin dataSet: currentLabel = featVec[-1]# 目前的标签=数据集的每行的最后一个元素if currentLabelnotin labelCounts.keys():# 如果键值不存在,则扩展字典并将当前键值加入字典 labelCounts[currentLabel] = 0# 初始化为0 labelCounts[currentLabel] = labelCounts[currentLabel] + 1# 每个键值都记录了当前类别出现的次数,出现一次加1 shannonEnt = 0.0 for keyin labelCounts: prob = float(labelCounts[key]) / numEntries# 使用所有类标签的发生频率计算类别出现的概率 shannonEnt = shannonEnt - prob * log(prob, 2)# 使用这个概率计算香农熵 以2为底求对数return shannonEnt defcreateDataSet(): """ 创建简单鱼类鉴定数据集 :return:dataSet(数据集),labels(标签) """ _dataSet = [ [1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no'] ] _labels = ['no surfacing', 'flippers'] return _dataSet, _labels myData, labels = createDataSet() print myData print calcShannonEnt(myData) """ result [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']] 0.970950594455 """ # 熵越高,则混合的数据也越多,我们可以在数据集中添加更多的分类,观察熵是如何变化的,这里我们增加第三个名为maybe的分类,测试熵的变化 myData[0][-1] = 'maybe'# 第0行的最后一个元素置为maybeprint myData print calcShannonEnt(myData) """ [[1, 1, 'maybe'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']] 1.37095059445 """ # 得到熵以后,我们就可以按照获取最大信息增益的方法划分数据集# 另一个度量集合无需程度的方法是`基尼不纯度`(Gini impurity),简单地说就是从一个数据集中随机选取子项,度量其被错误分类到其他分组里的概率""" 分类算法除了要测量信息熵,还需要划分数据集,度量花费数据集的熵,以便判断当前是否正确划分了数据集,我们将对每个特征划分数据集的结果计算一次信息熵,然后判断按照那个特征划分数据集是最好的划分方式 """ defsplitDataSet(dataSet, axis, value): """ 按照给定特征划分数据集 :param dataSet: 待划分的数据集 :param axis:划分数据集的特征位 :param value:预设特征值 :return: """ retDataSet = []# 创建新的list对象,因为函数中传递的是列表的引用,在函数内部对列表对象的修改,将会影响该列表对象的整个生存周期,因此需要创建一个新的列表for featVecin dataSet: if featVec[axis] == value:# 如果axis位的值等于预设的特征值 reducedFeatVec = featVec[:axis]# 取行数据的前axis位 reducedFeatVec.extend(featVec[axis + 1:])# 加上axis位后的元素 retDataSet.append(reducedFeatVec)# 就是将除了axis特征位的元素抽取出来return retDataSet # 测试splitDataSetprint "测试splitDataSet" myData, labels = createDataSet() print myData newData = splitDataSet(myData, 0, 1)# 将待测试数据的第0位为1的数据的其他特征和标签筛选出来print newData defchooseBestFeatureToSplit(dataSet): """ 选择最好的数据集划分方式 :param dataSet: 数据集 :return: """ numFeatures = len(dataSet[0]) - 1 # 计算整个数据的原始香农熵 baseEntropy = calcShannonEnt(dataSet) bestInfoGain = 0.0 bestFeature = -1 # 遍历数据集中的所有特征for iin range(numFeatures): # 创建唯一的分类标签列表 featList = [example[i]for examplein dataSet] uniqueVals = set(featList)# 将list转换为set,集合类型中每个值不同,从列表中创建集合是Python语言中得到列表中唯一元素值的最快方法 newEntropy = 0.0 # 计算每种划分方式的信息熵for valuein uniqueVals:# 遍历当前特征中的所以唯一属性值,对每个特征划分一次数据集 subDataSet = splitDataSet(dataSet, i, value) prob = len(subDataSet) / float(len(dataSet)) newEntropy += prob * calcShannonEnt(subDataSet)# 并对所有唯一特征值得到的熵求和 infoGian = baseEntropy - newEntropy# 信息增益=熵的减少值或者数据无序度的减少# 计算最好的信息增益if infoGian > bestInfoGain: bestInfoGain = infoGian bestFeature = i return bestFeature# 返回最好特征划分的索引值# 获取最好特征划分索引值print "获取最好特征划分索引值" myData, labels = createDataSet() print "dataSet:" + str(myData) print "best index:" + str(chooseBestFeatureToSplit(myData)) """ 代码表示,第0个特征是最好的用户划分数据集的特征 """ """ 递归构建决策树 """ defmajorityCnt(classList): """ 类似classify0部分的投票表决 创建键值为classList中唯一值的数据字典,字典对象存储了classList中每个类标签出现的频率,最后利用operator操作键值排序字典,返回出现次数最多的分类名称 :rtype: str :param classList: 分类名称的列表 :return: 返回出现次数最多的分类名称 """ classCount = {} for votein classList: if votenotin classCount.keys():# 如果投票的类别不在classCount字典的key中, classCount[vote] = 0# 则新建此key,value设置为0 classCount[vote] += 1 sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) return sortedClassCount[0][0] defcreateTree(dataSet, labels): """ 创建树,使用了递归 :param dataSet:数据集 :param labels: 分类标签 :return: 树结构 """ classList = [example[-1]for examplein dataSet]# 将数据集中的每一行的最后一个元素的值取出生成类别列表classListif classList.count(classList[0]) == len(classList):# 递归停止条件1return classList[0]# 类别完全相同时停止继续划分if len(dataSet[0]) == 1:# 递归停止条件2return majorityCnt(classList)# 遍历完所有特征时返回出现次数最多的 bestFeat = chooseBestFeatureToSplit(dataSet)# 选择最好的划分特征位 bestFeatLabel = labels[bestFeat]# 取出最好的标签 myTree = {bestFeatLabel: {}}# 初始化一个tree字典del (labels[bestFeat])# 删除最好的标签,防止树的下一个节点还使用此标签 featValues = [example[bestFeat]for examplein dataSet]# 创建最好的特征位的值所构建的list uniqueVals = set(featValues)# 生成唯一的特征位的值构成的集合setfor valuein uniqueVals: subLabels = labels[:]# 复制所有标签,且树不会和已经存在的标签搞混 myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value), subLabels)# 递归创建树return myTree # 构建树测试print "构建树测试" myData, labels = createDataSet() myTree = createTree(myData, labels) print myTree # coding:utf-8import matplotlib.pyplotas plt# 导入绘制图库""" 绘制树图 """ decisionNode = dict(boxstyle="sawtooth", fc="0.8") leafNode = dict(boxstyle="round4", fc="0.8") arrow_args = dict(arrowstyle="<-") defgetNumLeafs(myTree): """ 获取叶节点的数目 :param myTree:树结构 :return: 叶节点的数目 """ numLeafs = 0 firstStr = myTree.keys()[0] secondDict = myTree[firstStr] for keyin secondDict.keys(): if type(secondDict[ key]).__name__ == 'dict':# test to see if the nodes are dictonaires, if not they are leaf nodes numLeafs += getNumLeafs(secondDict[key]) else: numLeafs += 1 return numLeafs defgetTreeDepth(myTree): """ 获取树的层数(深度) :param myTree: :return: 树的层数(深度) """ maxDepth = 0 firstStr = myTree.keys()[0] secondDict = myTree[firstStr] for keyin secondDict.keys(): if type(secondDict[ key]).__name__ == 'dict':# 判断此节点是否是字典,如果不是就是叶节点 thisDepth = 1 + getTreeDepth(secondDict[key])# 是字典,层数+1else: thisDepth = 1# 叶节点,层数为1if thisDepth > maxDepth: maxDepth = thisDepth return maxDepth defplotNode(nodeTxt, centerPt, parentPt, nodeType): """ 绘制节点 :param nodeTxt:节点名称 :param centerPt: 目前的位置 :param parentPt: 父节点的位置 :param nodeType: 节点类型 :return: """ createPlot.ax1.annotate(nodeTxt, xy=parentPt, xycoords='axes fraction', xytext=centerPt, textcoords='axes fraction', va="center", ha="center", bbox=nodeType, arrowprops=arrow_args) defplotMidText(currentPt, parentPt, txtString): """ 绘制中间的文本 :param currentPt:目前的位置 :param parentPt: 父节点的位置 :param txtString: 想绘制的文本 :return: """ xMid = (parentPt[0] - currentPt[0]) / 2.0 + currentPt[0] yMid = (parentPt[1] - currentPt[1]) / 2.0 + currentPt[1] createPlot.ax1.text(xMid, yMid, txtString, va="center", ha="center", rotation=30) defplotTree(myTree, parentPt, nodeTxt):# if the first key tells you what feat was split on numLeafs = getNumLeafs(myTree)# this determines the x width of this tree depth = getTreeDepth(myTree) firstStr = myTree.keys()[0]# the text label for this node should be this cntrPt = (plotTree.xOff + (1.0 + float(numLeafs)) / 2.0 / plotTree.totalW, plotTree.yOff) plotMidText(cntrPt, parentPt, nodeTxt) plotNode(firstStr, cntrPt, parentPt, decisionNode) secondDict = myTree[firstStr] plotTree.yOff = plotTree.yOff - 1.0 / plotTree.totalD for keyin secondDict.keys(): if type(secondDict[ key]).__name__ == 'dict':# test to see if the nodes are dictonaires, if not they are leaf nodes plotTree(secondDict[key], cntrPt, str(key))# recursionelse:# it's a leaf node print the leaf node plotTree.xOff = plotTree.xOff + 1.0 / plotTree.totalW plotNode(secondDict[key], (plotTree.xOff, plotTree.yOff), cntrPt, leafNode) plotMidText((plotTree.xOff, plotTree.yOff), cntrPt, str(key)) plotTree.yOff = plotTree.yOff + 1.0 / plotTree.totalD # if you do get a dictionary you know it's a tree, and the first element will be another dictdefcreatePlot(inTree): fig = plt.figure(1, facecolor='white') fig.clf() axprops = dict(xticks=[], yticks=[]) createPlot.ax1 = plt.subplot(111, frameon=False, **axprops)# no ticks# createPlot.ax1 = plt.subplot(111, frameon=False) #ticks for demo puropses plotTree.totalW = float(getNumLeafs(inTree)) plotTree.totalD = float(getTreeDepth(inTree)) plotTree.xOff = -0.5 / plotTree.totalW plotTree.yOff = 1.0 plotTree(inTree, (0.5, 1.0), '') plt.show() # def createPlot():# fig = plt.figure(1, facecolor='white')# fig.clf()# createPlot.ax1 = plt.subplot(111, frameon=False) #ticks for demo puropses# plotNode('a decision node', (0.5, 0.1), (0.1, 0.5), decisionNode)# plotNode('a leaf node', (0.8, 0.1), (0.3, 0.8), leafNode)# plt.show()defretrieveTree(i): listOfTrees = [{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}, {'no surfacing': {0: 'no', 1: {'flippers': {0: {'head': {0: 'no', 1: 'yes'}}, 1: 'no'}}}} ] return listOfTrees[i] # createPlot(thisTree) myTree = retrieveTree(0) createPlot(myTree)