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

Комментарии 73

Осторожно! phpDoc


Заголовок спойлера
/**
 * Class Iin
 * @package App\Classes\Support
 *
 * Класс проверки иин для казахстана
 *
 * ИИН содержит 12 цифр из которых
 * первые 6 цифр - дата рождения [гг-мм-дд]
 * 7-я цифра - пол и век (нечетные цифры - муж, четные женский)
 *      1,2 - 19 век
 *      3,4 - 20 век
 *      5,6 - 21 век
 *      7,8,9,0 - зарезирвированны на будущее
 * 8 - 11 регистрационный гос номер
 * и 12 - контрольный разряд
 *
 * Иин проверяесться по контрольной сумме через две последовательности
 * Сперва каждая цифра иин, кроме последней умножается на цифру из 1-й последовательности и суммируется
 * Результат делиться на 11 и если он от 0 до 9 и соотвествует 12-й цифре иин то иин верен,
 * если результат 0 - иин не верен, если результат 10 - то проверка продолжается по второй последовательности
 * Если результат проверки по всторой последовательности от 1 до 9 и равен 12-й цифре иин - то иин верен иначе проверка
 * заканчивается и иин не верный.
 *
 * UPD - Хьюстон у нас проблемы - некоторые безответственные работники цонов делают неверные иин с 7,8 и 9 цифрой для 22 и 23 века.
 * В итоге люди для системы как из 23 века а сами из 21 или 20 - так что пока не настал 22 и 23 век их разряды будут для 20 века.
 * Не люблю костыли но работники цонов такие работники - а менеджеры и клиенты недовольны, так что придеться
 *
Это зачОт!!!
Неужели процесс генерации ИИН не автоматизирован?

Существует как не странно — правда на местах его походу не все и не всегда используют.

Результат делиться на 11
шайтанама…
Ну дык ведь, как говаривала амёба, «Господь завещал делиться».
Возможно, вы удивитесь, но существует признак деления числа на 11!
«Число делится на 11, если сумма цифр, которые стоят на четных местах, равна сумме цифр, стоящих на нечетных местах, либо отличается от неё на 11.»
Гррр.
Если N = (сумма цифр на чётных местах) — (сумма цифр на нечётных местах) кратно 11.

Это так-то просто. 1 сравнимо с 1 по модулю 11 — дальше не буду это уточнять, модуль всегда 11. 10 сравнимо с -1. 100 — с 1, 1000 — с -1 и так далее. То есть мы можем построить некоторую сумму, включив туда разряды 1, 100, 10000 и так далее со знаком плюс, а 10, 1000, 100000 и так далее — со знаком минус, и так построенная сумма будет сравнима с исходным числом. Если, в частности, она сравнима с 0 (то есть равна 0, +-11, +-22 и так далее), то и исходное число кратно 11.
Теперь осталось только заметить, что если эта сумма сравнима с 0, то и противоположное ей число (1, 100, 10000 с минусом, 10, 1000, 100000 с плюсом) тоже будет сравнимо с 0 по модулю 11. То есть если нас интересует только делимость исходного числа на 11 (а не величина остатка) — то мы можем сказать «сложи цифры на чётных местах и вычти цифры на нечётных» или «сложи цифры на нечётных местах и вычти цифры на чётных», не заботясь о том, с какой стороны человек начнёт цифры считать.
Придёться делиться… надеюсь, сам алгоритм без ошибок.
«Because killer robots like unicorns» переведён неверно. На мой взгляд тут like использован в значении such as. Вспоминаем первый закон робототехники, собственно killer robots ему противоречат, то бишь не существуют, как и единороги.
Переведён согласно грамматике английского. Возможно, автор имел ввиду именно то, что Вы сказали, но тогда должно было бы быть «robots are like unicorns».
Верное замечание. Узнать, о чём думал автор, нам не дано, ибо автор для нас на данном этапе неизвестен.
Если «robots» переводится как «роботит» или «роботеет», то «like» может быть «как».

Также как Федя и Костя.
А кровать — глагол.

Собственно речь видимо об этой cms. По логике тут речь о чем-то несуществующем (не передана линия в метод или не найдено соответствие в языковом файле). Но додумывать, что имел в виду автор — бессмысленно.
Речь, собственно, о фреймворке, на базе которой эта cms написана.
А иногда корпоративные стандарты написания кода заставляют делать что-то, что не поддаётся внутренней логике разработчика.

const int TEN=10; // As if the value of 10 will fluctuate...


Конечно, если так называть константы, то не увидишь в этом логики. Нормальными и полезными были бы названия: MAX_STUDENT_COUNT, SUCCESS_CODE, MAIN_GATE_ID, etc.

Извиняюсь за занудство в юмористическом посте)
Скорее всего это был запрос на рефактор из-за hardcoded constant, которая алгоритмически ничем иным, кроме как 10, не может быть.
Иногда константа должна означать именно 10: BigDecimal

Потому что это не столько TEN, сколько RADIX

А она точно равна 10?

В указанном месте она берётся из массива:
public static final BigDecimal TEN =
        zeroThroughTen[10];

А перед этим она записывается в массив — и не выглядит как просто число:
 // Cache of common small BigDecimal values.
    private static final BigDecimal zeroThroughTen[] = {
...
        new BigDecimal(BigInteger.TEN,          10, 0, 2),
    };

Да, как и описано в комментарии, этот массив — кэш для первых десяти значений.
Под десятым индексом лежит BigDecimal со значением 10.
Тут же, кстати, можно увидеть и другую константу TEN — BigInteger.TEN.
Поговаривают, кто-то использовал такую goto метку:
ICantBelieveImUsingAGoto:
Говорят, это было в исходном коде DefWindowProc из WinAPI.
НЛО прилетело и опубликовало эту надпись здесь

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

Каждые несколько лет в индустрии появляются юнлинги, которым было бы полезно ознакомиться с подобным сборником. И обязательно появится один бородатый человек с комментариями про бородатые шутки.
Простейшая логика подсказывает, что если в момент рождения боян не знает никто, а к 20 годам его знают все, то, значит, каждый день сотни тысяч человек читают его впервые. И это не зависит от древности бояна.
Уважаемый Сопровождающий! Когда Вы закончили свою попытку «оптимизировать» этот процесс и поняли, насколько чудовищной была эта ошибка, увеличьте последующий счётчик в назидание тем, кто придёт за Вами.

Обязательно возьму на вооружение.
Обложите лучше проблемный код тестами и не придётся такие вот назидания писать.
В секции «Боль и отчаяние», в переводе комментария во 2 абзаце на 4 строке опечатка:
… блоки должны быть выравняны на четыре байта, ...
. Наверное, всё-таки, выравнены.
Спасибо за наводку, погуглил, исправил. Задумался: а в данном контексте выравнены или выровнены?.. :)

Здесь, конечно, «выровнены», то есть сделаны ровными (а не равными) — если правильно представить адресное пространство в виде прямоугольника, то объекты окажутся геометрически выровненными по правому краю.

Договорились, исправил ещё раз. :)
Немного из 1С…
Комментарий, встреченный в одном популярном модуле, распространяемом на коммерческой основе (не буду называть компанию-разработчика):
//Вася, убери эту х****, и будет счастье.

И из серии
//магия, не трогать
Как то столкнулись с ситуацией, что 1С упорно отказывалась присваивать значение переменной с первого раза, пришлось продублировать строку и добавить комментарий.
Видел где-то скрин 1С кода со смыслом: «Если Х = нет //Сервера ответ»
image
Да, вот именно оно. По какому поисковому запросу вы нашли эту картинку, если не секрет? Мне вот не удалось :)
А это просто сбой в матрице. Вчера днем мне эту картинку в мессенджере скинул знакомый 1С-ник.
Я когда программированием контроллеров занимался, то количество экспрессивного мата в коде и комментах зашкаливало, потому что в здравом уме код туда никто не полезет читать, а во вторых меня заставляли делать костыльные программные хаки под глючные исполнительные механизмы, так что всё норм.
Мне запомнилось вот такое:
int[] unlinkinPark; //массив точек, которые должны быть убраны из рассмотрения на следующем шаге работы алгоритма.

В том проекте было много всего забавного, но не всё пройдёт цензуру)
Иногда пишу что-то нелестное об умственных способностях предыдущего программиста и объясняю, что сейчас плохо, но было еще хуже.
Чаще всего это касается случаев, когда нужно рефакторить 150 кб файл index.php, в котором находится все — классы, контроллеры, запросы в БД, шаблоны, реклама, настройки, но нет возможности переписывать на фреймворк из-за нерентабельности разработки; проблема читаемости этих файлов решается хотя бы вынесением разметки в несколько view-файлов и созданием уровня абстракции над базой данных, чтобы убрать сложные MySQL-запросы с главного файла в отдельные методы и поцепить на это все PDO с подстановкой строк для защиты.
НЛО прилетело и опубликовало эту надпись здесь
OOXML такой же. Да и вообще большинство форматов, изначально поддерживавшихся одной программой так устроены.
Грустный комментарий в битриксе:

// nobody interested in my errors :(
перед костыльным кодом:
// написал, но осуждаю

перед генерацией исключения:
// ошибка, которая никогда не произойдет:
Когда-то писал код с напарником, и комментарии играли роль чата:
-- name, ты зачем эту фигню здесь написал?

Потом в следующем комите либо фигня убиралась, либо добавлялось объяснение:
-- name, ты зачем эту фигню здесь написал?
-- потому что гладиолус
Аналогично было :)
Писали на php, каждый использовал свой собственный символ для комментария (// и #)
также общаемся:) TODOхами и FIXME и вопросы по реализации друг другу задаем:)

// When I wrote this, only God and I understood what I was doing
// Now, God only knows


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

Рассказ Брайана Кантрилла о программистском фольклоре (на английском):
Самый лучший заголовок, который я видел:
Тот самый заголовок из ядра Linux
/*
 * Generic driver for memory-mapped GPIO controllers.
 *
 * Copyright 2008 MontaVista Software, Inc.
 * Copyright 2008,2010 Anton Vorontsov <cbouatmailru@gmail.com>
 *
 * This program is free software; you can redistribute  it and/or modify it
 * under  the terms of  the GNU General  Public License as published by the
 * Free Software Foundation;  either version 2 of the  License, or (at your
 * option) any later version.
 *
 * ....``.```~~~~````.`.`.`.`.```````'',,,.........`````......`.......
 * ...``                                                         ```````..
 * ..The simplest form of a GPIO controller that the driver supports is``
 *  `.just a single "data" register, where GPIO state can be read and/or `
 *    `,..written. ,,..``~~~~ .....``.`.`.~~.```.`.........``````.```````
 *        `````````
                                    ___
_/~~|___/~|   . ```~~~~~~       ___/___\___     ,~.`.`.`.`````.~~...,,,,...
__________|~$@~~~        %~    /o*o*o*o*o*o\   .. Implementing such a GPIO .
o        `                     ~~~~\___/~~~~    ` controller in FPGA is ,.`
                                                 `....trivial..'~`.```.```
 *                                                    ```````
 *  .```````~~~~`..`.``.``.
 * .  The driver supports  `...       ,..```.`~~~```````````````....````.``,,
 * .   big-endian notation, just`.  .. A bit more sophisticated controllers ,
 *  . register the device with -be`. .with a pair of set/clear-bit registers ,
 *   `.. suffix.  ```~~`````....`.`   . affecting the data register and the .`
 *     ``.`.``...```                  ```.. output pins are also supported.`
 *                        ^^             `````.`````````.,``~``~``~~``````
 *                                                   .                  ^^
 *   ,..`.`.`...````````````......`.`.`.`.`.`..`.`.`..
 * .. The expectation is that in at least some cases .    ,-~~~-,
 *  .this will be used with roll-your-own ASIC/FPGA .`     \   /
 *  .logic in Verilog or VHDL. ~~~`````````..`````~~`       \ /
 *  ..````````......```````````                             \o_
 *                                                           |
 *                              ^^                          / \
 *
 *           ...`````~~`.....``.`..........``````.`.``.```........``.
 *            `  8, 16, 32 and 64 bits registers are supported, and``.
 *            . the number of GPIOs is determined by the width of   ~
 *             .. the registers. ,............```.`.`..`.`.~~~.`.`.`~
 *               `.......````.```
 */

