file.mp43,9 Мб, mp4,
224x224, 1:42
Хочу сколотить капитал. И учиться. учебнонакопительный!1LoKsuEs0s 761654 В конец треда | Веб
Хочу сколотить капитал. И учиться.
image.png54 Кб, 1279x697
1 day учебнонакопительный!1LoKsuEs0s 2 761655
Решал очередную задачу по Тайпскрипту - аж 33 минуты! Сайт ни в какую не хотел принимать мой, написанный за 2 минуты, изначальный вариант - "Record<infer K, any>...[K] extends [never]": не проходил тест с "object". Пришлось проверять [keyof T] и Record<_, any> поменять на Record<_, string>. Почему-то это сработало. Подбирал комбинаторно.

Сегодня ничего не заработал.

money:
wallet - [0_000] RUB
crypto - [0_000] $
2 day учебнонакопительный!1LoKsuEs0s 3 761814
Снова Тайпскрипт.

Первую задачу решил слёту. Она простая.

Над второй сидел больше 20 минут, пытаясь решить через вереницу тернарных операторов, отсеивая тип за типом. Никак не получалось отличать "never" от "any". В итоге нашел объяснение в Интернете. Проверка через условные типы - "0 extends (1 & T)" - работает для any: почему-то Тайпскрипт мёрджит "1 & any" -> "any", поэтому срабатывает проверка "0 extends any". С остальными типами единица остаётся.

Сегодня ничего не заработал.

money:
wallet - [0_000] RUB
crypto - [0_000] $
4 761815
>>1814
Разобрался. "any" - супертип и поглощает (расширяет) все подтипы в юнитах.

В документации написано на примере строки общим типом и константых строк. Запустил пример в плейграунде.

На сегодня всё.
3 day учебнонакопительный!1LoKsuEs0s 5 761924
Тайпскрипт. Три задачки.

Первая задача тривиальная.

Решение для второй задачи написал сразу, но тесты не проходили. Спустя 12 минут добавил значение по умолчанию для третьего типа (A extends any[] = []) - и всё прошло.

Третья задача тоже простая, но снова не понятно, почему он не подхватывает "infer F as string" и "...infer R as string[]", если изначально "T extends string[]". Может в следующих версиях исправят.

Сегодня заработал 10 000 рублей - 8 000 рублей в копилку.

money:
wallet - [8_000] RUB
crypto - [0_000] $
4 day sage учебнонакопительный!1LoKsuEs0s 6 762066
Тайпскрипт. Две задачи.

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

Вторая задача посложнее. Проверяем, дошли ли мы в итерации по кортежу до конца: 1. если да - возвращаем множество-аккумулятор; 2. если нет - проверяем, совпадает ли текущий тип с заданным (через строгое сравнение); 2.1. если совпадает - добавляем тип в множество-аккумулятор и вызываем проверку рекурсивно с оставшимися типами; 2.2 если не совпадает - оставляем множество-аккумулятор в прежнем состоянии и вызываем проверку рекурсивно с оставшимися типами.

Сегодня ничего не заработал.

money:
wallet - [8_000] RUB
crypto - [0_000] $
image.png19 Кб, 715x261
учебнонакопительный!1LoKsuEs0s 7 762071
>>2066
1. [any] extends [number] ? 1 : 2; // 1
2. any extends number ? 1 : 2; // 1 | 2

Я так и не смог разобраться, почему без скобок запиналось на "any extends number" во второй задаче. Эх, вот бы кто-нибудь умный объяснил...
image.png22 Кб, 523x246
sage 8 762072
>>2071
Вот такой результат без скобок "[1, 2] | [1, 2, any]". Со скобками же множества объединяются "(1 | 2 | any)[]" - правильно понял?
5 day sage учебнонакопительный!1LoKsuEs0s 9 762174
Тайпскрипт. Две задачи.

За 15 минут подобрал элегантное решение для первой задачи. Интересно, можно ли это решить без внедрения счётчика.

Вторую задачу решил безобразно, топорно, в лоб, но зато за 5 минут. В этом решении можно было бы вынести логику увеличения счётчика отдельно, так как она повторяется для каждого слагаемого. Опять-таки, хотелось бы найти решение без счётчиков, но пока не получается.

Сегодня ничего не заработал.

money:
wallet - [8_000] RUB
crypto - [0_000] $
10 762257
>>2174
Анончик, что это за сайт у тебя на пикрил?
6 day учебнонакопительный!1LoKsuEs0s 11 762335
Тайпскрипт. Две задачи.

