SwiftUI 入门
SwiftUI 的官方入门教程:Creating and Combining Views 不得不说我觉得这个教程看起来很好但是实际真不咋滴,只说怎么用,不说为什么这么用,根本不考虑初学者的感受。另外该教程应该是 WWDC 2019 发布的,基于 Xcode 11。而在最新发布的 Xcode 12 beta 版本中,似乎 SwiftUI 有了自己的生命周期,不再依赖于 UIKit。 1. 项目结构 […]
SwiftUI 的官方入门教程:Creating and Combining Views 不得不说我觉得这个教程看起来很好但是实际真不咋滴,只说怎么用,不说为什么这么用,根本不考虑初学者的感受。另外该教程应该是 WWDC 2019 发布的,基于 Xcode 11。而在最新发布的 Xcode 12 beta 版本中,似乎 SwiftUI 有了自己的生命周期,不再依赖于 UIKit。 1. 项目结构 […]
Laravel 应该是在5.几之后吧,其laravel/ui项目的前端框架默认使用Bootstrap与Vue。 1. 无法打印vue实例 对于vue官方文档中的例子,我们都可以在浏览器console窗口通过app变量打印出vue实例。 但是在laravel/ui的页面中,我们打印app变量时候,输出的却是id=”app”的那个dom元素,并不是在/resources/js/app.js中定义的vue实例。 const app = new Vue({ el: '#app', }); 原因是laravel mix在编译打包js文件的时候,会将每个js源文件作为一个独立的作用域,这样可以使不同js文件中的变量互不干扰。而这个app变量(打包时候还会将const变成var。。。=。=# js真是迷)的作用域就只在该/resources/js/app.js文件中。在其他地方是无法读取该变量的。 我们可以看一下laravel mix打包后生成的/pulbic/js/app.js文件,整个/resources/js/app.js源文件的代码(包括app变量)都被function(module, exports,
1. 加密解密 全局辅助函数: encrypt($value, $serialize = true) decrypt($value, $unserialize = true) Facade: Crypt::encrypt($value, $serialize = true) Crypt::decrypt($value, $unserialize = true)
在Laravel的Eloquent ORM中,Mass Assignment是指以数组形式对模型的属性进行赋值,比如:Model->fill(array $attributes) ,Model::create(array $attributes) 。与之对立的是指单一属性的赋值,比如:Model->age=18 。 考虑这么一个场景: 在用户注册的时候,后台通常使用User::create($attributes) 来进行用户模型的创建并写入数据库。这里的$attributes数组来自于用户提交的表单中的$_POST[’email’], $_POST[‘password’]等属性。正常情况下用户注册时候只会提交表单中列出的属性,所以一切正常。 但是如果有个不怀好意的用户,在提交表单时候添加一些虚假数据进来,比如$_POST[‘user_type’]=’admin’。而偏巧数据库中user表结构就有一个字段’user_type’用来表示用户类型是管理员(admin)还是客户(customer)。那么此时他就成功注册了一个管理员用户。这不是我们想见到的。 为了防止这种情况的发送,Laravel提供了mass assignment保护。在定义一个Model类型的时候,必须通过Model->fillable 或者Model->guarded 变量来指定哪些属性是允许mass assignment的。(这两个成员变量继承自trait GuardsAttributes ,默认情况下所有的属性都不允许mass assignment。)
Log::debug(‘debug message’); 的默认输出实在是太简陋了 最起码应该加上输出日志时候的文件与代码所在行吧。幸好Log::debug() 接受一个数组实参作为第二个参数,并格式化后一同输出。所以我们可以把__FILE__魔术常量放在这个数组参数中交给Log打印。 Log::debug(‘debug message’, [‘file’ => __FILE__, ‘line’ => __LINE__]); 输出如下: 我们也可以将一些想要打印的变量放在第二个实参数组中打印,比如: Log::info(‘User failed to login.’,
启用Laravel的基本用户认证模块后,就会自动生成几个用户注册/登录/密码找回的页面。我们就来从这几个页面深入理解Laravel的用法。 1. 找到路由 这几个路由都由/routes/web.php文件中新增的Auth::routes(); 这一行注册的。 1.1 Facade 这个用法涉及到了Laravel的facade概念,facade是指用看起来像调用类的静态方法的语法(类名::静态方法)来调用容器中对应实例的同名公有方法的一种用法。 我们可以在/config/app.php的aliases数组中找到这个Auth别名,该别名指向实际的facade类‘Auth’ => Illuminate\Support\Facades\Auth::class, 所以在路由/routes/web.php中的Auth::routes()实际上就是Illuminate\Support\Facades\Auth::routes() 然后我们再去看这个…\Facades\Auth的代码。 class Auth extends Facade { protected static
1. 创建laravel 6项目 在工作目录下执行如下命令,通过composer创建laravel项目。 composer create-project –prefer-dist laravel/laravel blog “6.*” 该命令会在当前工作目录下生成blog项目目录。整个目录结构如下,关于laravel项目目录结构的说明可以参考Laravel Docs 然后使用php artisan serve 启动网站服务,或者配置nginx来运行网站。 初始的网站只有两个路由,可以通过命令php artisan route:list 来检查路由。
1. 新建目录composer_test 后续的所有操作都在该目录下执行。所以现在该目录为空。 2. 使用Composer下载第一个包(monolog/monolog) 方法一 在当前目录下直接执行require命令: composer require monolog/monolog 。 该命令首先会在目录下寻找composer.json文件,如果没有的话则自动创建composer.json并将require的依赖包写入该文件。 然后再去composer源上下载所需要的依赖包,放到vendor目录下。 将依赖包的顶级命名空间与其源码目录的对应关系写入到/vendor/composer目录下的autoload_*文件中。 运行完命令后目录结构变成如下图所示。 /composer.json文件 是composer进行项目依赖管理的配置文件。 /composer.lock文件 是composer下载依赖包时候创建的文件,它记录了当前下载到的所有依赖包的版本。 /vendor目录
最近的项目突然发现一个bug,就是当服务器系统时区是utc时区,而服务器pgsql的时区是+8时区时候,通过python的datetime.now()插入的timestampz值有问题。所以特意做了一个测试。 1 测试前提 1.1 python的datetime类型 首先,要了解python的datetime类型是包括时间与时区的。而通过datetime.now()与datetime.utcnow()获得的时间其tzinfo属性为null,即不带时区属性。要想获得带时区属性的datetime类型,就必须使用datetime.now(tz=timezone.utc)或者datetime.now(tz=timezone(timedelta(hours=8)))。 1.2 pgsql的时间戳类型 然后,pgsql的时间戳类型包括timestamp(无时区), timestampz(有时区)两种。 1.3 测试表与测试代码 为了进行测试,我新建了一张time_test表,然后分别插入pythono的datetime.now(), datetime.utcnow(), datetime.now(timezone.utc)三个值。 #!/usr/bin/env python # -*- coding:
首先要记住,midi文件并不存储声音,只存储指示合成器(电子乐器)如何发声的动作,比如某个时刻以什么力度按下某个音符。 音符note 狭义的音符指C、D、E、F、G、A、B七个(即Do–Re–Mi–Fa–Sol–La–Si)。广义的应该是包括音符与对应的音阶,比如中央C即C4。音符、琴键与它们在midi中编号的关系如下图所示: 在midi信息中的note number从[21, 108]对应着钢琴的88个琴键。 midi channels 通道,最多有16个通道。可以了解为每个通道对应一个物理输出,所以midi最多可以同时控制16种乐器。 midi tracks 音轨,音轨与通道并不是一一对应,而是可以多对多的关系。音轨是逻辑上的划分,比如可以将钢琴的左手演奏放在track 1,右手演奏放在track 2。但是输出时候,都是对应输出到钢琴的通道。你也可以只设置一个track 1,并且在里面记录着不同通道的消息。另外,还经常将track 0用来存储midi的元信息。 event 事件,也叫做消息(在mido库中使用message表示)。包括三种事件meta event,midi event,