CloudFlare 支持部署 Angular 17,但是需要稍微做一点调整。

使用 CloudFlare 命令行创建 Angular 17 工程后,需要将 package.json 中的命令

"start": "npm run pages:build && wrangler pages dev dist/cloudflare
改为:
"start": "npm run pages:build && wrangler pages dev dist/browser
angular.json 中需要将 outputPath 从:
"outputPath": "dist/(项目名称)",
修改为:
"outputPath": "dist",
cloudflare 新建 pages 项目,build 命令处设置为:
Build output directory:/dist/browser

这个 /dist/browser 请几个地方保持一致,就可以正常的访问了。

这么一设置之后,部署之后 functions 也可以正常访问,前端页面也可以正常访问,本地开发的 functions 也可以正常访问,只是还不能启动 ng serve 然后 wrangler pages dev 来开发。需要 ng build 之后,wrangler pages dev 来开发,但是不需要重新跑 wrangler pages dev。

主要可能是新版本系统(或者软件)对于获取设备的返回数据格式作了修改
所以这里在 cordova build ios 获取可用设备列表的时候,会报 Cannot read property ‘toLowerCase’ of undefined。

解决方法很简单
打开这个文件:platforms/ios/cordova/lib/list-emulator-build-targets,
大概 54 行左右

device.availability.toLowerCase().indexOf('unavailable') < 0
改成:
device.isAvailable
所以改完之后完整的代码是:
availableDevicesInCategory.forEach(function (device) {
    // console.log(device);
    if (device.name === deviceType.name.replace(/\-inch/g, ' inch') && device.isAvailable) {
        availAcc.push(device);
    }
});
如果还不对,看一看这个 console.log(device); 输出是什么,我这里输出的是:
{ state: 'Booted',
  isAvailable: true,
  name: 'iPhone 11 Pro',
  udid: 'A4E72C68-XXXX-XXXX-XXXX-DFB57EB137B7' 
}
所以看看这个输出的内容就知道怎么改了。

var x = [1,2,3,4,5,6,7,8,9,10];
// var x = (Array(101).join(0).split('')).map((a,i)=>{return i+1;});
var findIndex =  (target, x, lowIndex, highIndex) => {
	var low = lowIndex || 0;
	var high = highIndex === undefined ? (x.length - 1) : highIndex;
	var mid = Math.ceil((low + high) / 2);
    // var mid = Math.floor((low + high) / 2);
	// console.log('Mid : ', mid);
	if(target === x[mid]){
		return mid;
	} else {
		if(target < x[mid]){
			// console.log('Low : ', x.slice(low, mid));
			return findIndex(target, x, low, mid - 1);
		} else {
			// console.log('High : ', x.slice(mid, high));
			return findIndex(target, x, mid + 1, high);
		}
	}
};
x.forEach((z)=>{
	console.log(findIndex(z, x));
});

在VPS上面安装Wordpress可能没有虚拟空间那么简单,但是复杂也给了你更大的优化和自定义空间。安装 WordPress 很多人都会发现安装插件或者升级的时候提示要FTP账号,这就是因为文件权限没有设置正确。 

WordPress官网介绍了详细的各文件需要的权限,下面我们看看应该怎么做。

先设定用户所有者为 www (有些php默认运行用户和组是http这些,按照php和nginx的配置来设置),比如我的网站根目录是在/home/wwwroot 那么
chown -R www:www /home/wwwroot

下面将所有文件夹设置为755权限,所有文件设置为644权限,注意!任何时候都不要设置为777权限(本方法来自Virson’s Blog,原贴为Linux 批量单独修改文件夹、文件的权限和所有者)

进入网站根目录

cd /home/wwwroot

设置此目录下所有文件夹的权限为755

find -type d -exec chmod 0755 {} \;

设置此目录下所有文件的权限为644

find -not -type d -exec chmod 644 {} \;

问题解决!

函数是一等公民

Dart 是一门完备的面向对象的编程语言,所以函数也是对象并且其类型是 Function。所以这就表示函数也可以赋值给变量,也就是说可以将函数作为参数进行传递。

一个函数的示例

    bool isBiggerThan10(int number) {
        return number > 10;
     }

虽然加上函数的返回值是个好习惯,但是 Dart 并不一定非要返回值,因为 Dart 会尝试推断函数的返回值。如果没有明确返回值,则会返回 null(因为 Dart 中所有未定义的变量都是 null)。

例如:

    isBiggerThan10(int number) {
        return number > 10;
     }

可以通过

    print(isBiggerThan10.runtimeType);

来获取此函数的类型。

箭头函数

当然了,为了简化函数的写法,Dart 也支持箭头函数,上面的例子可以写作为:

    bool isBiggerThan10(int number) => number > 10;

但不可写作下面这样子(number > 10 后面没有分号)。

    isBiggerThan10(int number) => {
        number > 10
     };

这段代码相当于:

    isBiggerThan10(int number) {
        return {number > 10};
     };

即:函数只包含一个表达式(重点),可以简写成胖箭头形式,=> 后面的表达式将作为函数的返回结果(或者返回 null)。

参数

和其他语言一样,函数定义的时候都可以指定参数列表

    bool isBiggerThanX(int number, int x) {
        return number > x;
     }

但是如果参数很多的话,就很有可能分不清楚要传入的参数对应的是那个了。Dart 有了具名参数。

具名参数
    bool isBiggerThanX({int number, int x}) {
        return number > x;
     }

调用

    isBiggerThanX(number:5, x:9);

还可以有默认(可选)参数

    bool isBiggerThanX({int number, int x = 10}) {
        if(number == null ){
            return false;
        }
        return number > x;
     }

调用

    isBiggerThanX(number:5)

此时 x 的值默认就是 10.

再调用

    isBiggerThanX(number:5, x:9)

此时 x 的值就是 9.

再调用

isBiggerThanX()

此时 x 的值就是 10, 所以说具名参数都是可选的。但是可以通过增加 @required 来表明是必填项, 但是好像编译时并没有出错(?)。

    bool isBiggerThanX({@required int number, int x = 10}) {
        return number > x;
     }
可选参数

那有时候我想要的可选参数是可传可不传的,而参数比较少,不想使用具名的默认参数,怎么办呢?那就是用可选参数。

    bool isBiggerThanX(int number, [int x]) {
        if(x != null) {
            return number > x;
        }
        return true;
     }

当然也可以这样

    bool isBiggerThanX(int number, [int x = 9]) {
        return true;
     }

这个时候,x 不传的话就是 9 了。

但是可选参数必须放在最后一个。对于具名的默认参数,可以不放到最后一个,任意都可以设置默认参数。

匿名函数

上面的函数都起了名字,Dart 当然支持不起名字的函数

    List list = [1, 2, 3];
    list.forEach((item) {
        print('item is : $item');
     }