Frossky 发布的文章

之前看了太多大约都不是官方文档看得自己晕乎乎, 直到今天决心用MDN看看
使用Promise
Promise对象的构造器

const p = function(param){
  new Promise((callItWhenResolved, callItWhenRejected)=>{
    if(doSomethingOk){callItWhenResolved(resovledResultAsParam)}
    else{callItWhenRejected(rejectedResultAsParam)}
  })
}
p(Real_param).then(function callItWhenResovled(resovledResultAsParam){})

所以Promise构建的函数,具体来说就是返回一个promise对象的函数. 这个函数的主要操作完成后, 在promise对象的构造器中根据操作结果执行resolved()函数或者rejected()函数.这两个回调函数放在p().then()中定义.

async await只是Promise的语法糖.

async function af(){
  function callItWhenResovled(resovledResultAsParam){}
  callItWhenResovled(await p(Real_param)) 
}

也能合并简写为:

async function af(){
  (function callItWhenResovled(resovledResultAsParam){})(await p(Real_param)) 
}

如果callItWhenResovled已经定义过,当然又可以省却定义的过程,例如console.log

async function af(){
  console.log(await p(Real_param)) 
}

所以: await aPromiseObject,得到的是正常完成后的返回值resovledResultAsParam. 这个返回值会输入callItWhenResovled函数作为参数,并执行callItWhenResovled.
这儿特别晕的地方就是, 回调函数callItWhenResovled的参数, 表面上是aPromiseObject在await等待的返回值resovledResultAsParam, 实际上这个返回值在Promise对象构建的时候,并没有一个return resovledResultAsParam, 却是以callItWhenResovled实参的方式提供返回值的callItWhenResovled(resovledResultAsParam). 这个透过输入实参造成输出return的效果确实让人好晕.
所以async函数干脆在函数尾部使用return 返回值来替代这种回调函数(实参返回值),使得这个逻辑一下子清晰了很多. 而其返回的实质相当于return new Promise((resolved)=>{resolved(返回值)}).
而await的作用,就是进行Promise的脱壳,将一个promise对象变成其resolved返回值. await 异步函数()相当于异步函数返回的Promise对象.then(), 而某个函数(await 异步函数())相当于异步函数返回的Promise对象.then(某个函数).
这儿有个重要区别:

某个函数(await 异步函数()) //只能在async函数内使用await
异步函数返回的Promise对象.then(某个函数)  //在普通函数中也可以使用,应用范围更广些了

x={a:{b:{c:1}}}这个Object, 如果是x.a还可以写作x['a'], 然而x.a.b.c却只能写作x['a']['b']['c'], 对于深度不定的Object来说, 会比较难以引用.
一个简单的方式是用危险的eval函数, 写作eval('x.a.b.c').
那么eval又这么危险, 又推荐了比较安全Function函数:

Function('return x.a.b.c')()

否则就要更加复杂啦:

function objValue(str){
var keys = str.split('.')
var current = this
for(var key of keys){ current = current[key] }
return current
}
objValue('x.a.b.c')

lavas
js13kpwa PWA游戏
appspot 墙外
appscope

疑问

PWA能访问本地文件系统吗?
PWA能调用本地应用吗?
PWA应用能离线发布给其他人吗?

似乎PWA应用按不同商店、不同系统、不同浏览器而不同。windows商店中的 PWA应用可以作为md文件浏览器,但只能用于Win10,在Win7的Chrome中也有PWA应用,可以在桌面建立快捷方式,单怎么看都比网页快捷方式强不到哪儿去。
充满疑惑上知乎,看了这篇2019-12-17的新鲜答案后对PWA看来也是失望透顶啦!还不如微信小程序,哈哈

从PWA似乎又引出一个Flutter,看了下,能开发IOS和Android的应用。Windows看来是没戏的。只是不知道这玩意儿相比快应用又如何。

