Так себе программист
91 subscribers
101 photos
2 videos
1 file
138 links
Разработчик, преподаватель, к.т.н о программировании и профессии.

10 лет пишу desktop на C/С++, а когда никто не видит - на python и js.

Здесь нет иллюзий о гениальных разработчиках. Есть ежедневный труд и легкая самоирония :)

Автор: Александр Троценко
Download Telegram
Базы данных в Obsidian

Уже год как я мигрировал с Notion в Obsidian. Не сказать, что я полностью адаптировался. Многое пришлось переосмыслить.

⛔️ Одна из фишек Notion, от которой пришлось отвыкать - это таблицы.

Да, в Obsidian есть dataview - мощный инструмент для представления заметок в виде таблиц. Но в нем не хватает интерактивности.

С интерактивностью помог плагин Projects. Но он очень глючный, тормозит на больших представлениях, приводил к проблемам, да и больше не поддерживается. Пришлось от него отказаться.

А вместе с Projects отказаться и от интерактивных таблиц.

И тут с последним обновлением в Obsidian появляется встроенный модуль Bases (на скрине).

Ух и вау! Таблицы! Наглядные как в dataview и интерактивные как в Notion.


Ну где они были раньше!

На первый взгляд - удобно! Большие представления работают плавно, есть гибкие настройки фильтров.

Короче, осваиваю и очень активно, так как в августе во всю веду подготовку заданий на семинар к новому учебному году 🎓
👍4
С предыдущим тестом отдохнули и снова во все тяжкие ⤵️😟

#include <iostream>
#include <vector>

int main() {
std::vector<int> vec { 1, 2, 3, 4, 5, 6 };
for (auto i = vec.size() - 1; i >= 0; --i) {
std::cout << vec[i] << ' ';
}
return 0;
}
Выше дан код C++. Какой вывод будет у программы?
Anonymous Quiz
5%
Никакой
43%
6 5 4 3 2 1
24%
5 4 3 2 1
29%
Неопределенное поведение
Разделители разрядов в C++

Чтобы нам было проще воспринимать большие числовые константы, в C++ существуют разделители разрядов (digit separators).

С ними непонятно число
long a = 100000;

превращается в понятные сто тысяч!
long a = 100'000;


В качестве разделителя используется символ одинарной кавычки ('). Мы сами можем выбирать, где ставить разделитель и на сколько разрядов делить число. Компилятор все равно разделители не учитывает.

Смотрите, как получается:
int a = 122'302;
long b = 10'823'013'000;
double pi = 3.141'592'6535;
uint8_t mask = 0b1010'1101;
uint32_t transparent_red = 0x80'FF'00'00;


Но есть пара ограничений:
⛔️ разделитель не может стоять в начале или конце числа: '100, 10'
⛔️ разделитель не может стоять после точки: 1.'003

Разделители разрядов доступны, начиная с C++14. До этого читаемость констант улучшали разными способами. Например, я использовал:
- научный вариант записи, вроде 1e-5
- выражения, вроде 10 * 1000 * 1000 (что скорее экзотика).

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



А вы использовали разделители?

🔥 - ага
🤷‍♂️ - не доводилось
😁 - ох уж этот ваш C++
🤷‍♂3😁2👍1🔥1
🔼 Кстати, продолжая тему истории программирования, напоминаю про серию тестов по датам создания языков программирования.

Отличная возможность освежить знания)
Media is too big
VIEW IN TELEGRAM
Объединение коммитов в TortoiseGit

В последнем видео про WIP-коммиты я рассказывал, что коммиты можно объединять с помощью операции rebase. Но оказывается, что в TortoiseGit есть более простой способ.

В логе коммитов есть пункт меню "Combine to one commit", который объединяет выделенные коммиты, позволяя отредактировать сообщение.

Подробнее смотрите в коротком видео ⤵️

📱 Смотреть на YouTube

📱 Смотреть в VKVideo



Как вам формат вертикальных видео?

Мне кажется неплохо. Но какая же запара впихнуть горизонтальный экран в вертикальный ролик 😅
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Вывод какой команды показан на картинке выше?
Anonymous Quiz
26%
git status
44%
git branch -vv
7%
git diff
22%
git log
🎉1
Как ведут документацию проекта в Capella

Почти год назад я рассказывал вам про ведение документации проекта на Markdown, когда файлы документации располагаются рядом с исходным кодом. То есть в том же репозитории.

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

И тут попадается живой пример!

👉 Копаясь в проекте Capella на GitHub, я обратил внимание на довольно развитый раздел Wiki. На первый взгляд, ничего особенного, у многих такое есть. Но при переходе по первой же ссылке я попадаю обратно в репозиторий!

GitHub Wiki оказалась фасадом, который ведет к файлам документации, расположенным в основном репозитории.
И этих файлов там больше трех сотен.

В Capella вместо Markdown используется MediaWiki. Они похожи. В обоих случаях культивируется парадигма "doc as code". Однако MediaWiki посложнее и предлагает больше инструментов для разработки документации. Но самое главное, что GitHub "из коробки" умеет рендерить и те, и другие файлы.

Я не знаю, насколько наличие документации мешает работе с репозиторием. Ну git clone будет выполняться подольше. Ну места на диске будет занято чуть больше...

С другой стороны:
- документация всегда под рукой,
- как следствие, поддерживать ее проще,
- как следствие, правки кода и документации попадают в один пул-реквест,
- как следствие, сборка с пул-реквеста готова в production 🤭

В общем, подход имеет место быть. Проект Capella не заброшен и развивается. 5000+ коммитов, ежегодные релизы, полсотни контрибьютеров говорят сами за себя.



🎉 Этим постом вводится новая рубрика #ЖизньДругих, где мы будем разбирать интересные решения в открытых проектах. Предыдущий пост про Minetest тоже в нее попал ⤴️
👏2🔥1
#include <iostream>

int main() {
int a = 11, b = 4;
double c = 4;
std::cout << a / b << " " << a / c;
return 0;
}
Выше дан код C++. Какой вывод будет у программы?
Anonymous Quiz
75%
2 2.75
15%
2.75 2.75
5%
2 2
5%
11/4 11/4
🔥2
"Этого не может быть...

...потому что этого не может быть никогда".

Помните крыловского "философа без огурцов", который критиковал мужика-огородника, а сам так ничего и не вырастил?

👇 Так вот похожий сюжет есть и у Чехова в "Письме к ученому соседу". Только здесь "умник" наполнен не книгами и журналами, а слухами и предрассудками.

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

В письме мужик в пух и прах разматывает достижения современной науки (с поправкой на 19 век).
Ну, например, тезис об эволюции:

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


Или про людей на Луне:

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


И про пятна на Cолнце:

Из какого мокрого тела сделаны эти самые пятны, если они не сгорают? Может быть, по-вашему и рыбы живут на солнце? Извените меня дурмана ядовитого, что так глупо съострил! Ужасно я предан науке!


😁 Мужик не знает о том, что он не знает, ...и ему норм (эффект Даннинга-Крюгера?)

Но к чему это я.

А к тому, что образование - это наилучший способ расширить перспективу собственного мышления, чтобы реже попадаться в ловушку самоуверенной некомпетентности. Да-да, именно реже. Потому что вероятность выступить "так себе" у нас будет всегда 😉



📍 Чехов А.П. - "Письмо к ученому соседу" (1880) #КнижнаяПолка@mediocre_developer
🔥4
Традиционно университет в сентябре отнимает почти все свободное время, но без теста я вас не оставлю 😊

По крайней мере сегодня 😁

👇

#include <iostream>

int main() {
for (int i = 0; i < 2;) {
std::cout << i;
for (int j = 0; j < 2; ++j, ++i)
std::cout << j;
}
return 0;
}
Выше дан код C++. Какой вывод будет у программы?
Anonymous Quiz
39%
001101
44%
001
17%
Бесконечные нули и единицы
0%
Ошибка сборки
Симпотный робот 👍

Но если захочется отсканировать QR, то надо будет либо поклониться ему, либо встать на колени 🧎‍➡️🤖

Ну реально не удобно. Что ж так низко куарчики то?

А робот симпотный, да.



Это, конечно, не рубрика "путаница в интерфейсах", но отличный повод про нее напомнить 😊
😁4👾4
Переезд блога

🎉 Рад сообщить, что я наконец-то перевез свой сайт с большими статьями с платформы hashnode на собственную статику с хостингом на GitHub Pages.

👉 https://mediocre-developer.ru

А лозунг то какой, а! Зацените:
Признание - первый шаг на пути от “так себе” вчера к “немного лучше” сегодня.

Философия так себе программиста 🔥
Только через осознание своего незнания мы развиваемся и двигаемся дальше.

Но ладно с ней, с философией, перейдем к практике.

🔸 Чем же не угодил hashnode?

1. Деградация индексации в поисковиках. С марта этого года платформу начали дудосить какие-то плохие ребята и разработчики поставили контроль входа, который заблокировал в том числе роботов гугла и яндекса. Просмотры упали в ноль (см. скрин). Техподдержка отморозилась и приказала ждать. Я подождал полгода... и ни-че-го.

2. Слабая кастомизация. Кроме статей, ничего особенного и не опубликуешь.

3. Риск блокировки. Ресурс зарубежный, а исходников на руках нет.

🔸 Почему GitHub Pages?

1. Простота входа. В сети есть готовые шаблоны сайтов. Сконфигурировал под свои нужды и сразу захостил.

2. Исходники на руках. Весь сайт генерируется из markdown с помощью jekyll. В случае чего развернуть можно где угодно, хоть на домашнем сервере.

3. Бесплатный хостинг. Чего тут комментировать то)

Честно говоря, как только в hashnode провалились просмотры, желание писать улетучилось. Несколько статей так и остались в черновиках. Теперь постепенно их допишу и опубликую. Все таки читательская активность невероятно мотивирует 😊
🔥6
Так себе программист
Переезд блога 🎉 Рад сообщить, что я наконец-то перевез свой сайт с большими статьями с платформы hashnode на собственную статику с хостингом на GitHub Pages. 👉 https://mediocre-developer.ru А лозунг то какой, а! Зацените: Признание - первый шаг на пути…
К слову, с сайтом очень помогли нейронки. И с кодом, и с переездом. Я не знаю, сколько бы я сам с ним просидел, так как в вебе не бум-бум. Ну то есть небольшой опыт имеется, но это было очень давно.

Возможно, без нейронок я вообще бы за это не взялся. Многое пришлось бы изучать. Сомнительная инвестиция. Отдал бы на аутсорс)

А теперь, получается, и волки сыты, и овцы цели.
💪 Мощь
👍3
#include <iostream>

struct Foo {
Foo() {
std::cout << "Foo ";
throw 42;
}
~Foo() {
std::cout << "~Foo ";
}
};

int main() {
try {
Foo o;
} catch (int) {
std::cout << "catch";
}
return 0;
}
😁4
Выше дан код C++. Какой вывод будет у программы?
Anonymous Quiz
40%
Foo ~Foo catch
20%
Foo 42 catch
7%
Foo ~Foo
33%
Foo catch
🤬1