2023年11月

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 

使用webdav server 连接

参考 https://blog.csdn.net/SilentCWQH/article/details/127559615

pkg i apache2
cd $PREFIX/etc/apache2
nano httpd.conf

httpd.conf把下面行前面的#去掉并保存:

LoadModule dav_module libexec/apache2/mod_dav.so
LoadModule dav_fs_module libexec/apache2/mod_dav_fs.so
LoadModule dav_lock_module libexec/apache2/mod_dav_lock.so
LoadModule auth_digest_module libexec/apache2/mod_auth_digest.so
Include etc/apache2/extra/httpd-dav.conf

看一下Listen哪个端口,默认应该是8080,可以按自己需要修改,特别是端口被占用的情况:

Listen 8080

nano httpd-dav.conf修改其中内容,设置别名和真实路径,我设置的是downloads路径,也可以设置storage/shared路径,可以访问手机全盘:

Alias /downloads "/data/data/com.termux/files/home/storage/downloads"
<Directory "/data/data/com.termux/files/home/storage/downloads">

创建webdav的账号密码,似乎必须是admin,以和上面httpd-dav.conf中的内容对应起来

htdigest -c "/data/data/com.termux/files/usr/user.passwd" DAV-upload admin

创建密码。这儿如果忘记了也没有关系,重新运行一次这个命令再创建新密码就行了。

启动服务:

httpd -k start

如果要重启服务,可以先用pkill httpd杀掉服务再启动。
如果有什么异常。查看log,在$PREFIX/var/log/apache2/

客户端

参考:https://www.jianshu.com/p/7ba5f0756efc

MAC上用finder>前往>连接服务器添加如:http://192.168.2.2:8080/downloads这样的形式即可连接访问。用户名admin,密码就是上面创建的那个。

其他推荐的软件还有RailDrive, bitkinex. windows上使用可在本站搜索 webdav参考群晖搞机的文章。

启用samba server,并通过windows连接

termux 安装samba

pkg install samba
cp $PREFIX/share/doc/samba/smb.conf.example $PREFIX/etc/samba/smb.conf
cd $PREFIX/samba
cp smb.conf smb.conf.backup
nano smb.conf

主要是启用guest登录,并设置共享路径。修改:

map to guest = Bad User
guest ok = yes
path = @TERMUX_HOME@/storage/shared

path应该不需要改,默认是共享sdcard全盘的。
启动smb服务:smbd。如果报错,有可能是有的软件不配套,更新一下:

pkg update
pkg upgrade
smbd

注意,由于android限制端口, smbd默认启动端口是4445,而windows默认是445端口。termux在很多手机上是不能提权为root的。
这儿有一个问答:https://superuser.com/questions/702948/how-to-mount-a-samba-share-on-non-standard-port似乎能解决,因为要下载运行一个脚本,暂未测试。
第一个答案:

This is possible! It's been a good few years, but combining a loopback interface tutorial I found with portions out of @Mike's [..link-only] answer (multihost version) I've created a script that can do this for you.

You can use this after running Install-Module -Name LoopbackAdapter -MinimumVersion 1.2.0.0 in an admin terminal (dont forget to dot-source the script so you can call this).

Create-Host -Name bob -Ip 10.254.0.1 -Dest ipOfHostname -Port port
which [upon reboot] will allow you to go to \bob (fake IP 10.254.0.1) which attaches to your "hostname:port" from your question.
This will persist across boots and you don't need to re-run it if the source server goes up or down; teardown is as simple as Retire-Host -Name bob.

That easy, one command, programmatic, no gui/windows settings dialogs; but feel free to follow along below manually.

翻译过来就是:先在powerscript用admin运行Create-Host -Name bob -Ip 10.254.0.1 -Dest ipOfHostname -Port port,然后运行作者的ps1脚本https://gist.github.com/Hashbrown777/081e57ff9673a1f457e1c3a71b55cfaf#file-attachsmb-ps1-L61, 然后就可以使用\\bob连接目标设备了。