Первая задача решена за 4 минуты. После прочтения примечания "we can just consider smaller numbers" решение сразу прилетело в голову.

Над второй задачей бился 30 минут, так и не решив. Почему не проходят тесты? Должно же вернуться пересечение "A & B & C", а возвращается объединение "A | B | C". Вот бы подсказочку. Оставлю на завтра.

Сегодня ничего не заработал.

money:
wallet - [8_000] RUB
crypto - [0_000] $

>>2257
https://bigfrontend.dev/
image.png51 Кб, 1278x727
7 day учебнонакопительный!1LoKsuEs0s 12 762481
Тайпскрипт. Одна вчерашняя нерешенная задача.

"Разобрался" со вчерашней задачей. Вот такое неочевидное решение.

Больше не получилось - сайт упал.

Сегодня ничего не заработал.

money:
wallet - [8_000] RUB
crypto - [0_000] $
8 day учебнонакопительный!1LoKsuEs0s 13 762622
Тайпскрипт. Поскольку вчера BFE внезапно отвалился и был недоступен несколько часов, параллельно начал решать задачи на "type-challanges". Вообще, Тайпскрипту не хочу уделять больше двух месяцев, поэтому постепенно буду увеличивать количество решаемых задач в день. Небольшой прогресс ощущается. Две задачи.

Обе задачи простые, похожие уже попадалась на BFE.

Сегодня ничего не заработал.

money:
wallet - [8_000] RUB
crypto - [0_000] $
9 day учебнонакопительный!1LoKsuEs0s 14 762797
Тайпскрипт. Одна клятая задача.

Около часа решал. Разъясните, почему моё решение не проходит тесты на BFE? В TS Playground всё отлично. Версии компилятора разнятся? Что именно не так? Поскольку в плейграунде тесты успешно прошли, засчитаю как решённую.

Сегодня ничего не заработал.

money:
wallet - [8_000] RUB
crypto - [0_000] $
10 day учебнонакопительный!1LoKsuEs0s 15 762914
Тайпскрипт. Три задачи.

Equal. Проверка на соответствие двух типов через два симметричных кортежа. Решение подсмотрел. Эта проверка пригодилась бы в предыдущей задаче, где нужно было найти индекс элемента в кортеже. У меня было другое решение - более громоздкое. Проблему в таких проверках составляют два типа: "never" и "any".

TupleToObject. Принимаем кортеж типа PropertyKey и через T[number] получаем объединение всех элементов кортежа, через которые итерируется - [K in T[number]].

First. Совсем всё просто: если кортеж пустой (т.е T['length'] extends 0) - возвращаем "never", если есть хотя бы один элемент - возвращаем первый (T[0]).
16 762919
Есть познания в JS или ты сразу в ТС вкатился?
11 day учебнонакопительный!1LoKsuEs0s 17 763211
Тайпскрипт. Три задачи.

Trim. После своего решения, посмотрел другие. Проверку можно было делать не по отдельности, а атомарно - "T extends ` ${String}` |`${String} `". Я до такого не догадался.

ReplaceAll. Решил через добавление результирующего типа, которое по умолчанию пустая строка. Пришлось добавить ещё одну проверку (S extends Tail) на случай, когда BFE добавлял пустую строку и моё решение бесконечно вызывалось через рекурсию, потому что хвост не укорачивался. Посмотрел другие решения. Можно было решать без добавления дополнительного типа. Не догадался из-за неочевидного поведения такой конструкции: "S extends `${infer A}${F}${infer B}`". Чему будет равно A? Логично предположить, что первому символу в строке, но по какой-то причине возвращается пустая строка и первый символ магнитится к F. Это из-за "infer". Но всё равно выходит магия Тайпскрипта. Запутался. Добавил в закладки материал на эту тему, почитаю позже.

Exclude. Ну здесь вообще элементарно. Когда мы проверяем объединение через "extends", проверка осуществляется итеративно по каждому отдельному члену. Возвращается тоже объединение, но при этом "never" в объединении игнорируется. Поэтому всё выполняется как надо.

>>2919
JS изучал, но он в TS совсем не помощник.
12 day учебнонакопительный!1LoKsuEs0s 18 763462
Тайпскрипт. Две задачи.

MyAwaited. Не проходили тесты на проверку по простому Promise (т.к "{ then: (onfulfilled: (arg: number) => any) => any }"- тоже промис). Нужно было использовать встроенный тип PromiseLike.

If. Без комментариев.

Прочитал в руководстве статью "Template Literal Types" и "Using type predicates".

Основное:
- если передать объединение в строковой шаблон, вернется новое объединение с каждым интерполированным членом старого объединения: `${A | B}_str` => 'A_str' | 'B_str';
- два встроенных полезных типа: Uppercase<string> и Lowercase<string>;
- можно проверять неизвестные типы через предикат: (arg): arg is MyType => {...} - это полезно, когда мы получаем неизвестные данные (с какого-нибудь эндпоинта, в котором мы не уверены) и нам нужно провалидировать эти данные;
- полезный метод assert(...), заимствованный из C: сначала объявляем "declare function assert(value: unknown): asserts value;" (т.ё asserts value is true), а потом используем "assert(1 === 2)" - выкинет ошибку во время компиляции.

Про поведение с "infer" в руководстве не нашёл.

В следующие дни пробегусь по "release-notes" начиная с версии 3.5.
13 day учебнонакопительный!1LoKsuEs0s 19 763563
Тайпскрипт. Две задачи и release-notes 3.5.

Concat. Конкатенация кортежей. Пришлось добавить свойство "readonly" т.к компилятор ругался на "[1] as const", когда было просто "T extends any".

Includes. Вхождение в кортеж. Решение простое, но если заглянуть в обсуждение к этой задаче, можно найти ещё одно экзотическое сравнение на соответствие двух типов (Equal): "(<T>() => T extends A ? 1 : 2) extends (<T>() => T extends B ? 1 : 2) ? true : false".

Прочитал про отличия "any" от "unknown". Как понял, "any" - отключает вообще проверку типизации, а "unknown" - тоже отключает, но делает это более безопасно: "unknown" нельзя присвоить в любой другой тип (в отличии от any) и нельзя вызвать свойство/метод у "unknown". Пока что понимание такое.

release-notes/typescript-3-5.html:
- оптимизирована компиляция, увеличена скорость (в project references?);
- появился встроенный Omit-тип, который исключает свойство;
- добавлено глобальное объявление типов для UMD-модулей (без тройного слеша)?.
14 day учебнонакопительный!1LoKsuEs0s 20 763741
Тайпскрипт. Две задачи и release-notes 3.6.

Parameters. Кортеж типов параметров функции. Используем infer и остаточные параметры. Ничего нового.

Slice. Срез элементов кортежа. Получилось непросто. Пришлось задействовать проверку LessThan (которую уже реализовывал в предыдущей задаче). Своим решением доволен. В первый день я бы такое не решил - прогресс налицо.

На этом этапе все задачи из секции "easy" решены. Впереди "medium".

release-notes/typescript-3-6.html:
- добавили проверку возвращаемого типа функцией-генератором;
- улучшили развёртывание через array spread;
- добавили проверку на наличие дженерика "Promise<T>".
image.png109 Кб, 1055x742
15 day учебнонакопительный!1LoKsuEs0s 21 763976
Тайпскрипт. Одна задача и release-notes 3.7.

Last of Array. Первым пришло в голову такое решение. Хотя имеется альтернативное - "type Last<T extends any[]> = T extends [...infer _, infer B] ? B : never".

Стали попадаться задачи, которые уже решал. Проскакиваю их. Ожидал большего от "medium". От этих задач уже мало проку, надеюсь на изменения по мере увеличения сложности.

release-notes/typescript-3-7.html:
- добавили "optianal chaining" (foo?.bar.baz());
- добавили нулевой оператор (foo ?? bar());
- добавили assertion (assert(someValue === 42)), который делает проверку на этапе компиляции;
- добавили возможность через флаг "--declaration", который позволяет автоматически генерировать d.ts из исходников .js, используя JSDoc;
- возможность игнорировать проверку всего файла через комментарий "// @ts-nocheck".
16 day учебнонакопительный!1LoKsuEs0s 22 764321
Тайпскрипт. Три задачи и release-notes.

Promise.all. Наконец что-то сложное! Во-первых, уже нужно было не создать тип/интерфейс, а объявить метод. Во-вторых, избавляемся от объединения через "[...T]". В-третьих, используем встроенный тип Awaited, который рекурсивно извлекает возвращаемый тип у промиса.