晚上下班8点多,基于一个很简单的原因:Electron的应用好几十M太大了,我想看能否有不那么臃肿的应用,我先是找到了vuido,基于vue开发的体积更小的原生应用听起来很符合我的胃口。可是,按作者说,Vuido的应用仍然有20M+,并且至今为止已经有2年没有维护了。我是想有没有1M以内的应用呢?编译完最简单的Hello World应该是在几十到几百K的大小。
微软的传统原生应用开发平台是Visual Studio,专业版本是收费的,不过这些年有免费社区版。然而,VS向来体积巨大,一个功能包动辄4~5G,一点儿也不优雅,还不如基于Electron的VScode,这可能就是所谓的历史包袱吧。
既然VScode是微软家的,我也不想要什么图形编程界面,那么有没有基于Vscode的原生应用开发方式呢?找来找去,找到了.net core。号称跨平台开发、跨平台运行。
.net core这家伙直到3.0以前都不支持桌面GUI应用,默认都是console应用!.net core最新版本是3.1,也就是才支持桌面应用不久。支持的桌面应用框架是Winforms和WPF。
那么Winforms和WPF到底哪个好呢?经过对比,发现WinForms更加古老,WPF更新些。区别是Winforms用cs文件(C#)编写界面和逻辑,而WPF用XAML(XML形式)编写界面,cs编写逻辑(还支持VB、F#)。嗯,这听起来还比较合理,对比h5和js。
然后就开始写。xaml跟HTML果然有些像的。那么,问题来了,怎么vscode预览xaml呢?答案是不行。网上有人提了个issue给.net core开发者,开发者的反馈是:基本上没有人用vscode开发WPF,大家都用VS!最后还把这个球踢给了vscode团队,然后vscode团队给这个issue标了个out of range超范围了!
我靠。
只能又下载VS。然后发现我可能两年前装了VS2017,打开后让我升级,升级包好几个G!然后又看到VS最新的版本是2019。那么嫩不能不用卸载-下载-安装就可以直接升级到VS2019呢?网上真有人问。回答是:No。说这俩是不同Channel的,如果你装了2019,机子里会同时共存两个:2017和2019,说,你还是卸载了吧!
好吧,我卸载2017。过程好慢。到半夜12点多了,还没有卸载完!第二天在搞吧!
第二天也就是今天,卸载完了。但是居然报了个错:卸载失败!赶快去安装目录看看,还好除了留着一个2017的空目录再没有什么内容了。然后就漫长等待装2019,去吃个饭先。
吃饭时再看相关文章。发现WinForm/WPF之后,还有个UWP!这货支持HTML+JS!再看WPF,似乎近多年以来微软都没有再怎么在WPF上使劲儿,开发者对此还多有怨言。那就转向UWP?
然而,问题又来了:1、UWP只支持Win10;2、应用要上Windows商店。额,UWP有些耳熟,我记得是不是已经相当于阵亡状态,只是微软秘不发丧?查了下相关报道,还真是个这样!
UWP几乎已死WPF又上不来这怎么搞?况且UWP就算没死还不支持Win7也不是办法。这时候有人说,有个叫Xaml island的东西,可以在WPF框架里放UWP!不知道这个是不是救星。
另外,微软在放弃UWP、WPF之后,又搞了个PWA,不知道是什么东西,能不能用呢?

原意是通过vscode快速开发一个Windows GUI。 不想用electron的原因是electron打包出来的app太大。
通过框架选择,似乎只有.net core适合vscode。又发现.net core3.1只支持WinForms和WPF两种GUI框架。
通过对比,WPF似乎是更先进的。查看代码发现WPF中xaml类似HTML布局的作用,.cs写代码,而Winforms用一个cs文件写布局另一个cs文件写逻辑……不喜欢。还是WPF符合我的要求。
接着开始写xaml。这玩意儿写布局总得有个预览吧。HTML直接用任何一个浏览器打开看就行了。xaml呢?能不能在Vscode中编辑?搜索了下,真有人问了这个问题,然而回答却是残酷的:

I like the idea of a XAML editor in VS Code. But honestly all WPF and WinForms developers I know use Visual Studio. And as WPF and WinForms in .NET Core are still Windows-only UI stacks, there's no reason why you shouldn't use Visual Studio. But for cross-platform stuff it would make sense, yes. And for those who want to use VSCode for everything. :)
我喜欢VS Code中的XAML编辑器的想法。但老实说,我认识的所有WPF和WinForms开发人员都使用Visual Studio。而且由于.NET Core中的WPF和WinForms仍然是仅Windows的UI堆栈,因此没有理由不应该使用Visual Studio。但是对于跨平台的东西,这是有道理的,是的。对于那些想要对所有内容使用VSCode的人。:)

