Как стать автором
Обновить
7.56

Говнокод

Код, за который должно быть стыдно

Сначала показывать
Период
Уровень сложности

Как подружить Google Диск и Google Календарь? Пробуем GAS на вкус

Время на прочтение5 мин
Количество просмотров29K
Корзина покупателя GASПредлагаю читателям «Хабрахабра» историю о том, как мне удалось повысить свою покупательскую способность в кризисное время при помощи Google Apps Script (GAS). Под катом вы найдете нестандартный пример использования и узнаете о возможностях работы со службами Google Drive и Google Calendar.

Началось все с того, что цена импортируемых товаров в России неуклонно росла вверх. Работая IT-специалистом в крупной ритейл-сети, у меня возникла идея о том, как можно воспользоваться преимуществом наличия доступа к товарной базе, не нарушая установленных правил компании и тем более закона. Наибольший интерес с точки зрения экономии личных денежных средств представляют так называемые «промоакции» (тарифы со скидкой). Необходимо было организовать ежедневную выгрузку «промоакций» на интересующие товары и реализовать возможность своевременного получения уведомлений о наличии скидок на Android-смартфон.
Читать дальше →

Сериализация C++ с полиморфизмом и прототипами

Время на прочтение6 мин
Количество просмотров20K
Уже достаточно давно заинтересовался темой сериализации, а если конкретно, то сериализацией объектов, хранящихся по указателю на базовый класс. Например, если мы хотим загружать интерфейс приложения из файла, то скорее всего нам придется заполнять полиморфными объектами контейнер по типу “std::vector<iWidget*>”. Возникает вопрос, как подобное реализовать. Этим я недавно решил заняться и вот что получилось.

Для начала я предположил, что нам все-таки придется унаследовать в базовом классе интерфейс iSerializable, такого вида:

class iSerializable
{
public:
    virtual void serialize (Node node) = 0;
};
Читать дальше →

[Неочевидные алгоритмы очевидных вещей] Алгоритм 1. Корень квадратный

Время на прочтение1 мин
Количество просмотров30K
Серия постов [Неочевидные алгоритмы очевидных вещей] будет содержать алгоритмы действий, которые кажутся очевидными и простыми, но если задать себе вопрос «как это делается?», то ответ является далеко не очевидным. Разумеется, все эти алгоритмы можно найти в литературе. Под катом располагается алгоритм вычисления корня квадратного числа X.

Читать дальше →

Введите код, изображенный на картинке

Время на прочтение1 мин
Количество просмотров4.7K
Наткнулся на интересную реализацию капчи.
По привычке стал дергать картинку курсором в опере, каково же было удивление когда изображение оказалось текстом.


Ссылка попала в руки по наводке Alert.

Можно, но лучше не стоит: разбираемся в связях между объектами, функциями, генераторами и сопрограммами

Время на прочтение15 мин
Количество просмотров10K

Давайте проведём исследование некоторых взаимосвязей функций, объектов, генераторов и корутин в Python.

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

Предупреждаю: мы рассмотрим рабочие, но очень странные примеры кода; я не советую вам применять их в реальных проектах!

Читать далее

C++. Убираем приватные поля из описания класса или немного дурачества

Время на прочтение4 мин
Количество просмотров9.9K

Всем привет! Решил на выходных продолжить писать свой домашний проект и наступила пора реализовать платформозависимый код. Самым простым вариантом было бы описать классы в *.h файле, а в зависимости от платформы, Закрытые поля засунуть под #define. При этом, саму реализацию по конкретным платформам разнести по *.cpp файлам и включать их в компиляцию в зависимости от текущей платформы. Но... мне не нравится как выглядит описание класса с #define, поэтому я решил убрать препроцессор и оставить в описании класса только интерфейс. И да, я не пользовался абстрактными классами и pimpl, всё еще хуже :-)

Читать далее

Ищете бесплатные альтернативы cPanel? Держите сразу 7

Время на прочтение7 мин
Количество просмотров17K
image

Приветствую вас, уважаемые читатели и почитатели Хабра!

В этой статье я расскажу вам о 7 популярных альтернативах cPanel. Вы узнаете:

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

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

Говоря о cPanel, стоит отметить, что ее преимущества всё ещё превышают недостатки. К последним относится её платная основа. Как говорится, не заплатишь – не попользуешься. Смотрим тарифы… от 15 баксов в месяц! Хм. Многие даже за сервер в месяц платят меньше.
Читать дальше →

Разбор утилиты Files.walkFileTree();

Время на прочтение4 мин
Количество просмотров62K
Не найдя нигде толкового описания на русском, что за зверь Files.walkFileTree(), и со скрипом освоив его, как оказалось впоследствии, несложный функционал, решил поделиться в рамках закрепления материалом с примерами, чего мне так не хватало.

Метод walkFileTree() позволяет обойти дерево файлов и поддиректорий передаваемого ему в качестве параметра элемента Path…
Читать дальше →

Интересный отрывок скрипта регистрации

Время на прочтение1 мин
Количество просмотров1.1K
Просматривал исходники одного проекта, зарубежный портал с возможностью публикации аудио-видео и т.д., не суть важно. И вот так там реализована регистрация пользователей, вернее — получение id пользователя при его регистрации.
Читать дальше →

Enlarge your BASHUI for free! Как увеличить потенциал производительности?

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров1.6K

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

Увеличить потенциал

Локализация своих скриптов на BASH

Время на прочтение7 мин
Количество просмотров5.9K

Создание меню на BASH — задача сама по себе не сложная: "case тебе в руки и echo в спину". Решая её в очередной раз, мне захотелось добавить возможность отображать текст на других языках. Осталось решить, как сделать сам процесс локализации меню более удобным. Если оно большое, то решение "в лоб" превратит его в громоздкую копипасту. Здесь я хотел бы поделиться тем, как решил эту проблему для себя. Надеюсь, для кого то это будет небезынтересным.



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


Примечание:

Я вполне понимаю и принимаю, что существуют и другие языки программирования. Как когда-то кто-то сказал здесь на Хабре — если при написании скрипта на BASH возникает необходимость хоть в одной функции, то лучше взять нормальный язык. Я с этим согласен, но иногда, как говорится, хочется, потому что хочется.


Мне не хотелось бы разбивать скрипт на несколько частей и хранить локализацию в отдельных файлах. Скрипт тем и удобен, что его проще использовать одним файлом. Поэтому тексты будем хранить в массивах.


Реализация будет состоять из:


  • буквенного кода языка
  • массива слов
  • преобразователя косвенных ссылок для обращения к массиву
  • обращения к элементам массива
  • создания меню

Теперь рассмотрим подробнее

Читать дальше →

Как я разрабатываю и тестирую API со своим «велосипедом» PieceofScript

Время на прочтение24 мин
Количество просмотров5.9K
PieceofScript — простой язык для написания сценариев автоматического тестирования HTTP JSON API.

PieceofScript позволяет:

  • описывать методы API в формате YAML, с названием метода на почти естественном языке, что удобно для чтения тестов
  • достаточно гибко описывать модели в формате YAML и генерировать по ним рандомные данные
  • писать сложные сценарии вызовов API на легкочитаемом языке с несложным синтаксисом
  • получать результаты тестирования в форматах JUnit и HTML

Я написал этот «велосипед» потому что меня вгонял в уныние интерфейс SoapUI. Хотелось просто и понятно описывать тесты в текстовом редакторе без специального GUI. Кроме того, git плохо переваривает огромный xml-файл, который выдает SoapUI, поэтому тесты на конкретную задачу сложно положить в той же ветке, где сделана сама задача. Интерфейс Postman куда приятнее, но при разработке много времени уходит на составление/изменение там запросов и повторение их в нужной последовательности. Это хотелось автоматизировать. Я изучил еще и другие инструменты тестирования, у каждого был "фатальный недостаток", поэтому в припадке NIH-синдрома я открыл IDE.

Вот что из этого вышло.


Читать дальше →

Литературный архиватор

Время на прочтение5 мин
Количество просмотров7K
Прежде всего, поздравляю всех православных и им сочувствующих с пасхой и окончанием великого поста, всех остальных — с наступлением весны. В песочнице только месяц назад наконец утонул мой дебют про программирование на кириллице. Не знаю, что привлекло внимание читателей к зелени, но комментировали простынями, как настоящую статью. В своей простыне TrllServ предложил использовать задумку для архивации. Обожаю людей, которые умеют находить практическое применение идеям. Развернув блокнот, я попробовал набросать алгоритм на основе свойства своей кодировки, а именно — однозначной типизации символа по первым битам. Сжимать таким алгоритмом удобно именно текст, то есть статьи, книги или копипасты из интернетов — то, что состоит из слов, и где регистр букв имеет грамматическое значение. Впоследствии к простому алгоритму добавились средние, основанные на правилах русского языка, и всё это собралось в одну сложную программу, эффективно сжимающую учебник литературы. Назовём его «Литературный архиватор».
Читать дальше →