linux/v4.4.153/source/drivers/gpio/gpio-generic.c
Еще больше перлов можно почитать на SO.
Я тоже поначалу показывал в комментариях своё остроумие.
Потом разок почитал и понял, что ни разу не остроумный.
И перестал.
И всем советую.
String fakeAnswer = "{ \"isError\" : \"unknown\" }";
                try {
                    reader = new JSONObject(fakeAnswer);
                } catch (JSONException e2) {
                    //Абсолютно маловероятно
                    e2.printStackTrace();
                    reader = new JSONObject();
                }
Уважаемый Сопровождающий!

без последующей линии

Алелуйя


новая эра переводов на хабре — теперь с гуглотранслейтом, но без мозга!

P.S. Я уже видел перевод этих «смешных историй» на хабре.
К сожалению был случай, когда комментарий типа «меня заставили написать этот отвратительный код», увиденный заказчиком про ревью кода, вызвал реакцию заказчика — «уберите этого разработчика из проекта немедленно». В итоге — проект лишился хорошего программиста (другой проект получил его).

Надеюсь это чему-нибудь научило заказчика. Была история в одной фирме, что как обычно бизнес использовал "быдлокод как инструмент" и в итоге задолбавшись отлавливать баги свалил не один человек а целая комманда из 20 опытных разработчиков. После этого наняли вторую комманду и мало того чтобы их завлечь начали раздавать опционы, в итоге и эта комманда свалила. Только с третьей коммандой контора смогла выделить ресурсы и терпение на рефакторинг и теперь вроде бы у них все хорошо.

Трудно сказать. Специалисты на стороне заказчика были вполне адекватные, квалифицированные, но у американцев все строго — что-то не так как ожидали от консультанта — немедленная реакция.

В процессе, когда реализовать задачу надо было «вчера». Особо не думаешь об оптимизации и лепишь первое пришедшее в голову решение, построенное на уже существующих методах, которые могут делать много лишнего, но в процессе дают нужный результат. И такие моменты обозначаются как:
//Переписать А когда спустя пару лет лезешь в этот самый «новый метод», который за годы начал вызываться из кучи других разных мест, с мыслями: «Руки бы оторвать тому, кто это написал» и видишь свою фамилию и скромное «переписать»…
делали систему для компетентных органов. Обработчик одной из форм выбиравший «подозреваемых» назывался destiny. В нем были комментарии:
// проверка правильности переменных==танцы с бубнами
//обрабатываем попытки получить отрицательные значения времени
//если образовалось марсианско/нептунианское время
//конец танцев с бубнами
из этого же проекта
//Вызываю базу! Где там этот хренов Оракл?!!!
// не забыть обрубить соединение базу и сессию прибить по-сильнее, а то найдется
переменные в другом проекте:
$bredmarketologa
$dreem_in_summer_night

Иногда попадается не только в комментариях: например, в документации QEMU


Lines should be 80 characters; try not to make them longer.
...
Rationale:
 - Some people like to tile their 24" screens with a 6x4 matrix of 80x24
   xterms and use vi in all of them.  The best way to punish them is to 
   let them keep doing it.
...

А в Firefox какое-то время назад были параметры для включения экспериментального и "ваще экспериментального" WebRender:


gfx.webrender.enabled
gfx.webrendest.enabled
Однажды в универе заглянула на паре через плечо одногруппника в его монитор. А тот препод заставлял прописывать в комментариях: кто автор, что за задача, каков был способ ее решения.
А что-то тогда нетривиальное было задано.
Короче, через плечо я увидела на размер экрана нарисованную псевдокодом кирпичную стену, в самом центре которой был обозначен метод решения задачи: «Бился головой сюда».

10 лет прошло, а я все и тот случай помню, и время от времени саму тянет такой комментарий от всего сердца где-то оставить.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий