Главная Юзердоски Каталог Трекер NSFW Настройки

Дневнички

Ответить в тред Ответить в тред
Check this out!
<<
Назад | Вниз | Каталог | Обновить | Автообновление | 113 84 5
Хочу сколотить капитал. И учиться. учебнонакопительный !1LoKsuEs0s 19/10/24 Суб 07:08:13 761654 1
file.mp4 4028Кб, 224x224, 00:01:42
224x224
Хочу сколотить капитал. И учиться.
1 day учебнонакопительный !1LoKsuEs0s 19/10/24 Суб 07:22:15 761655 2
image.png 54Кб, 1279x697
1279x697
Решал очередную задачу по Тайпскрипту - аж 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 20/10/24 Вск 07:22:21 761814 3
image.png 46Кб, 1274x702
1274x702
image.png 47Кб, 1277x714
1277x714
Снова Тайпскрипт.

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

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

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

money:
wallet - [0_000] RUB
crypto - [0_000] $
Аноним 20/10/24 Вск 07:38:12 761815 4
image.png 13Кб, 601x169
601x169
image.png 60Кб, 729x767
729x767
>>761814
Разобрался. "any" - супертип и поглощает (расширяет) все подтипы в юнитах.

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

На сегодня всё.
3 day учебнонакопительный !1LoKsuEs0s 21/10/24 Пнд 05:15:34 761924 5
image.png 46Кб, 1270x720
1270x720
image.png 55Кб, 1273x723
1273x723
image.png 53Кб, 1271x709
1271x709
Тайпскрипт. Три задачки.

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

Решение для второй задачи написал сразу, но тесты не проходили. Спустя 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 !1LoKsuEs0s 22/10/24 Втр 07:53:43 762066 6
image.png 52Кб, 1278x727
1278x727
image.png 58Кб, 1275x732
1275x732
Тайпскрипт. Две задачи.

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

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

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

money:
wallet - [8_000] RUB
crypto - [0_000] $
учебнонакопительный !1LoKsuEs0s 22/10/24 Втр 08:56:49 762071 7
image.png 19Кб, 715x261
715x261
>>762066
1. [any] extends [number] ? 1 : 2; // 1
2. any extends number ? 1 : 2; // 1 | 2

Я так и не смог разобраться, почему без скобок запиналось на "any extends number" во второй задаче. Эх, вот бы кто-нибудь умный объяснил...
22/10/24 Втр 09:04:15 762072 8
image.png 22Кб, 523x246
523x246
>>762071
Вот такой результат без скобок "[1, 2] | [1, 2, any]". Со скобками же множества объединяются "(1 | 2 | any)[]" - правильно понял?
5 day !1LoKsuEs0s 23/10/24 Срд 06:21:36 762174 9
image.png 58Кб, 1277x743
1277x743
image.png 53Кб, 1276x719
1276x719
Тайпскрипт. Две задачи.

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

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

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

money:
wallet - [8_000] RUB
crypto - [0_000] $
Аноним 23/10/24 Срд 19:35:24 762257 10
>>762174
Анончик, что это за сайт у тебя на пикрил?
6 day учебнонакопительный !1LoKsuEs0s 24/10/24 Чтв 09:29:26 762335 11
image.png 53Кб, 1279x716
1279x716
image.png 65Кб, 1275x756
1275x756
Тайпскрипт. Две задачи.

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

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

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

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

>>762257
https://bigfrontend.dev/
7 day учебнонакопительный !1LoKsuEs0s 25/10/24 Птн 10:59:19 762481 12
image.png 51Кб, 1278x727
1278x727
Тайпскрипт. Одна вчерашняя нерешенная задача.

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

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

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

money:
wallet - [8_000] RUB
crypto - [0_000] $
8 day учебнонакопительный !1LoKsuEs0s 26/10/24 Суб 10:09:46 762622 13
image.png 47Кб, 1135x743
1135x743
image.png 113Кб, 1216x730
1216x730
image.png 61Кб, 1161x797
1161x797
image.png 104Кб, 1130x709
1130x709
Тайпскрипт. Поскольку вчера BFE внезапно отвалился и был недоступен несколько часов, параллельно начал решать задачи на "type-challanges". Вообще, Тайпскрипту не хочу уделять больше двух месяцев, поэтому постепенно буду увеличивать количество решаемых задач в день. Небольшой прогресс ощущается. Две задачи.

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

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

money:
wallet - [8_000] RUB
crypto - [0_000] $
9 day учебнонакопительный !1LoKsuEs0s 27/10/24 Вск 08:32:03 762797 14
image.png 93Кб, 1128x641
1128x641
image.png 78Кб, 1273x804
1273x804
Тайпскрипт. Одна клятая задача.

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

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

money:
wallet - [8_000] RUB
crypto - [0_000] $
10 day учебнонакопительный !1LoKsuEs0s 28/10/24 Пнд 07:48:54 762914 15
image.png 54Кб, 1270x762
1270x762
image.png 166Кб, 1235x757
1235x757
image.png 125Кб, 1240x770
1240x770
Тайпскрипт. Три задачи.

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

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

First. Совсем всё просто: если кортеж пустой (т.е T['length'] extends 0) - возвращаем "never", если есть хотя бы один элемент - возвращаем первый (T[0]).
Аноним 28/10/24 Пнд 09:41:00 762919 16
Есть познания в JS или ты сразу в ТС вкатился?
11 day учебнонакопительный !1LoKsuEs0s 29/10/24 Втр 09:16:46 763211 17
image.png 49Кб, 1277x734
1277x734
image.png 59Кб, 1279x761
1279x761
image.png 122Кб, 1223x779
1223x779
Тайпскрипт. Три задачи.

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

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

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

>>762919
JS изучал, но он в TS совсем не помощник.
12 day учебнонакопительный !1LoKsuEs0s 30/10/24 Срд 08:10:05 763462 18
image.png 147Кб, 1254x708
1254x708
image.png 106Кб, 1205x687
1205x687
Тайпскрипт. Две задачи.

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 31/10/24 Чтв 06:55:14 763563 19
image.png 97Кб, 1001x726
1001x726
image.png 154Кб, 1169x717
1169x717
Тайпскрипт. Две задачи и 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 01/11/24 Птн 07:24:42 763741 20
image.png 140Кб, 1192x770
1192x770
image.png 72Кб, 1273x718
1273x718
Тайпскрипт. Две задачи и release-notes 3.6.

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

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

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

release-notes/typescript-3-6.html:
- добавили проверку возвращаемого типа функцией-генератором;
- улучшили развёртывание через array spread;
- добавили проверку на наличие дженерика "Promise<T>".
15 day учебнонакопительный !1LoKsuEs0s 02/11/24 Суб 05:41:57 763976 21
image.png 109Кб, 1055x742
1055x742
Тайпскрипт. Одна задача и 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 03/11/24 Вск 07:51:01 764321 22
image.png 123Кб, 1122x780
1122x780
image.png 117Кб, 1192x759
1192x759
image.png 175Кб, 1202x833
1202x833
Тайпскрипт. Три задачи и 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 04/11/24 Пнд 08:54:10 764400 23
image.png 119Кб, 1154x770
1154x770
image.png 115Кб, 1204x668
1204x668
Тайпскрипт. Две задачи и 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 05/11/24 Втр 09:17:22 764533 24
image.png 63Кб, 1273x730
1273x730
image.png 63Кб, 1269x687
1269x687
Тайпскрипт. Две задачи и 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;
- добавили фишки в редактор кода с автоматическим редактированием.
19 day Аноним !1LoKsuEs0s 06/11/24 Срд 12:13:20 764669 25
image.png 93Кб, 1264x783
1264x783
Тайпскрипт. Одна задача и release-notes.

release-notes/typescript-4-1.html:
- добавили `${тип}${строкового}${литерала}`;
- добавили оператор "as" в переборе ключей ([K in keyof T as NewKeyType]).
20 day учебнонакопительный !1LoKsuEs0s 07/11/24 Чтв 12:31:15 764788 26
image.png 61Кб, 1271x730
1271x730
Тайпскрипт. Одна задача и 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 08/11/24 Птн 10:47:44 764916 27
image.png 44Кб, 1254x719
1254x719
image.png 58Кб, 1261x693
1261x693
Тайпскрипт. Две задачи и release-notes.

release-notes/typescript-4-3.html:
- добавлена директива "override" на методы класса (вызовет ошибку, если в базовом классе этот метод не определён);
- вызывается ошибка в кондишите, если промис был вызван без "await";
- добавлена возможность объявлять статичные методы в классе таким образом - "static [propName: string]: string | number | undefined".
22 day учебнонакопительный !1LoKsuEs0s 09/11/24 Суб 05:48:28 764999 28
image.png 65Кб, 1274x726
1274x726
image.png 64Кб, 1247x745
1247x745
image.png 65Кб, 1261x709
1261x709
Тайпскрипт. Три задачи и 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), которые вызываются перед конструктором.
23 day учебнонакопительный !1LoKsuEs0s 10/11/24 Вск 09:32:24 765131 29
image.png 65Кб, 1263x726
1263x726
Тайпскрипт. Одна задача и 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 { ... }".
24 day учебнонакопительный !1LoKsuEs0s 11/11/24 Пнд 11:03:51 765222 30
image.png 68Кб, 1263x695
1263x695
Тайпскрипт. Одна задача и 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)";
- больше ничего полезного не нашел.
25 day учебнонакопительный !1LoKsuEs0s 12/11/24 Втр 06:24:04 765342 31
image.png 48Кб, 1261x742
1261x742
Тайпскрипт. Одна задача и 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.
Ошибки:
- добавил ненужный артикль (погода - неисчисляемое существительное).
учебнонакопительный !1LoKsuEs0s 12/11/24 Втр 07:28:13 765346 32
image.png 12Кб, 558x114
558x114
>>765342
Наглядное пояснение к "keyof (Foo | Bar)".
26 day учебнонакопительный !1LoKsuEs0s 13/11/24 Срд 06:59:21 765583 33
image.png 61Кб, 1261x706
1261x706
Тайпскрипт. Одна задача и 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" разрешает составлять вопросительную конструкцию не по грамматике).
27 day учебнонакопительный !1LoKsuEs0s 14/11/24 Чтв 06:24:40 765783 34
image.png 213Кб, 1088x879
1088x879
Гит. Книга "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.
учебнонакопительный !1LoKsuEs0s 15/11/24 Птн 07:21:05 765979 35
image.png 206Кб, 1114x887
1114x887
Гит. Книга "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 16/11/24 Суб 06:32:29 766283 36
image.png 235Кб, 1074x902
1074x902
image.png 96Кб, 1209x783
1209x783
Гит. Книга "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 17/11/24 Вск 07:07:46 766446 37
image.png 205Кб, 1081x894
1081x894
image.png 63Кб, 1172x766
1172x766
Гит. Книга "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 18/11/24 Пнд 06:57:18 766576 38
image.png 166Кб, 1076x889
1076x889
image.png 67Кб, 1137x677
1137x677
Гит. Книга "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 19/11/24 Втр 09:24:21 766803 39
image.png 143Кб, 1109x902
1109x902
image.png 67Кб, 1096x748
1096x748
Гит. Книга "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 20/11/24 Срд 06:59:38 766920 40
image.png 161Кб, 1081x894
1081x894
image.png 77Кб, 1098x744
1098x744
Гит. Книга "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 21/11/24 Чтв 08:36:40 767031 41
image.png 76Кб, 1080x742
1080x742
image.png 204Кб, 1109x892
1109x892
Гит. Книга "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.
35 day учебнонакопительный !1LoKsuEs0s 22/11/24 Птн 10:44:53 767187 42
image.png 134Кб, 1074x881
1074x881
image.png 82Кб, 1042x758
1042x758
Гит. Книга "Pro Git". 65 / 557 стр.

Конспект:
- к одному проекту может быть подключено несколько репозиториев;
-! посмотреть список репозиториев через команду git remote (-v);
- origin - имя клонированного репозитория по умолчанию;
-! добавить репозиторий: git remote add shortname url;
-! git push/pull shortname;
-! при git pull shortname создается ветка с префиксом: branchname -> shortname/branchname;
- pull = fetch + merge;
- git remote show shortname - показывает состояние удаленного репозитория и что будет при pull/push;
- git remote rm shortname (удаление) git remote rename old new (переименование).

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

Конспект:
-! set relativenumber number относительные номера строк;
- w - начало слова, e - конец;
- предыдущее слово: b - начало, ge - конец;
-! нижний регистр - a-zA-Z0-9_, верхний регистр - все символы (W, E, B, gE).

Эту же главу на завтра.
36 day учебнонакопительный !1LoKsuEs0s 23/11/24 Суб 08:50:25 767289 43
image.png 181Кб, 1080x899
1080x899
image.png 90Кб, 1075x751
1075x751
Гит. Книга "Pro Git". 71 / 557 стр.

Конспект:
- посмотреть список тегов git tag;
- git tag -l "v1.1" выводит список тегов, которые соответствуют шаблону;
-! существует два типа тегов: легковесные и аннотированные;
-! легковесный тег - просто указатель на коммит, его алиас;
-! аннотированные теги хранятся в базе Гита как объекты и содержат информацию: author's email & name, date, comment and etc...;
-! создать аннотированный тег: git tag -a v1.2 -m "message";
-! показать информацию git show v1.2;
-! помечать уже созданные коммиты: git tag v1.3 commithash;
-! теги автоматически не отправляются на сервер, их нужно отправлять явно: git push origin v1.2 или git push --tags;
-! если нужно переключиться на тег и сделать изменения, то обязательно нужно создать ветку в чекауте, иначе detached HEAD: git checkout -b ver2 v2.0.0.

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

Конспект:
- t - аналог f но позиционирование перед символом;
-! ";" - повторяет последний поиск "," - в обратную сторону;
- ( и ) - навигация между предложениями;
- { и } - навигация между параграфами;
-! CTRL+F/CTRL+B - листать вниз/вверх на весь экран;
-! CTRL+D/CTRL+U - листать вниз/вверх на половину экрана;
-! zt (Top) zz (Middle) zb (bottom) - листает, но оставляет курсор (относительно верха экрана, низа или в центра);
-! nnoremap <esc><esc> :noh<return><esc> - забиндить снятие подсветки после поиска;
-! искать слово под курсором -
, поиск назад - # (g* и g# сразу перемещают на следующее слово);
-! марки ma-Z - верхний регистр - глобальные (между файлами), нижний - только в файлах (локальные марки хранятся в буферах);
- 'mark - перемещает на строку, `mark - точное позиционирование на момент создания;
- H - перемещение курсора в вверх окна, L - перемещение курсора вниз окна;
-! CTRL+O and CTRL+I - перемещение вперед/назад между джампами.

Накрыла продолжительная меланхолия. С 1 января определенно нужно менять жизнь. Есть время подумать, что именно требует изменений. Тяжело заниматься в таком психоэмоциональном состоянии, но пока ползу по чуть-чуть. Срочно нужен душевный подъем!
37 day учебнонакопительный !1LoKsuEs0s 24/11/24 Вск 08:38:45 767375 44
image.png 74Кб, 1080x780
1080x780
image.png 104Кб, 1069x760
1069x760
Гит. Книга "Pro Git". 81 / 557 стр.

Конспект:
- можно устанавилвать алиасы: git config --global alias.unstage 'reset HEAD --';
-! Гит хранит снимки в виде информации о коммите и ссылки на дерево каталога, который ссылается на blob-файлы и другие каталоги;
-! каждый коммит хранит ссылку на своего родителя;
-! ветка - премещаемый указатель на коммит;
-! HEAD - указатель на текущую локальную ветку;
- git checkout branchname - переключение на ветку;
-! git branch branchname - создать ветку.

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

Конспект:
-! A - перейти в исёрт в конец строки, I - в начало;
-! s - удаляет символ под курсором и переходит в инсёрт, S - строку;
-! gi - вернуться в место последнего инсёрта;
-! выходить из инсерт режима CTRL+C - но не работают сокращения;
- inoremap jj <Esc> - перебиндить выход;
-! 10i - 10 раз повторит введенное;
-! Ctrl-h - удалить символ, Ctrl-w - удалить слово, Ctrl-u - удалить строку.

Продолжу эту главу завтра.
учебнонакопительный !1LoKsuEs0s 24/11/24 Вск 10:52:47 767386 45
Мне нужна хорошая учебная программа/литература по Linux для профессионалов. Что-то проверенное есть предложить? В Интернете много всего - глаза разбегаются.
38 day учебнонакопительный !1LoKsuEs0s 25/11/24 Пнд 06:34:07 767476 46
image.png 61Кб, 1058x753
1058x753
image.png 117Кб, 1068x875
1068x875
Гит. Книга "Pro Git". 90 / 557 стр.

Конспект:
- при переключении между ветками не должно быть незафиксированных изменений с конфликтами;
-! чтобы ВЛИТЬ изменения В МАСТЕР нужно приключиться на МАСТЕР и сделать git merge branchname;
-! git merge branchname - будет обновлена текущая ветка, а изменения будут браться из branchname;
- при fast-forward слиянии просто перемещается указатель ветки вперед;
-! не забывать удалять ненужные ветки: git branch -d branchname;
- когда Гит не может выполнить фастфорвард, он делает снимок трехстороннего слияния на базе общего родительского коммита;
-! если изменены одни и те же файлы по-разному, Гит создает конфликт и откладывает коммит слияния;
- посмотреть конфликтные файлы через git status;
-! после разрешения конфликтов нужно добавить файлы в индекс (git add) и закоммитить (git commit).

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

Конспект:
-! во время инсёрта ставить текст из регистра (yank) - CTRL+R + yankid (крайний - 0);
-! поместить в регистр "a" слово - "ayiw;
-! перейти в сабмод - CTRL-X;
- submode + CTRL-Y/E - скролл вверх/вниз;
- autocomplete submode + CTRL-L (all line) or CTRL-I (included);
-! to avoid submode - just use Ctrl-N/P;
- Вим ищет автодополнения во всех открытых буферах;
-! перейти в нормалмод из инсёрта на одну команду - Ctrl+O;
-! например, можно джампнуть на марку в инсёртмоде - Ctrl-O 'a;
- Ctrl-O 100ihello - Insert "hello" 100 times;
- Ctrl-O !! curl https://google.com - Run curl;
- Ctrl-O !! pwd - Run pwd;
-! Ctrl-O dtx - Delete from current location till the letter "x".
39 day учебнонакопительный !1LoKsuEs0s 26/11/24 Втр 10:18:17 767546 47
image.png 53Кб, 1078x661
1078x661
Гит. Повторял конспект с 27 дня по 38.

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

Конспект:
- повторять последнее изменение через точку (.);
- учитываются все зименения, кроме командых операций (:);
-! df,.. - удаляет до запятой и повторяет (df,) через точку;
-! A,<Esc> - добавить в конец запятую, а потом j. - тоже сработает как повторение команды;
-! вспомнить про блочное выделение, удаление и повтор - (CTRL+V2jd w..);
-! вспомнить про /let, run cgnconst<Esc> then .. (с и gn после поиска), здесь gn - motion to the next serach.
40 day учебнонакопительный !1LoKsuEs0s 27/11/24 Срд 11:27:42 767643 48
Гит. Книга "Pro Git". 98 / 557 стр.

Конспект:
- команда git branch (-v) - выводит список веток и помечает звездочкой текущую (на которую указывает HEAD);
-! в проектах несколько стабильных веток (по каждому уровню стабильности): master, development и proposed/pu (предлагаемые обновления);
-! создавать тематическую ветку под отдельную задачу.

Вим. Повторял конспект с 29 дня по 32.
41 day учебнонакопительный !1LoKsuEs0s 28/11/24 Чтв 09:01:07 767703 49
Гит. Книга "Pro Git". 107 / 557 стр.

Конспект:
- удалённые ссылки - это ссылки на ветки, теги и т.д. на удаленном репозитории, их нельзя двигать локально;
-! имена веток слежения имеют вид remote/branchname (например, origin/master);
-! git fetch remote - синхронизация между удаленным сервером и локальным репозиторием;
-! синхронизовать ветки на удаленном сервере через git origin remote branchname;
-! git fetch remote & git merge remote/branchname (по удаленному указателю на ветку);
- git checkout -b branchname remote/branchname (создать отдельную ветку branchname и начать с remote/branchname);
-! находясь на сетке слежения можно выполнить git pull;
-! начать следить за локальной веткой на сервере, находясь на текущей ветке: -git checkout --track remote/branchname;
-! ветка слежения создается автоматически, если ее нет в локальном репо и есть на сервере, командой git checkout branchname;
-! либо если ветка существует, можно задать upstream: git branch -u remote/branchname;
-! git merge @{u} вместо git merge origin/master;
- git branch -vv для дополнительной информации по отслеживаемым веткам (ahead/behind).

Вим. Повторял конспект с 33 дня по 35.
42 day учебнонакопительный !1LoKsuEs0s 29/11/24 Птн 11:00:59 767807 50
Гит. Книга "Pro Git". 115 / 557 стр.

Конспект:
- помимо merge есть rebase - он применяет изменения поверх (команду rebase по отношению к той ветке, поверх которой применять - git rebase master);
-! при перебазировании в коммитах сохраняется только дельта относительно общего родительского коммита;
- перебазирование переместит коммисты из ветки вперед, которые можно уже влить в master (git checkout master & git merge newrebasedcommit);
- перебазирование делает историю коммитов чище (линейной);
-! вспомнить - git rebase --onto master server client;
- git rebase beforebranch afterbranch;
-! не перемещать коммиты уже отправленные на удаленный репозиторий (не выполнять rebase);
- после фетча с сервера и подтягивания результата операции ребейза, локальные ветки у получателя не удаляются, которые были до ребейза, от этого путаница.

Запутанная тема с ребейзами.

Вим. Повторял конспект с 36 дня по 39.
43 day учебнонакопительный !1LoKsuEs0s 30/11/24 Суб 09:52:18 767881 51
Гит. Разбор статьи https://habr.com/ru/articles/161009/ и книга "Pro Git". 118 / 557 стр.