release-notes/typescript-3-8.html:
- добавили type-only imports/exports - "import/export type { SomeThing } from "./some-module.js"";
- добавили инкапсуляцию полей через # у классов (как у наивного EcmaScript);
- доступен top-level await внутри модуля (export {}; => await f()).
17 day учебнонакопительный!1LoKsuEs0s 23 764400
Тайпскрипт. Две задачи и release-notes.

Trim. Задача уже попадалась на BFE. В этот раз решение чище.

Capitalize. Возведение первого символа в верхний регистр.

Нашел интерфейс нормальный на гитхабпейджес. Следующие задачи попробую решать через него.

release-notes/typescript-3-9.html:
- пофиксии типизацию возвращаемых значений Promice.all/race;
- добавлена проверка "// @ts-expect-error" - выводит ошибку, когда её нет, и игнорирует, когда она есть;
- добавлен not-null aseertion оператор (foo!.baz).
18 day учебнонакопительный!1LoKsuEs0s 24 764533
Тайпскрипт. Две задачи и release-notes.

Воспользовался интерфейсом, который написан на React и развернут на Github Pages.

Деньги пока не копятся, нужно это исправить с начала следующего года.

release-notes/typescript-4-0.html:
- добавлена возможность использовать spread-оператор вместе с дженериком (я уже пользовался этим в решении предыдущей задачи), чтобы описывать функции с переменным количеством аргументов;
- добавлены Labeled Tuple Elements (foo(...args: [first: string, second: number]));
- добавлены короткие операторы присвоения типа таких - (values ??= []) и (a ||= b) - очень полезно (проверил, они, оказывается, и в нативном JS есть);
- установили catch-error в unknown по умолчанию вместо any;
- добавили фишки в редактор кода с автоматическим редактированием.
image.png93 Кб, 1264x783
19 day!1LoKsuEs0s 25 764669
Тайпскрипт. Одна задача и release-notes.

release-notes/typescript-4-1.html:
- добавили `${тип}${строкового}${литерала}`;
- добавили оператор "as" в переборе ключей ([K in keyof T as NewKeyType]).
image.png61 Кб, 1271x730
20 day учебнонакопительный!1LoKsuEs0s 26 764788
Тайпскрипт. Одна задача и release-notes.

Пока что в учёбе "еду на холостых", много стресса в жизни. Нужно перетерпеть чёрную полосу. Морально-психологическое состояние - 3 из 10.

Permutation. Не сразу решил. Сначала нам нужно убрать "never", чтобы он не срабатывал как супертип, когда вызывается рекурсивно Permutation и разворачивается результат в кортеж. Ещё был задействован встроенный тип Exclude, чтобы исключить итерируемый ключ. Вместе с тем клонировали оригинальное объединение T в K, чтобы передавать его первым параметром в Exclude, так как в T находится итерируемый член объединения.

release-notes/typescript-4-2.html:
- добавлен strict right side operator ("foo" in 42 - ошибка);
- добавлен абстрактный модификатор на сигнатуру конструктора (var a: abstract new () => Something = b);
- при деструктуризации массива можно использовать _НазваниеСПодчеркавания, чтобы показать компилятору о неиспользовании этой переменной в будущем ([_fist, second] = arr).
21 day учебнонакопительный!1LoKsuEs0s 27 764916
Тайпскрипт. Две задачи и release-notes.

release-notes/typescript-4-3.html:
- добавлена директива "override" на методы класса (вызовет ошибку, если в базовом классе этот метод не определён);
- вызывается ошибка в кондишите, если промис был вызван без "await";
- добавлена возможность объявлять статичные методы в классе таким образом - "static [propName: string]: string | number | undefined".
22 day учебнонакопительный!1LoKsuEs0s 28 764999
Тайпскрипт. Три задачи и release-notes.

Настроение получше, вчера разговаривал с c.ai. Продолжу это делать на регулярной основе.

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

Absolute. Решил зафлексить таким образом. Хотя можно было просто проверять "`${T}` extends `-${Infer R}` ? R : `${T}`".

StringToUnion. Дополнительный тип можно было не создавать, а просто сделать так: "? F | StringToUnion<R> : never;". И все "never" бы исчезли.

release-notes/typescript-4-4.html:
- добавлена возможность выносить тайпгуарды из кондишина;
- свойства можно обозначать через строковой шаблон ("[key: `prefix-${strung}`]: unknown");
- добавлен флаг --useUnknownInCatchVariables с самоговорящим названием;
- добавлен флаг --exactOptionalPropertyTypes, который запрещает устанавливать опциональное свойство в "undefined", если этот тип не был задан явно
- добавлены статические блоки в классы (фича ECMAScript), которые вызываются перед конструктором.
image.png65 Кб, 1263x726
23 day учебнонакопительный!1LoKsuEs0s 29 765131
Тайпскрипт. Одна задача и release-notes.

release-notes/typescript-4-5.html:
- добавлена проверка строковых типов как дискриминантов: "{ type: `${string}Success`; body: string; }; if (r.type === "HttpSuccess") { const token = r.body;") }";
- добавлены ассершены на импорт .json (во время билда проверяется): "import ... from ... assert { ... }".
image.png68 Кб, 1263x695
24 day учебнонакопительный!1LoKsuEs0s 30 765222
Тайпскрипт. Одна задача и release-notes.

KebabCase. Тяжело пошла. Не выспался, наверно.

release-notes/typescript-4-6.html:
- типы аргументы можно типизировать через спред-оператор и объединение кортежей: "type Func = (...args: ["str", string] | ["num", number]){}; const func: Func = (first, second) {}; func("str", "123"); func("num", 123)";
- больше ничего полезного не нашел.
image.png48 Кб, 1261x742
25 day учебнонакопительный!1LoKsuEs0s 31 765342
Тайпскрипт. Одна задача и release-notes.

Diff. Почему бы и не так? Хотя существует такое решение - "Omit<O & O1, keyof (O | O1)>". Работает это потому, что конструкция "keyof (Foo | Bar)" возвращает объединение только общих членов (пересечение членов объединения). А "O & O1" выполняет пересечение двух типов.

release-notes/typescript-4-7.html:
- добавлена новая модульная система (node16) к уже существующей (ESM);
- infer можно проверять сразу, а не выносить в отдельный кондишинал тайп: "T extends [infer S extends string, ...unknown[]] ? S : never;";
- продолжу завтра этот же релиз - вышел объемным.

Параллельно займусь изучением английского через перевод текстов. Начну со сборника упражнений Кэнского Сергея, а продолжу переводом книг из цикла ЖЗЛ.

Кэнский Сергей Еxеrcisе 1. Two sentences.

1. Егo сoветы всегдa бывaют тaкими убедительными (convincing). Пoчему ты никoгдa им не следуешь?
Me: His advices is always so convincing. Why do you never follow it?
Translator: His advice is always so convincing. Why do you never follow it?
Ошибки:
- не исчисляемое существительное (advice).

2. Кaкaя ненaстнaя (nasty) пoгoдa! В тaкую дoждливую пoгoду лучше сидеть дoмa.
Me: What a nasty weather! It's better to stay at home in such rainy weather.
Translator: What nasty weather! It's better to stay at home in such rainy weather.
Ошибки:
- добавил ненужный артикль (погода - неисчисляемое существительное).
image.png12 Кб, 558x114
учебнонакопительный!1LoKsuEs0s 32 765346
>>5342
Наглядное пояснение к "keyof (Foo | Bar)".
image.png61 Кб, 1261x706
26 day учебнонакопительный!1LoKsuEs0s 33 765583
Тайпскрипт. Одна задача и release-notes.

IsUnion. Чуть не сдох пока решал, пришлось взять помощь зала. Никак не проходили тесты с "never". Кто хочет, может попробовать решить (не способом со скрина). Догадался сам до проверки через "<T, C = T> T extends T ? C extends T ? здесь_один_элемент : здесь_обединение : never", но как дальше быть с IsUnioun<never>?

release-notes/typescript-4-7.html:
- добавлены две директивы: "in" и "out" (это что-то про инварианты и расширяемые типы, например, A extends B => out A принимает так же B, и наоборот, in B принимает так же A - а ещё есть комбинация in out, не понял зачем).

Кэнский Сергей Еxеrcisе 1. Two sentences.

3. Oнa дeлaeт хoрoшиe успeхи в aнглийскoм.
Me: She makes good successes in English.
Translator: She is making good progress in English.
Ошибки:
- использовал буквально success, а не progress;
- использовать форму Preset Continuous.

