提前声明, 个人观点, 仅供参考.

喝桶装水, 哪种产品更好?




以上3种饮水机/抽水机哪一种更好?
一二三分别是立式饮水机,电动抽水机和手动抽水机.
当然每个产品都有各自的定位, 有各自的受众和市场. 但从第一性原则上说, 我认为第二种更好.
第一种传统的大饮水机, 几个问题: 占地/反复烧开浪费能源/换水落灰长期滋生细菌/烧的开水多数时候是兑了凉水/即使烧了开水储水量也很小泡茶泡面都不太够/开水也不够高温会储存晾凉. 第三种按压机械式当然非常简洁, 不过喝水作为一个非常高频的动作, 应该更省力.
第二种电动抽水机, 小巧, 容易安装, 没有储水结构, 不会积灰也不会反复烧开. 可以电加热为温水足以满足绝大多数饮水情形. 要开水的话, 几乎都会有电热水壶完成.

修剪鼻毛,哪种产品更好?



一二三分别是电动鼻毛修剪器/手动修剪器/圆头剪刀.
我认为第二种更好.
修剪鼻毛其实是比较低频的操作, 不可能天天修剪. 由于电池自然放电, 第一种电动的可能用不了几次就没电了, 而且清洁起来也要麻烦些. 体积也稍大一些. 第三种剪刀还是容易让人有恐惧心理, 毕竟鼻毛根部隐藏在鼻孔中是看不到的, 让人感觉必须小心翼翼去修剪.
第二种手动修剪器, 当然不必担心没电的问题, 另外不锈钢全身随便怎么洗都没有问题, 体积也小巧容易收纳.

在一个具备数据增删改功能的页面中, 一种呈现增删改操作的常见方式就是对话框. 微信Weui中的mp-dialog组件的控制, 在js中一般需要下面五六种对象和函数

  • data中控制对话框显示的isShowDialog布尔变量
  • data中展示对话框中按钮的dialogButtons数组变量
  • 触发对话框显示的函数showDialog
  • 点击按钮后触发的, 与mp-dialog的bindbuttontap绑定的tapDialogButton函数
  • 隐藏对话框的函数. 因为比较简单,一般集成在tapDialogButton中
  • 处理实际增删改的函数如add
    显得特别复杂.增删改各一个对话框,上面就得来3套, 15~18个.
    考虑将dialogButtons/showDialog()/tapDialogButton()合并, 不同的对话框共用一套按钮/显示/隐藏/处理按钮函数.以add为例, 如下:
<view bind:tap="showDialog" data-show="isAddDialog">显示对话框</view>
<mp-dialog title="新增目标" show="{{isAddDialog}}" bindbuttontap="tapDialogButton" data-show="isAddDialog" data-func="add" buttons="{{dialogButtons}}">
对话框内容
</mp-dialog>
Page({
  data: {
    dialogButtons: [{text: '取消'}, {text: '确定'}], // 通用的对话框按钮列表
    isAddDialog: false,
  },
  showDialog(e){
    this.setData({
      [e.currentTarget.dataset.show]: true
    })
  },
  tapDialogButton(e){
    console.log(e)
    switch (e.detail.index) {
      case 0: // 取消   
        this.setData({
          [e.currentTarget.dataset.show]: false
        })
        break;
      case 1:
        console.log('dialog running ', e.currentTarget.dataset.dialog)
        let ret = this[e.currentTarget.dataset.func](e)
        // 返回值为true时表示成功处理, 则隐藏对话框
        if(ret){        
          this.setData({
            [e.currentTarget.dataset.show]: false
          })
        }
        break;
    }
  },
  add(e){
    // 对数据进行处理
    return true
  },
})

阿里云官方原文
不但减到了3个月, 而且免费额度还是20个不变, 想要12月的证书就要68元一张. 这是非要我们付费不[]可吗.
知乎上有个答案, 建议申请https://certsvc.com/的二级域名通配符证书. 这个证书是50元一年.
另外,在gitee上有一个certd的项目, 声称是完全免费部署
上面这个项目提到了一个免费ssl提供商letencrypt

let's Encrypt和acme.sh

这儿介绍了let's encrypt 的部署, 以及github的acme.sh项目.
推荐使用这个项目进行ssl证书的申请. 申请下来后,部署都好说了.
对于阿里万网的云虚拟主机, 参考这个官方说明
Let's encrypt支持三种证书:单域名证书, 泛域名证书(SAN证书), 通配符证书.
这儿文章介绍如何用acme.sh为阿里云域名申请泛域名证书. 这儿是acme.sh支持阿里云的官方文档.

certbot

知乎这个文章介绍了通配符证书工具certbot

在gitee上开了个项目做这个测试: https://gitee.com/littleprog/js_efficiency

测试结果

Array add 10M elements 3 times (by push) 
time diff:  284
time diff:  363
time diff:  226
Array add 0.1M elements 3 times (by unshift. unshift is really slow, so I use 1% elements of 10M)
time diff:  737
time diff:  703
time diff:  736
Object add 10M elements
time diff:  244
time diff:  294
time diff:  249
 Array delete 10000 elements(by splice from beginning)
time diff:  636
 Object delete 10000 elements
time diff:  1
 Array modify 10M elements 3 times
time diff:  8
time diff:  7
time diff:  8
 Objec modify 10 elements 3 times
time diff:  8
time diff:  8
time diff:  7

总结

  • 新增: Array用push新增元素和Object效率差不多, 但是用Unshift新增元素效率惨不忍睹, 效率极低, 在增加的数据量为100K时已经接近1秒时间, 而且估计随着array的变大会越来越低. 所以array的内存块是连续的, unshift是内存整体向后移动后再在前面增加元素的.
  • 删除: 同样, 如果array用splice删除排序靠前的元素, 效率也是远远低于使用delete删除Object中的元素.
  • 修改: 两者的修改不存在区别.

因此, 对于元素数量极多并且需要随机插入数据和删除数据时, Object才是更好的选择. Array有一个Object没有的功能是Array元素是有序的, 而Object元素是无序的. 虽然Object可以将key值设置为序号, 表现为类似Array的顺序, 但是在随机增加和删除后, 这些序号会被打乱. 事实上, Array比Object低效的部分, 恰恰就是在排序上花费了额外的时间, 每次插入和删除一个元素时, 相当于要将其后面的所有元素序号变更. 另外, array还有个特点是支持for of循环, 也就是本身是一个迭代器iterator
我猜测NoSQL数据库, 包括腾讯小程序的云数据库, 都是用的Object的方式存储不同条的数据的. 其_id相当于是key, 这样随机查找增加删除都比较快. 而排序是需要单独的sort命令, 因为object本身是无序的. 并且经常使用某一个属性排序或者查找时, 还需要预先进行升序或降序索引, 否则数据量大了以后速度估计会惨不忍睹.
所以在本地对大数据量操作时, 要提前考虑好是使用array还是object. 如果必须要有顺序或者要使用迭代器的特性, 那么就只能用array了.

讲class的文章
讲生成器和迭代器的文章

  • class
    class只是prototype的语法糖, 其中的函数都是挂在prototype下的.
    class后面的大括号里面的代码段和函数里面大括号的代码段有所不同. 主要是class里面的函数定义不需要加function关键字.
    class中特殊成员:
  • constructor() 构造函数. 给实例初始化用的. 如 class C{constructor(name){this.name = name}}; let c = new C('John'). 对于只是初始化变量,有简写的方式,就是直接在class最开始赋值且不能加let/var. 如class C{name='Mike';}
  • static 静态函数/变量修饰符. 静态的函数/变量不属于this, 只能通过class名引用. 如class C{static x = 0; f(){console.log(C.x)} }
  • name class是从function继承的, 所以function有一个name属性, class也有(static的)name属性. function x(){}; x.name==='x', class C{}; C.name==='C'
  • # 私有函数/变量前缀. 在函数或者变量前面加#就变成了私有的. 有意思, 这种用法跟linux在文件或目录前面加.就变成了隐藏的一样. 访问的时候也要加上#才行. 如class C{static #x = 0; f(){console.log(C.#x)}}. 符号加的多就更像天书了哈哈(这个是ES2022特性)
  • extends 继承(扩展)父类. 如class C{}; class D extends C{};
  • super() 子类constructor()中调用父类constructor(). 不是可用可不用, 而是子类有constructor就必须用, 而且必须先用, 也就是在子类构造函数一开始就调用: constructor(){super(); this.x = 'xx'}. 否则在new 子类的时候会报错ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor

CMAT-AMMA认证

似乎没怎么看到最新情况, 也不知道这个认证现在推广情况如何了
CMAT官网
CMAT是China Marketing Accreditation Test, 中国市场营销资格证书考试
AMMA是American Management and Marketing Association 美国管理和市场协会. 这个组织现在已经搜索不到了, 能搜到的是American Management AssociationAmerican Marketing Association,很神奇, 简称都是AMA. 不过ama.org这个域名被美国市场协会拿去了(不愧是市场协会啊), 美国管理协会只拿到了amanet.org,嗯,域名怪怪的.
通过研究两个AMA的历史, 发现都和AMMA没有任何关系. 美国管理协会的历史美国市场协会的历史.
而amma.org,是一个名叫Amma的印度女性的网站, 似乎是一位很知名的宗教界女性, 不过国内找不到什么任何报道.
从官网对最高一级认证'中国市场营销总监'认证的教材介绍,结合淘宝给出的书来看, 考试的教材是2006年的, 十几年没有更新, 都被淘宝店家标成了"古书旧书",确实没有新书卖, 所以这个认证的可靠性非常堪忧.

市场营销职业国家职业资格证书

分三级, 分别叫高级营销工程师/营销人员/营销助理工程师.
我现在还没有听说哪个销售有考过这个的哈哈, 似乎认可度不高?

ChatGPT的回答

在市场营销领域,有许多权威的认证考试可以帮助提升自己的专业水平。以下是一些较为知名的市场营销认证考试:

谷歌广告认证(Google Ads Certification)
谷歌分析认证(Google Analytics Certification)
Facebook广告认证(Facebook Ads Certification)
英国市场营销协会资格认证(Chartered Institute of Marketing Qualifications)
美国市场营销协会认证(American Marketing Association Certification)
市场营销研究协会认证(Market Research Society Professional Certification)
营销科学研究所认证(Institute of Practitioners in Advertising Qualification)
通过参加这些认证考试,您将能够获得权威的市场营销知识和技能,并证明自己在该领域具备专业能力。这些认证考试通常包括理论知识测试和实践案例分析,使您能够全面了解市场营销的不同方面和应用。

对人群(市场)分类

普通人,(需要)更好的生活

多数产品创新方向,宽市场。普通人也也有普通的可支配收入。
在兔国因为是M型结构,应该还可以分为有钱的普通人和穷的普通人,前者常被称为成功者、总裁、老板、高管之类,后者常被称为打工人、社畜之类。

穷苦人,(需要)正常的生活

此类市场进一步细分。是属于宽市场还是窄市场需要看具体细分程度、市场规模。

财富不足

且称之为财富穷苦人,财富勉强或难以维持基本生活。与普通打工人不同,普通打工人日常生活开支并不发愁,还能在更高品质生活上规划一定支出。

身体健康不足

且称之为病痛穷苦人,身体勉强或难以维持基本生活。如受到严重的残疾或慢性病困扰,生活难以自理,需要他人协助的。如重度阿兹海默症、盲人、听障(可进一步按年龄划分)、高位截瘫、渐冻症等。如果是轻度残疾或轻度慢性病,生活可以自理的不在此列。

心理健康不足

且称之为心理穷苦人,精神状态勉强或难以维持基本生活。如严重的焦虑、抑郁、情感障碍、幻觉、妄想等,生活难以维持的。他们往往需要他人和社会的协助而又常常难以得到。心理障碍与身体障碍不同,后者非常明确而前者相对模糊,再加上人们本身的偏见使其更难以获得帮助。

特殊人,(需要)正常的生活

此类划分标准比较多样,通常属于细分的窄市场。

特殊性偏好

如LGBT人群或其他细分性偏好。

特殊信仰

总有一些信仰在一个大的族群中属于少数的,未被了解的。信仰与信仰之间往往又充满的隔阂,严重的还会发生暴力事件。每种信仰从根本上总是希望积极传播自己,否则都会面临终结;每种信仰又都希望保持自己的纯净性和一致性,这又对外界树立起了高墙。这是信仰得以存续的根本矛盾。

特殊文化

不同国家、不同的民族(主要民族、少数民族)有不同的历史文化,从文化中出发,发现同一族群中的潜在文化缺失。

特殊经历

有共同的特殊经历,并且造成了长远影响的。如失孤打拐人群、家中有特殊需要照顾对象的人群等。

轻度残疾和慢性病

轻度的标准是生活可以自理。下肢残疾者甚至可以踢足球,聋哑人甚至可以送快递,他们不但可以自理还能给别人服务,然而社会却缺少对他们的关心。冠心病、高血压、颈椎腰椎病、早期阿兹海默症等患者,日常和常人没有太大区别,但除了吃药理疗外,也需要日常更多注意的地方以缓解病痛。

特定职业

如教师、程序员、医生、律师、警察等。特定职业还可以继续细分,进一步细分可带来特定的抢滩登陆机会。如高中年轻女教师,可针对开发小巧可爱的教学用扩音器,还可以从礼品角度出发,定位为高中年轻女教师的男友或老公购买。

特定习惯或爱好。

如烟民、股民、素食主义者等。

满足上述不同人群(市场)的产品类别

实物

耐用品

消耗品

虚拟物品

平台类(联结类)

平台类产品意在提供一种人与人之间的联结。

服务者对被服务者

服务者和被服务者之间是不同的群体,如司机与乘客的打车平台,店家、外卖员与食客的外卖平台。

用户对用户

用户之间平等地提供信息,如微信、QQ、电话、邮箱等。

工具类(非联结类)

工具类产品提供一种功能而不是人与人的联结。即使这种工具是以SaaS的方式提供的,也不能称之为平台类产品。

这儿有个前提, 就是这组数据需要是正态分布才可以. 其次,标准差是距离中位数多少个标准差, 百分比是从大到小排列, 数据所处的位置, 这个位置也叫标准正态分布的累积分布

EXCEL

在EXCEL中可以这样换算: =NORM.S.DIST(A2, TRUE), A2中填入标准差, 结果:

标准差 百分比
-3 0.001349898
-2 0.022750132
-1 0.158655254
0 0.5
1 0.841344746
2 0.977249868
3 0.998650102

JavaScript

以下是GPT3.5的回答:

// 引入Math.js库
const math = require('mathjs');

// 计算标准正态分布CDF的值
function standardNormalCDF(x) {
  return math.erf(x / math.sqrt(2)) / 2 + 0.5;
}

// 示例用法:计算标准正态分布CDF在给定x值处的概率
var x = 1.5;
var cdfValue = standardNormalCDF(x);

console.log("标准正态分布CDF在 " + x + " 处的概率为: " + cdfValue);

有多个体系.

  1. 基于Ruby的Jekyll,可以将md生成静态的HTML站点
  2. npm项目markdown-to-html, 这个项目有些太简单, 只能附加一个css, 无法自定义meta.
  3. npm项目remark-rehype, 这个项目似乎又太复杂, 是remark/rehype/unified多个项目的插件.

Powerpoint

矢量动画比位图动画要好做, 最简单的就是用powerpoint.现在版本的powerpoint支持直接另存为mp4格式, 保存的文件也比较小, 还可以直接在必剪等视频编辑软件中编辑.
但Powerpoint动画有几个局限性:

  • 时序控制。动的元素多了以后,各个元素之间的时序控制就比较麻烦
  • 元素重叠。不同的元素在不同的时间在同一个空间动作,这些元素就会叠加在一起,很难操作。
  • 时间不准确,尤其在切换帧的时候,会出现过早或者过晚切换。

Pencil2D

参考12 BEST FREE 2D ANIMATION SOFTWARE IN 2023
上面这个文章里Pencil2D是最佳选择, 我用了以后,发现功能非常简单, 是基于关键帧的绘画, 但是不会自动做动画, 似乎每一帧都要自己画. 我在B站上找了一个视频对比Pencil2D和Blender做2D动画, 视频认为Pencil2D很好用而Blender很难用.不过可以看出视频作者是平面绘画的专业人士, 画一帧图片对他来说很容易.

其他

备选的选手包括Blender和Cocos Creator.
Blender可以做3D动画, 当然也可以做2D, 当然比Powerpoint难一些但能做的效果要高级很多
Cocos Creator作为一个游戏引擎和游戏IDE, 我记得也是有一些动画能力的,并且肯定超出PPT,只是不知道是否能导出mp4. 或者至少可以用录屏的方式来完成.