Конспект:
- git pull --reabse (git fetch & git rebase oririn/master);
-! ещё раз: важно применять reabase только для локальных коммитов, которые никто еще не получил иначе коллеги должны вызывать git pull --rebase для полной копии состояния репозитория;
-! при reabase выполняется слияние изменений дельты каждого комита и родительского общего коммита с веткой преобразования по отношению этой ветки;
-! на каждоой итерации слияния может возникнуть конфликт: т.е на каждом коммите с дельтой;
- git rebase --abort - откатить ребейз при конфликте;
- после ребейза у коммита появляется два автора: автор коммита и автор коммита-ребейза;
-! merge коммиты запутывают историю, делая её нечитаемой;
-! при пуш лучше указывать айди ветки явно git push origin master, чтобы всё не передать.

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

Конспект:
- регистры в Виме со знака ";
- удалене (d), янк (y) и т.д добавляют запись в базовый регистр ("0);
- вставлять текст с регистра p/P (10p);
-! вставить текст из регистра a - "ap;
-! регистры бывают разные: пронумерованные ("0-9), именованные ("a-z), ридонли (".), выделения ("*), поисковые ("/) и т.д.

Эту главу на завтра.
44 day учебнонакопительный !1LoKsuEs0s 01/12/24 Вск 10:07:50 767954 52
Гит. Книга "Pro Git". 130 / 557 стр.

Конспект:
- технически можно получать данные из локальных репозиториев друг друга;
- удаленный репозиторий голый (bare) - т.е хранит только .git без рабочего каталога;
- можно установить локальный репозиторий без сети с доступом одной файловой системе;
- помимо этого доступ к репозиторию можно устанавливать по https ("умный" и "тупой") и ssh;
- и ещё специльный гит-протокол;
- репозиторий по https возвращается любым веб-сервером как обычная статика;
- ssh проще настроить на серверах чем веб-сервер;
-! по соглашению bare-репозитории кончаются на .git (project.git);
-! генерировать приватные и публичные ключи через утилиту ssh-keygen в директорию ~/.ssh/;
-! отправлять для аутентификации публичный ключ (.pub) и прописывать для доступа на сервере в ~/.ssh/authorized_keys;
- построчный способ записи (прикольно) - cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys.

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

Конспект:
- вставить регистр в инсёрте Ctrl-R regid;
-! удаление (dd) не перезатирает регистр "0 (только янк);
- "1P после этого каждая команда точки (.) будет инкрементить регистр ("2, "3 и т.д);
-! dw в отличии от dd сохраняется в small-регистрах ("-), а не в нумерованных.

Эту главу продолжу завтра.
45 day учебнонакопительный !1LoKsuEs0s 02/12/24 Пнд 15:37:50 768046 53
Гит. Книга "Pro Git". 143 / 557 стр.

Конспект:
- демоны в Линуксе хранятся в /etc/systemd/name.service;
- простой опенсорс веб-интерфейс к Гиту - GitWeb;
-! GitLab - продвинутый опенсорс современный веб-интерфейс для Гита;
- на Гитлабе есть админ-панель;
-! настройка и сопроводжение своего гит-сервера полезна для организаций, которые не хотят размещать код своего продукта на хостингах (типа Гитхаба), а хотят все хранить на своих серверах;
-! в Гите можно работать над проектом через несколько удаленных репозиториев (у каждой команды свой remote), а управляющий проектом будет собирать изменения каждой команды, сивать изменения локально с основным репозиторием и потом отправлять все изменения в основной репозиторий;
- пример такоого подхода - форк репизитория на Гитхабе.
46 day учебнонакопительный !1LoKsuEs0s 03/12/24 Втр 14:37:51 768092 54
Гит. Книга "Pro Git". 156 / 557 стр.

Конспект:
-! не отпралять ненужные пробелы в коммите (проверить before commit - git diff --check);
-! разделять коммиты по задачам, не делать один большой коммит;
- можно после пустой строки описывать детальное сообщение коммита;
-! краткое сообщение в императивной форме (do it - not done it);
-! одно из отличий от ЦСКВ: в Гите слияние выполняется локально, а не на ЦС;
-! порядок слияния в отслеживаемых ветках не важен, результат будет идентичен, но история будет отличаться;
-! простой воркфлоу на 1-2 разраба: создаем тематическую ветку -> работаем -> сливаем в мастер темтическую ветку -> фетчим изменения -> сливаем origin/master в мастер -> отправляем локальный мастер на сервер.

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

Конспект:
- ". - регистр последнего введенного текста;
- ": - last executed cmd;
- "% - name of current file;
-! "= - expression register (insert mode CTRL + R =26);
- in expression register i can use @regid ("=@0 + 1 - last yanked plus one);
- "+ and "
- регистры для системного клипборда, если включен +clipboard;
- "_dd - blachole register (vim wont remember in "0 or somewhere);
- "/ - last search register;
- there are plugins for register (for ex: vim-peekaboo);
- макросы перезатирают регистры (qaq - overwrites a);
- :call setreg('a', 'hello register a') - установить текст в регистр а;
- :let @a = '' - такой способ очистить регистр;
- :put - вставить регистр на новую строку - :put a;
- :g/end/put _ втавить блекхол (будет пустая строка);
- "" = "0.
47 day учебнонакопительный !1LoKsuEs0s 04/12/24 Срд 16:11:08 768189 55
Гит. Книга "Pro Git". 165 / 557 стр.

Конспект:
- можно запрещать определенным людям пушить в определенные ветки;
- git push -u origin localbranch:tobranch (когда имена не совпадают, спецификация ссылок);
-! git log featureA..origin/featureA (посмотреть изменения локальной и серверной ветки);
- работа отдельных команд в отдельных ветках и конечное слияние через интегратора;
-! изменения в опенсорс вносятся через форк: clone -> create_branch -> commit Xtimes -> rebase_for_better_read? -> fork -> git remote add myfork <url>? -> push_to_fork (git push -u myfork featureA) -> git request-pull origin/master myfork (or PR_via_web_interface);
-! git checkout -b featureB origin/master (создать новую ветку, базируясь на мастере);
-! если кто-то сделал ПР до меня, то можно перебазировать ветку фичи относительно ориджинмастера (чтобы коммиты встали цепочкой после ориджинмастер);
- git merge --squash (сквеш без коммита слияния).
48 day учебнонакопительный !1LoKsuEs0s 05/12/24 Чтв 09:40:24 768229 56
Гит. Туториал https://learngitbranching.js.org/?locale=ru_RU [остановился на 1.1.3]

Ещё практиковался локально. Создал конфликт в двух ветках и разрешил его при слиянии.

Конспект:
- коммиты - сжатые снимки состояния файлов и дельты, когда это возможно;
- желательно делать ветки чаще: эта операция ничего не стоит, но упрощает сопровождение проекта;
- git branch branchName - создает ветку, но не переключается.

Прочитал основные первые две главы в книге, самое время закрепить знания на интерактивном туториале.

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

Конспект:
- макросы позволяют записывать в регистр и запускать последовательность команд;
- qa - начать запись в a, q - закончить, @a - воспроизвести;
-! ~ - переключает регистр под курсором;
-! J - joins two lines in normal mode;
- макрос останавливается, когда получится ошибка;
- запустить макрос в регистре а 99 раз - 99@a;
- :2,3 normal @a - запускает макрос с командного режима в диапазоне строк.

Эту главу на завтра.
49 day учебнонакопительный !1LoKsuEs0s 06/12/24 Птн 12:09:59 768295 57
Гит. Туториал https://learngitbranching.js.org/?locale=ru_RU [остановился на 1.2.3]

Конспект:
- git rebase main - means all commits FROM current branch AFTER main branch;
- HEAD - is a pointer on commit (not only branches);
- detached HEAD means when HEAD points on commit (not branch: HEAD -> C1 <- main);
- move based on HEAD: chechout HEAD^ - to 1 commit ago, chechout HEAD~n - to n commits ago.

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

Конспект:
-! :args *.txt && :argdo g/donut/normal @a && :argdo update - запускает макрос в нескольких файлах по вхождению в строку;
- макросы можно запускать рекурсивно - qa0W~@bq;
- register uppercase A - appends commands to macros lowercase a (insread of recreating from scratch).

Эту главу на завтра.
50 day учебнонакопительный !1LoKsuEs0s 07/12/24 Суб 09:35:07 768350 58
Гит. Туториал https://learngitbranching.js.org/?locale=ru_RU [остановился на 1.4.1]

Конспект:
-! git branch -f branchname HEAD~3/commithash - переместит ветку на выбранное место (branch forcing);
- (для локального отката, локальной втеки) git reset HEAD~1 - откатить изменения на коммит назад и перенести туда ветку;
- (для удаленных веток) git revert HEAD - откатывает изменения коммита, но при этом сохраняет коммит и создает новый коммит-дельту, которая содержит откатанные изменения;
- git cherry-pick <Commit1> <Commit2> <...> - применить CommitN to current commit;
- git rebase -i FROMWHERE для ребейза в интерактивном режиме (предложены будут на выбор комиты от HEAD до FROMWHERE и применены как обычный ребейз - после FROMWHERE);
- можно менять последовательность коммитов в ребейзе, поменял местами строки в интерактивном режиме.

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

Конспект:
- put register - :put a;
- ^[ - replresentation of <Esc>;
-! макросы хранятся в регистрах, поэтому можно поместить отредактированную последовательность команд в нужный регистр - 0"ay$ (в данном случае a);
- another way to amend register's commands: :let @a="commands";
-! в командном режиме можно использовать CTRL+R как и инсёрт моде.

Эту главу на следующий день.
Аноним 07/12/24 Суб 11:56:37 768354 59
>>768350
Я понимаю тягу к знаниям, но в чем смысл настолько сильно копать гит?
51 day учебнонакопительный !1LoKsuEs0s 08/12/24 Вск 10:51:13 768398 60
image.png 58Кб, 885x816
885x816
Гит. Туториал https://learngitbranching.js.org/?locale=ru_RU [остановился на 1.5.1]

Попробовал локально сделать ребейз с конфликтами (решаются через git add & git rebase --continue на каждой итерации слияния).

Конспект:
-! через git rabase -i (в конец) и git commit --amend и потом git rebase -i (обратно) можно поменять коммит в середине истории ветки (если требуются в него изменения), а потом выполнить branch forcing;
-! случай выше можно решить через cherry-pick (вспомни как);
- для branch force нужно находиться на коммите и передвинуть сюда (на HEAD) нужную ветку: git branch -f branchname;
- тег - постоянная ссылка на коммит, в отличии от ветки, которая перемещается по ходу истории;
- коммит в тег делать нельзся (detached HEAD) - нужно создать ветку от тега;
- git describe опционально_ветка - выводит информацию до ближайшего тега в формате версия-коммитов_наззад-gотносительный_хеш_коммита.

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

Конспект:
- можно копировать макросы - :let @z = @a;
- gui{ - перевести в нижний регистр внутри {};
-! :1,$ normal @a игнорирует ошибки в макросе и продолжает запускать на каждой строке до конца файла.

>>768354
Опешил от такого вопроса. В моём мире Гит - один из самых важных и основных инструментов разработчика. В этой связи я не понимаю, какой смысл в том, чтобы знать эту технологию поверхностно. Я планирую начать приминать участие в разработке открытого ПО в следующем году, поэтому мне необходимо сперва изучить все возможности инструмента. Мой подход может быть неэффективен, но сейчас мне так не кажется. На своём опыте я убедился, что стратегия "плюс-минус понял, разберусь уже по ходу дела" мне не подходит: спотыкаюсь на мелочах, принимаю неоптимальные решения и в итоге трачу больше времени. Моё рабочее окружение будет зиждиться на трёх китах: терминале или терминальном мультиплексоре, текстовом редакторе и СКВ. Мне должно быть комфортно, поэтому и берусь за это основательно.
Аноним 08/12/24 Вск 11:54:18 768402 61
>>768398
Мб расскажешь о себе? А то непонятен бэкграунд, куда стремишься.
Аноним 09/12/24 Пнд 11:44:09 768466 62
image.png 59Кб, 878x841
878x841
Гит. Туториал https://learngitbranching.js.org/?locale=ru_RU [остановился на 2.1.2]

Конспект:
-! git rebase beforebranch afterbranch (чтобы не переключаться);
- git branch -f whichbranch tobranch/tocommit;
- HEAD^2 - второй родитель мёрджа (по умолчанию первый - без цифры);
-! git checkout -b branchName HEAD~^2~2 (комбинация модификаторов).

Первый блок пройден.

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

Конспект:
-! кроме :undo (u) есть команда :redo (CTRL-R);
- U (capital) undo all changes on the line;
- CTRL-G + u (indo breakpoint isert mode);
- g+/g- (similar as redo/undo but full tree?);
-! :earlier 10(s/m/h/d) - back file's state by time;
- :undolist (check time last changed);
-! :earlier can pass id form :undolist;
- вспомнить про плагин vim-mundo.

>>768402
На ближайший год план копить деньги и продолжать учиться. Закончить TS и потом SQL, ElasticSearch, Rabbit, Docker и Nginx. Опять-таки, поверхностные знания по каждой перечисленной технологии уже имеются.
53 day учебнонакопительный !1LoKsuEs0s 10/12/24 Втр 08:08:27 768513 63
image.png 35Кб, 884x360
884x360
Гит. Туториал https://learngitbranching.js.org/?locale=ru_RU [остановился на 2.2.1]

Конспект:
- git fetch лучше пулла, чтобы явно синхронизовывать состояние;
- push.default в конфиге (upstream?);
- git fetch & git rebase o/main & git push - норма, история чистая, ребейз локальный;
- git pull --rebase (по умолчанию merge);
-! можно заблокировать ветку main на push и работать с ней только через PR;
-! если сделал лишний коммит не в ту ветку, основную ветку можно подвинуть назад, а на месте текущего коммита создать нужную ветку (помнить, что ветка - просто указатель на коммит).

Осталась полследняя часть в туториале и возвращаюсь обратно к книге.

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

Конспект:
- три режима выделения: v (symbol), V (line) and CTRL-V (block);
- снизу подсказка, какой режим выделения активирован;
- exit via CTRL-C - more comfortable;
-! gv as gi (returns to previous selection);
-! сменить нарпавление выделения курсора в режиме выделения - o.

Эту главу на завтра.

Cpp. https://metanit.com/cpp/tutorial/ [остановился на 1.2]

Начну изучать цпп, а то никак до него не доберусь. Под это дело минут 30 в день имеется.

Конспект:
- cpp создан как расширение си (1969-1973) с классами в 1979-1983;
- компилируется код в набор машинных инструкций, под определенную ОС;
- в языке много стандартов, самый крайний - cpp23 (2023);
- компилятор gcc от GNU (most popular);
- #include <iostream> - для вывода строки на консоль (std::cout);
- g++ source.cpp -o result (exe);
-! g++ instead of (gcc).
- собирает автомаически под платформу, могу хоть -o result.abcd собрать и запустить ./result.abcd - сработает.
54 day учебнонакопительный !1LoKsuEs0s 11/12/24 Срд 10:39:44 768597 64
Вчера клонировал репозиторий neovim и собрал из исходников. Перед сборкой переключился на последнюю стабильную версию через тег v0.10.2 (commit 8b9864 от 3 октября). Клёво.

Гит. Туториал https://learngitbranching.js.org/?locale=ru_RU [остановился на 2.2.4]

Конспект:
- git push [remote] [branch].
- отслеживаемые ветки автоматически после clone;
-! установить отслеживание: git checkout -b [localbranch] [remote/branch] (pull / push для этой втеки линкуются);
-! другой способ - установить -u: git branch -u [remote/branch] localbranch? (не указывать, если нахожусь на ней).

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

Конспект:
- r (replace) in visual mode relacess all selected;
-! множественное добавление (например, ; в конец) через блочное выделение CTRL-V jj $A;^[;
-! multi increment/decrement all highlighted CTRL-X CTRL-A;
-! через блочное выделение CTRL-V jjj g CTRL-A - увеличивает по поряддку на 1 (уникальные айди).

Эту главу на зватра.

Cpp. https://metanit.com/cpp/tutorial/2.2.php

Конспект:
- gcc -Wall - для вывода предупреждений компилятора;
- -std=с++23 - задать стандарт (флаг);
- -pedantic добавить этот флаг и выводить предупреждения, если код не соответствует стандарту;
- return 0 - без ошибок;
- # - директивы препроцессора;
-! компиляция: обработка директив -> создает объектные файлы с машинным кодом из кода -> компоновщик/линкер собирает объектные файлы в одну программу.
55 day учебнонакопительный !1LoKsuEs0s 12/12/24 Чтв 15:02:34 768698 65
Гит. Туториал https://learngitbranching.js.org/?locale=ru_RU - прошел туториал до конца.

Конспект:
- git push <remote> <localCommit>:<remoteBranch> (можно пушить таргетно);
- аналогично git fetch <remote> <branch> (git fetch <remote> <remoteCommit>:<localBranch> - в обратном направлении);
-! git fetch без аргумнтов - все коммиты;
-! можно фетчить комиты выборочно из двух веток (git fetch origin c4:foo) и потом мерджить - может быть полезно;
-! таким образом можно удалить ветку (foo) на сервере, передав в нее ничего - git push origin :foo (так же можно создавать ветку, притянув ничего - git fetch origin :foo);
- git pull принимает те же аргументы.
-! git pull origin main = git fetch origin main && git merge origin/main (сливает в ветку, на которой находимся - важно).
56 day учебнонакопительный !1LoKsuEs0s 13/12/24 Птн 11:41:29 768741 66
Гит. Книга "Pro Git". 175 / 557 стр.

Конспект:
- коммиты (патчи) можно отпралять через почту (format-patch);
- работа с гитом по протоколу IMAP (через гмайловские сервера, например);
- применить патч по почте: git apply name.patch (или git am);
-! можно не добавлять remote для одноразового использования через пул: git pull https://.../project.git;
-! git diff master..somebranch (аналог git log somebranch --not master) - показывает коммиты, которые не включены в мастер с текщей ветки;
-! git diff master - посмотреть изменения, если произойдет слияние с текущей веткой.

Cpp. https://metanit.com/cpp/tutorial/2.5.php

Конспект:
-! __name, _Name, global _nmae - не рекомендуются такие имена, так как компилятор может использовать;
- переменную можно объялять без = - int age {15} или int age (15);
-! int age {22.5} - компилятор выбросит ошибку или предупреждение, а (22.5) и = 22.5 - отбросят дробь и вернут 22;
- int counter {} - инициализация нулем;
- "int x;" - без инициализации может по умолчанию внутри функции быт чем угодно, вне функции - ноль;
- short (–32768 до 32767, unsigned - 0 до 65535) - 2 байта, unsigned/signed char - byte;
- int −2 147 483 648 до 2 147 483 647 (при 4 байтах, но может быть 2 на некоторых архитектурах проца);
- unsigned int 0 до 4 294 967 295;
- long в зависимости от архитектуры может занимать 4 или 8 байт и представляет целое число в диапазоне от −2 147 483 648 до 2 147 483 647 (при 4 байтах) или от −9 223 372 036 854 775 808 до +9 223 372 036 854 775 807 (при 8 байтах);
- unsigned long long: представляет целое число в диапазоне от 0 до 18 446 744 073 709 551 615. Занимает в памяти, как правило, 8 байт (64 бита).
- литералы U, L, UL, ULL: -25L;
- разраяды можно разделять - 1'234'567'890 (аналог _ в js);
- float (4byte), dobule (8byte) and long double (как понял, отличается большей мантиссой и меньшей экспонентой);
-! sizeof(var) - выводит размер сущности в байтах (октеты);
- wchar_t для чаров больше 8бит (кириллица, например);
-! auto - когда трудно подобрать тип и предоставить это компилятору: auto num = 5.
57 day учебнонакопительный !1LoKsuEs0s 14/12/24 Суб 14:49:46 768794 67
Гит. Книга "Pro Git". 190 / 557 стр.

Конспект:
- несколько стабильных веток;
- перебазировать изменения с тематической ветки по отношению к стабльной (в тематической - мёрджи);
-! можно черрипикать в сейбл последний коммит из тематической ветки (чистая история сбейбл веток);
-! git config --global rerere.enabled true - rerere (reuse recorded resolution) - автоматически решает раннее решенные вручную конфликты;
-! или git rerere для разового использования;
- git describe --tags (с флагом, если искать легковесные теги. без --tags только аннотированные);
- git archive для архивирования релиза;
- авторизация на Гитхабе по публичному ssh-ключу;
-! настроить секцию email в профиле (можно скрыть адрес).

Cpp. https://metanit.com/cpp/tutorial/2.8.php

Конспект:
- std::cin >> var (можно по цепочке), std::cout << "str" << std::endl;
- std:: (пространство имён и область вдимости);
- using std::cin (в глобальном скопе);
-! using ullong = unsigned long long (псевдонимы для типов);
-! typedef unsigned long long ullong (аналог выше);
-! при делении a / b для получения флоат - одно из двух тоже флаот должно быть;
-! кастомизация/преобразование типов - static_cast<type>(value) - аналог сишного (тип) значение;
-! перевод в двоичую систему из десятичной делением на 2: есть остаток - 1, нет 2 (частное переходит на следующую итерацию);
- старший разряд бита равен 1 - отрицательное число (11111111 = -1);
- инвертируются биты и добавляется 1 (из + на -);
- << 1 сдвиг право на 1 - умножение на 2, >> 1 - сдвиг вправо на 1 - деление на 2 (<< n = *2^n - умножение на 2 в n).
58 day учебнонакопительный !1LoKsuEs0s 15/12/24 Вск 14:23:57 768845 68
Вим. https://github.com/iggredible/Learn-Vim Chapter 11.

Конспект:
- марки для джампа `< и `> start/end last selected (так же в командном режиме выделенный текст отображается: `<,`>...);
-! Ctrl-O v (works from insert mode);
- diw - целое слово удаляет, если в середине (diW - WORD);
-! vim has select mode expect visual;
-! gh (v), gH (V) gCtrl-h (Ctrl-v).

Cpp. https://metanit.com/cpp/tutorial/2.18.php

Конспект:
- с++17 switch(int a {2}; checkvalue) - instance a variable indise switch;
-! foreach like - for (int n : {2, 3, 4, 5}) or for (char c : "Hello");
-! int &refNumber {number} - number must be same type (int);
-! получаем по ссылке в цикле for (auto& n : numbers);
- for (const auto& n : numbers) - const when we dont need to change value;
-! for (const auto& n : numbers) - also optimize cycle cuz we dont need to copy var n and take it directly;
- const int numbers[4]{1,2,3,4} - const array so we cannot change items;
- sizeof(arr) / sizeof(arr[0]) - length of array.

По ощущениям Цпп изуродован новыми стандартами, эстетически уже не то. Раньше с ссылками получше было, когда явно указывались операции разыменовывания и указателя. Сейчас просто ссылочный тип &var и верти им как хочешь - он сразу разыменованный (как в php). Может тогда сразу Раст уже учить или просто Си повторить. Ладно, всё же этот туториал пройду до конца.
59 day учебнонакопительный !1LoKsuEs0s 16/12/24 Пнд 12:25:45 768900 69
Гит. Книга "Pro Git". 203 / 557 стр.

Конспект:
- пуллреквесты через форки;
-! it possible to make pull request via Github CLI instead of web;
-! PR: fork -> clonse_fork -> create_new_branch -> commit -> check_cahnges? -> push_to_fork_origin_branchname -> go_to_webpage_fork_and_click_pr_button;
- подход к разработке через PR иногда применяется даже в закрытых проектах, где у каждого имеется доступ пушить напрямую, но предпочитают создавать ранний PR и отслеживать изменения в тематической ветке;
-! если мейтенер отклонит запрос на слияние, достаточно просто сделать еще один пуш в тематичсекую ветку на форке и Гитхаб автоматически обновит PR;
-! мейтенер может слить изменения в проект через веб-интерфейс, если без конфликтов, или стянуть изменения и смёрджить локально, и если эта ветка будет слита в мастер, то Гитхаб автоматически закроет PR;
-! PR не обязательно делать через форки, можно делать их между ветками в контексте одного репозитория (может быть полезно для автозапуска CI на PR и проверок кода);
-! решать мёдрж-конфликты обязанность контрибьютора, мейтенеру желательно сливать все изменения одной кнопкой через интерфейс;
-! Гитхаб сообщает в веб-интерфейсе диалога на слияние информацию о конфликтах;
-! при конфликте можно слить целевую ветку (master) в свою, предварительно добавив ремоут на основной репозиторий и подтянув изменения мастера оттуда (со своей ветки git merge upstream/master);
-! либо сделать ребез мастера по отношению свой ветке (переключить на мейн и сделать git rebase mybranch), но ребез сложнее, поэтому лучше мёрджить;
-! если долгоживущая тематическая ветка, то удобно сливать изменения через PR и при необходимости возвращаться к этой ветке, разрешая только неразрешенные (новые) конфликты по отношению к мастер (а не просто мерджить и разрешать конфликты заново, если продолжать через какое-то время работать в этой ветке).

Очень важная для меня тема сегодня. Как оказывается это всё просто! А я так долго откладывал контрибьют в опенсорс, думая, что не справлюсь с созданием PR - на деле ничего страшного.

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

Конспект:
- /\Set - (case sensitive S via \ before it);
- /^dist - starts with (or /dist$ - ends with);
-! // - repeat last search;
- ctrl-p/ctrl-n - листать раннее введенные команды;
-! [range]s/old/new/ - substitute (% - entire file);
-! s/pattern/\0/ - (\0 is matched pattern, & - also works);
- разбиение на группы - :%s/\(\w\+\) \(\w\+\)/\2 \1/ - поменять местами (первое) и (второе) слово во вхождении (в скобки, экран на скобки и +);
-! :%s/\v(\w+) (\w+)/\2 \1/ - аналогично, чтобы не ставить экраны (работает через \v).

Эту главу ещё на потом.
60 day учебнонакопительный !1LoKsuEs0s 17/12/24 Втр 11:04:36 768973 70
Гит. Книга "Pro Git". 215 / 557 стр.

Конспект:
-! #id - добавить в комментарий или описание, чтобы сослаться на PR/issue;
-! у запросов на слияние и ишшус свои айди в контексте проекта #3 ишшус и #3 PR быть не может;
-! username#<num> - форкнутый репо, username/repo#<num> - вообще другой репо;
-! полные ссылки на Гитхаб автоматом сокращаются: https://github...;
-! в PR на который ссылаемся видно что мы на него сослались (автоматом добавляется запись);
-! можно ссылаться на комиты по хешу (полный - 40 символов);
-! [ ] - список задач можно переключать, кликнув по чекбоксу, и сообщение отредактируется само (у всех);
- список задач отображается в списке PR/issue в виде прогрессбара;
- ```html <div></div>``` - код форматировать;
-! > - цитировать текст, на каждую строчку добавлять (выделить текст и нажать r);
- Гитхаб сообщает, если форк отстает от ориганала (This branch is 5 commits behind progit:master);
-! актулизировать ветку: git checkout master & git pull (link to origin repo) && git push origin master;
-! либо добавить ремоут и линкануть свой мастер через апстрим с оригалом;
- клонировать паблик репу по HTTPS - всем, по ssh - только с доуступом к проекту (даже паблик).
61 day учебнонакопительный !1LoKsuEs0s 18/12/24 Срд 14:45:00 769094 71
Вим. https://github.com/iggredible/Learn-Vim Chapter 12.

Конспект:
- s/one/two/c - ask for substitution each occurrence;
- s+a+b+ - instead of slashes;
-! s/a/\U\0/ - change case (via \U before);
-! \<. - first letter of each word (via flag global - g - can change all occurrences);
-! \zs and \ze: s/hot\zscake/dog/ - (analogue (?=) and (<?=)).

Continue this chapter next time.

Cpp. https://metanit.com/cpp/tutorial/4.3.php

Конспект:
- нулевой символ '\0' + 1 элемент в строке;
-! если не установить нуль символ, будет выводить мусор;
-! для работы со строками std::string из модуля <string>;
-! int p{nullptr} - специальная константа, указатель ни на что (или ноль);
- размер указателя не зависит от типа, только от платформы (32 и 64 бит);
-! int
pnumber {&number} - получить адрес по ссылке на намбер;
-! должно быть соответствие типа ссылки и указателя, можно использовать auto - auto pnumber {&number};
-! указатель возвращает адрес начала памяти - 0x1543bffc74 - int - (0x1543bffc74, 0x1543bffc75, 0x1543bffc76, 0x1543bffc77);
-! указатель тоже где-то хранится и мы можем получить ссылку на него &pnumber;
-! dereference to get value -
pnumber;
-! px = 45 - допустимо
- указатели одного типа можно присваивать друг другу - pa = pb;
-! через ссылку на указатель можно менять адрес указателя или значение объекта, куда указывает указатель;
- int
&pRef {p} - указатель на указатель p (int pRef = &p;);
- сравнение указателей pa > pb (по адресу);
-! кастомизация указателя при присвоении в другой тип - int pd {(int )pc};
- void pv {(void)pc} - указатель на void - допустимо;
- cahr* pc - интерпретируется как строка (указатель на чар).
62 day учебнонакопительный !1LoKsuEs0s 19/12/24 Чтв 11:05:29 769205 72
Гит. Книга "Pro Git". 230 / 557 стр.

Конспект:
-! ветки запросов на слияние - псевдовтеки на сервере;
- можно получить эти ветки через git ls-remote <remote>;
- ссылки на запросы на слияние начинаются с refs/pull/ (ссылка на ветку в форке);
-! по умолчанию эти ветки не фетчатся - нужно дописать в конфиге строчку для линковки - +refs/pull/...:refs/remots/....;
-! можно открыть запрос слияния на другой запрос слияния, чтобы модифицировать его;
- через @ обратиться к юзеру (ему придет уведомление);
-! два вида уведомлений: веб и емейл, можно включить только веб и не получать письма;
-! CONTRIBUTING - будет показываться ссылка на файл при запросе на слияние: в нем описываются правила оформления кода, руководство по созданию запроса на слияние и т.д;
- помимо персональных акков есть организации со своим профилем и каталогом репозиториев;
- в организации имеются команды со своим скоупом доступа к проектам.

Тихим ходом.
63 day учебнонакопительный !1LoKsuEs0s 20/12/24 Птн 15:31:15 769329 73
Вим. https://github.com/iggredible/Learn-Vim Chapter 12.
- substitute multiple files :args *.txt & :argdo %s/from/\U\0/c & :argdo update;
- its possible to substitute via marcos (:wnext - saves file and goes to the next :args file).

Cpp. https://metanit.com/cpp/tutorial/4.5.php

Конспект:
-! увеличение указателя на единицу - переход к другому объекту в памяти (увеличение на тип указателя - 4 байта для int и т.п.);
-! разность двух указателей = расстояние между ними ((адрес1 - адрес2) / тип указателя);
-! константный указатель может менять ссылку (присваивать новый объект), но не значение объекта по указателю;
-! указатель на константу - наоборот (выше);
-! константный указатель на константу запрещает обе операции.
66 day учебнонакопительный !1LoKsuEs0s 23/12/24 Пнд 15:25:13 769658 74
Гит. Книга "Pro Git". 248 / 557 стр.

- можно взаимодействовать со сторонними сервисами через сикреткей;
-! можно подключать хуки на события Гитхаб (мегаполезно на авторазвертку ПО в тесте/проде);
- у Гитхаба есть паблик апишка (авторизированные запросы можно делать чаще);
-! очень маловероятен, но возможен случай, когда создастся коммит с тем же хешем SHA-1 (и при переключении будет всегда использоваться первый) у SHA256 больше вариантов и Гит переходит на него;
- git reflog для просмотра перемещения HEAD в истории (local);
- ветка_нет_изменений..ветка_изменения_есть (git diff master..featureA).

Два дня проветривал мозги: не занимался никакой интеллектуальной деятельностью вообще - не работал, не учился, ничего не читал и не смотрел. Надо будет практиковать такие разгрузочные дни раз в месяц. Гит по большому счету освоен, можно дочитывать книгу "по диагонали" и двигаться дальше. Главное я разобрался в базовых вещах и понял как контрибьютить в чужие или мейтейнить свои проекты. Всякие специфичные сценарии можно загуглить по необходимости.
67 day учебнонакопительный !1LoKsuEs0s 24/12/24 Втр 15:39:43 769753 75
Гит. Книга "Pro Git". 256 / 557 стр.

- master...featureA (three ...) - хотя бы в одной ветке, но не в двух сразу (все коммиты);
-! --left-right - полезно (показывает где);
-! git add -i - interactive;
-! индексирование частями via -i;
- git stash / git stash push;
- git stash list - shows all;
-! git stash apply [name] - if name not setted - applies last.
68 day учебнонакопительный !1LoKsuEs0s 25/12/24 Срд 20:53:56 769895 76
Гит. Книга "Pro Git". 274 / 557 стр.

Конспект:
- git commit -S - sign commit via GPG;
- squash - meld one commit into another (prev);
- pick/drop/squash/edit (and order can be changed);
-! почту в существующих коммитах можно поменять постфактум.
71 day учебнонакопительный !1LoKsuEs0s 28/12/24 Суб 13:57:54 770119 77
Гит. Книга "Pro Git". Закончил.

Конспект:
- коммит можно разбивать на части (на несколько коммитов - edit);
- удалить коммит - drop.

Далее в книге начался разбор слишком глубоких тем, возможно, вернусь к ним позже. Пролистал до конца. В приоритете добить vim & cpp. В следующие дни буду повторять конспекты.

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

-! :g/pattern/command - запускает команду на каждой строчке с хождением паттерна (:g/console/d - удаляет все строчки, где есть console);
-! :g!/pattern/command - наоборот не включает вхождение (:v/p/c - аналогично).

Новогодняя хандра.
Аноним 29/12/24 Вск 01:52:13 770178 78
>>768466
Ты работаешь или собираешься всему научиться, а потом вкатиться? Бэкендер?

>На ближайший год план копить деньги и продолжать учиться. Закончить TS и потом SQL, ElasticSearch, Rabbit, Docker и Nginx. Опять-таки, поверхностные знания по каждой перечисленной технологии уже имеются.
Интересный (несколько нестандартный) план с фокусом сейчас на гит и вим, потом еще плюсах, а потом еще вот по этому списку. Это с текущей работой связано, или с какой-то конкретной областью, в которой хочешь работать?
77 day учебнонакопительный !1LoKsuEs0s 03/01/25 Птн 15:41:40 770942 79
Гит. Повторял конспект с 27 дня по 42.

Вим. https://github.com/iggredible/Learn-Vim Chapter 13.
-! :g/pattern/normal A; - запустить команду в нормальном режиме (:normal), в данном примере добавляет по патерну точку с запятой в конец (очень полезная команда);
- так же можно выполнять любые команды, например запускать макрос - :g/pattern/normal @a;
- . - current line, $ - last line (:.,$g/pattern/cmd).
-! /./ - non-empty line pattern;
- можно вызывать рекурсивно и менять разделитель: g@one@s+const+let+g - глобальная команда на замену в строчках, где есть "one";
- :g/pattern - without cmd just print all matched lines.

Эту главу дочитать.

Cpp. https://metanit.com/cpp/tutorial/3.1.php

Конспект:
- cpp преобразует массив в указатели;
-! в переменной массива лежит адрес на первый элемент (can be unnamed);
- увеличиваем поинтер - переходим к следующему объекту в памяти: т.е инкрементируем индекс (`(arr + 1));
- адрес указателя на строку кастомизировать к void (void`)pchararray;
-! char arr[][20] { "abc" } (20 байт каждый эл.) и const char *arr[] { "abc" } (память выделяется под размер - сохраняются адреса указателей).

>>770178
Работа уже есть. Фулстек. Глубокой экспертизы не имею. В перспективе не хочу работать по найму. В идеале запустить свои проекты, собираюсь клепать их один за одним с небольшими затратами на аренду серверов и раскрутку - какой-нибудь да стрельнет.

Гит нужен для вклада в разработку открытого ПО: на текущем месте работы развития нет, а через совместную разработку с хорошими инженерами можно многому научиться. Без текстового редактора как без рук, поэтому осваиваю Вим. Плюсы - база.
78 day учебнонакопительный !1LoKsuEs0s 04/01/25 Суб 18:14:06 771056 80
Гит. Повторял конспект с 42 дня по 53.

Вим. https://github.com/iggredible/Learn-Vim Chapter 13.
- :g/pattern/t $ - выносит все вхождения в конец файла (дублирует/копирует);
- :g/pattern/m $ - переносит вхождения;
-! встроенная команда :sort - :1,3g/pattern/sort.

Cpp. https://metanit.com/cpp/tutorial/3.3.php

Конспект:
- global access var - ::name;
-! static vars keep in memory and init only once (static int a {1});
- если использовать прототип выше вызова, можно реализацию функции поместить ниже вызова;
- default value can be described in prototype (int age, std::string name = "Bob");
- необязательные параметры допускаются только в конце, после обязательных;
- parameter can be type "auto".
79 day учебнонакопительный !1LoKsuEs0s 05/01/25 Вск 19:39:16 771149 81
Гит. Повторял конспект с 53 дня по 62.

Cpp. https://metanit.com/cpp/tutorial/4.7.php

Конспект:
-! при передаче аргумента по ссылке нельзя преобразовывать тип (for instance double2int);
-! могут быть константные параметры - void func(const int a) {...};
- в прототипе необязательно указывать const;
-! обязательно указывать в прототипе const для параметров, которые передаются по ссылке;
-! void func (int x) { int y {10}; x = &y; } - не меняет значение переданное по ссылке, а переопределяет x;
- (const int
const x) - константный указатель на константу;
- параметр по указателю может быть nullptr, а по ссылке (void func (int& m)) - должен ссылаться на что-то.
82 day учебнонакопительный !1LoKsuEs0s 08/01/25 Срд 17:22:31 771364 82
Гит. Повторял конспект с 62 дня по 78 и почитал best practice/конвенции.

На этом с Гит пока всё. Аллилуйя! К нему ещё вернусь позже ненадолго.

Cpp. https://metanit.com/cpp/tutorial/3.10.php

Конспект:
- int nums[] (nums[0]) & int nums (nums) - равносильно;
- нуль-символ - конец массива - '\0';
- размер массива - size_t n {std::size(nums)};
- указатель на конец массива - int *end {std::end(nums)};
- int (&nums)[5] - передача массива по ссылке (можно задать размер для компилятора).

Взял в работу проект. Думал потяну на Си, но появились проблемы с установкой зависимостей на WSL. Поэтому придется делать на Джаваскрипт - это будет проще и быстрее.

Положил 9000 рублей в копилку. Копить буду начинать с нуля.
Аноним 08/01/25 Срд 20:34:50 771395 83
>>771364
И что? Действительно вышел на новый уровень в гит? Просто столько деталей, которые я бы забыл через месяц.
83 day учебнонакопительный !1LoKsuEs0s 09/01/25 Чтв 11:58:21 771419 84
image.png 63Кб, 1239x714
1239x714
Тайпскрипт. Одна задача и release-notes.

release-notes/typescript-4-8.html:
- type SomeNum = "100" extends `${infer Z extends number}` ? Z : never - SomeNum примет тип 100;
- ability to exclude specific autoimport files (some lib's types?).

После длительного перерыва с небольшим трудом решил простенькую задачку.

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

Конспект:
- :r !cmd - run external command on read (or :r filename.txt);
-! :r !curl -s 'https://jsonplaceholder.typicode.com/todos/1' - exec curl and print output;
-! :w !cmd - runs a command and passes buffer's data as STDIN;
-! :w !node (for instance data in buffer is - console.log("Hello Vim"));
- or just call :!cmd;
- :%!cmd - set range (. | $ | 1,4 ...).

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

Cpp. https://metanit.com/cpp/tutorial/3.6.php

Конспект:
- первый парамтр char argv[] - filename;
- int
func (int a) { return &a } - not okay (after return func will clear all data);
- function overloading.

>>771395
Было не зря.
84 day учебнонакопительный !1LoKsuEs0s 10/01/25 Птн 15:23:41 771551 85
image.png 84Кб, 1229x717
1229x717
Тайпскрипт. Одна задача и release-notes.

release-notes/typescript-4-9.html:
-! добавлен валидирующий оператор "satisfies": const a = { key: value } satisfies Record<key, value> (не нужно определять тип переменной - a: Record<...>) - использовать, когда нужно провалидировать сущность, но не определять для нее тип;
- narrowing via "in" operator (for instance we can validate some unknown data from JSON-response);
- new directive "accessor" (automatically makes var private and adds setter & getter) - class Smth { accessor name: string; } (can be init in constructor);
- NaN is a selfpointed NaN and will be false if NaN == 0 or NaN === NaN.

Перепрыгнул на задачи уровня "hard". Самостоятельно не осилил, разобрал готовое решение и узнал про маркер "ThisType".

Cpp. https://metanit.com/cpp/tutorial/4.9.php

Конспект:
- множественный рекурсивный вызов функции занимает большой объем стековой памяти для хранения копий аргументов;
- свап переменных при сортировке через temp;
- void (`name) () - указатель на функцию (void func(); name = func);
-! скобки обязательны, иначе прототип функции, который возвращает указатель на void - void` name();
-! we can use auto when init: auto name { func };
-! массивы указателей на функцию: тип (*имя_массива[размер]) (параметры) = { func, func, func }.

Взял ещё небольшую халтурку. Положил 2000 рублей в копилку.
Аноним 15/01/25 Срд 23:48:30 772680 86
ОП, ты куда пропал?
90 day учебнонакопительный !1LoKsuEs0s 16/01/25 Чтв 11:02:30 772721 87
Тайпскрипт. release-notes.

release-notes/typescript-5-0.html:
- добавлены декораторы над методами и классами (func dec(origMethod, context) { reutn func(this, args) {} });
- to @something("somearg") - wrapper decorator: func wrapper(somearg = "somearg") { return func dec(origMethod, context) { reutn func(this, args) {} };
- compare string and int - throws an error ("4" > 5), also for multiply ("4" * 5).

Задачки на потом оставлю, пока своих хватает. Ограничусь теорией.

Cpp. https://metanit.com/cpp/tutorial/3.8.php

Конспект:
- void func(int(`f)(int, int)): в прототипе параметр - функция-коллбек (int f(int a, int b); func(f););
-! определение псевдонима через using: using SomeName = void (`)(int, char) - псевдоним указателя на функцию, повышающий читабельность;
- использовать: SomeName anotherName { func };
- void(`message(unsigned))() - прототип функции, который возвращает указатель на функцию;
-! void(`message(unsigned hour))(char) - функция возвращает другую функцию типа void func(char), а сама обозначается как message(unsigned hour);
-! можно возвращать nullptr вместо функции.

Черт ногу сломит.

>>772680
Ушел с головой в проект, о котором писал выше. Сложно выходит, приходится спеки разбирать. ChatGPT помогает, но не особо (выдает псевдокод и порой вообще не в тему). Библиотек подходящих тоже не нашел. Задача сводится к работе с некоторыми прикладными протоколами и бизнес-логикой поверх них. Основная сложность в бизнес-логике. Больше не буду стараться сделать быстрее и сливать на это все свое время, а просто увеличу сроки на разработку. И вообще нужно приоритет сделать на учебе в этом году. Работа подождет.

Три месяца проскочило. Я опечален. Нужно прилагать больше усилий.
91 day учебнонакопительный !1LoKsuEs0s 17/01/25 Птн 15:10:25 772930 88
Тайпскрипт. release-notes.

release-notes/typescript-5-1.html:
- explicit return undefined in funcs: (): undefined => return;
-! movetofile some entity in Vscode;
- ts now resolves custom types in typeRoot (file or dir).

Cpp. https://metanit.com/cpp/tutorial/4.11.php

Конспект:
- подключение модулей через заголовочные файлы: include "module.h";
- компиляция, перечислять все файлы: g++ one.cpp two.cpp -o app;
- использовать сущности помимо функций из внешних файлов через extern;
- подключение внешних сущностей выносить в заголовочный файл.

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

Конспект:
- ctrl-[ (closes cmd-mode also as insert mode);
-! @: - macro that repeats last cmd;
- shift + larrow/rarrow - word-wise movement;
- CTRL+U deletes etnire line before cursor;
-! CTRL+F to find a cmd in history;
- we can past some register data (CTRL+R);
- Ctrl-R Ctrl-W or Ctrl-R Ctrl-A - past word under normal-mode cursor;
- Tab - next, Shift+tab - prev (autocomplete);
- Ctrl+p/Ctrl+n - go trought hostory;
-! q: - run cmd-mode history from normal-mode;
-! we can change cmd directly in history list.

Отъел ряху на пирожках, начинают появляться щёчки. Беда.
94 day учебнонакопительный !1LoKsuEs0s 20/01/25 Пнд 11:39:27 773403 89
Тайпскрипт. release-notes.

release-notes/typescript-5-2.html:
- [Symbol.dispose] (new ECMAScript feature);
- new directive "using" (also try {} catch {} not needed anymore);
- using a = someMethod(); function someMethod() { (some logic...); return { [Symbol.dispose]() { (some logic...) } }} - works like destructor with block visibility;
- its possible to make async disposal (Symbol.asyncDispose and await using name = ...);
- we can use .defer(cb) method: using a = new DisposableStack(); a.defer(() => { ... }).
- type Pair<T> = [T, T].

В JS (это фича именно ES) появились деструкторы функций (не совсем функций, поскольку деструкторы скорее блочные, но применимы по большей части к функциям). Такие я встречал, когда работал с Го (defer). Класс!
96 day учебнонакопительный !1LoKsuEs0s 22/01/25 Срд 16:28:03 773634 90
Тайпскрипт. release-notes.

release-notes/typescript-5-3.html:
- import obj from "./something.json" with { type: "json" } (зачем? расширяет json? или метадата для компилятора? но такое появилось);
- class C {[Symbol.hasInstance](value) { return sometype === value; }} (sometype instance of C // true);
- static [Symbol.hasInstance](val: unknown): val is PointLike;
- import { type Person } from "./types".

Cpp. https://metanit.com/cpp/tutorial/4.12.php

Конспект:
- статические объекты освобождаются из памяти по завершению программы и создаются при первом использовании (static memory);
- временные/блочные объекты помещаются в стек и очищаются по выходу программы из блока (stack memory);
- stack memory has fixed limit size;
- помимо этого существуют динамические объекты, их можно очищать из памяти явно в любой момент и размещаются они в динамической памяти (free store);
- для управления динамическими объектами применяются операторы new и delete (int `ptr = new int - хранится в указателе & delete ptr - free);
- "болтающийся указатель" (dangling pointer) - to avoid = set nullptr after delete.
98 day учебнонакопительный !1LoKsuEs0s 24/01/25 Птн 15:52:02 774001 91
Тайпскрипт. release-notes и tsconfig.

Конспект:
- tsconfig состоит из rootOptions и comilerOprions;
- tsconfig supports comments;
- tsconfig supports inheritance ( { "extends": "./path/to/antother/tsconfig.json" } );
- rootOptions: extends, files, include, exclude;
- посмотреть итоговый собранный конфиг из экстендов - tsc --showConfig;
- compilerOptions: target, module, moduleResolution, lib, outDir, outFile (дочитать завтра).

Бегло ознакомился с release-notes до последней версии: 5.5. В следующий день дочитаю ещё про tsconfig.
100 day учебнонакопительный !1LoKsuEs0s 26/01/25 Вск 15:16:00 774231 92
Тайпскрипт. tsconfig.

Конспект:
- type checks & linter checks;
- compilerOptions: allowSyntheticDefaultImports, esModuleInterop, forceConsistentCasingInFileNames, declaration, declarationDir, resolveJsonModule, strict, alwaysStrict, noPropertyAccessFromIndexSignature, noUncheckedIndexedAccess.

Осталось ещё раз пробежаться по всем свойствам из tsconfig и прочитать про Project References.

Cpp. https://metanit.com/cpp/tutorial/11.2.php

Конспект:
- delete [] ptr - удалить динамический массив;
-! unique_ptr<T> - умные указатели, сами освобождают память;
-! unique_ptr<T> - возможно только единожды указывать на один объект в памяти;
- после удаления unique_ptr<T> удаляется и объект на который он указывает;
-! std::unique_ptr<int> ptr { std::make_unique<int>(125) } (или { new int(125) } до С++ 14);
-! ptr.reset() - освободить память (удалить объект) и задать nullptr на указатель .

Юбилейный. Йе-еху-у! Пойду повешусь.
Аноним 26/01/25 Вск 19:38:00 774253 93
Поздравляю с 100-ым днем самообучения, ОП!
Ты усердно и плодотворно занимаешься. Я уверен, что это обязательно окупится. Если не в материальном плане, так в профессиональном.
учебнонакопительный !1LoKsuEs0s 27/01/25 Пнд 16:53:45 774324 94
Тайпскрипт. Project References.

Конспект:
- разделять монорепозиторий на packages & apps;
-! при таком подходе приложение будет состоять из множества маленьких кусочков, а Project References помогает уменьшить время сборки всего приложения (что-то вроде инкрементальной сборки);
-! собирать такой проект - в корне tsc --build/-b;
- { "references": [ { "path": "./path/to/tsconfig" } ] };
- модуль по ссылке должен содержать { "composite": true, "declaration": true } и заданный "includes";
- после указания ссылки на модуль, при импорте будут подгружаться d.ts, а не прямая реализация;
-! модуль по ссылке сам соберется при необходимости во время сборки основного модуля;
- так же это уменьшает выделяемую память для ide чтобы распарсить код и зависимости (из-за ссылок и d.ts);
- Project References помогает дважды не компилировать лишний код, что экономит время сборки;
- declarationMap для навигации по коду в реакторе (Go To Definition);
- из минусов: придется собирать другой модуль, просто импортировать сущность не получится, так как ориентация на d.ts;
- обойти это и генерировать в память - disableSourceOfProjectReferenceRedirect (разобраться).

На этом с Тайпскриптом покончено.

>>774253
Дьякую! Это очень плохой результат за 100 дней. Не получается быть продуктивным и эффективно управлять своим временем, когда большая когнитивная нагрузка на работе. Время остается, но сил не хватает. Нужно попробовать заняться домашним фитнесом и какими-нибудь силовыми упражнениями. Точно - так и сделаю! А ещё мне нужен хороший учебник по ядру операционной системы, желательно Линукс. Есть варианты?
Аноним 27/01/25 Пнд 17:30:07 774325 95
>>774324
>Есть варианты?
Не моя область, так что ничего предложить не могу.
>Нужно попробовать заняться домашним фитнесом и какими-нибудь силовыми упражнениями. Точно - так и сделаю!
Мне кажется, что это ошибочный ход мыслей. Работать, учиться и не замечать своего труда, думать, что сделал мало. Так и выгорают. Проблема не в том, что ты не занимаешься спортом, а в том, что ты и так загружен.
104 day учебнонакопительный !1LoKsuEs0s 30/01/25 Чтв 08:46:05 774561 96
Cpp. https://metanit.com/cpp/tutorial/5.6.php

Конспект:
- shared_ptr<T> - несколько таких указателей могут ссылаться на один объект;
- reference counting, подсчет ссылок;
- auto pnumbers { std::make_shared<int[]>(7) } - инициализировать массив из 7 элементов (автоматически устанавливается 0 для всех эл.);
- Person `ptr = &person, person->age - обращаться через указатель к свойствам/методам класса используя "->";
- перегрузка конструкторов;
-! делегирование конструктора: вызывать из одного конструктора другой Person([args]): Person([args]) {};
- списки инициализации конструктора на константы Parson(): name{p_name}[, etc..];
- void Person::print(){} - выносить реализацию метода класса наружу (в т.ч. конструктор);
- Person tom([args]), Person tomas{tom} - конструктор копирования;
-! создать свой конструктор копирования - Person(const Person &p);
- Person(const Person &p) = delete - удаляем конструктор;
-! const Person tom{"Tom", 38} - свойства только на чтение и запрещает вызов функций (кроме константных);
-! void print() const {} - константная функция (свойства класса внутри менять нельзя и внутри можно вызывать только константные методы);
- mutable unsigned age - задать свойство, которое можно менять в константном методе или в инстансе класса.

Составил график на день: работа, учёба и фитнес в балансе. Осталось его только придерживаться. ЦНС не должна так сильно теперь перегружаться. Провожу время за компьютером помидорными циклами, в перерывах разминаюсь.
105 day учебнонакопительный !1LoKsuEs0s 31/01/25 Птн 08:50:13 774653 97
Cpp. https://metanit.com/cpp/tutorial/5.10.php

Конспект:
- this - is a pointer at the current object (so this->...);
-! дружественные функции (friend void drive(const Auto&)) - не часть класса, но имеют доступ к приватным сущностям класса;
- friend class Person - определение дружественного класса (всех его методов и свойств);
- ~Person - деструктор;
- person tom{ 34, "Tom" } - инициализация структуры с присвоением по порядку;
-! структуры похожи на классы: имеют модификаторы доступа, конструктор и деструктор;
- обычно используются публичные структуры, которые еще называют агрегатными классами;
- enum class Day {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday} & Day today {Day::Thursday};
- enum & sctruct используются для определения своих типов данных;
- using enum Day - чтобы не писать Day::Monday, but just Monday (только для одной константы);
- unscoped unums from C: enum name {A, B, C} (without class) - старый нежелательный способ, который неограничен областью видимости и потенциально может привести к ошибкам.

Каждое утро - после пробуждения - начал немного заниматься математикой и английским, но вести дневник по этим занятиям не буду. На учёбу с конспектами в этот дневник выделил один помидор в день: 35 минут. После ознакомления с C++ доучу Vim, а дальше, скорее всего, начнется глубокое освоение реляционных БД с горизонтальным масштабированием, шардированием и прочим. Никуда не спешим. Какие-то знания ещё добираются в процессе работы, но это всё бессистемно.
106 day учебнонакопительный !1LoKsuEs0s 01/02/25 Суб 08:57:35 774710 98
Cpp. https://metanit.com/cpp/tutorial/5.11.php (дочитать)

Конспект:
- class Employee : public Person {} - inheritance;
- public: using Person::Person - подключаем конструктор базового класса;
- class Person final - запрет наследования;
- class A : ptivate Class B - все protected & public не распространяются на производные классы, кроме A (если A будет для кого-то базовым), и на инстанс класса A;
-! using Person::print (внутри A) - восстановить public (даже если class A : private B) и использовать принт на инстанс A, а не только внутри;
- public Phone, public Camera - множественное наследование;
- cppbook.File::print() - вызывать родительский метод (или чрез каст - static_cast<File&>(cppbook).print());
- двойственное наследование и виртуальные классы (class Employee: public virtual Person);
- static binding, dynamic binding and virtual functions (overloads basic func when we invoke via ->).
учебнонакопительный !1LoKsuEs0s 02/02/25 Вск 08:28:56 774788 99
Cpp. https://metanit.com/cpp/tutorial/5.14.php (дочитать)

Конспект:
-! метод по указателю определяется типом указателя, а не объектом на который указывает (static/early binding) - помнить, что производный тип класса автоматически кастуется на базовый;
- virtual перед методом в базовом классе (dynamic/late binding);
-! класс, который определяет или наследует виртуальный метод, называется полиморфным;
- void print() const override {} - переопределить виртуальный метод явно через override (для компилятора);
- virtual void print() const final {} - у метода, запрет на переопределение;
- dynamic_cast - in time преобразование (только на объекты по ссылке и указателю);
- virtual double getSquare() const = 0 - чситая виртуальная функция в абстрактом классе;
-! Counter operator + (const Counter& counter) const {} - перегрузка операторов в классе.

Пробежался по теме с динамическим связыванием и виртуальными функциями. Цель - ознакомление.
108 day учебнонакопительный !1LoKsuEs0s 03/02/25 Пнд 07:26:20 774898 100
Cpp. https://metanit.com/cpp/tutorial/6.1.php

Конспект:
-! в перегрузку оператора передается правый операнд аргументом;
- либо два параметра (для двух операндов слева направо), во внешних определениях метода;
- default для стандартного поведения оператора;
- операторы преобразования типов (кастомная кастомизация);
-! explicit - явные преобразования (только через static_cast);
-! void operator[](unsigned index) const - оператор индексирования у класса;
- пространства имён и псевдонимы пространств;
- вложенные классы (с внешними и внутренними модификаторами доступа).

Насколько же мощный ЯП! А это едва только половина учебника пройдена. Но всю эту теорию обязательно нужно будет подкреплять практикой. А ещё так много всего хочется: и Earlang/Elixir пощупать и написать свой компилируемый ЯП (с исследовательской целью, чтобы понимать что к чему).
109 day учебнонакопительный !1LoKsuEs0s 04/02/25 Втр 07:28:21 775011 101
Cpp. https://metanit.com/cpp/tutorial/9.3.php

Конспект:
- throw "message";
- catch (...) - обработать любое исключение;
- catch (const char` error_message) - получить сообщение;
- void print(int argument) noexcept;
- множественный catch;
- std::exception - можно использовать для обработки остальных исключений;
- др. исключения "std::": runtime_error, underflow_error, logic_error...;
- template<typename T> T add(T, T) - дженерики/шаблоны;
- decltype(auto) - делегировать определение возвращаемого типа компилятору;
-! template <typename T, unsigned N=1> void print(const T&) - создавать нетипизированные параметры прямо в шаблоне;
- template <typename T=int> - deafult pattern value.

Вчера нашел нужную хеш-функцию в исходниках ВБ и сам решил проблему правильного вызова обработчиков .onmouseenter & .onmouseleave на элемент, который сверху перекрывается другим - GPT не помог (скорее всего, из-за моих корявых промптов). Сегодня в планах доработать небольшое веб-приложение на Вью, создать веб-сервис на два эндпоинта и исправить некоторые ошибки в почтовом клиенте.
110 day учебнонакопительный !1LoKsuEs0s 05/02/25 Срд 09:15:31 775137 102
Cpp. https://metanit.com/cpp/tutorial/7.10.php

Конспект:
- ассоциативные и последовательные контейнеры в стандартной библиотеке;
- std::vector<int> numbers, вектор - коллекция объектов одного типа;
- std::vector<int> v5(5, 2) - вектор из 5 чисел, каждое инициализировано 2;
- вектор умеет возвращать эл. по индексу, первый и последний;
- iterator - std::vector<int>::iterator iter = numbers.begin();
-! iterator is a pointer on container's elem;
-! std::begin([])/end из стандартной библиотеки;
- list - двухсвязный список (ptr on next and prev);
- forward_list - односвязный список (only next);
-! удаление элементов в контейнере делает ссылки на итераторы недействительными.
116 day учебнонакопительный !1LoKsuEs0s 11/02/25 Втр 06:58:51 776112 103
Cpp. https://metanit.com/cpp/tutorial/14.1.php

Конспект:
- std::stack<T> - LIFO (size/empty/push/top/pop);
- std::queue<T> - FIFO (size/empty/push/pop/front/back/swap);
- std::set<T> - unique elements (sorted/unsorted);
- std::map<K, V> - key:value pair (for instance if K is string - map["key"] = value);
- loop map = for (const auto& [key, value] : map);
- std::span<T> - универсальный тип данных;
- строки с поддержкой unicode.
117 day учебнонакопительный !1LoKsuEs0s 12/02/25 Срд 08:57:56 776343 104
Cpp. https://metanit.com/cpp/tutorial/17.3.php

Конспект:
- lvalue & rvalue: int&& tempVar = {n+4} - ok, but {n} - bad (lvalue cannot be equal to lvalue);
- but we can handle case above via std::move(n);
- void operator()(const std::string& message) const - перегрузка оператора вызова;
-! []() { std::cout << "Hello" << std::endl; } - лямбда;
- [](int a, int b) -> double {return a + b;} - returntype;
- [=] - заватывает все внешние переменные по значению;
- [np] - передвать конкретные (в т.ч. по указателю);
- [&] - получение всех внешних по ссылке;
-! template <параметры> requires ограничения - ограничение шаблона;
-! concept size = sizeof(T) <= sizeof(int) - концепты (под шаблонами) (size<int> returns true);
- template <conceptname T>.
121 day учебнонакопительный !1LoKsuEs0s 16/02/25 Вск 08:34:00 777466 105
Cpp.

Конспект:
- requires (параметры?) { требования } - (параметры) опционально;
- идиома RAII (получение ресурсов при инициализации, освобождение в деструкторе);
- идиома copy-and-swap: copy object -> change copy -> if ok, set copy to object;
- идиому copy-and-swap можно реализовать через перегрузку оператора присваивания.

На этом ознакомление с C++ завершается. В следующие дни буду повторять конспекты.

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

Конспект:
-! Ctrl-] - goto definition by tagname;
-! нужно устанавливать пакеты для конкретного ЯП;
-! ctags для C (очень круто - попробовал);
- создается файл tags в корне.

Продолжить эту главу.
122 day учебнонакопительный !1LoKsuEs0s 17/02/25 Пнд 06:58:47 777674 106
Cpp. Повторял конспект с 53 дня по 63.

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

Конспект:
- файл с тегами можно брать не из корня проекта;
- to find manually - :tag [name];
- у одинаковых тегов приоритет и по умолчанию перемещается на максимальный;
-! :tselect [tagname] - выбрать самостоятельно;
-! :autocmd BufWritePost *.с silent !ctags -R . - автоматически регенерировать теги после сохранения буфера (файла);
- есть плагины, которые генерируют тэги автоматически (изучить потом).
123 day учебнонакопительный !1LoKsuEs0s 18/02/25 Втр 07:15:47 777820 107
Cpp. Повторял конспект с 63 дня по 100.

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

Конспект:
-! zf[motion] (zfj) - folds 2 lines;
-! zo - opens a fold;
- :[range]fold (:,5fold);
-! zR - open ALL folds, zM - close all folds, za - toggle a fold;
- different foldmethods.

Продолжить эту главу.
125 day учебнонакопительный !1LoKsuEs0s 20/02/25 Чтв 10:21:54 778059 108
Cpp. Повторял конспект с 100 дня по 121.

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

Конспект:
- fold expression - :set foldexpr=getline(v:lnum)[0]==\\"p\\";
- foldmode=diff (vimdiff file1 file2);
-! :set foldmethod=marker && :set foldmarker={{{,}}} (zM, zR - через маркер);
- фолды можно сохранять (:mkview, :loadview);
- auto: autocmd BufWinLeave .txt mkview && autocmd BufWinEnter .txt silent loadview.
126 day учебнонакопительный !1LoKsuEs0s 21/02/25 Птн 08:01:10 778133 109
Вим. https://github.com/iggredible/Learn-Vim Chapter 18.

Конспект:
- утилита vimdiff f1 f2 - посмотреть разницу в сплите;
- vimdiff для разрешения git-конфликтов via vim;
-! :diffget LOCAL/BASE/REMOTE - to select;
- git config --global mergetool.keepBackup false (no .orig);
- :!git add % - to add current file;
- изучить и подключить позже плагины для Гита.

Скачал две книжки по Докеру: "Docker на практике" Иан Милл и "Использование Docker" Эдриен Моуэт. Приступлю к ним после Вима. Появилось желание по 40 минут в день разрабатывать свои проекты. Переживаю тяжелый эмоциональный период. Меланхолия. Удивительно, что вообще нахожу силы на что-то. Ожидаю душевный подъем.
Аноним 21/02/25 Птн 09:43:19 778136 110
>>778133
Тебе банально нужно отдыхать больше и чаще делать перерывы. Немного убавить к себе ожидания. Нет, ты не плох. И твои амбиции не плохи. Но подумай - что сейчас важнее: твое психическое состояние или тот прирост квалификации, который ты пытаешься получить? В этом мире не обязательно 24/7 ебашить, существует множество программистов, которые работают и не знают элементарных вещей в программировании, но это не мешает им и дальше оставаться в сфере. Я понимаю твое желание развиваться и я не за то, чтобы быть веб-макакой, но сейчас имеет смысл замедлиться. У тебя не стоит выбор между "поработать меньше, чем обычно или работать как всегда", у тебя стоит выбор между "поработать меньше, чем обычно или выгореть полностью".
учебнонакопительный !1LoKsuEs0s 21/02/25 Птн 10:33:43 778137 111
>>778136
Угнетают внешние обстоятельства и некоторые психологические проблемы. Подавленность отнюдь не связана с учёбой. Для меня это наоборот форма эскапизма. Проблемы в жизни. Доходит порой до суицидальных мыслей. Тяжело морально, в общем. Описать свою проблему не могу даже на "анонимном" форуме, потому что для меня это слишком личное.

Просто отметил свой эмоциональный фон. Спасибо за поддержку!
127 day учебнонакопительный !1LoKsuEs0s 22/02/25 Суб 09:12:26 778198 112
Вим. https://github.com/iggredible/Learn-Vim Chapter 20.

Конспект:
- autocmd BufWritePost `.cpp make - запускать команду (например, билд) на сохранение;
-! :mkview - сохраняет состояние файла (по умолчанию в ~/.local/state/nvim/view/);
-! :loadview - загружает состояние (метки, фолды, настройки ":set" для файла и проч.);
-! :mkview N (1, 2, 3, 4, ...) - можно сохранять до 9 вариаций файла;
-! autocmd BufWinLeave .txt mkview - авто на закрытие;
-! autocmd BufWinEnter
.txt silent loadview - авто на открытие.
-!! периодически чистить ~/.local/state/nvim/view/;
-! :mksession - сохраняет не отдельное окно а всю сессию;
-!! сессия сохраняется локально в директории Session.vim (можно переопределить dir or filename.vim);
-! :source Session.vim - загрузить сессию;
-! перезаписать сессию через "!" - :mksession!;
- viminfo remembers marks, yanks, search. cmd-history and etc;
- each view - per file, each session - per project, each viminfo - per computer.

В голову пришла блестящая идея, какой проект разрабатывать! На днях исследую рынок, изучу конкурентов.
131 day учебнонакопительный !1LoKsuEs0s 26/02/25 Срд 09:44:42 778478 113
Вим. https://github.com/iggredible/Learn-Vim Chapter 21.

Конспект:
- change multiple files via argdo;
-! :args file1 file2 (or ``/`.txt);
-! then to run - :argdo %s/donut/pancake/g | update (:update to save);
- :bufdo (для всех файлов, которые открывались за сессию);
- also :windo and :tabdo;
- quickfix window.
Настройки X
Ответить в тред X
15000
Добавить файл/ctrl-v
Стикеры X
Избранное / Топ тредов