Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Как заменить строку на цифры у оператора IN?

Лучший ответ:
Цифры тут как раз совершенно не обязательны, а вот знаков вопроса должно быть больше. На каждый айди. 
ПХП не джинн из бутылки, чтобы отгадывать, что тут имелось в виду - целиком строка или отдельные значения.
Если нужны отдельные значения, то и передавать их надо по отдельности, n'est pas?

Это конечно не так красиво выглядит, но других вариантов все равно нет

$array = [8,10,11]; 
$in  = str_repeat('?,', count($array) - 1) . '?';
$sql = "SELECT * FROM users WHERE id NOT IN ($in)";
$stmt  = $db->prepare($sql);
$stmt->execute($array);

Худший ответ:
Если передаваемый параметр - это CSV идентификаторов, то следует использовать
SELECT *
FROM `users`
WHERE FIND_IN_SET(id, ?);

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

PS. В принципе этот CSV несложно довести до состояния JSON array (всего-то две скобки добавить) - тогда можно применить JSON_CONTAINS(), что может быть немного быстрее. А уж если переданный JSON распарсить на отдельные значения с помощью JSON_TABLE(), так ещё и от фуллскана избавимся (правда, версия сервера нужна достаточно свежая).
Вопрос: 1С как вывести в Сообщить( число + строка )?

Лучший ответ:
можно чуть короче: "" + число + строка. Или СтрШаблон("%1 %2", Число, Строка). Да и вообще в БСП есть несколько методов в модуле СтроковыеФункцииКлиентСервер, которые реализуют пародию на шаблонные строки и они несколько удобнее, когда потом придется менять вывод.

Худший ответ:
Типы приведи
Сообщить( Строка(число) + строка );
Вопрос: Почему выдает ошибку 1442?

Лучший ответ:
CREATE DEFINER=root@localhost
TRIGGER bi_trigger_in_employees
BEFORE INSERT ON employees 
FOR EACH ROW 
SET NEW.entpr_name = COALESCE( NEW.entpr_name, 
                               ( SELECT ap_name 
                                 FROM companies 
                                 WHERE id = NEW.entpr_id 
                                 LIMIT 1
                                )
                              ),
    NEW.employee_name = COALESCE( NEW.employee_name, 
                                  ( SELECT CONCAT_WS(' ',np_surname,np_name,np_patronymic) 
                                    FROM people 
                                    WHERE id = NEW.employee_id
                                    LIMIT 1
                                   )
                                 );
1) Суть ошибки - именно та, что написана в сообщении. Нельзя UPDATE таблицы, на которой определён триггер (и другие DML - тоже нельзя).
2) Изменять вставляемые значения надо до вставки, а не после. Потому BEFORE триггер. 
3) По-хорошему, нужен ещё аналогичный BEFORE UPDATE триггер.
4) Все SET выполняются в одном операторе (см. https://dev.mysql.com/doc/refman/8.0/en/set-variab...). А триггер из одного оператора обходится и без BEGIN-END, и без DELIMITER.
5) При скалярном присвоении из подзапроса ВСЕГДА добавляйте LIMIT 1. А по-хорошему ещё и ORDER BY. На показанный код ни то, ни другое не влияет - всё равно одна запись, ибо отбор по PK. Но вдруг структура поменяется, а про триггер забудете? Начнутся ошибки - оно надо?

 тогда да, ошибка на бесконечный цикл. Но тут почему?
Как это ни странно, но в теле триггера неизвестно, на какое событие определён триггер.

Худший ответ:
Сделайте триггер BEFORE INSERT и задайте значение полям объекта NEW (как это и предполагается таким триггером by design)
Вопрос: Кто-нибудь может подсказать хороший материал и roadmap по Django?

Лучший ответ:
Первые три - можно в любой последовательности. Django в последнюю очередь.

html/css/js
Архитектура бд
python
django


Худший ответ:
Учим Django за час хауди хо
Вопрос: Ubuntu for macOS?

Лучший ответ:
Лучшая виртуализация для макоси, имхо, Parallels. Ставить линукс на голый макбук не рекомендую.

