После того, как CMUS успешно установлен, хорошо было бы - изменить тему оформления - с той, которая есть по умолчанию.

Это легко сделать. При установке CMUS - устанавливаются также дополнительные темы оформления.

Находятся они по пути /usr/share/cmus и можно их посмотреть так:

ls /usr/share/cmus

Также список тем можно посмотреть в репозитории пакета, на GitHub - CMUS Themes.

Изменить тему оформления можно командой:

:colorscheme gruvbox

… именно так - просто имя темы, без расширения. И все - можно пользоваться.


Как в Prisma - получать колонки выборочно

Самый простой пример получения всех данных (колонок) из таблицы в базе данных - при помощи Prisma такой:

const user = await prismaClient.users.findUnique({
    where:{
        id: userId
    }
})

… что является аналогом такой sql-команды, например:

SELECT * FROM users AS u WHERE u.user_id = 2;

Но что, если нужно получить в Prisma - только определенный набор колонок? При помощи sql-команды это делается просто:

SELECT u.user_name, u.user_gender, u.user_birthday FROM users AS u WHERE u.user_id = 2;

Как же выполнить точно такой же запрос - в Prisma? Это можно сделать при помощи дополнительной опции select.

В принципе - в оф. доке все описано - “… select defines which fields are included in the object that Prisma Client returns …” - “… select определяет, какие поля будут включены в объект, который возвращает Prisma Client …”.

И вот пример, как это можно сделать:

const user = await prismaClient.users.findUnique({
    select:{
        user_name: true,
        user_gender: true,
        user_birthday: true,
    },
    where:{
        id: userId
    }
})

Ссылка для более детального чтения, с примерами - Model query options


Пошагово - как создать playlist в CMUS

Есть такой отличный музыкальный плейер - CMUS; прелесть его в том, что он - консольный, легковесный; висит в фоновом режиме - и играет тебе музыку. Он богат функционалом, но вот его команды - приходится запоминать.

Шаги для создания playlist и папки с музыкой\аудиокнигой. Команды у CMUS - vim-подобные, начинаются с символа двоеточия.

Создание самого playlist’а

Достаточно выполнить такую командой - в любом окне CMUS:

:pl-create my-awesome-playlist

Переход в окно с playlist’ами

Жмем кнопочку с циферкой 3 - чтобы перейти в окно, в котором отображаются все playlist’ы - они будут слева, в колонку расположены. Подводим под вновь созданный playlist курсор (arrow-keys) и жмем Space, чтобы выделить этот playlist.

Добавление файлов в playlist

Вводим команду - для добавления файлов в выделенный playlist. В моем случае - это папка с файлами аудиокниги:

:add -p ~/Music/awesome-audiobook/

Единственное неудобство - CMUS не понимает пути к файлам, если они написаны кириллицей, не латиницей; приходится заранее - переименовывать папку, перед ее добавлением в playlist CMUS. По крайней мере - я пока не нашел, как заставить CMUS понимать кириллицу в путях.

Когда команда выполнится - в правой колонке окна под номером 3 - появится список аудио-файлов, которые привязаны к данному playlist’у. Можно переходить курсором на этот список - и пользоваться.


Пользовательское объединение типов - что это и как можно использовать

Помимо объединения примитивных типов данных (например):

type myType = number | string;

… в TypeScript можно делать и объединение пользовательских типов данных:

interface Rectange {
  width: number,
  height: number
}

interface Circle {
  radius: number
}

type Shape = Rectange | Circle;

Более того, пользовательские типы можно связать между собой при помощи общего для всех типов поля:

interface Rectange {
  width: number,
  height: number,
  type: 'rectange'
}

interface Circle {
  radius: number,
  type: 'circle'
}

type Shape = Rectange | Circle;

… здесь поле

1
type
- является таким связующим звеном; такое поле называется дискриминантом.

Прелесть такого объединения типов заключается в том, что можно проверять значение этого поля и в зависимости от результата - выполнять нужное действие. Например, можно создать такую функцию

1
calcArea
:

function calcArea(shape: Shape): number {
  const { type } = shape;

  switch(type) {
    case 'rectange':
      return shape.width * shape.height;
    case 'circle':
      return Math.round(Math.PI * shape.radius ** 2);
  }
}

… и тогда пример использования этой функции и объединенного типа будет таким:

interface Rectange {
  width: number,
  height: number,
  type: 'rectange'
}

interface Circle {
  radius: number,
  type: 'circle'
}

type Shape = Rectange | Circle;

function calcArea(shape: Shape): number {
  const { type } = shape;

  switch(type) {
    case 'rectange':
      return shape.width * shape.height;
    case 'circle':
      return Math.round(Math.PI * shape.radius ** 2);
  }
}

const rectangle: Rectange = { width: 10, height: 10, type: 'rectange' };
const circle: Circle = { radius: 20, type: 'circle' };

console.log(calcArea(rectangle)); // => 100
console.log(calcArea(circle)); // => 1257

Классы против интерфейсов в TypeScript - когда использовать, преимущества и недостатки

Классы

В TypeScript можно использовать классы для создании пользовательских типов данных. Например, так:

class Person {
  constructor(
    public name: string,
    public age: number
  ) {}
}

const person: Person = {
  name: 'John',
  age: 12
}

Однако, это не совсем правильный пример.

Преимуществом при использовании класса является тот факт, что можно создавать экземпляры этого класса:

class Person {
  constructor(
    public name: string,
    public age: number
  ) {}
}

const person: Person = new Person('John', 12);

Еще одно преимущество использования класса в TypeScript - возможность использования оператора

1
instanceof
:

class Person {
  constructor(
    public name: string,
    public age: number
  ) {}
}

const person: Person = new Person('John', 12);

if (person instanceof Person) {
  console.log('yes');
}

… в этом случае условие выполнится и проверка сработает, так как

1
person
является экземпляром класса
1
Person
.

Недостаток использования класса в TypeScript - при транспиляции в JavaScript в результирующем коде останется этот класс - или ввиде функции (ES5):

var Person = /** @class */ (function () {
  function Person(name, age) {
    this.name = name;
    this.age = age;
  }
  return Person;
}());
var person = new Person('John', 12);

… или ввиде класса (ES6):

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}
const person = new Person('John', 12);

Интерфейсы

Главное преимущество использования интерфейса в TypeScript - то, что в скомпилированном JS-коде не остается следов использования интерфейса; результирующий код - не утяжеляется:

"use strict";
const person = { name: 'John', age: 12 };
if (person instanceof Person) {
  console.log('yes');
}

… однако, использовать оператор

1
instanceof
в данном случае уже не получится - будет ошибка
1
'Person' only refers to a type, but is being used as a value here
.