free commander 显示日期时间格式的修改
默认是dd/mm/yyyy,看起来很不习惯。修改在“工具、设置、查看、文件/文件夹列表、常规”中的“时间戳格式”,改为Windows就和系统一样了。
默认是dd/mm/yyyy,看起来很不习惯。修改在“工具、设置、查看、文件/文件夹列表、常规”中的“时间戳格式”,改为Windows就和系统一样了。
再看Jekyll的过程中,忽然发现简化简化再简化才是王道,也是程序员们孜孜不倦追求的王道。
先举两个远一点的例子。
第一个例子是文档编辑格式,在寻找什么才是更好的文档编辑格式的时候,就会发现有DITA(xml格式承载)、reStructText(.rst格式承载)、Markdown(.md格式承载)。上面三种都可以转成html,所以另外还可以再加上html本身。可以看到,在这篇老外写的对比里面,markdown确实是极受欢迎的。 markdown+jekyll也是其推荐首选之一。而DITA的复杂性令人望而却步。
第二个例子是宇宙第一js框架之争。候选是react和vue。vue无数人说其胜在简单。除了使用标准的html、css、js以外,没有引入更多的新语法。而react虽然很强大,但是它引入了jsx这个奇怪的产物。然后就开始在js里面写html……让我想起了在html写php……虽然react极其优秀,然而更多的人们仍然更喜欢更简单的vue。
再说到对文件内容的简化。能列出来好多例子了。
markdown其实就是对html的简化。考虑到markdown里面还可以加入html标签以达成更高的兼容性,就更让大家喜欢了。html长长的标签及其影响阅读体验,才有了markdown用武之地。当然,HTML更强大不是吗,但这无法阻止更简单的markdown对它应用范围的蚕食。
scss是对css的简化和强化。去掉了{}和分号,改用了缩进,加入了变量和语句。其实,像if、for这种语句就是为了怕麻烦。另外,看来相当多的程序员都不喜欢花括号和分号啊!scss前身sass并不流行,看来简化的时候保持兼容性还是很重要的。
python之所以能有这么大的占有率,可以说他也是去掉了C系语言(C/C++/Java/Javascript)里面的花括号和分号。去掉了变量类型。javascript虽然没有去掉花括号(不知道有没有改型语言去掉它的花括号的),但可以省略分号。当然花括号和分号有一大好处就是可以把代码压缩在一行里面,这个python就不行了。JavaScript开始甚至都没有class,所有都是object,并且给object一系列默认的隐藏的function,让其实现复杂的功能已经class的功能,而表现上及其简单。
yaml是json的简化。虽然其名称更像是html。当然,json是xml的简化,用花括号替代了冗长的标签。yaml又用缩进替代了花括号,用-替代了方括号。
简化之路无止尽!每一种简化虽然可能损失了很多功能,然而却带来了更多的使用者、更高的效率!这才是发展的方向,而不是做一个大而全晦涩难懂的东西。
大而全的东西必然走向晦涩难懂,因为它要考虑的太多了。比如excel使用率极低的vba,它要考虑自动化,那么必然vba有很高的学习门槛。另外csv是excel不太成功的简化。损失了太多,但也有其生存之地。
看这个.
简单来说, sass是css的语法简化版,但是和css语法又不兼容. 于是在sass3版本加入了scss, 这个就是和css的语法的兼容版本.
4000端口被占用
D:\r\jekyllproj\try\my-awesome-site
λ netstat -aon | findstr "4000"
TCP 127.0.0.1:4000 0.0.0.0:0 LISTENING 3112
TCP 127.0.0.1:4000 127.0.0.1:52772 ESTABLISHED 3112
TCP 127.0.0.1:52772 127.0.0.1:4000 ESTABLISHED 32940
最后是PID.在任务管理器的服务中找到PID, 我这儿发现是foxit的一个服务占用的. 停掉它.再次运行就好了.
包括markdown和liquid
在html最前面加上
---
---
即可
据说淘宝源已经停止维护,现在只有https://gems.ruby-china.com了
$ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
$ gem sources -l
https://gems.ruby-china.com
# 确保只有 gems.ruby-china.com
gem默认不显示安装进度,下载比较大的gem文件的时候就搞不清楚是不是断了,添加--verbose或者-V显示详情.
gem install xxx -V
``` 这儿是原文, 2016年写.
到最后, 看来还是用markdown+Jekyll. 另外有个kramdown, 是markdown的扩展, 被github所用. 详见这儿
自己的核心产品是应该做的。可以扩大一点产品的的概念:产品除了我们常见的产生价值的有形物品外,把销售能力/服务能力等其他产生价值的虚拟能力也称之为产品。核心产品是公司依靠赚钱生活的产品,或者是在未来想象中依靠赚钱生活的产品。公司的客户建立在核心产品之上的印象凝聚成品牌印象。
一个产品背后都是一串供应链,那么自己的产品中,哪些又是应该自己做,哪些是供应链来做?
那么要看产品的竞争力和供应链的竞争力了。这两个有什么不同?产品竞争力是公司的客户、也就是我们的下游评估的,供应链的竞争力是供应链的客户(包括自己公司在内)评估的。
至少包括产品门槛和产品差异化优势。门槛决定能不能卖,差异化决定好不好卖。
在我来看,产品差异化优势是必须自己做的,不自己做也就没有所谓“差异化”可言。
而产品门槛是否自己做,其实可以看供应链的竞争力。
供应链的竞争力其实是供应链提供的产品的竞争力。就是看我们能不能从市场上(潜在供应商)那里选购到合适的产品作为我们产品的原料。原料可选择性多、很容易选购到,我们说供应链很成熟;很难选购到,我们说供应链不成熟。
那么怎么算成熟?
我对华为终端还算比较熟悉。华为很早之前尝试做过终端,一直不成功。包括电话、Modem、小灵通、手机。但终端一直没法成为像运营商产品那样的核心产品。更像是因为有了运营商渠道而搭配着卖的。也不重视品牌,很多都是运营商定制。所以,华为这个时期有很多终端都是外包做的。然而终端中的手机成为未来核心产品的时候,就必须找出差异化来亲力亲为了。
首先是外观。其次是系统。最早的智能手机可能只有外观是差异化,系统都是公版Android。然而自从小米等自制系统越来越受到欢迎后,系统也变成了差异化竞争力之一。再次是主板。这是由外观差异化决定的。
在后期的差异化方面又发生了变化,首先是CPU。高通、联发科CPU虽然符合要求、大量存在,然而供应商就这俩,然后提高下要求到高端的话,就只剩下高通了,CPU成本也不低,所以不能说是太成熟的,值得自己做。并且其中有可以差异化的点,如低功耗之类。虽然这个门槛很高,但作为华为仍然是有实力、或者有魄力去做的。
其次是拍摄效果。这完全是新定义的一个差异化点。摄像头没有能力做,好在供应商还有几个,算法还可以优化,数量还可以自定义。当然,最重要的摄像头不能做的话,导致其实差异化拉不开太大差异,小米努努力,也可以超越。
最后是
.s是汇编编写的.
从开头注释来看是Winner Micro原厂编写, 使用的汇编应该是ARM了.
; Vector Table Mapped to Address 0 at Reset
向量表里面IMPORT的是需要启用的功能.
配合后面的DCD也要打开, 这个功能才能启用.
可以看到大多是中断回调.这个就是很神奇的地方了. 中断回调函数名称实际上是在这儿定义的.这大概意味着你不能随便改名字啦.
但是, 按键中断却不在这儿定义,而是通过wm_gpio.c中的函数tls_gpio_isr_register()定义.
解决问题吗?No. 预测问题的能力最重要, 重要1000倍啊.
Keil编译设置里的“fromelf.exe --bin -o "$L@L.bin" "#L"到底什么意思?
官方解释:Key Sequence for Tool Parameters
% File name with extension (PROJECT1.UVPROJ)
# File name with extension and complete path specification (C:\MYPROJECT\PROJECT1.UVPROJ)
@ File name without extension or path specification (PROJECT1)
$ Path name of a file. Path names get extended with a backslash. For example, $P could generate C:\MYPROJECT\.
L Linker output file. Typically the executable file used for debugging (PROJECT1). 在乐鑫官网关于ESP-Touch的说明中, 主要文档在于资源-文档-用户指南中.
但翻开用户指南的pdf文件, 发现其中说明似乎缺少了点什么:
smartconfig了, 这个名字不是TI的吗?)唯独缺少了手机端如何组装和发送数据的说明.
通过阅读手机端的源码 (Android DatumCode.java和IOS DatumCode.m), 发现了其数据的构造过程在源码中注释如下
// Data = total len(1 byte) + apPwd len(1 byte) + SSID CRC(1 byte) +
// BSSID CRC(1 byte) + TOTAL XOR(1 byte)+ ipAddress(4 byte) + apPwd + apSsid apPwdLen <=
// 105 at the moment
在源码中,private static final int EXTRA_HEAD_LEN = 5;正好是前面的长度/CRC/XOR共5个字节,总长度:char totalLen = (char) (EXTRA_HEAD_LEN + ipLen + apPwdLen + apSsidLen); 只是奇怪的是,在apSSid之后,又通过奇妙的方法去插入bssid:
// add bssid
int bssidInsertIndex = EXTRA_HEAD_LEN;
for (int i = 0; i < apBssid.length; i++) {
int index = totalLen + i;
char c = ByteUtil.convertByte2Uint8(apBssid[i]);
DataCode dc = new DataCode(c, index);
if (bssidInsertIndex >= mDataCodes.size()) {
mDataCodes.add(dc);
} else {
mDataCodes.add(bssidInsertIndex, dc);
}
bssidInsertIndex += 4;
}
看上述方法,似乎是从EXTRA_HEAD_LEN开始,每隔4字节插入一字节的bssid直到插完为止(事实上应该是原数据上每隔3字节,因为每插入一个bssid后原数据剩余部分都往后挤出1个字节). 如果原数据插完不够长,就把剩下的bssid插在最后面...奇怪的做法啊.
而实际在传输中, 竟然会把1个字节数据拆成6个字节传输.
整个看起来挺复杂的,也升级了很多个版本, 没时间的话还是不建议自己再实现一遍了.
在这个网站下载
TortoiseSVN Password Decrypter , 命令行运行即可。