Худший ответ:
Доброго дня.
Ставил на старенький мак Ubuntu для слабых компов (не помню точно название) вместо родной оси.
Всё отлично работает.  Ребёнку для занятий школьных самое то было.

Можно впоследствии переустановить родную ось штатными средствами.
Вопрос: Нужен ли бэкендеру HTML?

Лучший ответ:
Вопрос уровня "нужно ли водителю уметь пользоваться ложкой".

Худший ответ:
Обязательно. 80% случаев, что любого бека будут делать фулл-стеком и вас, даже если вы не знаете, вас просто заставят выучить его. А так же заставят выучить css, JavaScript, и т.д.

Но я могу ошибаться в том случае, если у вас бекенд специфический, что в вашем стеке может быть не востребовано (типа серверов на линуксе и т.д.) либо компания, где есть очень чёткое о строгое распределение по стекам, по этому вас могут просто не грузить этим. Но это вряд ли, если вы захотите повышаться, то вы просто обязаны будете
Вопрос: Знаете ли вы сколько точно лет провайдер хранит логи?

Лучший ответ:
Это персональные данные хранятся вашим провайдером 5 лет после рассторжения договора, а "логи" всего полгода:

"
8. Удаление из технических средств накопления информации сообщений электросвязи осуществляется автоматически в соответствии с предусмотренными программным обеспечением алгоритмами и требованиями к применяемым техническим средствам накопления информации исходя из максимально допустимого срока хранения таких сообщений в течение 6 месяцев с даты окончания их приема, передачи, доставки и (или) обработки.
"
12.04.2018 № 445 "Об утверждении Правил хранения операторами связи текстовых сообщений пользователей услугами связи, голосовой информации, изображений, звуков, видео- и иных сообщений пользователей услугами связи".

Худший ответ:
У нас логи хранятся, пока не кончится  место. А места много...
Вопрос: Как стать андроид разработчикам если ничего не понятно?

Лучший ответ:
Как это всему научиться и гдев интернете и в компаниях. На рабочем проекте проще разбираться
как попасть в компании? знать больше чем другие. Никто и не обещал что будет просто(кроме всяких курсов). Если бы было просто, то столько бы не платили

Худший ответ:
Андроид это операционка.
Как старичок, советую изучить язык Delhi community по книжке "Delphi для чайников" Нила Рубенкинга.  Запустите в Windows, а потом почитайте, как запустить на Андроиде.
А потом можете и другие языки освоить.
Вопрос: Как с помощью PowerShell произвести замену во всех файлах определенной директории?

Лучший ответ:
Добрый день.
Можете использовать для этого такую конструкцию:
$Files = Get-Childitem -path "C:\Test Install" -recurse | Where-Object {$_.Extension -eq ".txt"}
foreach ($file in $Files)
        {
        $txt = Get-Content -Path $file.FullName
        $txt = $txt -replace "a", "x"
        Set-Content -Path $file.FullName -Value $txt
        }

Худший ответ:
Добрый день.
Можете использовать для этого такую конструкцию:
$Files = Get-Childitem -path "C:\Test Install" -recurse | Where-Object {$_.Extension -eq ".txt"}
foreach ($file in $Files)
        {
        $txt = Get-Content -Path $file.FullName
        $txt = $txt -replace "a", "x"
        Set-Content -Path $file.FullName -Value $txt
        }
Вопрос: Как преодолевается потеря мотивации в ИТ?

Лучший ответ:
- Жениться
- Взять ипотеку
- Родить парочку детей
(вовсе не обязательно в такой последовательности :) )
После всего оного мотивации будет - выше крыши! :)

Худший ответ:
Как всегда отпуск и секс наркотики рок-н-ролл
Вопрос: Если злоумышленникам известен IP, то Cloudflare не поможет?

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

Худший ответ:
От слабых атак может и помочь, если будете отбрасывать все пакеты, кроме пришедших с cloudflare, но если забьют всю ширину сетевого канала входящими пакетами - то уже не поможет.
Вопрос: В чем смысл do while? Как его можно использовать?

Лучший ответ:
do-while удобно применять когда например есть пользовательский ввод и есть реакция на ошибу. Где нужно ввод 
повторить. Например

