3,9 Мб, mp4,
224x224, 1:42
224x224, 1:42
Хочу сколотить капитал. И учиться.
54 Кб, 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] $
Сегодня ничего не заработал.
money:
wallet - [0_000] RUB
crypto - [0_000] $
Снова Тайпскрипт.
Первую задачу решил слёту. Она простая.
Над второй сидел больше 20 минут, пытаясь решить через вереницу тернарных операторов, отсеивая тип за типом. Никак не получалось отличать "never" от "any". В итоге нашел объяснение в Интернете. Проверка через условные типы - "0 extends (1 & T)" - работает для any: почему-то Тайпскрипт мёрджит "1 & any" -> "any", поэтому срабатывает проверка "0 extends any". С остальными типами единица остаётся.
Сегодня ничего не заработал.
money:
wallet - [0_000] RUB
crypto - [0_000] $
Первую задачу решил слёту. Она простая.
Над второй сидел больше 20 минут, пытаясь решить через вереницу тернарных операторов, отсеивая тип за типом. Никак не получалось отличать "never" от "any". В итоге нашел объяснение в Интернете. Проверка через условные типы - "0 extends (1 & T)" - работает для any: почему-то Тайпскрипт мёрджит "1 & any" -> "any", поэтому срабатывает проверка "0 extends any". С остальными типами единица остаётся.
Сегодня ничего не заработал.
money:
wallet - [0_000] RUB
crypto - [0_000] $
>>1814
Разобрался. "any" - супертип и поглощает (расширяет) все подтипы в юнитах.
В документации написано на примере строки общим типом и константых строк. Запустил пример в плейграунде.
На сегодня всё.
Разобрался. "any" - супертип и поглощает (расширяет) все подтипы в юнитах.
В документации написано на примере строки общим типом и константых строк. Запустил пример в плейграунде.
На сегодня всё.
Тайпскрипт. Три задачки.
Первая задача тривиальная.
Решение для второй задачи написал сразу, но тесты не проходили. Спустя 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] $
Первая задача тривиальная.
Решение для второй задачи написал сразу, но тесты не проходили. Спустя 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] $
Тайпскрипт. Две задачи.
Над первой пришлось немного покумекать, но в целом ничего сложного. Не сразу сообразил, как правильно решить через рекурсию. Надо было увеличивать как результирующее множество, так и множество-счетчик.
Вторая задача посложнее. Проверяем, дошли ли мы в итерации по кортежу до конца: 1. если да - возвращаем множество-аккумулятор; 2. если нет - проверяем, совпадает ли текущий тип с заданным (через строгое сравнение); 2.1. если совпадает - добавляем тип в множество-аккумулятор и вызываем проверку рекурсивно с оставшимися типами; 2.2 если не совпадает - оставляем множество-аккумулятор в прежнем состоянии и вызываем проверку рекурсивно с оставшимися типами.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Над первой пришлось немного покумекать, но в целом ничего сложного. Не сразу сообразил, как правильно решить через рекурсию. Надо было увеличивать как результирующее множество, так и множество-счетчик.
Вторая задача посложнее. Проверяем, дошли ли мы в итерации по кортежу до конца: 1. если да - возвращаем множество-аккумулятор; 2. если нет - проверяем, совпадает ли текущий тип с заданным (через строгое сравнение); 2.1. если совпадает - добавляем тип в множество-аккумулятор и вызываем проверку рекурсивно с оставшимися типами; 2.2 если не совпадает - оставляем множество-аккумулятор в прежнем состоянии и вызываем проверку рекурсивно с оставшимися типами.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
19 Кб, 715x261
>>2066
1. [any] extends [number] ? 1 : 2; // 1
2. any extends number ? 1 : 2; // 1 | 2
Я так и не смог разобраться, почему без скобок запиналось на "any extends number" во второй задаче. Эх, вот бы кто-нибудь умный объяснил...
1. [any] extends [number] ? 1 : 2; // 1
2. any extends number ? 1 : 2; // 1 | 2
Я так и не смог разобраться, почему без скобок запиналось на "any extends number" во второй задаче. Эх, вот бы кто-нибудь умный объяснил...
22 Кб, 523x246
>>2071
Вот такой результат без скобок "[1, 2] | [1, 2, any]". Со скобками же множества объединяются "(1 | 2 | any)[]" - правильно понял?
Вот такой результат без скобок "[1, 2] | [1, 2, any]". Со скобками же множества объединяются "(1 | 2 | any)[]" - правильно понял?
Тайпскрипт. Две задачи.
За 15 минут подобрал элегантное решение для первой задачи. Интересно, можно ли это решить без внедрения счётчика.
Вторую задачу решил безобразно, топорно, в лоб, но зато за 5 минут. В этом решении можно было бы вынести логику увеличения счётчика отдельно, так как она повторяется для каждого слагаемого. Опять-таки, хотелось бы найти решение без счётчиков, но пока не получается.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
За 15 минут подобрал элегантное решение для первой задачи. Интересно, можно ли это решить без внедрения счётчика.
Вторую задачу решил безобразно, топорно, в лоб, но зато за 5 минут. В этом решении можно было бы вынести логику увеличения счётчика отдельно, так как она повторяется для каждого слагаемого. Опять-таки, хотелось бы найти решение без счётчиков, но пока не получается.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Тайпскрипт. Две задачи.
Первая задача решена за 4 минуты. После прочтения примечания "we can just consider smaller numbers" решение сразу прилетело в голову.
Над второй задачей бился 30 минут, так и не решив. Почему не проходят тесты? Должно же вернуться пересечение "A & B & C", а возвращается объединение "A | B | C". Вот бы подсказочку. Оставлю на завтра.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
>>2257
https://bigfrontend.dev/
Первая задача решена за 4 минуты. После прочтения примечания "we can just consider smaller numbers" решение сразу прилетело в голову.
Над второй задачей бился 30 минут, так и не решив. Почему не проходят тесты? Должно же вернуться пересечение "A & B & C", а возвращается объединение "A | B | C". Вот бы подсказочку. Оставлю на завтра.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
>>2257
https://bigfrontend.dev/
51 Кб, 1278x727
Тайпскрипт. Одна вчерашняя нерешенная задача.
"Разобрался" со вчерашней задачей. Вот такое неочевидное решение.
Больше не получилось - сайт упал.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
"Разобрался" со вчерашней задачей. Вот такое неочевидное решение.
Больше не получилось - сайт упал.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Тайпскрипт. Поскольку вчера BFE внезапно отвалился и был недоступен несколько часов, параллельно начал решать задачи на "type-challanges". Вообще, Тайпскрипту не хочу уделять больше двух месяцев, поэтому постепенно буду увеличивать количество решаемых задач в день. Небольшой прогресс ощущается. Две задачи.
Обе задачи простые, похожие уже попадалась на BFE.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Обе задачи простые, похожие уже попадалась на BFE.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Тайпскрипт. Одна клятая задача.
Около часа решал. Разъясните, почему моё решение не проходит тесты на BFE? В TS Playground всё отлично. Версии компилятора разнятся? Что именно не так? Поскольку в плейграунде тесты успешно прошли, засчитаю как решённую.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Около часа решал. Разъясните, почему моё решение не проходит тесты на BFE? В TS Playground всё отлично. Версии компилятора разнятся? Что именно не так? Поскольку в плейграунде тесты успешно прошли, засчитаю как решённую.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Тайпскрипт. Три задачи.
Equal. Проверка на соответствие двух типов через два симметричных кортежа. Решение подсмотрел. Эта проверка пригодилась бы в предыдущей задаче, где нужно было найти индекс элемента в кортеже. У меня было другое решение - более громоздкое. Проблему в таких проверках составляют два типа: "never" и "any".
TupleToObject. Принимаем кортеж типа PropertyKey и через T[number] получаем объединение всех элементов кортежа, через которые итерируется - [K in T[number]].
First. Совсем всё просто: если кортеж пустой (т.е T['length'] extends 0) - возвращаем "never", если есть хотя бы один элемент - возвращаем первый (T[0]).
Equal. Проверка на соответствие двух типов через два симметричных кортежа. Решение подсмотрел. Эта проверка пригодилась бы в предыдущей задаче, где нужно было найти индекс элемента в кортеже. У меня было другое решение - более громоздкое. Проблему в таких проверках составляют два типа: "never" и "any".
TupleToObject. Принимаем кортеж типа PropertyKey и через T[number] получаем объединение всех элементов кортежа, через которые итерируется - [K in T[number]].
First. Совсем всё просто: если кортеж пустой (т.е T['length'] extends 0) - возвращаем "never", если есть хотя бы один элемент - возвращаем первый (T[0]).
Тайпскрипт. Три задачи.
Trim. После своего решения, посмотрел другие. Проверку можно было делать не по отдельности, а атомарно - "T extends ` ${String}` |`${String} `". Я до такого не догадался.
ReplaceAll. Решил через добавление результирующего типа, которое по умолчанию пустая строка. Пришлось добавить ещё одну проверку (S extends Tail) на случай, когда BFE добавлял пустую строку и моё решение бесконечно вызывалось через рекурсию, потому что хвост не укорачивался. Посмотрел другие решения. Можно было решать без добавления дополнительного типа. Не догадался из-за неочевидного поведения такой конструкции: "S extends `${infer A}${F}${infer B}`". Чему будет равно A? Логично предположить, что первому символу в строке, но по какой-то причине возвращается пустая строка и первый символ магнитится к F. Это из-за "infer". Но всё равно выходит магия Тайпскрипта. Запутался. Добавил в закладки материал на эту тему, почитаю позже.
Exclude. Ну здесь вообще элементарно. Когда мы проверяем объединение через "extends", проверка осуществляется итеративно по каждому отдельному члену. Возвращается тоже объединение, но при этом "never" в объединении игнорируется. Поэтому всё выполняется как надо.
>>2919
JS изучал, но он в TS совсем не помощник.
Trim. После своего решения, посмотрел другие. Проверку можно было делать не по отдельности, а атомарно - "T extends ` ${String}` |`${String} `". Я до такого не догадался.
ReplaceAll. Решил через добавление результирующего типа, которое по умолчанию пустая строка. Пришлось добавить ещё одну проверку (S extends Tail) на случай, когда BFE добавлял пустую строку и моё решение бесконечно вызывалось через рекурсию, потому что хвост не укорачивался. Посмотрел другие решения. Можно было решать без добавления дополнительного типа. Не догадался из-за неочевидного поведения такой конструкции: "S extends `${infer A}${F}${infer B}`". Чему будет равно A? Логично предположить, что первому символу в строке, но по какой-то причине возвращается пустая строка и первый символ магнитится к F. Это из-за "infer". Но всё равно выходит магия Тайпскрипта. Запутался. Добавил в закладки материал на эту тему, почитаю позже.
Exclude. Ну здесь вообще элементарно. Когда мы проверяем объединение через "extends", проверка осуществляется итеративно по каждому отдельному члену. Возвращается тоже объединение, но при этом "never" в объединении игнорируется. Поэтому всё выполняется как надо.
>>2919
JS изучал, но он в TS совсем не помощник.
Тайпскрипт. Две задачи.
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.
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.
Тайпскрипт. Две задачи и 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-модулей (без тройного слеша)?.
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-модулей (без тройного слеша)?.
Тайпскрипт. Две задачи и release-notes 3.6.
Parameters. Кортеж типов параметров функции. Используем infer и остаточные параметры. Ничего нового.
Slice. Срез элементов кортежа. Получилось непросто. Пришлось задействовать проверку LessThan (которую уже реализовывал в предыдущей задаче). Своим решением доволен. В первый день я бы такое не решил - прогресс налицо.
На этом этапе все задачи из секции "easy" решены. Впереди "medium".
release-notes/typescript-3-6.html:
- добавили проверку возвращаемого типа функцией-генератором;
- улучшили развёртывание через array spread;
- добавили проверку на наличие дженерика "Promise<T>".
Parameters. Кортеж типов параметров функции. Используем infer и остаточные параметры. Ничего нового.
Slice. Срез элементов кортежа. Получилось непросто. Пришлось задействовать проверку LessThan (которую уже реализовывал в предыдущей задаче). Своим решением доволен. В первый день я бы такое не решил - прогресс налицо.
На этом этапе все задачи из секции "easy" решены. Впереди "medium".
release-notes/typescript-3-6.html:
- добавили проверку возвращаемого типа функцией-генератором;
- улучшили развёртывание через array spread;
- добавили проверку на наличие дженерика "Promise<T>".
109 Кб, 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".
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".
Тайпскрипт. Три задачи и 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()).
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()).
Тайпскрипт. Две задачи и release-notes.
Trim. Задача уже попадалась на BFE. В этот раз решение чище.
Capitalize. Возведение первого символа в верхний регистр.
Нашел интерфейс нормальный на гитхабпейджес. Следующие задачи попробую решать через него.
release-notes/typescript-3-9.html:
- пофиксии типизацию возвращаемых значений Promice.all/race;
- добавлена проверка "// @ts-expect-error" - выводит ошибку, когда её нет, и игнорирует, когда она есть;
- добавлен not-null aseertion оператор (foo!.baz).
Trim. Задача уже попадалась на BFE. В этот раз решение чище.
Capitalize. Возведение первого символа в верхний регистр.
Нашел интерфейс нормальный на гитхабпейджес. Следующие задачи попробую решать через него.
release-notes/typescript-3-9.html:
- пофиксии типизацию возвращаемых значений Promice.all/race;
- добавлена проверка "// @ts-expect-error" - выводит ошибку, когда её нет, и игнорирует, когда она есть;
- добавлен not-null aseertion оператор (foo!.baz).
Тайпскрипт. Две задачи и 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;
- добавили фишки в редактор кода с автоматическим редактированием.
Воспользовался интерфейсом, который написан на 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;
- добавили фишки в редактор кода с автоматическим редактированием.
93 Кб, 1264x783
Тайпскрипт. Одна задача и release-notes.
release-notes/typescript-4-1.html:
- добавили `${тип}${строкового}${литерала}`;
- добавили оператор "as" в переборе ключей ([K in keyof T as NewKeyType]).
release-notes/typescript-4-1.html:
- добавили `${тип}${строкового}${литерала}`;
- добавили оператор "as" в переборе ключей ([K in keyof T as NewKeyType]).
61 Кб, 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).
Пока что в учёбе "еду на холостых", много стресса в жизни. Нужно перетерпеть чёрную полосу. Морально-психологическое состояние - 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).
Тайпскрипт. Две задачи и release-notes.
release-notes/typescript-4-3.html:
- добавлена директива "override" на методы класса (вызовет ошибку, если в базовом классе этот метод не определён);
- вызывается ошибка в кондишите, если промис был вызван без "await";
- добавлена возможность объявлять статичные методы в классе таким образом - "static [propName: string]: string | number | undefined".
release-notes/typescript-4-3.html:
- добавлена директива "override" на методы класса (вызовет ошибку, если в базовом классе этот метод не определён);
- вызывается ошибка в кондишите, если промис был вызван без "await";
- добавлена возможность объявлять статичные методы в классе таким образом - "static [propName: string]: string | number | undefined".
Тайпскрипт. Три задачи и 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), которые вызываются перед конструктором.
Настроение получше, вчера разговаривал с 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), которые вызываются перед конструктором.
65 Кб, 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 { ... }".
release-notes/typescript-4-5.html:
- добавлена проверка строковых типов как дискриминантов: "{ type: `${string}Success`; body: string; }; if (r.type === "HttpSuccess") { const token = r.body;") }";
- добавлены ассершены на импорт .json (во время билда проверяется): "import ... from ... assert { ... }".
68 Кб, 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)";
- больше ничего полезного не нашел.
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)";
- больше ничего полезного не нашел.
48 Кб, 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.
Ошибки:
- добавил ненужный артикль (погода - неисчисляемое существительное).
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.
Ошибки:
- добавил ненужный артикль (погода - неисчисляемое существительное).
12 Кб, 558x114
>>5342
Наглядное пояснение к "keyof (Foo | Bar)".
Наглядное пояснение к "keyof (Foo | Bar)".
61 Кб, 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" разрешает составлять вопросительную конструкцию не по грамматике).
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" разрешает составлять вопросительную конструкцию не по грамматике).
213 Кб, 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.
Содержание, предисловие и введение.
Кэнский Сергей Е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.
206 Кб, 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.
Конспект:
- система контроля версий предназначена для записи изменений в течение времени и возможности возвращаться на любое изменение в истории;
- поддерживается любой формат файла, не обязательно текст;
- Гит - распределенная система контроля версий: каждый клонированный репозиторий является полным бэкапом;
- один проект можно разделять на несколько репозиториев и работать с отдельными людьми;
- Гит разработал Торвальдс 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.
Гит. Книга "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% наиболее полезной информации;
- если перейти на Вим сразу, то в первое время это скажется на продуктивности, поэтму автор рекомендует переходить постепенно, уделяя Виму каждый день небольшое количество времени, пока не появится уверенность, а уже потом использовать Вим как основной/единственный редактор;
- автор в своей учебной программе акцентирует внимание на практику (поэтому постараюсь повторять каждый приведенный пример у себя в редакторе).
Переводить предложения на английский лучше продолжу устно. Попробую параллельно по чуть-чуть учить Вим, авось за год что-то из этого выйдет.
Конспект:
- Гит перед сохранением вычисляет хеш-сумму (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% наиболее полезной информации;
- если перейти на Вим сразу, то в первое время это скажется на продуктивности, поэтму автор рекомендует переходить постепенно, уделяя Виму каждый день небольшое количество времени, пока не появится уверенность, а уже потом использовать Вим как основной/единственный редактор;
- автор в своей учебной программе акцентирует внимание на практику (поэтому постараюсь повторять каждый приведенный пример у себя в редакторе).
Переводить предложения на английский лучше продолжу устно. Попробую параллельно по чуть-чуть учить Вим, авось за год что-то из этого выйдет.
Гит. Книга "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 -.
Конспект:
- Гит настраивается через утилиту 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 -.
Гит. Книга "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.
Конспект:
- бывают два типа файлов: отслеживаемые и неотслеживаемые;
- проверить можно через 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.
Гит. Книга "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.
Конспект:
- бывают два типа файлов: отслеживаемые и неотслеживаемые;
- проверить можно через 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.
Гит. Книга "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 и т.д.
Конспект:
- команда 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 и т.д.
Гит. Книга "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.
Продолжу эту главу завтра.
Конспект:
- 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.
Продолжу эту главу завтра.
Гит. Книга "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.
Конспект:
- если запустить 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.
Гит. Книга "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).
Эту же главу на завтра.
Конспект:
- к одному проекту может быть подключено несколько репозиториев;
-! посмотреть список репозиториев через команду 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).
Эту же главу на завтра.
Гит. Книга "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 января определенно нужно менять жизнь. Есть время подумать, что именно требует изменений. Тяжело заниматься в таком психоэмоциональном состоянии, но пока ползу по чуть-чуть. Срочно нужен душевный подъем!
Конспект:
- посмотреть список тегов 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 января определенно нужно менять жизнь. Есть время подумать, что именно требует изменений. Тяжело заниматься в таком психоэмоциональном состоянии, но пока ползу по чуть-чуть. Срочно нужен душевный подъем!
Гит. Книга "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 января определенно нужно менять жизнь. Есть время подумать, что именно требует изменений. Тяжело заниматься в таком психоэмоциональном состоянии, но пока ползу по чуть-чуть. Срочно нужен душевный подъем!
Конспект:
- посмотреть список тегов 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 января определенно нужно менять жизнь. Есть время подумать, что именно требует изменений. Тяжело заниматься в таком психоэмоциональном состоянии, но пока ползу по чуть-чуть. Срочно нужен душевный подъем!
Гит. Книга "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 - удалить строку.
Продолжу эту главу завтра.
Конспект:
- можно устанавилвать алиасы: 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 - удалить строку.
Продолжу эту главу завтра.
Мне нужна хорошая учебная программа/литература по Linux для профессионалов. Что-то проверенное есть предложить? В Интернете много всего - глаза разбегаются.
Гит. Книга "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".
Конспект:
- при переключении между ветками не должно быть незафиксированных изменений с конфликтами;
-! чтобы ВЛИТЬ изменения В МАСТЕР нужно приключиться на МАСТЕР и сделать 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".
Гит. Книга "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".
Конспект:
- при переключении между ветками не должно быть незафиксированных изменений с конфликтами;
-! чтобы ВЛИТЬ изменения В МАСТЕР нужно приключиться на МАСТЕР и сделать 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".
53 Кб, 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.
Вим. 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.
Гит. Книга "Pro Git". 98 / 557 стр.
Конспект:
- команда git branch (-v) - выводит список веток и помечает звездочкой текущую (на которую указывает HEAD);
-! в проектах несколько стабильных веток (по каждому уровню стабильности): master, development и proposed/pu (предлагаемые обновления);
-! создавать тематическую ветку под отдельную задачу.
Вим. Повторял конспект с 29 дня по 32.
Конспект:
- команда git branch (-v) - выводит список веток и помечает звездочкой текущую (на которую указывает HEAD);
-! в проектах несколько стабильных веток (по каждому уровню стабильности): master, development и proposed/pu (предлагаемые обновления);
-! создавать тематическую ветку под отдельную задачу.
Вим. Повторял конспект с 29 дня по 32.
Гит. Книга "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.
Конспект:
- удалённые ссылки - это ссылки на ветки, теги и т.д. на удаленном репозитории, их нельзя двигать локально;
-! имена веток слежения имеют вид 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.
Гит. Книга "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.
Конспект:
- помимо 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.
Гит. Разбор статьи 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), ридонли (".), выделения ("*), поисковые ("/) и т.д.
Эту главу на завтра.
Конспект:
- 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), ридонли (".), выделения ("*), поисковые ("/) и т.д.
Эту главу на завтра.
Гит. Книга "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-регистрах ("-), а не в нумерованных.
Эту главу продолжу завтра.
Конспект:
- технически можно получать данные из локальных репозиториев друг друга;
- удаленный репозиторий голый (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-регистрах ("-), а не в нумерованных.
Эту главу продолжу завтра.
Гит. Книга "Pro Git". 143 / 557 стр.
Конспект:
- демоны в Линуксе хранятся в /etc/systemd/name.service;
- простой опенсорс веб-интерфейс к Гиту - GitWeb;
-! GitLab - продвинутый опенсорс современный веб-интерфейс для Гита;
- на Гитлабе есть админ-панель;
-! настройка и сопроводжение своего гит-сервера полезна для организаций, которые не хотят размещать код своего продукта на хостингах (типа Гитхаба), а хотят все хранить на своих серверах;
-! в Гите можно работать над проектом через несколько удаленных репозиториев (у каждой команды свой remote), а управляющий проектом будет собирать изменения каждой команды, сивать изменения локально с основным репозиторием и потом отправлять все изменения в основной репозиторий;
- пример такоого подхода - форк репизитория на Гитхабе.
Конспект:
- демоны в Линуксе хранятся в /etc/systemd/name.service;
- простой опенсорс веб-интерфейс к Гиту - GitWeb;
-! GitLab - продвинутый опенсорс современный веб-интерфейс для Гита;
- на Гитлабе есть админ-панель;
-! настройка и сопроводжение своего гит-сервера полезна для организаций, которые не хотят размещать код своего продукта на хостингах (типа Гитхаба), а хотят все хранить на своих серверах;
-! в Гите можно работать над проектом через несколько удаленных репозиториев (у каждой команды свой remote), а управляющий проектом будет собирать изменения каждой команды, сивать изменения локально с основным репозиторием и потом отправлять все изменения в основной репозиторий;
- пример такоого подхода - форк репизитория на Гитхабе.
Гит. Книга "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.
Конспект:
-! не отпралять ненужные пробелы в коммите (проверить 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.
Гит. Книга "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.
Конспект:
-! не отпралять ненужные пробелы в коммите (проверить 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.
Гит. Книга "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 (сквеш без коммита слияния).
Конспект:
- можно запрещать определенным людям пушить в определенные ветки;
- 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 (сквеш без коммита слияния).
Гит. Туториал 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 - запускает макрос с командного режима в диапазоне строк.
Эту главу на завтра.
Ещё практиковался локально. Создал конфликт в двух ветках и разрешил его при слиянии.
Конспект:
- коммиты - сжатые снимки состояния файлов и дельты, когда это возможно;
- желательно делать ветки чаще: эта операция ничего не стоит, но упрощает сопровождение проекта;
- 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 - запускает макрос с командного режима в диапазоне строк.
Эту главу на завтра.
Гит. Туториал 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).
Эту главу на завтра.
Конспект:
- 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).
Эту главу на завтра.
Гит. Туториал 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 как и инсёрт моде.
Эту главу на следующий день.
Конспект:
-! 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 как и инсёрт моде.
Эту главу на следующий день.
58 Кб, 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 игнорирует ошибки в макросе и продолжает запускать на каждой строке до конца файла.
>>8354
Опешил от такого вопроса. В моём мире Гит - один из самых важных и основных инструментов разработчика. В этой связи я не понимаю, какой смысл в том, чтобы знать эту технологию поверхностно. Я планирую начать приминать участие в разработке открытого ПО в следующем году, поэтому мне необходимо сперва изучить все возможности инструмента. Мой подход может быть неэффективен, но сейчас мне так не кажется. На своём опыте я убедился, что стратегия "плюс-минус понял, разберусь уже по ходу дела" мне не подходит: спотыкаюсь на мелочах, принимаю неоптимальные решения и в итоге трачу больше времени. Моё рабочее окружение будет зиждиться на трёх китах: терминале или терминальном мультиплексоре, текстовом редакторе и СКВ. Мне должно быть комфортно, поэтому и берусь за это основательно.
Попробовал локально сделать ребейз с конфликтами (решаются через 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 игнорирует ошибки в макросе и продолжает запускать на каждой строке до конца файла.
>>8354
Опешил от такого вопроса. В моём мире Гит - один из самых важных и основных инструментов разработчика. В этой связи я не понимаю, какой смысл в том, чтобы знать эту технологию поверхностно. Я планирую начать приминать участие в разработке открытого ПО в следующем году, поэтому мне необходимо сперва изучить все возможности инструмента. Мой подход может быть неэффективен, но сейчас мне так не кажется. На своём опыте я убедился, что стратегия "плюс-минус понял, разберусь уже по ходу дела" мне не подходит: спотыкаюсь на мелочах, принимаю неоптимальные решения и в итоге трачу больше времени. Моё рабочее окружение будет зиждиться на трёх китах: терминале или терминальном мультиплексоре, текстовом редакторе и СКВ. Мне должно быть комфортно, поэтому и берусь за это основательно.
59 Кб, 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.
>>8402
На ближайший год план копить деньги и продолжать учиться. Закончить TS и потом SQL, ElasticSearch, Rabbit, Docker и Nginx. Опять-таки, поверхностные знания по каждой перечисленной технологии уже имеются.
Конспект:
-! 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.
>>8402
На ближайший год план копить деньги и продолжать учиться. Закончить TS и потом SQL, ElasticSearch, Rabbit, Docker и Nginx. Опять-таки, поверхностные знания по каждой перечисленной технологии уже имеются.
35 Кб, 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 - сработает.
Конспект:
- 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 - сработает.
35 Кб, 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 - сработает.
Конспект:
- 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 - сработает.
Вчера клонировал репозиторий 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 - без ошибок;
- # - директивы препроцессора;
-! компиляция: обработка директив -> создает объектные файлы с машинным кодом из кода -> компоновщик/линкер собирает объектные файлы в одну программу.
Гит. Туториал 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 - без ошибок;
- # - директивы препроцессора;
-! компиляция: обработка директив -> создает объектные файлы с машинным кодом из кода -> компоновщик/линкер собирает объектные файлы в одну программу.
Вчера клонировал репозиторий 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 - без ошибок;
- # - директивы препроцессора;
-! компиляция: обработка директив -> создает объектные файлы с машинным кодом из кода -> компоновщик/линкер собирает объектные файлы в одну программу.
Гит. Туториал 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 - без ошибок;
- # - директивы препроцессора;
-! компиляция: обработка директив -> создает объектные файлы с машинным кодом из кода -> компоновщик/линкер собирает объектные файлы в одну программу.
Гит. Туториал 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 (сливает в ветку, на которой находимся - важно).
Конспект:
- 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 (сливает в ветку, на которой находимся - важно).
Гит. Книга "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.
Конспект:
- коммиты (патчи) можно отпралять через почту (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.
Гит. Книга "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.
Конспект:
- коммиты (патчи) можно отпралять через почту (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.
Гит. Книга "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).
Конспект:
- несколько стабильных веток;
- перебазировать изменения с тематической ветки по отношению к стабльной (в тематической - мёрджи);
-! можно черрипикать в сейбл последний коммит из тематической ветки (чистая история сбейбл веток);
-! 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).
Гит. Книга "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).
Конспект:
- несколько стабильных веток;
- перебазировать изменения с тематической ветки по отношению к стабльной (в тематической - мёрджи);
-! можно черрипикать в сейбл последний коммит из тематической ветки (чистая история сбейбл веток);
-! 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).
Вим. 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). Может тогда сразу Раст уже учить или просто Си повторить. Ладно, всё же этот туториал пройду до конца.
Конспект:
- марки для джампа `< и `> 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). Может тогда сразу Раст уже учить или просто Си повторить. Ладно, всё же этот туториал пройду до конца.
Гит. Книга "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).
Эту главу ещё на потом.
Конспект:
- пуллреквесты через форки;
-! 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).
Эту главу ещё на потом.
Гит. Книга "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).
Эту главу ещё на потом.
Конспект:
- пуллреквесты через форки;
-! 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).
Эту главу ещё на потом.
Гит. Книга "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 - только с доуступом к проекту (даже паблик).
Конспект:
-! #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 - только с доуступом к проекту (даже паблик).
Вим. 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 - интерпретируется как строка (указатель на чар).
Конспект:
- 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 - интерпретируется как строка (указатель на чар).
Вим. 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 - интерпретируется как строка (указатель на чар).
Конспект:
- 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 - интерпретируется как строка (указатель на чар).
Гит. Книга "Pro Git". 230 / 557 стр.
Конспект:
-! ветки запросов на слияние - псевдовтеки на сервере;
- можно получить эти ветки через git ls-remote <remote>;
- ссылки на запросы на слияние начинаются с refs/pull/ (ссылка на ветку в форке);
-! по умолчанию эти ветки не фетчатся - нужно дописать в конфиге строчку для линковки - +refs/pull/...:refs/remots/....;
-! можно открыть запрос слияния на другой запрос слияния, чтобы модифицировать его;
- через @ обратиться к юзеру (ему придет уведомление);
-! два вида уведомлений: веб и емейл, можно включить только веб и не получать письма;
-! CONTRIBUTING - будет показываться ссылка на файл при запросе на слияние: в нем описываются правила оформления кода, руководство по созданию запроса на слияние и т.д;
- помимо персональных акков есть организации со своим профилем и каталогом репозиториев;
- в организации имеются команды со своим скоупом доступа к проектам.
Тихим ходом.
Конспект:
-! ветки запросов на слияние - псевдовтеки на сервере;
- можно получить эти ветки через git ls-remote <remote>;
- ссылки на запросы на слияние начинаются с refs/pull/ (ссылка на ветку в форке);
-! по умолчанию эти ветки не фетчатся - нужно дописать в конфиге строчку для линковки - +refs/pull/...:refs/remots/....;
-! можно открыть запрос слияния на другой запрос слияния, чтобы модифицировать его;
- через @ обратиться к юзеру (ему придет уведомление);
-! два вида уведомлений: веб и емейл, можно включить только веб и не получать письма;
-! CONTRIBUTING - будет показываться ссылка на файл при запросе на слияние: в нем описываются правила оформления кода, руководство по созданию запроса на слияние и т.д;
- помимо персональных акков есть организации со своим профилем и каталогом репозиториев;
- в организации имеются команды со своим скоупом доступа к проектам.
Тихим ходом.
Вим. 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) / тип указателя);
-! константный указатель может менять ссылку (присваивать новый объект), но не значение объекта по указателю;
-! указатель на константу - наоборот (выше);
-! константный указатель на константу запрещает обе операции.
- 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) / тип указателя);
-! константный указатель может менять ссылку (присваивать новый объект), но не значение объекта по указателю;
-! указатель на константу - наоборот (выше);
-! константный указатель на константу запрещает обе операции.