佳简几何的yoose(有色)品牌取得了成功. 事后诸葛亮分析一下它为什么成功.
在它成功之后的很长一段时间, 我和周围的人都认为不就是改了个外观和包装, 做得很有设计感吗? 但不是所有改了外观和包装的产品都能卖得好. 佳简几何作为深圳近年来最成功的设计公司之一, 也有做了其他几款成品并不成功. 那是什么原因? 我觉得定位很重要, 也就是小女生送男生的礼物. 所以这个产品是小女生对礼物的需求, 也就带出了这个产品的外观/功能/价格等等属性(或者所谓的核心利益/有形特性/增强特性). 我有朋友用过这个剃须刀, 小巧方便, 但剃须效果并不见得比其他剃须刀更好, 只能说是够用. 剃须这个必备功能, 即非补偿模型特性, 在小女生这儿达到60分也就可以了.
但这儿, yoose剃须刀的价值主张并不是最重要的, 最重要的是, 女生通常是不买剃须刀的, 即使作为礼物, 也很难想到他剃须刀这个选项. yoose把剃须刀作为女生的礼物选项, 开拓出了一个新的市场, 事实上是商业模式的创新, 在皮萨诺创新景观图中,可以作为颠覆者.
而昔马和其他跟进这个市场的品牌, 在迈尔斯斯诺框架中作为分析者出现.
再者, 小女生送男生的剃须刀市场, 是一个多维度细分市场, 第一维度,青春期, 年龄16~24; 第二维度, 恋爱期女生; 第三维度, 礼品市场.
有色公众号第一篇介绍文章介绍剃须刀, 是2020年8月23日, 一开始细分市场似乎并没有瞄准小女生送的礼物, 而是指向潮男.这一年并没有公布销量上的数据. 从2021年开始的情人节和七夕, 公号都推出了响应的专题页, 似乎开始转向小女生送的礼物这个定位, 当年双十一的2小时成单3000份, 销量120万, 平均价格400元,相比2020年双十一增长5倍,即2020年大约只有600单。这似乎预示着有色在这一阶段完成了从早期采用者到早期大众的鸿沟跨越。
在这一年,有色还推出了吹风机,同样极具设计感。定位似乎是男生送女友。另外还推出了送老爸的剃须刀。
从今天的有色天猫店的销量来看,剃须刀10w+,吹风机800+。就此来看,女生送礼的这个市场创新是非常成功的,但不是每一个送礼的市场都同样成功。

这篇文章说new Date()构造函数是个魔鬼,我不能同意更多。
8 个关于 new Date() 的陷阱,你需要知道一下
事实上上面的8个还没有列举完!还有我发现的两个问题:https://idarc.cn/index.php/archives/3786/ https://idarc.cn/index.php/archives/3739/,是关于细微差别的方式构建出来的时区不同, 和不同操作系统对new Date()实现不同的.

昨天用termux安装WebDav Server, 并尝试通过Windows和MAC连接, 很强大,很麻烦. 最后通过Apache2实现, 从晚上10点搞到陵城2点.
所以想Termux这么强大, 可以做一个类似宝塔的Web客户端,实现很多功能:

  • 备份照片
  • 做FTP/HTTP文件服务器
  • 同步文件夹
  • 做网盘(WebDav)
  • 互传文件
  • 互传剪贴板
  • 看宝塔哪些功能可以用在这儿,或者能不能直接装个宝塔
    ...
    定位为个人手机的万能工具箱.

参考1 https://www.digitalocean.com/community/tutorials/host-a-web-server-on-android
参考2 https://wiki.termux.com/wiki/Remote_Access

概述过程:参考1的作者先是把termux整改了一番,比如启用sshd,把默认命令行从bash改成了fish等等,然后才开始正式行动。

pkg update && pkg upgrade
pkg install apache2 git neovim wget curl
# 下面装的这些只是优化
pkg install openssh neofetch fish nmap
# 设置一下ssh的登录密码
passwd
# 启动sshd,记住端口是8022
sshd
# 看一下自己的用户名和ip
whoami
ifconfig

然后可以从pc上登录:ssh -p 8022 username@ipaddr

下一步可选,是把命令行改为fish的

chsh /data/data/com.termux/files/usr/bin/fish
fish

如果8080被占用,修改一下apache配置,端口号改为8000,nano ../usr/etc/apache2/httpd.conf
运行服务

apachectl