do {
  s = input("Enter your bidthday: ")
} while(!isValidDate(s));
Еще я использовал для простого I/O когда надо что-то по-символьно читать и проверять
что файл не закончился (результат не отрицательный).

В последних версиях Scala (3.x) мусье Одерский внезапно зобанил оператор цикла с постусловием.
Я уж не помню как он это аргументировал.  

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

while ({ <body> ; <cond> }) ()

Еще дальше пошел Дейкстра. Он придумал специальный вид do-while для конечных автоматов.
Такой себе гибрид do-switch-case-while. Где можно как в DSL описать исходящие переходы.
Правда я не помню где он его реализовал.

UPD: Ошибочка. Не Вирт а Дейстра. Путаю их.

Худший ответ:
Например, функции ввода/вывода в POSIX возвращают EINTR, если во время их работы в приложение пришел сигнал.
Сигнал вы можете перехватить, обработать и можно продолжать дальше. Но функция (например write) вернет EINTR. Если эту ситуацию не обрабатывать отдельно, то это может вызвать, например, завершение приложения (из-за ошибки ввода/вывода), тогда как приложение могло бы дальше работать.
В этом случае удобно вызов функции заключать в do while:
int ret;
do {
  ret = write(...);
} while(ret == EINTR);
Это один из вариантов, когда надо выполнить действие, и по результатам действия будет понятно надо ли еще раз его запустить или уже достаточно.
В этот же цикл можно добавить и другой функционал. 
В случае неблокируемых операций ввода/вывода операция может завершится не записав или не прочитав все что нужно или вообще вернуть EAGAIN, если ничего нет. Можно эти проверки добавить в этот же цикл do while вместе с проверкой на EINTR.
Вариантов использования, на самом деле много. Вы это увидите, когда столкнетесь с таким вариантом в своей практике.

Но самый популярный вариант у Си программистов, это использование в макросах:
#define MACRO(x)      do { тут что-то делаем } while(0)
Этот фиктивный цикл служит двум целям:
1. внутри цикла можно объявлять локальные переменные, которые не будут видны вне цикла
2. При использовании макроса можно в конце ставить точку с запятой, не нарываясь на предупреждения компилятора: MACRO(val);. Компилятор в итоге уберет цикл, но все побочные эффекты сохранятся.
В плюсах этот вариант практически не используется, т.к. тут есть шаблоны и т.п. и от макросов в основном отказываются. Но в Си макросы вполне актуальный инструмент.

Но циклы for и while применяются чаще, чем do while.
Вопрос: Какую модель роутера Keenetic установить в сеть на 200 хостов?

Лучший ответ:
Никакую, наверно. Это оборудование для домашнего использования.

Худший ответ:
Саму мощную. 
Keenetic - это домашнее решение. 
Лучше берите Mikrotik, если надо экономить.
Только выбирайте по мощнее аппарат, а то еще захотите L2TP+IPsec.
Вопрос: Почему не происходит отправка сообщений ботом в установленное время?

Лучший ответ:
Потому что метод infinity_polling - это бесконечный цикл, его вызов блокирует вызывающую сторону и следующих итераций цикла while True никогда не происходит.

Худший ответ:
Запускай отдельный поток и в нём свой цикл
Вопрос: Как в PHP вычисляется count()?

Лучший ответ:
второе
потому что там дураков нет, каждый раз пересчитывать одно и то же.

Худший ответ:
Все же написано
https://www.php.net/manual/ru/function.count.php

If you want to run through large arrays don't use count() function in the loops , its a over head in performance,  copy the count() value into a variable and use that value in loops for a better performance.

Eg:

// Bad approach

for($i=0;$i<count($some_arr);$i++)
{
    // calculations
}

// Good approach

$arr_length = count($some_arr);
for($i=0;$i<$arr_length;$i++)
{
    // calculations
}

Пример #4 Объект, реализующий интерфейс Countable
Вот тут вы можете извернуться и как то закешировать значение
<?php
class CountOfMethods implements Countable
{
    private function someMethod()
    {
    }

    public function count(): int
    {
        return count(get_class_methods($this));
    }
}

