Комментарии 143
А что не так с
// Autogenerated, do not edit. All changes will be undone.
?
Что с 1С взять, если у них даже код на русском?
Доводилось мне ковыряться в коде, который писали фрицы и итальянцы. В первом случае хватало магии, во втором — адские спагетти. И комменты на немецком и итальянском, соответственно. Разработка была для заказчиков, которые не розуміють ни по-немецки, не по-итальянски.
Я очень долго ругался и уйму времени потратил только на перевод комментов. В случае с немецким особо доставляло то, что надо локаль менять, иначе теряются некоторые символы — вот такие, например: «groß».
Сам пишу на английском.
Благо что строк кода мало и вообще это AI гомункула для игры Ragnarok Online — нет необходимости сидеть и разбираться, если не идет.
а я сейчас работаю с наукоёмким и низкоуровневым кодом (т.к. сложный и его нереально много) на японском — то ещё счастье, особенно мило что вместо взаимствований и кальки английских терминов всё термины написали исключительно на японском. т.е. не пиксель (pixeru) а 画素 и тд
ладно этот быдлокод разложен по полочкам, есть структура и есть документация и оформлен по самым суровым стандартам.
Если каменты не на английском, то предполагается, что продукт дальше страны не пойдет. Так или иначе, на родном языке воспринимаются намного проще (при условии «толковости» написания).
объясняю на примере:
всё оформлено в строгом и едином кодестиле, не только для собственно программирования а ещё и для удобного документирования (типа доксигена и тд), чтоб гит давал минимум строк изменений и тд.
всё разложено по отдельным функциям, они в классы и методы, потом модули и тд.
но
- вызывается в итоге одна чудо функция в которую передаётся ВСЁ, десять типов изображений, все опции и все указатели на другие функции которые аккуратно и тчательно обёрнуты, но NULL или указатель не на ту функцию с другими параметрам передать можно хотя с++.
- функция нахождения медианы из 5 чисел — сотни строк аккуратнейшего кода (хотя во всех DSP и сигнальных либах это 30-40 строк и десять compare&swap)
- на каждый вид и размерность матрицы свои функции которые принимают (void *) БРРРР!!! холодный пот!!! ну и прочие миксы си и си++.
- зачем то умножения расписаны в деления и сдвиги, хотя целевая плис аппаратных умножителей содержит в 10 раз больше чем требуется даже этому быдлокоду.
А так больше документация на корейском попадается, либо переписка.
В случае с немецким особо доставляло то, что надо локаль менять, иначе теряются некоторые символы — вот такие, например: «groß».А нужно просто пользовать вменяемые редакторы.
Самый цимес, что я видел (правда давно) — файл, который был одновременно написан в трёх кодировках. После моих правок он стан написан в четырёх кодировках… и я не о комментариях. Комментарии там, как раз, были вполне себе на английском.
Только один вопрос: зачем?!Это был спеллчекер. На входе был, понятно, UTF-8 (XXI век, всё-такое), но дальше — оно перегонялось в однобайтовую кодировку (ядро было универсальным, но поддерживало только однобайтовые кодировки). windows-1252 для европейских языков, понятно, windows-1250 для центральной европы и, кажется, windows-1253 для греческого (вот тут могу соврать — давно дело было).
Ну а вишенкой на торте было наличие некоторого количество таблиц в коде (валидные символы для разных языков), символы, «нерелевантные» для текущего языка (как и символы не поддерживаемые в текущей кодировке) перегонялись в "?" плюс таблички с классификаторами (гласные/согласные/etc).
Ну и как понятно табличка для немецкого была в windows-1252, а для польского — в windows-1250… для русского, понятно, ещё windows-1251 добавился…
Всё в одном файле, да. Достаточно было этот файл в каком-нибудь новомодном Eclipse открыть и один пробел поставить — и всё, тесты начинали падать (да, несмотря на весь этот ужас с кодировками в остальном-то там всё неплохо было, unit-тесты, CI, вот это вот всё)…
Зато в TIA Portal'е немцы исправились, даже теги на русском создавать можно)
даже теги на русском создавать можно)А вот это ни за что и никогда.
С языками ещё одна подстава, актуальная для меня: из списка языков, которые можно добавить в проект, исчез иврит. Не сильно критично, выбираем какой-нибудь другой. Но неприятно. Из плюсов — больше не надо писать на иврите для панелей задом наперёд. Старые, под Flexible на WinCE, не поддерживали RTL.
одновременно написан в трёх кодировкахНо ведь английские буквы и всякие плюсы-минусы во всех кодировках в одном и том же месте? Или в коде были неанглийские?
Скажите это BOCU1 ,)
switch (CurrentSpellcheckerLanguage) {
case LanguageGerman:
if (std::find_if(it1, it2, 'ß') {
...
}
break;
case LanguagePolish:
if (std::find_if(it1, it2, 'ł') {
...
}
break;
case LanguageRussian:
if (std::find_if(it1, it2, 'ш') {
...
}
break;
}
И, соответственно вот эти вот 'ß'
, 'ł'
и 'ш'
— были в разных кодировках. Прямо внутри одной функции…Насколько трудно кусок между case и break вынести в отдельный файл?
Или проще есть кактус?
Насколько трудно кусок между case и break вынести в отдельный файл?В конце-концов это и сделали… когда ресурсы нашли.
До сих пор не знаю как к этому относится: код в результате стал сложнее и медленнее, но зато его можно редактировать Eclipse'ом не опасаясь всё уничтожить неловким движением. Ну и количество WTF'ов уменьшилось…
#define CODE_GERMAN_ESZETT = 223
#define CODE_RUSSIAN_SHA = 248
и сравнивать по коду символаPS вам повезло, что ко всей этой прелести не добавилась кодировка windows-1255 :)
Т.е. сама программа нормально работала с кодировкамиКак я уже писал: ядро у неё нормально работало с любой однобайтовой кодировкой — а языков там было… много.
PS вам повезло, что ко всей этой прелести не добавилась кодировка windows-1255 :)А чем тут windows-1255 плох? Это бы как-то повлияло только на тех, кто поддержку иврита бы добавлял, остальные бы видели в этих местах разные свои буквы…
С немцами у меня была похожая история. Только там еще в комплекте шел модуль препроцессора для Java (который вызывался внутри ant-таски и переводил ключевые слова с немецкого на английский). Более того: имена классов, методов и переменных были тоже на немецком. УчитываяОсобенностиОнногоЯзыка
оно действительно выглядело как нечто родное.
Коммент в исходниках VMWare:
//This exception should never happen, if it does gods help us.
И все же ЭТО однажды случилось, и бог не помог..
Тут и переводы хромают, в оригинале написано: «Это исключение никогда не должно было случиться, но если произошло, боги помогают нам».
Так нормально?
длинный длинный тому_назад; /* в далекой-далекой галактике */
float boat; // must be a float, otherwise it sinks.
// I can’t divide with zero, so I have to divide with something very similar
result = number / 0.00000000000001
// no comments for you
// it was hard to write
// so it should be hard to read
решение — делать перед вычислением
if(divider==0) return SomeSpecialResult
А разве стандарт float не позволяет делить на ноль? Есть же специальные значения для Nan, PositiveInfinity, NegativeInfinity.
А разве стандарт float не позволяет делить на ноль?Лучше бы не позволял.
Есть же специальные значения для Nan, PositiveInfinity, NegativeInfinity.
+inf
и -inf
— ещё себя прилично ведут. Но nan
…nan < 0
— falsenan > 0
— falsenan == 0
— falsenan != 0
— falseРазработчики, которые это извращение изобрели на stack overflow рассказывают сказки, но… звучит это примерно как «мины замедленного действия — это жутко круто, кишки намотанные на люстру — это просто восхитительно».
Дело в том, что если вы задумаетесь, то поймёте, что неявное предположение о том, что
==
— это отношение эквивалентности (в частности A == A
для любого A
), а <=
— это отношение порядка (в частности если A < B
— false, то A >= B
— true) заложено в такое количество алгоритмов, что возврат из функции nan
'а — это почти акт саботажа…Одна из причин почему в rust разделили типажи Ord/PartialOrd и Eq/PartialEq это как раз ieee754
Вы же в свою очередь можете разработать свой язык и компилтор, для которого результат сравнений больше/меньше/равно будет возвращать 3 состояния, и тогда проблема с nan == nan исчезнет.
Так что мне придётся создавать не свой собственный компилятор, а свой собственный процессор — что гораздо сложнее и безумнее. Гораздо более разумное решение: при обнаружении
nan
прекращать вычисления вообще. Проще, надёжнее, быстрее.но… его-таки нужно отдельноa проверять! Для проверок же «равно»/«неравно» и «больше»/«меньше» возвращаются, опять-таки true или falseДело в том, что его нужно в ряде случаев обязательно проверять. Иначе может оказаться, что любое число будет меньше и равно NaN. И компиляторы частенько проверяют оба флага, чтобы сгенерировать false.
Что это было?
// Нужно обязательно дунуть, потому что если не дунуть,
// то никакого чуда не произойдет...
// © Амаяк Акопян
// Please do not refactor, you probably won't optimize this better.
— в заголовке метода на 2000 с лишним строк. Ну, я его на сотню строк всё же сумел ужать.
// contrary to popular beliefs no magic is done here
— перед блоком, где выполнялось 15 битовых операций подряд. Код на Java.
// talk to the hand ★-★
Handler hand = new TerminationHandler();
— автор не поленился найти в Юникоде символ для очков, которые примерил Терминатор.
Вспомнился ассемблерный исходник тетриса для DOS, где бинарник получался размером ровно 2 Кб. Оно работало в текстовом режиме, я сумел туда дописать загрузку графики в знакогенератор, и удержаться в тех же 2 Кб.
для вас рефакторинг это ужатие количества строк? тогда я бы до 1 ужал :-D
Правда, я бы не стал удалять таблицу сразу. Как минимум, запустил бы что-то вроде
SELECT COUNT(A)
FROM Table
WHERE B <> A*3
Забавно было бы, если бы результатом этой оптимизации стал бы эфект гонки, который проявился только через полгода/год.
Гонка из-за чего? из-за нескольких параллельных обращений к формуле/таблице? Не думаю, что там это было актуально. А даже если, то слишком легкомысленно полагаться на одинаковое время исполнения и не отлавливать потенциальные гонки.
Это не обязательно таблица. Возможно просто внешняя память.
> Гонка из-за чего? из-за нескольких параллельных обращений к формуле/таблице? > Не думаю, что там это было актуально.
Мы наверно никогда не узнаем.
> А даже если, то слишком легкомысленно полагаться на одинаковое время исполнения.
Согласен. Кстати, насколько я помню, некоторые платы реального времени именно так и работают.
B = (A << 1) + A // B = A * 3
Я вот не знаю, как там у Apollo, а в нашей больничной БД названия всех таблиц и полей, имеющих отношение к лабораторным анализам, начинаются с ANAL_. Например, ANAL_DIR, ANAL_COMMON и т.п. В общем, всё через жо… Простите, через ANAL.
Что именно Вы имеете в виду?
В командной строке и многих IDE по дефолту используются шрифты с зачёркнутым нулём.
Или Вы про хабр речь ведёте? В блоках кода действительно нули обычные… Ну, можете предложение кинуть админам хабра, чтобы со шрифтом поиграли для блоков кода.
int x = 0; // обычный нолик :)
Серьёзно?
А у меня по-другому...
По настройкам в своём профиле пробежался, вроде как ничего не нашел по настройкам шрифтов… У Вас какой браузер/ОС, если не секрет? (у меня Mozilla/Win10)
Может быть, дефолтный шрифт в браузере разный?
У меня "Times New Roman" стоит. Может быть, у Вас "программерский" шрифт на дефолте?
UPD:
поменял дефолтный шрифт на "Consolas", ничего не изменилось :(
какая-то бага хабра, как думаете?
А вот код стиля для шрифта исходников хабра:
font-family: Menlo, Monaco, 'Courier New', monospace
Предположу что вы читаете Хабр под Windows, а в Courier New ноль без зачеркивания.
Да, Вы правы :)
Я скачал и установил в системе шрифт Monaco, теперь блоки кода сменили вид и отображаются этим шрифтом.
Спасибо!
Черкнул в службу поддержки предложение пересмотреть список шрифтов в стилях…
Правда, не знаю, сочтут ли этот вопрос достойным рассмотрения — так-то невелика проблема
Мне кажется это плохая идея, тащить лигатуры в статьи. Все эти автозамены уместны в уютном, под себя настроенном, редакторе, а в статьях будут создавать лишь путаницу и вызывать множество вопросов. К тому же, они не всегда идеально работают. Использую FiraCode и иногда натыкаюсь на появление символов там, где я бы не хотел их видеть.
А можно подписи к изображениям писать над самими изображениями? Я, конечно, понимаю — ЕСКД там, ГОСТ и все дела, но удобнее читать сверху-вниз всё-таки...
const {
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
} = require('ReactNative');
module.exports =
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactDebugTool;
https://github.com/facebook/react-native/blob/678a7f3c39e495db602e90e994894051eb7aab10/Libraries/Renderer/shims/ReactDebugTool.js
#define TRUE FALSE //Happy debugging suckers
Это слишком просто, здесь есть на много больше интересного.
/*
COME TO THE DARK SIDE!!!
_.-'~~~~~~`-._
/ || \
/ || \
| || |
| _______||_______ |
|/ ----- \/ ----- \|
/ ( ) ( ) \
/ \ ----- () ----- / \
/ \ /||\ / \
/ \ /||||\ / \
/ \ /||||||\ / \
/_ \o========o/ _\
`--...__|`-._ _.-'|__...--'
| `' |
*/
Из заголовочной части одного очень заморочного модуля.
MS-DOS Operating System:
А на скриншотах путь с Word 1.1
P.S. и это не софт для игрушек 18+
int q=centralWarehouse.getQuantity("SuperSucker 100 Vacuum Cleaner");
// бухой, пофиксю позже