苹果和安卓的时间构造函数new Date()不同

在安卓手机上可以接受new Date('1971-1-1'),而在苹果手机上这样构造出来的是Date <Null>, 苹果只能接受new Date('1971-01-01')这种形式的构造, 也即是必须严格遵循yyyy-mm-dd, 前面要补零.

云开发打不开或者白屏

微信开发者工具有时候会悄无声息的升级, 有时候给你升级到RC版, 有时候升级到不带RC但是也不是stable的版本. 这两个版本都会遇到这种问题. 版本回退就好了. 如果是RC版,可能要退两次,也就是RC->普通版->Stable版

不同的日志功能与费用

小程序有小程序的日志, 云函数还有云函数的日志.

小程序的日志有两种: 本地日志和实时日志.

  • 本地日志用log = wx.getLogManager()获取日志管理器对象使用, 需要用户手动上传日志. 原话是用户可以通过使用 button 组件的 open-type="feedback" 来上传打印的日志。 logManager官方文档
  • 实时日志用wx.getRealtimeLogManager()获取管理对象, 微信自动管理上传策略. RealtimeLogManager官方文档. 实时日志需要登录小程序后台, 从“开发->开发管理->运维中心->实时日志”进入日志查询页面。目前已经并入We分析. 然后We分析有基础和专业版之分, 专业版要收费. 影响是: 基础版只支持5000条/天开发数据上报, 并且保存7天, 开发数据包含小程序日志、插件日志、性能事件.

云函数日志也分基础和高级. 高级也是要收费的. 可以在开发工具的云函数面板中查看.

进入页面的方法的不同(GPT生成)

小程序中,有几个不同的方法可以用来进行页面跳转,包括wx.navigateTo、wx.navigateToMiniProgram、wx.redirectTo和wx.reLaunch。这些方法之间存在以下区别:

wx.navigateTo:用于打开新的页面,并将其加入页面栈中。新页面打开后,可以通过返回按钮返回上一个页面。
wx.navigateToMiniProgram:用于打开其他小程序。当调用该方法时,会打开目标小程序,并且会在当前小程序后台运行,用户可通过左上角的关闭按钮返回到当前小程序。
wx.redirectTo:用于关闭当前页面,并打开新的页面。被关闭的页面将会被销毁,新页面会替换原来的页面。
wx.reLaunch:用于关闭所有页面,并打开新的页面。所有已存在的页面将会被销毁,仅保留新打开的页面。
需要注意的是,以上四个方法均需要在App.json文件中对应的页面路径进行配置。此外,redirectTo和reLaunch方法可以进行跳转传参,而navigateToMiniProgram方法可以进行跳转传参和附加数据传递。
另外, 小程序组件navigator具有所有这些打开页面的功能.

页面unload并不会吧页面的js也onload. 所以第一次进入页面和第1+N次进入页面的表现是不同的.

因为js文件本身只会加载而不会卸载, 因此:
页面onload以后, 随着页面一起load的页面js并不会unload, 在第1+N次进入页面的时候, 这个js并不会重新运行.

区别点 第一次进入页面 第1+N次进入页面
页面js 加载, 不在Page()函数中的所有代码在这一次执行 不加载(已经加载过了), 所有代码不会再执行了
执行顺序 执行js->data数据初始化并保存初始data数据->调用onload() 执行js->d微信会用第一次保存的原始data再次初始化data->调用onload()

所以, 如果在page的data外初始化了全局变量, 就要保证在onload中重新初始化, 否则仍然遗留上次界面的数据造成判断错误. 最佳实践是全局变量都在onload中做初始化.

但对于定义在app.json中的tabBar页面则不需要, 因为tabBar只会onload一次.所以写tabbar页面必须时刻知道无论是页面还是js都不会卸载.

阿里企业邮箱有个功能, 员工账户删除后, 会转移到账号回收站中保留30天, 在这儿可以点击删除的邮箱后面的转移邮件按钮, 将它转移到其他邮箱中, 比如一个集中的邮件存档邮箱, 并且是集中存储在一个文件夹中的
也可以用foxmail把邮件收下来以后再删除, 也可以和上面的方法结合,把存档邮箱收下来. 但注意要使用imap, 不要用pop3, 因为pop3收不了邮箱文件夹里的邮件.

参考How to Configure Proxy Settings on Ubuntu 20.04

命令行运行:

export HTTP_PROXY=[username]:[password]@[proxy-web-or-IP-address]:[port-number]
export HTTPS_PROXY=[username]:[password]@[proxy-web-or-IP-address]:[port-number]
export FTP_PROXY=[username]:[password]@ [proxy-web-or-IP-address]:[port-number]
export NO_PROXY=localhost,127.0.0.1,::1

export http_proxy=[username]:[password]@[proxy-web-or-IP-address]:[port-number]
export https_proxy=[username]:[password]@[proxy-web-or-IP-address]:[port-number]
export ftp_proxy=[username]:[password]@ [proxy-web-or-IP-address]:[port-number]
export no_proxy=localhost,127.0.0.1,::1

大小写都要设置, 因为有的程序认大写, 有些(curl)认小写.
如果需要长期生效, 可以把上面的内容加到~/.bashrc里面
但是这个对apt不起作用. apt要生效, 需要修改文件: /etc/apt/apt.conf,增加:

Acquire::http::Proxy "http://[username]:[password]@ [proxy-web-or-IP-address]:[port-number]";
Acquire::https::Proxy "http://[username]:[password]@ [proxy-web-or-IP-address]:[port-number]";

用df -h查看Ubuntu server, 应该是有150G硬盘, 但实际上只看到73G

Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              392M  1.1M  391M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   73G  6.8G   62G  10% /
tmpfs                              2.0G     0  2.0G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  129M  1.7G   8% /boot
tmpfs                              392M  4.0K  392M   1% /run/user/1000

了解到有个LVM的东西, 意思是Logical Volume Manager.
参考LVM与磁盘配额原理及配置实例, Linux中的LVM逻辑卷管理(你真可爱,我说时来不及思索,而思索之后,还是这样说)
LVM可以便于动态在磁盘上调整容量.
ubuntu--vg-ubuntu--lv 的意思是 vg: virtual group, lv: logical volume.

管理命令:

功能 物理卷管理 卷组管理 逻辑卷管理
scan扫描 pvscan vgscan lvscan
create建立 pvcreate vgcreate lvcreate
display显示 pvdisplay vgdisplay lvdisplay
remove删除 pvremove vgremove lvremove
extend扩展 ———— vgextend lvextend
reduce减少 ———— vgreduce lvreduce

除此之外的辅助命令:

lsblk
fdisk -l

谁能想到呢。既然想不到哈马斯突袭以色列,也不会想到以色列夷平哈马斯。
加沙里面是巴勒斯坦管,但围墙是以色列管,相当于以色列“关押”巴勒斯坦人的巨型监狱。跟其他监狱一样,暴动了就要镇压。狱警这次打算一劳永逸,干掉所有犯人。狱警早就想这么做了,这回正好有个借口。
不是真杀完。加沙两百万人,杀完得用原子弹了。赶到埃及去确实对于以色列是最理想的做法。现在以色列的策略是极限施压加沙,把加沙人都压到气球唯一的泄气阀、最南端的lafa crossing. 只要压力足够大,让巴勒斯坦人自己一拥而出,埃及也无法阻止,毕竟埃及不可能枪杀巴勒斯坦人,而以色列可以。只要事实上赶走绝大多数犯人,以色列对剩下的暴动分子一一清洗就不是多么难的事情。如果有普通人不走?那也当做暴动分子。
以色列认定埃及会打碎牙往肚里咽。一定会给埃及造成难民危机,但埃及这次不会给巴勒斯坦人武装。