$obj = new CountOfMethods();
var_dump(count($obj));
?>
Вопрос: OS desktop для слабого VPS (512Ram 5Gb)?

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

Худший ответ:
Выбирать из семейства Puppy Linux.
Вопрос: Как сделать чтобы несколько микротиков смотрели друг на друга?

Лучший ответ:
Если айпишники везде белые, то GRE + IPSEC + OSPF ну хотя раз филиалов всего 5 то можно и статические маршруты прописать без OSPF.

Если есть серые айпишники, или не поднимается GRE (такое может быть у некоторых провайдеров) то на микротике с белым IP поднимается L2TP сервер, к нему подключаются все офисы по L2TP ну и сверху IPSEC. Маршруты также - либо статика, либо OSPF но я бы сделал сразу OSPF чтобы потом не париться.

Худший ответ:
Делай по инструкции. GRE
https://itproffi.ru/nastrojka-gre-tunnelej-v-mikro...
Вопрос: Почему нет цикличных референсов в обявлении Enum?

Лучший ответ:
тебя ждет боль
https://habr.com/ru/company/sberbank/blog/416413/
вот одна из статей. В основном проблемы от совместимости, в джаве дженерики не сразу появились, поэтому потом пришлось изварачиваться

Худший ответ:
Разобрался. Вот во что компилируется Enum: 



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

Как это работает ещё буду разбираться. Если кто-то может дополнить, буду благодарен.
Вопрос: Как в БЭМ называют вложенные элементы во вложенных?

Лучший ответ:
Блин, да прочитайте вы уже это https://ru.bem.info/methodology/
Хотя бы первые пять разделов и это https://ru.bem.info/methodology/faq/
99% вопросов отпадут сами собой

Худший ответ:
1.
.user__info-photo-img
т.е. блок у вас один (самого верхнего уровня), всё-остальное элементы.

2.
.user-info
.user-info-photo
.user-info-photo__img
или же как и в п.1:
.user__info-photo-img
т.е. можете наплодить блоков, элементы именовать по семантике, смотря какой блок у вас будет в основном переиспользоваться.

3. 
.user
.user__header
.user__info
.user__info-photo .photo-info
.photo-info__img
самый корректный, но самый длинный - элементам которые сами являются блоками, навешивать новый класс (в контексте содержимого именно этого блока), ну и их дочерним элементам - соответствующие классы.
Вопрос: Как взламывают бд крупных компаний?

Лучший ответ:
Взламывают точно так же как и мелкие. 
В статье описана обычная SQL инъекция, когда данные подставляются прямо в SQL запрос.

Я просто сомневаюсь, что valve может нанять таких людей в backend
Не надо сомневаться.
Нету никаких "особенных способов взлома". 
А есть такое явление как "эффективные менеджеры". У которых размер премии зависит от того, сколько денег они сэкономили акционерам. 

Если бы там были подготовленные выражения, то и взлома бы не было.
Но вместо подготовленных выражений в больших компаниях есть эффективные менеджеры. Которые экономят на нормальных программистах, и заказывают разработку в Индии, в штате Бангалор. Где живет какой-нибудь Хамишь Кумар, который родился в касте вычерпывателей говна из сортиров. И вот у него только один шанс не черпать говно всю жизнь - всеми правдами и неправдами научиться программировать, путь даже за еду. Сравниваем с силиконовым программером с запросами $250k в месяц. Экономия налицо!

На всякий случай напомню, для стопроцентной защиты от инъекций необходимо всегда следовать двум простым правилам:


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


Ключевое слово здесь - "всегда". Как только начинаются рассуждения вида "ну эти данные и так безопасные, их защищать не надо", то в этот момент мы добавляем инъекцию к себе на сайт. Следует понимать, что защищаем мы не данные, а запрос. Данные нас вообще не интересуют - какие они, откуда пришли, являются "безопасными" или нет. Важно не то откуда они пришли, а то, куда они идут. В SQL запрос? Используем подготовленные выражения, точка.

Худший ответ:
Самые-самые взломы - это либо вирусная атака, либо соц. инженерия. Остальное - не больше 10%.
Вопрос: Acer aspire 3 a315-57g-54v6 купил этот ноутбук позавчера. Греется. Что делать?