.net core

中文指南

C

中文指南
类型|JS|C#
--|--
整数| |int
浮点| |double
固定点| | demical

foreach(x in xs){}

WPF

中文指南
学习H5架构的原生Windows应用架构

要用到高级功能呢,呵呵, 看看百度经验

主要是:
1 连同标题行选择数据区域后, 选择数据-排序与筛选-高级命令. 如按关键字段筛选, 只选择关键字段列就好.
2 对话框中, 列表区域选择单列的话,只会以单列计算, 选择多列的话, 多列之间是"与"的关系.
3 勾选选择不重复的记录, 确定.

var exec = require('child_process').execSync;
var cmd = "echo 'hello world'";

var options = {
  encoding: 'utf8'
};

console.log(exec(cmd, options));

今天装Canon G5800打印机驱动时候忽然给我把我自己的Wifi密码全列出来了, 让我很震撼,哈哈

Windows

  1. 输入 netsh wlan show profile 获取本机已保存的wifi SSID
  2. 3.输入 netsh wlan show profile name=“ ” key=clear 获取密码 name里写入WiFi SSID

Github上有个WIFIpass项目可以用Python一键获取,不过我觉得批处理应该也可以有类似效果. 果然在这个网址找到了bat的方式, 试了下,只适用于英文版Windows,中文的要修改下. 代码如下:

@echo off
::
:: (c) Elias Bachaalany <lallousz-x86@yahoo.com>
:: Batchography: The Art of Batch Files Programming
::
setlocal enabledelayedexpansion
:main
    title WiFiPasswordReveal v1.0 (c) lallouslab.net - The Batchography book

    echo.
    echo Reveal all saved WiFi passwords Batch file script v1.0 (c) lallouslab.net
    echo.
    echo Inspired by the book "Batchography: The Art of Batch Files Programming"
    echo.
    :: Get all the profiles
    call :get-profiles r
    :: For each profile, try to get the password
    :main-next-profile
        for /f "tokens=1* delims=," %%a in ("%r%") do (
            call :get-profile-key "%%a" key
            if "!key!" NEQ "" (
               >>"C:\WiFi-Passwords.txt" echo WiFi: [%%a] Password: [!key!]
            )
            set r=%%b
        )
        if "%r%" NEQ "" goto main-next-profile
    echo.
    pause
    goto :eof
::
:: Get the WiFi key of a given profile
:get-profile-key <1=profile-name> <2=out-profile-key>
    setlocal
    set result=
    FOR /F "usebackq tokens=2 delims=:" %%a in (
        `netsh wlan show profile name^="%~1" key^=clear ^| findstr /C:"Key Content"`) DO (
        set result=%%a
        set result=!result:~1!
    )
    (
        endlocal
        set %2=%result%
    )
    goto :eof
::
:: Get all network profiles (comma separated) into the result result-variable
:get-profiles <1=result-variable>
    setlocal
    set result=

    FOR /F "usebackq tokens=2 delims=:" %%a in (
        `netsh wlan show profiles ^| findstr /C:"All User Profile"`) DO (
        set val=%%a
        set val=!val:~1!
        set result=%!val!,!result!
    )
    (
        endlocal
        set %1=%result:~0,-1%
    )
        goto :eof

在重大事件爆发的质变之前,往往有一个量变酝酿期.在量变开始的时候, 有部分敏锐的人知道了,并且宣传了出来(吹哨人). 然而任何国家和地方政府都是维稳和不专业的,会有意无意的不传播这个事件.这就形成了重大事件必然爆发的预测.
重要的一点是,重大事件的爆发,会引发哪些必然产生的关联事件?就如同蝴蝶效应. 但又和蝴蝶效应不同的是,蝴蝶效应的影响方向是随机的,而重大事件的影响方向有很多是确定和必然的.要如同公式一般预先推导出因果关系,就能形成预测.