Ближайшие события

За что я «люблю» PHP или переназначение переменных)

Время на прочтение1 мин
Количество просмотров1.9K
  1. if(is_numeric($email) && !empty($email)){
  2.     $email = $this->query("SELECT email FROM users WHERE id=".$email);
  3.     if($email && mysql_num_rows($email)>0){
  4.         $email = mysql_fetch_row($email);
  5.     $email = $email[0];
  6.     }
  7. }

CMake: Подключение riscv-arch-test для тестирования имплементации rv32

Время на прочтение6 мин
Количество просмотров968

При написании своей VM для RISC-V возникла необходимость в тестировании.
Сначала я пытался писать юнит-тесты самостоятельно, но выходило, что я просто копирую логику из основной.

И по сути тестирую не соответствие спецификации, а соответствие моему пониманию.
Через некоторое время я наткнулся на официальный набор тестов для RISC-V и решил их использовать.

Это помогло найти несколько багов в моём коде.

Что ж.

Сквозь покрытые тайной искусства строки кода: Как я оживил рабочий стол с помощью P/Invoke ?

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров3.3K

В новой публикации мы исследуем сферу магии кода и низкоуровневого программирования. Перед вами увлекательная история, как я смог обрести контроль над рабочим столом, используя лишь небольшие фрагменты C# кода. Вам будет интересно узнать, как я смог покорить мир обоев и сделать их подчиненными волшебства. Не упустите шанс окунуться в мир горячих клавиш и таинственных сообщений Windows API.

В этой истории о магической мощи программирования мы расскажем, как открываются двери к возможностям, о которых вы даже не подозревали. Узнаете ли вы, что стоит за командами, вдохновленными Ctrl+Alt+B и Shift+C? Все это и многое другое ждет вас внутри. Следите за нашим путешествием сквозь замысловатые лабиринты кода и давайте волшебству свободу! ✨

Раскрыть завесу тайны

Мой код не работает :-(

Время на прочтение1 мин
Количество просмотров21K
Представляем наглядное пошаговое руководство по поиску и устранению ошибок в коде для языка Python, которое мы в Alconost перевели специально для Хабра. Следуйте по стрелкам, чтобы определить вероятную причину проблемы — и, если первое из найденных решений не подходит, возвращайтесь и пробуйте еще.

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


Картинка кликабельна

Переведено с любовью к коду компанией-локализатором Alconost.

Assword

Время на прочтение1 мин
Количество просмотров1.8K
Один из самых восхитительных примеров кода, который я когда-либо встречал.
Как сказано в комментарии, этот код пытается найти в строке подстроку «Nothing», «Successful», «Password» или «Failed», причём регистр первой буквы неважен.

protected void parseSummaryLines()
{
   ...

   // NOTE: First letters are ommited in order to
   // support capitalized words as well
   String RESULT_GOOD_TEXT_1 = "othing"; // Nothing
   String RESULT_GOOD_TEXT_2 = "uccessful"; // Successful
   String RESULT_BAD_TEXT_1 = "assword"; // Password
   String RESULT_BAD_TEXT_2 = "failed"; // Failed

   ...
}


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

Но в любом случае, получившееся в результате «Жопослово» — это шедевр…

Форматируем дату

Время на прочтение1 мин
Количество просмотров974
Правильная подстановка нуля перед месяцами:

//dt — инициализированный объект Date()
$('declinedate').value = dt.getDate() + '.' + («00»+(dt.getMonth()+1)).substring((«00»+(dt.getMonth()+1)).length-2) + '.' + dt.getYear();

Интересный case

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров1.3K

Ковыряясь в скриптах наткнулся на интересный case. Чё тут интересного то? Подсказка, это не цикл. Да, вот эти вот break'и выглядят тут совершенно инородно. Возможно когда-то этот кусок эм, кода работал в цикле и break каким-то боком был нужен? Но сейчас цикла нет а brake есть. Бомбит? Бомбит до такой степени что я решился писнуть небольшую статейку про case.
На 100%-ю полноту освещения не претендую, все мои эксперименты лишь очень поверхностные но несколько точек постараюсь расставить.

Рассмотрим case