Лучший ответ:
Абсолютно нормальная температура для ноута, а чтобы посмотреть как будет в играх включи Furmark минут на 5.

Худший ответ:
епик - гавно
https://3dnews.ru/1028824/klient-magazina-epic-gam...
https://overclockers.ru/blog/Splash_Attack/show/48...
Вопрос: Стоит ли учить программирование, если в городе вакансий вообще нету связанных с программированием?

Лучший ответ:
Если тебе 16, учи математику, физику, и программирование по остаточному принципу. Не фронтенд, а основы - алгоритмы, структуры данных, сложность, разные парадигмы. Поступай в хороший ВУЗ, и там уже получай фундамент. После второго-третьего курса сможешь работать. Начинать карьеру, не зная ничего, с поиска вакансий - путь в никуда. 
P/s Буду учится до 18-19
Рассмешил. Мне 31, я закончил ВМК МГУ,  10 лет работаю (получаю деньги за разработку), и я до сих пор учусь.

Худший ответ:
Программирование это не щёлканье по клавишам. Вы изучаете алгоритмы. Учитесь их использовать. А какую прикладную область вы выберите это уже не важно. Можете пойти в юристы и быть успешным, или в бородатые сисадмины
Вопрос: Почему браузеры на Chromium не загружают заблокированные сайты с помощью VPN?

Лучший ответ:
Поставьте на ПК днс серверы не автоматически, а например от cloudflare
1.1.1.1 1.0.0.1

Chrome берет днс из системы
Фаерфокс использует публичные днс

Худший ответ:
Подними на VPS любой dns resolver и пуши его как днс при поднятии OpenVPN
Вопрос: E-commerce решения Laravel?

Лучший ответ:
Решай на здоровье

Худший ответ:
Из того, что я находил в свое время
https://github.com/aimeos/aimeos-laravel
https://github.com/Fanamurov/larrock-core/
https://github.com/marketplacekit/marketplacekit
https://www.laraship.com/
https://github.com/conedevelopment/bazar
https://vanilo.io/
https://getcandy.io/
Вопрос: Как выглядит правильный процесс тестирования?

Лучший ответ:
Привет. 
1) Заводить баги и тест-кейсы/чек-листы надо отдельно от задач, так как правиться и проверяться они могут сильно позже, когда задачу давно уже закрыли. Например, регресс. Писать в комментах к задаче - плохая практика :) 
2) Кейсы пишутся на документацию к задаче, а не на то, как реализовали. То есть тестовая документация пишется еще до того, как ты приступила к тестированию. 
3) Написанные кейсы можно прилинковать к задачам и наоборот. 
4) Тестовая документация, баги и задачи могут находиться в разных TMS. Например, кейсы/чек-листы в Allure, а задачи и баги в Jira. Или все в Jira, но в отдельном плагине. Тут уж как в компании заведено или какие вы используете TMS.
5) Баги заводятся как отдельные таски в бэклог. Если это новый функционал, который в работе, то может будет удобнее, если напрямую передашь разработчику и он сразу поправит. 

P.S. Сходи к коллегам из других команд (если такие есть) и посоветуйся с ними. В дальнейшем разговоре с лидом можно будет ссылаться на их мнение. Но менять процесс определенно стоит.

Худший ответ:
Привет. Я на одном проекте уже 2,5 года.
В среднем  и кратко процесс выглядит так, 

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

у нас на проекте отсутствуют тест-кейсы для ручного тестирования, так уж сложилось, никогда их не писала, но есть много автоматических тестов
Вопрос: Почему функция возвращает массив с теме же данными?

Лучший ответ:
Потому что Вы не прочитали документацию по методу.

https://developer.mozilla.org/ru/docs/Web/JavaScri...
Возвращаемое значение
Массив, содержащий удалённые элементы.

Соответственно, return [].splice() возвращает массив из элементов, которые были удалены.
А ещё метод - деструктивный. То есть меняет исходные данные. arrayTaskOne, объявленный вне функции, изменился, а это не хорошо.
Почему не хорошо? Гуглите по теме: чистые функции, сайд эффект

Худший ответ:
https://developer.mozilla.org/ru/docs/Web/JavaScri...
Возвращаемое значение
Массив, содержащий удалённые элементы. Если будет удалён только один элемент, вернётся массив из одного элемента. Если никакие элементы не будут удалены, вернётся пустой массив.
Вопрос: Почему msbuid создает dll и exe?

Лучший ответ:
Есть опция PublishSingleFile - как раз склеит DLL и exe.

self-contained можно отключить
dotnet publish -c Release -r win-x64 -o ./pub -p:PublishSingleFile=true --self-contained false

Худший ответ:
Есть опция PublishSingleFile - как раз склеит DLL и exe.

self-contained можно отключить
dotnet publish -c Release -r win-x64 -o ./pub -p:PublishSingleFile=true --self-contained false
Вопрос: Как задеплоить бэк и фронт на одном сервере?

Лучший ответ:
Всё в рамках стандартной конфигурации с проксированием. Делаете два серверных блока, разводите по разным портам в proxy_pass.

Худший ответ:
В зависимости от того, откуда д.б. доступны фронт и бэк, можно придумать разные решения.

Проще всего разнести фронт и бэк по разным IP-адресам, благо из пула 127.*.*.* их можно брать более чем достаточно. И дальше надо запустить два экземпляра Ngnix на этих адресах. А каждый адрес прописать в DNS в соответствующей зоне.
Если же фронт и бэк д.б. доступны извне, со всего мира - для этой схемы надо иметь несколько IP-адресов.

Можно разнести фронт и бэк по разным портам. Тогда в DNS оба имени должны указывать на один IP-адрес, а порт д.б. прописан в URL.

И наконец, можно сделать DNS-based вирт.хосты (вирт.сайты) внутри одного Ngnix. В DNS оба имени должны указывать на один IP-адрес.

PS: А ещё фронт и бэк можно засунуть в разные вирт.машины, и это будет как будто они на разных компьютерах.
Вопрос: Почему разработчики JavaScript не сделают этот язык типизированным как TypeScript?

Лучший ответ:
https://github.com/tc39/proposal-type-annotations
ну вот, например

Худший ответ:

Почему разработчики JavaScript не сделают этот язык тизипрованным как TypeScript.

Потому что это потенциально ломающее изменение. 

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

На счёт худшести системы типов у js можно много спорить, но пользу динамическая типизация тоже даёт.
Например у тебя не болит голова от отсутствия строгих контрактов с бэкендом.
Вопрос: Почему JS матчит обратный апостроф в регулярке?

Лучший ответ:
[А-Я] 
тут буква А - латинская, в интервале между латинской А и русской Я много чего. Проверь буквы.

Худший ответ:
Какая-то лажа при использовании диапазона заглавных букв А-Я в списке символов. Если его не указывать (а его и не надо указывать - ведь указан флаг i), то всё работает.
Вопрос: Какие размеры изображения лучше использовать для интерет-магазина?

Лучший ответ:
Посмотрите, как у других и сделайте так же.

Худший ответ:
Здесь без разницы, если это выглядит красиво то могут быть большие, а могут маленькие.
Вес особой роли не сыграет, но что бы сайт чуть быстрее работал, лучше использовать более маленький вес.
Формат подсказать не смогу, возможно PNG, JPG.
Вопрос: Как он это «заметил»?

Лучший ответ:
Ну, это известная формула - количество пар среди n объектов. Для самого левого подходит n-1 правых концов. Для второго - их будет n-2. Для последнего - 0. Сумма (n-1)+(n-2)+...+1+0 = (n-1)n/2. Можно через сумму арифметической прогрессии получить.

Худший ответ:
вам повезло попасть на довольно известный математический баян
Вопрос: Как ставить блок питания в корпус где он вставляется вверху? Кулером вниз или кулером вверх?

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

2. Отверстия для крепления расположены несимметрично, неправильно прикрутить не получится (если не применять чрезмерную силу)

Худший ответ:
А для установки БП вверх тормашками вы отверстия под крепления высверливать собирались? 
Для БП крепление такое, что поставить его можно только в одном положении.