我觉得在教西方拉丁语系历史的时候,应该吧人名地名中英文并列, 并且指出相关语源, 原因是:坑爹的翻译....

  1. 英国-英格兰:这个翻译就有大问题, 英国在国际上称呼是UK, 是United Kingdom of Great Britain and Northern Ireland的简称,全文一个"英"字都没有. 而英格兰是England,只是英国的部分区域. 这个翻译会让人误解英国是英格兰国.更广泛的代表英国人的应该是British而不是English.
  2. 英格鲁-盎(音:昂)格鲁. 如果是盎格鲁,你会觉得跟英国毛关系没有, 其实英格鲁盎格鲁都是Anglo, 而Anglo是西班牙语的English. 另有一说是中古英语中英国人被称为Angelcynn, Angles的家庭. 当然越古老,西语/英语的区分越少. Angles是公元5世纪移民到England的一个Germanic(日耳曼,德国)人. Angle和Angel这俩词好像.
  3. Anglo-Saxon(翻译为英格鲁撒克逊)经常并称, 而Saxon(德语Sachsen)实际上是德国东部现在的一个州萨克森自由州, 其州府Dresden德累斯顿是东德仅次于柏林的第二大城市. Angles前面说了是个人,也是个部落,和Saxons部落在公元5世纪左右移民去了英国, 构成了最早的Anglo-saxon人.

dead-tree 纸质书,纸质的. 纸=死掉的树,哈哈

  • 引申为dead-tree format (纸质版), dead-tree-ware (纸件)

网站

merriam webster , 好像会给这些俚语一个正确的解释, 而不是把deadtree翻译成死树. 比如今日(2020-2-26)的流行词就是pandemic

蚝油茄子 五星

上面是微波做法,但主要步骤是对的。
1 茄子切蓑衣刀3分钟蒸熟装盘
2 洋葱,蒜末,辣椒粉,油混合好,炒熟
3 蚝油,生抽,糖,醋,混合拌入炒匀
4 淋在茄子上
5 点缀品:小葱花小米辣。

照烧鸡块

我改良的做法
1 鸡块切小用盐腌制十分钟
2 配制所谓照烧汁。有卖的买不到就配。生抽,醋,糖,姜蒜末,果酒(清酒、味琳)
3 中油温煎鸡块双面金黄
4 加入配好的汁水文火烧十分钟。大火收汁。
5 点缀品:大葱花熟芝麻。

发现const和let有个特别的用法,可以将Object里面的元素展开, 使用花括号包住Object中的key即可:

x={a:1,b:2}
const {a,b} = x //a=1,b=2
y={c:1,d:2}
const {c,d} = y //c=1,d=2

这样在require中可以将下一级的元素直接用于上一级

const {readFile, writeFile} = require('fs') //readFile和writeFile可以直接使用

原来,这个叫做解构赋值
除了能使用Object解构赋值, Array也可以.
使用Array解构赋值,某种程度上实现了函数多返回值

function f() {
  return [1, 2];
}

var a, b; 
[a, b] = f(); 
console.log(a); // 1
console.log(b); // 2

这里面用于正则表达式提取匹配值也是很有意思的用法, 正则表达式需要用括号组合出不同的匹配组

function parseProtocol(url) { 
  var parsedURL = /^(\w+)\:\/\/([^\/]+)\/(.*)$/.exec(url);
  if (!parsedURL) {
    return false;
  }
  console.log(parsedURL); // ["https://developer.mozilla.org/en-US/Web/JavaScript", "https", "developer.mozilla.org", "en-US/Web/JavaScript"]

  var [, protocol, fullhost, fullpath] = parsedURL;
  return protocol;
}

console.log(parseProtocol('https://developer.mozilla.org/en-US/Web/JavaScript')); // "https"

对于Object的结构,除了基本的:

var o = {p: 42, q: true};
var {p, q} = o;

console.log(p); // 42
console.log(q); // true

还可以对其值进行解构,相当于重命名了变量

var o = {p: 42, q: true};
var {p: foo, q: bar} = o;

console.log(foo); // 42 
console.log(bar); // true 

Array和Object的结构还都有默认值

var {a = 10, b = 5} = {a: 3};

console.log(a); // 3
console.log(b); // 5

最后是看起来很晕的用于函数参数的解构, 相当于默认值

function drawES2015Chart({size = 'big', cords = { x: 0, y: 0 }, radius = 25} = {}) 
{
  console.log(size, cords, radius);
  // do some chart drawing
}

drawES2015Chart({
  cords: { x: 18, y: 30 },
  radius: 30
});

还TMD可以结构嵌套的Array和Object!!!,并且还能用在For循环里面!!