Предлагаю закон о запрете сарказмов и метафор. А то написан текст, а что имел ввиду автор -- непонятно. Надо, чтобы всё всегда было чётко и понятно! А то вот ещё, экспертизу назначать.
И лучше тогда ещё сразу закон о запрете пропаганды сарказма. Включающий в себя запрет на оправдание сарказма и запрет на информацию о сарказме.
Я знаю английский язык в одну сторону. С английского на русский. Если надо что-то перевести обратно, начинаются муки творчества. Однако, я несколько раз привлекался к чтению текстов других таких же горемык. Да и свои ошибки знаю. Хотел бы отметить наиболее вопиющие из них. Очень забавно об этом писать, особенно с учётом того, что я сам не в состоянии написать нормальный текст. Итак: - Пропущенный глагол. Особенно is. Это в русском можно пропускать глагол, в английском такого не бывает. - "Русицизмы" (в противовес "англицизмам"). Берётся русское словосочетание или выражение и по словам переводится на английский без корректировки грамматики и смысла (говорю от [всего] сердца -- speak from my heart). - (на самом деле часть предыдущего) Нарушенный порядок слов. Особенно радует инверсия подлежащего и сказуемого в утвердительных предложениях (привет Льюису Кэрролу). Особенно в сложносочинённых, особенно когда одно предложение в одном порядке, а другое в другом. One parameter was measured and was calculated other parameter. - Неправильное употребление предлогов с глаголами и предлогов вообще. One of us? One from us? Тут во многих случаях я бессилен. - Повсеместно пропущенные артикли a и the.
Как бы мне нормально выучить язык и во вторую сторону? Хмм...
Знающие английский в обе стороны, поправьте, если я где-то написал правильно.
За последний месяц уже четыре раза сообщили в новостях о сбое в московском метро. Правда два из этих разов были связаны с людьми упавшими на рельсы. Раньше сбои тоже бывали, но о них в новостях сообщали не всегда. Возможно, это формирование общественного мнения о работе метро? Только вот кому яму копают, а?
Каждое божье утро в 7 утра по двору проезжает трактор. Зимой он очищает снег. А летом поливает всё водой. Он очень громко тарахтит и вибрирует. Просыпаешься даже в выходной день. А если не спал, он полностью заглушает собой радиоприёмник. И не только люди просыпаются. У машин срабатывают сигнализации. Представляю, как задолбались эти ребята.
Дело было на пересечении Ленинградского проспекта и ТТК. На внутренней стороне ТТК, незадолго до в'езда под землю.
Я сначала даже не понял, кто это. Чёрная клякса хаотично перемещалась по полосам движения впереди меня. Прямо по поверхности дороги. Потом я понял. Это был котёнок. Чёрный котёнок. Не то чтобы он перебегал мне дорогу. Он подпрыгивал на месте и шарахался то от одной машины, то от другой. Иногда перепрыгивал в соседнюю полосу. Он был очень беспокоен. Машины ехали медленно, потому что они всегда в этом месте едут медленно. Интересно, так ли себя чувствует игрок в платформер, когда проходит места с прессами, которые давят пол по расписанию?
И вот этот котёнок прыгал-прыгал и... нырнул мне под машину. Из-за затруднённого движения я тогда стоял на месте. Но передо мной машины уже тронулись, следовало ехать и мне. Тогда я... вознёс молитву. Это была молитва никому и в ней не было слов. И я поехал. Медленно-медленно. Через 3 метра я с облегчением увидел, что котёнок уже прыгнул под следующую машину.
Что надо было этого котёнка поймать (блин, как его поймаешь, он же убегать будет!) и высадить на тротуар, я подумал, когда от'ехал уже слишком далеко. Когда я ехал спустя полчаса обратно, трупика на дороге видно не было. Но я мог его и не разглядеть в таком потоке машин. А может быть, кто-то оказался сообразительнее и его подобрал.
Нет, меня не мучают угрызения совести по этому поводу. Но вот что мне неприятно. Когда котёнок был под машиной, я думал не "только бы этого котёнка никто не задавил", а "только бы этого котёнка задавил не я". Это так эгоистично.
За что я не люблю интернет-магазины, так это за то, что наличие товара по сайту зело часто не совпадает с фактическим. Отсутствует синхронизация с реальной базой учёта. А ведь так просто... даже не держать единую базу данных для учёта на сайте и в магазине. А просто сделать в админке к товару кнопку "продать". И кнопку "завезти". Это если нет возможности/желания делать нормальную синхронизацию баз (база для сайта может разрабатываться без учёта внутримагазинной или быть вообще готовой, взятой вместе с каким-нибудь движком). А кнопки нажимать одновременно с фактом продажи/завоза. И всё будет синхронно. И никакой дезинформации, ложных надежд и ожиданий неизвестно чего. А то можно довольно долго выяснять, где же есть товар на самом деле.
Почему-то сложилось впечатление, что найти сканы/OCR импортных книг гораздо сложнее, чем отечественных. И не потому что я их плохо ищу. Их просто не сканируют и не выкладывают. А на форумах даже никто не спрашивает "где скачать", спрашивают "где купить". Это у нас национальная особенность?
Хотя, например, некоторые японские книги (выше я говорил не о них, а о импортных книгах вообще) найти можно. А именно ранобэ. А вот другие японские книги -- не-а.
Все зовут кошек "кыс-кыс-кыс". Они реагируют. Я обнаружил, что реагируют они на высокочастотную составляющую спектра этого сочетания звуков. То есть, на самом деле достаточно говорить "ссссс". Эффект тот же.
Я не всё написал вчера, т.к. меня просили тот пункт выделить особо. Короче --
Десять правил компьютерной безопасности: 1. Люди делятся на две категории: кто делает бекапы и кто уже делает бекапы. Делайте бекапы. 2. Шифруйте непубличные данные, которые могут попасть в чужие руки. TrueCrypt поможет. Также примите к сведению, что есть такая штука, как OTR, Tox. 3. ПО должно быть последней версии. Особенно это касается: антивируса, ОС, флеш-плеера, джавы. 4. Не работайте от администратора без необходимости. 5. Не указывайте в интернете своих личных данных: ФИО, фотографии. 6. Не сообщайте в интернете никому свой номер телефона и не отправляйте смс на короткие номера. 7. Пароли должны быть сложными (и разными). Их тоже никому не сообщайте. 8. Ответы на контрольные вопросы в любых интернет-аккаунтах не должны соответствовать действительности (как следует отвечать на вопрос "девичья фамилия матери"? Правильно, "лазанья"! А девичью фамилию матери лучше всё равно никому не сообщать. На всякий случай). 9. Перед вводом имени пользователя и пароля проверьте адрес сайта, на котором вы вводите свои данные. Вы можете сильно удивиться. Желательно вообще логиниться через HTTPS/SSL, но не у всех сайтов есть такая фишка. У серьёзных -- есть. То же касается и любых других непубличных данных отдаваемых в чужие руки "по нужде" -- проверка адресата. 10. Не переходите без проверки по незнакомым или непонятным ссылкам (типа goo.gl/Fe3Gs) даже от знакомых людей, даже если очень очень просят. Это касается и щелчков по баннерам. Не запускайте подозрительные файлы. Кстати, для определения, что по короткой ссылке, есть сервисы типа unshorten it.
Разумеется, у всех правил есть обратная сторона. Иногда просто необходимо их нарушить. Сообщить номер телефона знакомому, которого вы знаете через интернет, вполне допустимо. Если это нужно. А обновление ПО может привести к нестабильной работе системы, её отказу, или внедрению троянов (или других негативных программ), которые сделали сами разработчики. Вспомним "звезду пирата" (WGA) -- обновление проверки подлинности винды, которое ставилось автоматом и удалить которое было нельзя. (UPD 2015: или Windows 10).
Но отступая от любого правила, вы должны понимать, зачем надо делать именно так, и к чему это может привести.
Я хотел узнать о том, что такое функциональное программирование. И почему-то решил поизучать именно Haskell. Просто так, во имя добра. В целом, после изучения книжки сложилось ощущение, что Haskell состоит целиком из монад, а сверху обильно посыпан синтаксическим сахаром. Смешать, но не взбалтывать.
В принципе, я понял, что мне хотели сказать (хотя понимание того, что такое монада у меня лишь частичное). Теперь у меня вопрос -- как мыслить в данной парадигме? В процедурной и об'ектно-ориентированной я более-менее мыслить могу, а вот что делать тут? Видимо, надо прекращать читать книжки и начинать уже хоть что-то писать (помимо тех двух тестовых строчек, что я придумал).
К достоинствам книги я бы отнёс дебильные иллюстрации (иногда со скрытыми референсами), местный юмор, а также то, что подача материала организована в правильном порядке (и всё написано понятно). Т.е. сначала рассказывается что-то, что нужно для понимания следующего куска. Получается цепочка. Например, функторы -- аппликативные функторы -- монады.
К недостаткам я бы отнёс то, что хотя материал подаётся и правильно, но пояснений об этом нет. Читаешь-читаешь... а зачем всё это? Агааа! Через 20 страниц выясняется, зачем это было надо. Кроме того, именно в русском издании (а других у меня и не было) почему-то супер-быстро трепется обложка, в некоторых местах в исходниках пропущен символ карата (^) -- о нём, правда, можно догадаться по контексту. И ещё -- там написано про быструю сортировку, что цветная картинка для этого процесса на обложке! Но там только голубой слон (правда, он в очках)!
Очень приятная штука типа Портала. Но не Портал. И Гладосс нет. Надо решать загадки "как пройти дальше". Все уровни очень сильно друг на друга завязаны и хрен поймёшь, как по всему этому навигироваться. Карта на стене в главной комнате помогает мало (но немного таки помогает). Похожее ощущение у меня было в начале игры в Dark Souls -- выходишь иной раз в знакомую локацию, а как они связаны -- не понимаешь. Тут я вообще не знаю, можно ли добиться полного понимания связи локаций. Дело в том, что когда вы проходите по коридору, не факт, что идя обратно, вы попадёте туда, откуда пришли. Даже очень вероятно, что вы попадёте совсем в другое место. "Эта комната зелёная, она мне не нравится, я хочу обратно, в синюю". (С) Мир, вывернутый наизнанку и завязанный в узел Мёбиуса. Несмотря на кажущуюся внезапность некоторых игровых ходов, типа пропадающих полов и невидимых лестниц, игра абсолютно логична (т.е. это не такой хардкор, как неко-марио или Lab14). Тем не менее, логика заранее неизвестна, поведение мира придётся изучать самостоятельно и играть на тонких эффетках.
При прохождении придётся напрячь мозг. Несмотря на то, что многие решения нетривиальны, мне загадки показали проще, чем в Портал-2 (а с Портал-1 сравнивать не могу -- забыл уже). Тем не менее, две побочные загадки так и остались неразгаданными -- пришлось посмотреть в прохождение.
Также в игре будет много кубиков. Да-да, почти грузовые кубы. Только маленькие. И некоторые из них вам будут весьма дороги. У меня возникла ассоциация с майнкрафтом, в который я никогда не играл.
На стенах висят плашки с картинками и умными высказываниями о жизни, вселенной и всё таком... особенно порадовали: "Если у вас не получается решить проблему, значит у вас нет нужных инструментов" и "Чем больше вы нашли, тем сложнее искать остальное". Бесит, что они характеризуют решение задачи, но задачи предыдущей! То есть, это подсказки, которые показываются тогда, когда они уже не нужны.
Самые последние кадры финального ролика напомнили о карте Уцухо Subterranean Sun (а если сравнивать с 3D-версией схватки с Уцухо -- то вообще один в один).
К недостаткам хотел бы отнести то, что у меня не заработал звук. Пол-игры я вообще думал, что его нет. Потом мне сказали, что есть. Но у меня не было. Но это фигня. Главное -- текстуры следовало сделать в более высоком разрешении, тем более, что их не так много. И ещё -- довести до конца историю с фиолетовыми кубами. Там их 15, но найти можно только 13 (остальные в недоступных местах карты). И даже если их все найти, это не приведёт ни к какому результату. Кроме того, очень плохо виден прицел, внутри "анти-экспроприационного поля" это очень мешает.
Короче, создатели молодцы, если вам понравился Портал -- рекомендую и это.
Если вы увидели в программе, которую вам дали, сортировку пузырьком, и это не учебная программа, срочно, срочно замените её на что-нибудь более другое. Она супер-медленная. Можно получить увеличение производительности в 10+ раз. Если найдёте того, кто написал те строки с сортировкой пузырьком, поясните ему, что он не прав.
Описаны грабли, касающиеся макроопределений (#define) в языках Си/Си++.
(читать дальше) Значит, макросы бывают с параметрами и без параметров. Без параметров это так:
#define IDENTIFIER REPLACE_TEXT
Всё. В тексте теперь все идентификаторы IDENTIFIER заменяются на REPLACE_TEXT. Разумеется, препроцессор достаточно умён, чтобы не заменять "IDENTIFIER" на "REPLACE_TEXT", а также не заменять IDENTIFIER1334 на REPLACE_TEXT1334. Т.е. считаются только отдельные лексемы. Названия идентификаторов для замены рекомендуют писать большими буквами, чтобы видно было, где тут макрос. Потому что с макросами можно попасть в биду.
С параметрами -- поинтереснее. Классический пример:
#define SQR(X) (X)*(X)
Теперь везде в тексте SQR(*) будет заменена на то, что указано. То есть вместо аргумента будет подставлен его квадрат. Например:
В последнем случае printf("3") и getchar() вызовутся по два раза. Этот эффект тоже следует учитывать.
Вроде всё круто, но мы почему-то написали параметр икс в скобках? Почему? Обязательно ли так писать? Формально -- нет. Вполне можно писать и так:
#define SQR(X) X*X
Но такой макрос может не всегда работать верно. Например:
SQR(2+2) → 2+2*2+2
Приоритет умножения выше, поэтому сначала перемножатся две двойки, а потом ещё две двойки добавятся. Итого: 8. А 4 в квадрате это 16. Поэтому аргументы всегда надо в выражении для замены указывать в скобках. Тогда бы вычислялось выражение (2+2)*(2+2), т.е. 16.
Замечу, что все подстановки осуществляются чисто текстово и происходит это ещё до непосредственной компиляции.
Какие ещё есть подводные камни? Далеко ходить не надо, обнаружил вчера.
Программа не работает. Симптомы: программа вылетает с Access Violation, если запущена без отладчика и в Release верии, иначе всё ок (почему иначе всё ок -- так и не понял).
Косвенные проверки показали, что происходит всё из-за выхода индекса за границы массива. Увеличил на 1 размер одного из массивов, проблема исчезла. Ну ок. Ищем теперь источник. Написал функцию _check и добавил её во все места, где у массивов использовалась индексация. Т.к. ошибка проявлялась только без отладчика, пришлось вот так извращаться.
inline _check(int expr, int max, int t, int l) { char s[40]; sprintf("%d>=%d (LN %d, CV %d)",expr,max,l,t); if(expr>=max) AfxMessageBox(s); return expr; }
#define _C(x,y,z) _check((x),(y),(z),__LINE__)
Первый параметр -- проверяемое значение, второй -- максимум (в данном случае размер массива), третий -- контрольное значение, чтобы можно было посмотреть, что там происходит. Последний -- номер строки, где произошёл выход за границы.
В программе массив был одномерным, но эмулировал двухмерный, т.к. ему вместо индексов подавались значения вида x*n+y. Которые были заменены на _C(x*n+y,ARRAY_SIZE,x). Вместо x по очереди подставлялись другие переменные, чтобы узнать, чему они равны.
Оказалось, что CV -- control value для разных переменных в совокупности дают значения в пределах массива (т.е. всё ок), однако итог вычисления выражения x*n+y -- ЗА границами. То есть, если значение выражения считать на бумажке по тем значениям переменных, что выдаётся в сообщении, результат отличается от посчитанного компьютером. Нипанятна. И тут я замечаю макрос SWAP (ну да, большими буквами же имя!). Иду смотреть, что это за зверь. А он такой:
#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
Видимо, меняет значения двух переменных местами. Вроде ок, да? И аргументы в скобочках. Но несколько операторов в одну строку. И используется переменная tempr (это ограничивает применимость макроса функциями, где эта переменная об'явлена). Пишу ему замену inline-функцией. Ошибка пропадает. Да, дело было в макросе! А потом смотрю как он применяется. Там что-то вроде этого:
for(x=0;x<N;x++)//чему равно N -- значения не имеет SWAP(array[expr1],array[expr2]);
Раскроем определение макроса:
for(x=0;x<N;x++)//чему равно N -- значения не имеет tempr=(array[expr1]);(array[expr1])=(array[expr2]);(array[expr2])=tempr;
А чтобы было совсем понятно, что происходит, сделаем правильные отступы:
for(x=0;x<N;x++)//чему равно N -- значения не имеет tempr=(array[expr1]); (array[expr1])=(array[expr2]); (array[expr2])=tempr;
То есть, внутри цикла исполняется только первый оператор макроопределения (замена текстовая, фигурных скобок нет)! Остальные исполняются один раз после цикла (где и происходит выход за границы). Как же решить эту проблему? Можно поставить циклу операторные скобки. Можно заменить макрос встраиваемой функцией. Но можно и исправить сам макрос. Стандартный трюк тут такой:
Видите, мы добавили операторные скобки вокруг макроса. Теперь при любом раскладе он будет выполняться неделимо. Скобки эти использует цикл с постусловием, а это значит, что он будет выполнен минимум один раз. Заведомо ложное условие означает, что второй раз он выполнен не будет. Это то, что нам надо. Теперь при раскрытии получается:
for(x=0;x<N;x++)//чему равно N -- значения не имеет do{tempr=(array[expr1]);(array[expr1])=(array[expr2]);(array[expr2])=tempr;}while(0);
А с отступами:
for(x=0;x<N;x++)//чему равно N -- значения не имеет do { tempr=(array[expr1]); (array[expr1])=(array[expr2]); (array[expr2])=tempr; }while(0);
Внутри параметрического цикла ровно один оператор -- это цикл с пост-условием.
TL;DR: 1) В Си++ есть inline-функции. Они лучше макросов и полностью их заменяют. Лучше использовать их. В Си придётся использовать макросы; 2) При использовании макросов их имена следует писать большими буквами; 3) Аргументы в параметрических макросах в выражении-подстановке писать надо в скобках; 4) Если несколько операторов в макросе идут подряд, их нужно оформить в операторные скобки, например в цикл do-while; 5) Подстановка осуществляется чисто текстово, поэтому если аргумент содержит вызов функции и в выражении-подстановке присутствует несколько раз, функция тоже будет вызвана несколько раз. А в inline-функциях этого не произойдёт.
Однажды я сдавал экзамен по английскому языку в институте. Преподаватель была такая, которая всем ставила четвёрки, а пятёрки -- очень редко.
И вот я отвечаю, отвечаю. Вроде она поправляет мало. А потом вдруг спрашивает (на английском) -- "А какую бы оценку вы хотели получить?"
И тут я ей рассказываю (тоже на английском, естественно) следующую историю --
Однажды я учился в первом классе (на самом деле, во втором, я только сейчас вспомнил) и у нас была контрольная на таблицу умножения. Таблицу умножения я не знал. Вообще. Не выучил. Короче, я её написал на 2 очка. По-моему, единственный в классе. А потом пересдавал. Когда выучил. Ходил по комнате, учил. Выучил таки. И вот я пересдал. Учительница спрашивает -- какую оценку я хочу? А я отвечаю -- не знаю. Поставила пять.
Потом я прихожу домой и рассказываю родителям. А они мне говорят -- ты что? Если спрашивает учительница, какую оценку я хочу, надо всегда говорить, что конечно пять!
После этого я сказал преподавателю по английскому -- так что, в этот раз я говорю "конечно же, я хочу пять".
Она отвечает -- и я вам эту пятёрку поставлю. Мне понравился ваш ответ.
Я разглядывал новый талончик на наземный транспорт. Потом я стал понимать, что на нём изображено нечто странное.
Обратите внимание на нижний левый угол. Видите человечка с мусорной урной? Обратите внимание -- у него нет головы. Точнее, вместо головы -- дырка. Это просто ужасно.
На самом деле, все знают, что эта дырочка, чтобы турникет верно считывал талончик (т.е. чтобы не той стороной не совали). Но это же надо было так разработать. Или это специально? Хммм... Если это не специально, то автор рисунка просто не задумывался о какой-то там дырке в этом месте. Или даже не знал о ней. Это очень плохо. Если это специально, то это оч. круто.
Лозунг для мужчин (например, тех, которых их жёны внезапно припрягли к готовке): Три морковь -- устраняй конкурентов. Вот, кстати, ещё про морковь. Очень смешно.