4. Я удивлeн (be surprised), чтo oнa пoвeрилa этим стрaнным нoвoстям. Бoюсь, oни нeдoстoвeрны. Ктo их eй сooбщил?
Me: I'm suprised that she believed this strange news. Guess, it isn't true. Who did tell her this?
Translator: I'm suprised that she (has) belived this strange news. I'm afraid, it's not true. Who told it for her?
Ошибки:
- "im afraid" instead of "guess";
- "Who told it for her?" istead of "Who did tell her this?" (само наличие вопроса "Who" разрешает составлять вопросительную конструкцию не по грамматике).
image.png213 Кб, 1088x879
27 day учебнонакопительный!1LoKsuEs0s 34 765783
Гит. Книга "Pro Git". 15 / 557 стр.

Содержание, предисловие и введение.

Кэнский Сергей Еxеrcisе 1. Two sentences.

5. Мнe кaжeтся, эти вeсы слoмaны.
Me: It seems to me this weights is broken.
Translator: I think these scales are broken.
Ошибки:
- перевод слова весы - scales;
- весы - с чего-то вдруг исчисляемое, но ладно.

6. Вчeрa я пoлoжил сюдa дeньги. Гдe oни? Я нe мoгу их нaйти.
Me: Yesterday i put money here. Where is they? I cannot find this.
Translator: Yesterday I put money here. Where is it? I can't find it.
Ошибки:
- "it" instead of "they";
- "it" instead of "this".

С Тайпскриптом мы не прощаемся, а говорим "до скорой встречи!". Пока переключусь на Гит. Начну с теории: книга Скотта Чакона "Pro Git". На Тайпскрипт потребуется ещё около 40 дней - продолжу заниматься им с ~Нового года.

Денюжка всё так и не копится, но это поправимо. Настроение в норме - 5/10.
image.png206 Кб, 1114x887
учебнонакопительный!1LoKsuEs0s 35 765979
Гит. Книга "Pro Git". 21 / 557 стр.

Конспект:
- система контроля версий предназначена для записи изменений в течение времени и возможности возвращаться на любое изменение в истории;
- поддерживается любой формат файла, не обязательно текст;
- Гит - распределенная система контроля версий: каждый клонированный репозиторий является полным бэкапом;
- один проект можно разделять на несколько репозиториев и работать с отдельными людьми;
- Гит разработал Торвальдс 2005 году для совместной работы над ядром Линукса;
- в отличии от других СКВ Гит за каждый хранит снимки (запоминает состояние файлов), а не дельту (только изменения в файлах);
- для оптимизации, если файл не изменился, Гит хранит ссылку на предыдущий сохраненный снимок этого файла, а не делает для него отдельный снимок.

Кэнский Сергей Еxеrcisе 1. Two sentences.

7. Я считaю, чтo пoмeщeниe для нaшeгo мaгaзинa впoлнe пoдхoдящee.
Me: By my opinion, this place suits enough for our store.
Translator: I think that the premises for our shop are quite good.
Ошибки:
- premises - помещение (прэмизис);
- помещение (снова исчисляемое) и are quite good.

8. Мнe нe нрaвятся эти джинсы. Мнe кaжeтся, тa пaрa джинсoв лучшe.
Me: I dont like these jeans. I think that pair of jeans are better.
Translator: I don't like these jeans. I think that pair of jeans is better.
- jeans (неисчисляемое) - is.
29 day учебнонакопительный!1LoKsuEs0s 36 766283
Гит. Книга "Pro Git". 27 / 557 стр.

Конспект:
- Гит перед сохранением вычисляет хеш-сумму (SHA-1) для каталогов и файлов, присваивая соответствующие названия;
-! в Гите три основных состояния: modified, staged и commited;
- modified - изменённый, но не помеченный для включения в следующий commit;
- staged - изменённый файл и помеченный для включения в следующий commit;
- commited - сохранён в локальном репозитории;
-! в Гите три основные секции: working tree, staging area и git direcotry (repository);
- working tree - отдельный снимок состояния проекта (извлекается из сжатой базы данных каталогов Гит и помещается на диск);
- staging area - это файл в каталоге Гит куда пишутся все изменения, которые будут входить в следующий снимок;
- git direcotry (repository) - самая важная часть, где всё-всё хранится (скрытый каталог .git): от метаданных репозитория до всех снимков.

Вим. https://github.com/iggredible/Learn-Vim Chapter 0.

Вступительная глава.

Содержание:
- отмечается, что имеется несколько источников изучения (в пример приводятся vimtutor и :help), но в своей книге автор собрал ~20% наиболее полезной информации;
- если перейти на Вим сразу, то в первое время это скажется на продуктивности, поэтму автор рекомендует переходить постепенно, уделяя Виму каждый день небольшое количество времени, пока не появится уверенность, а уже потом использовать Вим как основной/единственный редактор;
- автор в своей учебной программе акцентирует внимание на практику (поэтому постараюсь повторять каждый приведенный пример у себя в редакторе).

Переводить предложения на английский лучше продолжу устно. Попробую параллельно по чуть-чуть учить Вим, авось за год что-то из этого выйдет.
30 day учебнонакопительный!1LoKsuEs0s 37 766446
Гит. Книга "Pro Git". 34 / 557 стр.

Конспект:
- Гит настраивается через утилиту git config;
-! у Гита три области видимости конфига: --system (вся система), --global (конкретный пользователь системы), -- local (конкретный репозиторий - значение по умолчанию);
- git config --list (--show-origin) - выводит список установленных настроек;
- две обязательные настройки: user.name & user.emal;
- создать репозиторий можно двумя способами: git init (создать новый из каталога) или git clone (клонировать существующий).

Автор отметил, что первые главы самые важные, поэтому правильно будет их просмаковать.

Вим. https://github.com/iggredible/Learn-Vim Chapter 1.

Конспект:
- :w file.txt - сохранить и записать в определенный файл;
- vim f1.txt f2.txt f3.txt - открывает несколько файлов в отдельных буферах (можно предать флаг -o и все откроются в сплите);
- vim +%s/pancake/bagel/g f1.txt - открывает Вим и сразу запускает переданную "+{cmd} / -c {cmd}" команды;
- vim -oN - открывает N окон в горизонтальном сплите (-ON - в вертикальном);
-! можно свернуть Вим через Ctrl+Z/:stop/:suspend и вернуть обратно написав в терминал "fg";
- запускать Вим можно передавая результат выполнения команд через пайп: ls -l | vim -.
31 day учебнонакопительный!1LoKsuEs0s 38 766576
Гит. Книга "Pro Git". 40 / 557 стр.

Конспект:
- бывают два типа файлов: отслеживаемые и неотслеживаемые;
- проверить можно через git status;
- после отслеживания файла через git add он сразу попадает в stage;
-! git add применим как к новым, так и к отслеживаемым модифицированным файлам;
- .gitignore для игнорирования файлов в списке неотслеживаемых и вообще попадания в репозиторий;
- build/ - слеш в конец, чтобы обозначить каталог.

Вим. https://github.com/iggredible/Learn-Vim Chapter 2.

Конспект:
-! в Виме три вида отображения: окна, буферы и табы;
- (set hidden) для автоматического сохранения буферов между переключениями;
- переключения :bnext/:buffer NAME/:buffer NUMBER;
- закрыть все буферы :qall/:wqall/:qall!;
- окно - визуальное представление буфера;
- переключение между окнами - Ctrl-W H/J/K/L;
- несколько окон может визуализировать один буфер;
- Ctrl-W C - закрывает окно, но буфер остается;
- Ctrl-W V/S (создает горизонтальное окно или вертикальное с текущим буфером);
- Ctrl-W O (:only) - закрывает все окно, оставляя только активное;
- :vsplit/:split/:new filename - открывает файл/буфер в новом окне;
- отдельная вкладка - отдельный набор окон;
- vim -p file1.js file2.js file3.js (флаг -p открывает файлы в новых вкладках);
- автор предпочитает использовать одно окно и один буфер;
- в редких случаях автор использует несколько окон, чтобы сравнить файлы или прочитать документацию;
- вместо табов автор использует окна tmux.
31 day учебнонакопительный!1LoKsuEs0s 38 766576
Гит. Книга "Pro Git". 40 / 557 стр.

Конспект:
- бывают два типа файлов: отслеживаемые и неотслеживаемые;
- проверить можно через git status;
- после отслеживания файла через git add он сразу попадает в stage;
-! git add применим как к новым, так и к отслеживаемым модифицированным файлам;
- .gitignore для игнорирования файлов в списке неотслеживаемых и вообще попадания в репозиторий;
- build/ - слеш в конец, чтобы обозначить каталог.

Вим. https://github.com/iggredible/Learn-Vim Chapter 2.

Конспект:
-! в Виме три вида отображения: окна, буферы и табы;
- (set hidden) для автоматического сохранения буферов между переключениями;
- переключения :bnext/:buffer NAME/:buffer NUMBER;
- закрыть все буферы :qall/:wqall/:qall!;
- окно - визуальное представление буфера;
- переключение между окнами - Ctrl-W H/J/K/L;
- несколько окон может визуализировать один буфер;
- Ctrl-W C - закрывает окно, но буфер остается;
- Ctrl-W V/S (создает горизонтальное окно или вертикальное с текущим буфером);
- Ctrl-W O (:only) - закрывает все окно, оставляя только активное;
- :vsplit/:split/:new filename - открывает файл/буфер в новом окне;
- отдельная вкладка - отдельный набор окон;
- vim -p file1.js file2.js file3.js (флаг -p открывает файлы в новых вкладках);
- автор предпочитает использовать одно окно и один буфер;
- в редких случаях автор использует несколько окон, чтобы сравнить файлы или прочитать документацию;
- вместо табов автор использует окна tmux.
32 day учебнонакопительный!1LoKsuEs0s 39 766803
Гит. Книга "Pro Git". 48 / 557 стр.

Конспект:
- команда git diff для просмотра дельты модифицированных, но неиндексированных файлов;
- команда git diff --staged для просмотра дельты индексированных файлов;
- под это дело есть плагин vimdiff;
-! вызывать git commit -v (с флагом -v) позволяет увидеть дельту при коммите;
- git commit -a (быстрый коммит с автоматической индексацией всех файлов, можно комбинировать с -m: git commit -am "test");
-! git rm удаляет файл из репозитория/индекса (делает его неотслеживаемым);
- git rm --cached filename - удаляет из индекса, но оставляет на диске;
- Гит не запоминает имена файлов, но распознает перемещения;
- переименовать файл: git mv file_from file_to (три команды в одной: mv & rm & add).

Вим. https://github.com/iggredible/Learn-Vim Chapter 3.

Конспект:
- открывать файлы, находня нужный через <TAB> - :edit a<TAB> - ускоряет процесс поиска нужного файла;
- :edit .yml<Tab> - предлагает список, который перелистывается табом;
- :edit /
.yml<Tab> - рекурсивный поиск;
- :vim /pattern/
/ - открывает файлы c паттерном (:cnext - переключение) - грузится все в память, нежелательно;
-! :grep -R "pattern"
/ - предпочтительнее;
-! netrw (% - create file, d - create dir, R - rename file/dir, D - delete file/dir);
-! полезные плагины с fuzzy поиском, например, telescope, fzf и т.д.
33 day учебнонакопительный!1LoKsuEs0s 40 766920
Гит. Книга "Pro Git". 55 / 557 стр.

Конспект:
- git log выводит историю коммитов;
- флаг -p (--patch) выводит изменения;
- --pretty=oneline выводит в одну строчку информацию по каждому коммиту;
- --graph выводит истрию слияний;
-! git log -- filename выводит коммиты по файлу;
-! git log -S string выводит коммиты, где string удалена или добавлена;
-! доступны флаги --author и --grep.

Вим. https://github.com/iggredible/Learn-Vim Chapter 4.

Конспект:
- } - motion по параграфам;
- cc - удаляет всю строку и переходит в инсерт мод;
- di( или da( (удалеяет внутри - inside, или снаружи - around);
-! dit (удаляет вокруг тега - delite inside tag);
- dip - delete inside paragraph.

Продолжу эту главу завтра.
34 day учебнонакопительный!1LoKsuEs0s 41 767031
Гит. Книга "Pro Git". 59 / 557 стр.

Конспект:
- если запустить git commit --amend сразу после коммита, то можно поменять название;
- если запустить git commit --amend после индекса перед коммитом, то предыдущий коммит будет заменен новым;
-! git reset HEAD filename - удаляет файл из стейджа (git add);
- git checkout -- filename - меняет состояние файла в рабочей директории на момент последнего коммита;
-! git restore --staged filename - убирает файл из индекса;
-! git restore (without staged) - откатывает изменения в файле по последнего коммита.

Сегодня важная тема с откатом изменений.

Вим. https://github.com/iggredible/Learn-Vim Chapter 4.

Конспект:
-! можно выделять текст и запускать внешние терминальные команды (:!column -t -s "|") - через !;
-! можно не переходить командый режим, а воспользоваться verb + noun: !};
-! можно передавать несколько команд через пайп util1 | util2 | ...;
- gU(motion) - возводит в верхний регистр (u - нижний).

Чем больше узнаю о Виме, тем скорее хочется настроить свой сетап tmux+neovim+plugins.
Обновить тред
« /dr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски

Скачать тред только с превьюс превью и прикрепленными файлами

Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах.Подробнее