Если бы программисты создавали Землю

Если бы программисты создавали Землю Программист, Программирование, IT, Создание, Земля, Разработка, Длиннопост
Если бы программисты создавали Землю Программист, Программирование, IT, Создание, Земля, Разработка, Длиннопост
Если бы программисты создавали Землю Программист, Программирование, IT, Создание, Земля, Разработка, Длиннопост
Если бы программисты создавали Землю Программист, Программирование, IT, Создание, Земля, Разработка, Длиннопост
Вы смотрите срез комментариев. Показать все
317
Автор поста оценил этот комментарий
Иллюстрация к комментарию
раскрыть ветку (103)
146
Автор поста оценил этот комментарий
Иллюстрация к комментарию
раскрыть ветку (14)
61
Автор поста оценил этот комментарий

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

раскрыть ветку (12)
28
Автор поста оценил этот комментарий

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

раскрыть ветку (4)
2
Автор поста оценил этот комментарий

Монстров Химер Иванович

1
Автор поста оценил этот комментарий

А там объясняется как этот бассейн помог бы всему делу? ну например швабры держат потолок, вентилятор сдувает газ, на дирижабле эвакуация, а бассейн с вениками для чего?

раскрыть ветку (2)
3
Автор поста оценил этот комментарий

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

1
Автор поста оценил этот комментарий

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

2
Автор поста оценил этот комментарий

Это незадокументированные фичи

Автор поста оценил этот комментарий
Прочёл - поделись
раскрыть ветку (5)
8
Автор поста оценил этот комментарий

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

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

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

раскрыть ветку (2)
1
Автор поста оценил этот комментарий
Спасибо!
Автор поста оценил этот комментарий

Из старого: если бы программисты строили дома

Автор поста оценил этот комментарий

Похоже на флэш-игрушку grow island в двух частях.

41
Автор поста оценил этот комментарий
Иллюстрация к комментарию
раскрыть ветку (2)
9
Автор поста оценил этот комментарий

Это брейнфак? Если он, то вы знаете толк в извращениях

Иллюстрация к комментарию
ещё комментарий
70
Автор поста оценил этот комментарий

Не матерись, тут приличное обшчество

раскрыть ветку (63)
54
Автор поста оценил этот комментарий

Не понимаю ненависти к goto. Крайне хороший метод - не надо писать многочисленные строки для выхода из циклов, им можно заменить кучу if-ов и множество другой шняги. К тому же, на процессорном уровне практически любой кейс/цикл является, как раз таки,  несколькими операциями перехода. Если адекватно его применять, то он может повысить читабельность кода. Он крайне оптимален и удобен - так за что же его не любят?

раскрыть ветку (61)
46
Автор поста оценил этот комментарий
1. Ты спокойно теряешь кучу памяти, потому что все, что из чего ты выпрыгнул с goto, не вычищается
2. Теряется линейность кода. Если это 1-2 перехода это терпимо, а вот больше превращаются в полный хаос и безобразие

Вообще по этому поводу достаточно литературы
раскрыть ветку (19)
12
Автор поста оценил этот комментарий

По пункту 1 как раз приводят классический контрпример:


int result = initA();

if (!result) goto a;


result = initB_onlyAfterA();

if (!result) goto b;


// some logic


b:

freeB();

a:

freeA();

раскрыть ветку (18)
17
Автор поста оценил этот комментарий

Надо сделать оговорку: ...не вычищается автоматически.

раскрыть ветку (1)
8
Автор поста оценил этот комментарий

Это если язык вообще подразумевает чистку чего-то автоматически) Да, в какой-нибудь Java такую логику представить сложно. В C++ тоже можно сделать гораздо красивее.  А вот на чистом C уже получаются неплохие оптимизации.

Автор поста оценил этот комментарий
Вот эта конструкция конечно дофига проще чем просто дать переменной почиститься после выхода из локальной области и вызывать someLogic(initA()||initB())
раскрыть ветку (11)
Автор поста оценил этот комментарий

Сразу видно что ты системный код даже не читал, не говоря уж о написании. Даже не представляешь, как это что-то вдруг может не уметь само «почиститься».


someLogic(initA()||initB())

И опять зачистку выделенных ресурсов потерял.


Заодно представь, что A прошло успешно, а B обломалось.

раскрыть ветку (10)
Автор поста оценил этот комментарий

>И опять зачистку выделенных ресурсов потерял.

Предположу что функция возвращает значение


>Заодно представь, что A прошло успешно, а B обломалось.
Для этого любая нормальная функция должна обрабатывать исключения внутри себя. Вообще не понимаю почему подобные вещи должны обсуждаться


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


При использовании goto ты можешь(Ну точнее это происходит неявно) запросто вызвать деструктор при выходе переменной из области видимости, перескочив через конструктор. Или, наоборот, не вызвать деструктор, успев при этом вызвать конструктор. В лучшем случае ты получишь утечку памяти и unexpected поведение, в худшем - просто ничего не заработает.


> Даже не представляешь, как это что-то вдруг может не уметь само «почиститься».
Ну, если у нас есть gc, то скорее всего мы просто можем забить на то что мы там где-то что-то объявляли/инициализировали. И то не стоит этого делать, дабы не получить постоянные блокирования потоков этим самым сборщиком. Но поскольку мы говорим о плюсах, любое невнимательное обращение с памятью или flow приведет к чему угодно, но только не к стабильной работе

раскрыть ветку (9)
Автор поста оценил этот комментарий

Дружище, для справки: во множестве языков НЕТ никаких исключений и деструкторов :)) Вообще нет. Совсем.


И ещё для справки: C++ и C — разные языки. Причём первый довольно редко используется для системного кода, поскольку содержит слишком много undefined behavior и накладных расходов.


Но речь не только про C, отнюдь. Из современных ЯП это, например, ещё и Go. И да, оператор goto в нём есть.

раскрыть ветку (8)
Автор поста оценил этот комментарий

"Исключение" это не только try/catch (Вот его терпеть не могу, засрут весь код им, читать невозможно) это в первую очередь обработка исключительных значений, asset, if(value) и т.п.


Что ты понимаешь под "системным кодом"? В первый раз слышу как определение чего-то


И почему мы вообще обсуждаем С? Это страшное легаси, его запретить надо, у него ub еще больше, а отсутсвие абстракций тупо раздувает код и возможность ошибок

раскрыть ветку (7)
1
Автор поста оценил этот комментарий
И почему мы вообще обсуждаем С? Это страшное легаси, его запретить надо

Ггггг) Это твои JS-фреймворки (угадал?) становятся легаси через месяц. А вот альтернативы C на сегодняшний день тупо нет. Вообще нет. Совсем. И подвезти не обещали.


Почитай ответ Торвальдса на предложение переписать Git на C++. Занимательно, хотя и не везде цензурно) Кстати, обрати внимание на имя автора вопроса.


http://harmful.cat-v.org/software/c++/linus


Кстати, переносимость — тоже не BS, а ещё одна вещь, в которой у C конкуренты элементарно отсутствуют. Просто нет больше настолько переносимого кода, понимаешь?

Что ты понимаешь под "системным кодом"

Да вроде ничего нового. Код, критически важный для функционирования прикладного кода поверх него.


Ядра операционных систем, прошивки контроллеров, виртуальные машины, декодеры видеопотока, серьёзные математические библиотеки. Всё это — голый C, без исключений.

раскрыть ветку (6)
Автор поста оценил этот комментарий

Причем, предположим, что ты понимаешь что делаешь, но достаточно по невнимательности/незнанию прописать 


int result0 = initA();

if (!result) goto a;

int result1 = initB_onlyAfterA();

if (!result) goto b;


и превратить твой контрпример в пример того как делать нельзя; - об этом писал Голуб во всем известной книге про стреляние по ногам

раскрыть ветку (3)
1
Автор поста оценил этот комментарий

Забавно, как раз Голуба достал из шкафа перечитать)


Беда всех таких «контрпримеров» в том, что невнимательность и опечатка остаются невнимательностью и опечаткой, а не дефектом самого подхода. Ты же можешь написать (Java):


class A {

String bar;


void foo(String baz) {

if (baz != null) doSomething(bar.length()); // NullPointerException

}


Беда ли Java в том, что ты перепутал bar и baz?)

раскрыть ветку (2)
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
Автор поста оценил этот комментарий

И я о том же! Не надо приводить чью-то опечатку как пример ошибки в языке.


Тем более что IDE уже лет двадцать на такое указывают.

73
Автор поста оценил этот комментарий
Иллюстрация к комментарию
раскрыть ветку (26)
49
Автор поста оценил этот комментарий

Минусы минусами, но мне бы хотелось объяснения. Ибо все аргументы, которые я читаю сводятся к "не по канону", что сложно назвать минусом метода, имхо

раскрыть ветку (24)
45
Автор поста оценил этот комментарий

это как пик ханзо в овере: не все на нем плохо играют, не такой уж это плохой герой, но как только ты его пикнул - сразу получил 5 репортов XD

раскрыть ветку (22)
42
Автор поста оценил этот комментарий
Иллюстрация к комментарию
21
Автор поста оценил этот комментарий

Друг, играющий в овер, постоянно пикает Ханзо. В принципе, у него всегда были странные вкусы: ещё в школе он просил добавку гречки, а ещё брал макароны без котлеты... Всегда знала, что с ним что-то не так

раскрыть ветку (7)
13
Автор поста оценил этот комментарий

Что ты имеешь против гречки ? -_-

6
Автор поста оценил этот комментарий

Что не так с гречкой? А жрать котлеты из школьной столовки все равно что прыгать с крыши стройплощадки в снег

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

эм, у нас были офигенные котлеты с крутой подливкой

2
Автор поста оценил этот комментарий

Может он еще и манку с комочками любит?

раскрыть ветку (3)
8
DELETED
Автор поста оценил этот комментарий
Иллюстрация к комментарию
раскрыть ветку (2)
DELETED
Автор поста оценил этот комментарий

Мммм, а ещё скрип мела по доске, скрип пенопласта.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

А ногтиком по гипсовому бюсту из кабинета изо?

Автор поста оценил этот комментарий
Это самый плохой герой и от него почти никакого толку, кто бы на нем не играл.
раскрыть ветку (12)
6
Автор поста оценил этот комментарий

то-то я его как не пикну (ранг, быстрая или аркада - без разницы), то золото по урону мое (привет бастиону, хогу, риперу и крысе в тиме), золото по содействиям в убийствах мое (привет обезьяне, люсио и мойре в тиме) золото по убийству на объекте - мое (привет лоурэнж дамагерам) и зачастую даже золото по времени объекта (привет всем танкам и хилам). За игру стабильно минимум одна золотая медаль и 2 серебра, каждая вторая-третья катка - мой лучший момент, причем очень редко, когда заря, рейн или мей могут посапортить и законтролить врагов, чтобы скомбить мою ульту. Это не герой плохой, это тима из таких руинеров как ты, которые после пика ханзо трольпикают, фидят и дизморалят. и все это на ранге 2200.

Может Ханзо не играбелен на рейтингах 3500++, но до 2000 он гнет врагов как тетиву лука!

И да, ханзо - даже при этом не мой мейн, и аим у меня как у кота на джойстике. XD

раскрыть ветку (11)
4
Автор поста оценил этот комментарий
А теперь иди рот с мылом помой
1
Автор поста оценил этот комментарий
Ты пикаешь дамагера и хвалишься золотом по урону? А что ещё у тебя должно быть?
раскрыть ветку (6)
1
Автор поста оценил этот комментарий

когда у ханзо золотой урон, а в тиме бастион или крыса... не ты ли на этом бастионе играешь?

раскрыть ветку (5)
Автор поста оценил этот комментарий

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

раскрыть ветку (4)
Автор поста оценил этот комментарий
Иллюстрация к комментарию
раскрыть ветку (2)
1
Автор поста оценил этот комментарий

учись, спецом для тебя откатал

Иллюстрация к комментарию
Автор поста оценил этот комментарий

Учись у папки!

Иллюстрация к комментарию
8
DELETED
Автор поста оценил этот комментарий

Очень много способов выстрелить себе в ногу. Слишком много. Можно забыть что-то удалить, очистить, закрыть. Можно попасть из готу на готу и обратно и зациклиться. Про повышение читаемости кода - это вообще какое-то странное утверждение. Если у меня 3 вложенных if? Это готу на готу на готу. Это туда-сюда по коду листать?

2
Автор поста оценил этот комментарий

попробуйте потоньше

10
Автор поста оценил этот комментарий

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


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


В общем, использовать только по КРАЙНЕЙ необходимости и только если это лучшее решение. Компилятор и сам готов расставит, если вопрос в оптимизации.

15
DELETED
Автор поста оценил этот комментарий
сарказм?

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

раскрыть ветку (11)
13
Автор поста оценил этот комментарий
Но гото усложняет отладку и читабельность кода.

С этого момента поподробней. Отрыл даже статейку на хабре
https://habrahabr.ru/post/114211/

Пример оттуда:
С goto

if (a)
{
A;
goto L3;
}
L1:
if (b)
{
L2:
B;
L3:
C;
goto L1;
}
else if (!c)
{
D;
goto L2;
}
E;

Без goto:

char bf1, bf2, bf3;

if (a)
{
A;
bf1 = 1;
}
else
bf1 = 0;


bf2 = 0;
do
{
do
{
if (bf3 || b)
bf3 = 1;
else
bf3 = 0;
if (bf3 || bf2)
B;
if (bf3 || bf1 || bf2)
{
C;
bf1 = 0;
bf2 = 1;
}
if (!bf3)
{
if (!c)
{
D;
bf3 = 1;
}
else
{
bf3 = 0;
bf2 = 0;
}
}
}
while (bf3);
}
while (bf2);
E;

Надо ли мне уточнять, какой из вариантов выглядит красивее и удобнее читается?


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

Порадовало. Достаточно вот этой вырезки:

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

То-есть опять всё сводится к "не по канону"?

Почему любое использование goto считается непрофессионализмом, если рабочий код с такой командой обозначает, что кодер действительно понимает ход работы своей программы?

раскрыть ветку (10)
15
Автор поста оценил этот комментарий

у goto связь приходится специально отслеживать, повышается риск ошибки.

goto может быть и циклом и if'ом, придется специально разбираться, что есть что

программист, применивший goto, может понимать логику работу программы. а другой программист, пришедший на проект, может её не понимать, так что "по канону" это очень важно.

35
Автор поста оценил этот комментарий

чет оба примера говно какое-то

25
DELETED
Автор поста оценил этот комментарий

ни один из приведённых не выглядит красиво ни на пол рубля, ибо если нет табуляции, то делать такие столбы скобок - аморально

раскрыть ветку (4)
4
Автор поста оценил этот комментарий

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

5
Автор поста оценил этот комментарий

Докапываешься, игнорируя суть

раскрыть ветку (1)
4
Автор поста оценил этот комментарий

да нет, к форматированию тоже есть вопросы

2
Автор поста оценил этот комментарий

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

2
Автор поста оценил этот комментарий

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

Во первых это очень очень специфический и странный алгоритм

Во вторых его куски можно обернуть в функции и не использовать готу

В третьих там приведены варианты как это иожно без функйий и готу по челтвечески сделать

В четвертых хоть какой-то прирост перфоманса будет только на низкоуровневых языках типа си


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

Ну и пацаны засмеют, это тоже немаловажно, когда ты работаешь в команде/опенсорс

2
Автор поста оценил этот комментарий

По примеру - вот это перепрыгивание goto L3 после A непонятно. Мы ведь можем дублировать код (пусть даже функциями), можно просто продублировать выполнение C в случае истинности a. Прыгать в середину цикла это... Накуя?

UPD:

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

в жизни такие алгоритмы почти не встречаются

Затем приводит этот же алгоритм как довод к использованию goto

Затем на замечание в комментариях, что вместо ужасного блока с if'ами можно написать

https://s.mail.ru/Dsiw/r8a3RTZqU

говорит, что рефакторить нельзя, что вот такая задача, надо реализовывать вот это извращение.

имхо, если тебе запрещают это рефакторить, и заставляют реализовывать, можно и goto использовать, хуже уже не будет.

Автор поста оценил этот комментарий

Вообще, вопросы к обоим фрагментам кода (в исходной статье): во втором хотя бы сразу видно что есть цикл. А первый, как отметили в комментариях, не корректен.

ещё комментарий
Автор поста оценил этот комментарий

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

35
Автор поста оценил этот комментарий
Сотворил Бог зверей, птиц и тварей прочих.

И сказал Бог: Заебись!

И все заеблось...

28
Автор поста оценил этот комментарий

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

раскрыть ветку (18)
46
Автор поста оценил этот комментарий

- Мужики, посоветуйте чтиво на ночь!

- Код ядра линукса!

раскрыть ветку (2)
17
Автор поста оценил этот комментарий
Анекдоты про полярников подъехали.
раскрыть ветку (1)
8
Автор поста оценил этот комментарий

От бородатых владельцев свитеров с оленями!

1
Автор поста оценил этот комментарий

Пример, где нужен goto? За исключением выхода из нескольких циклов (для этого уже есть конструкции) и кодогенерации (где без него тоже прекрасно живется).

раскрыть ветку (14)
Автор поста оценил этот комментарий

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

Чтобы не изобретать велосипед, приведу пример из ядра линукса:
kernel/power/hibernate.c
Каждый из goto пришлось бы заменить на всё, что написано под соответствующей меткой. Например вместо

goto Enable_irqs;

на 287 строке пришлось бы написать всё это:

local_irq_enable();
enable_nonboot_cpus();
platform_finish(platform_mode);
dpm_resume_start(in_suspend ?
(error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE);
return error;
Иллюстрация к комментарию
раскрыть ветку (13)
4
Автор поста оценил этот комментарий
на 287 строке пришлось бы написать всё это:

Нет, не пришлось бы. Здесь четкая вложенная конструкция.

Например, строчки 278-314 заменяются на


if (!error && !hib_test) {

__error = disable_nonboot_cpus()
__if (!error && !hib_test) {

__<все, что внутри>

__}

__enable_nonboot_cpus()

}
platform_finish(..);


И по мне так даже лучше.

с которыми нужно работать в строго определенном порядке (а иначе - дэдлок).

Можно пример (с goto)? Казалось бы, это ровно причина НЕ использовать goto.

раскрыть ветку (6)
1
Автор поста оценил этот комментарий
Это вы сейчас только один goto заменили на if, а если все?
раскрыть ветку (5)
2
Автор поста оценил этот комментарий

Я все так заменю. Здесь я заменил 2, например.
Скиньте ссылку на код (или в pastbin пошлите). Я отредактирую, чтобы не осталось goto

раскрыть ветку (4)
2
Автор поста оценил этот комментарий

скажи, ты (я на ты, ничего?) действительно хочешь в пятницу вечером сидеть и кодить, чтобы доказать свою точку зрения, потому, что в интернете кто-то неправ?
Peace, man!
Можно кодить с goto, а можно и без него. Большинству людей оно и не нужно. Но иногда приходится кстати. Мне, например, нравится, как написана эта функция, никакой путаницы нет.

раскрыть ветку (1)
4
Автор поста оценил этот комментарий

У меня сейчас 16:38:)

Это заняло минут 5, лол. Из них 3 я проверял, что не накосячил.

тобы доказать свою точку зрения, потому, что в интернете кто-то неправ?

Эм. Всё началось с моей просьбы:

Пример, где нужен goto?
Пока что я не видел примера, где нужен goto:)


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

Автор поста оценил этот комментарий

Вот для чего и нужны функции)))

раскрыть ветку (4)
Автор поста оценил этот комментарий
Перепиши как надо)
Без 5-6 уровней вложенных ифов, и с минимумом вызовов функций (это все таки код ядра)
раскрыть ветку (3)
Автор поста оценил этот комментарий

А мне оно надо? Я Линуксом не пользуюсь. У меня сервера на FreeBSD

раскрыть ветку (2)
1
Автор поста оценил этот комментарий
Открыл наугад пару файлов из ядра freeBSD - тоже goto вовсю используется
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Ладно)

Автор поста оценил этот комментарий

вот вы свели тут все к программированию, а ебанутые теперь не могут понять чем оскорблены их чувства ))

1
Автор поста оценил этот комментарий

Басик - наше все!

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку