воскресенье, февраля 08, 2009

Программизмы

Только что друг показал мне одну интересную страницу:

http://www.sjbaker.org/wiki/index.php?title=Cruel_Code_list

На ней расположен архив самых ужасных кусков кода,которые только может выдать человеческий мозг. Осмыслить и понять эти куски человеческий мозг уже способен с большим трудом. Код написан на C++ и в нём сможет разобраться каждый, даже без уморительных английских вставок автора архива, поэтому я не возьмусь переводить статью на русский. Интересно другое.

Я вылез в Гугл и нашёл реального автора одной из программ. Я даю ссылку на ветку одного форума... Угадайте, на каком языке написана программа? На Java.

http://forums.sun.com/thread.jspa?threadID=5224563

Читать рекомендую тред целиком,на второй странице выложены не меньшие перлы. Люди, не начинайте знакомство с программированием с лёгких языков вроде Бейсика, Явы и PHP\Perl! Они слишком легки, чтобы программист вообще задумывался над своей программой.

Приведу рассуждение одного из героев треда:

"Если (a>b) ложно,то логически следует, что b должно быть больше а. <..>"

Классно. Просто замечательно. От автора ускользнула мелкая деталь: a=b. Я не придираюсь, просто пытаюсь найти ту последовательность мыслей, тот корень в логике, провал мозга, который породил столь интересное творение:

if(a > b && b > c) {
// a is greatest
} else if(b > c) {
// note there is no b>a
// b is greatest
} else {
// note there is no test at all
// c is greatest
}


Заметьте - это функция выбора наибольшего элемента. Для трёх элементов. А теперь представьте,что элементов 5, 7, 10, 100...
Ему не жалко стирать пальцы.

Есть три вида ошибок. Первый - это обычные опечатки, вроде следующей для Си:

if ($value = $some_value) {
// тут какой-то код
}


такое случается спросонья,и никто от этого не застрахован. К тому же, компилятор в большинстве случаев вас спасёт.

Второй вид - это непродуманность, вроде хранения числа -333 в типе unsigned char или написания цикла if (password=='password'). Это лечится с опытом, хотя может и обрушить\помешать работе пары систем.

Наконец,третий вид - это именно такие программизмы. Перлы индийского кода. Те творения, авторов которых назвать "быдлокодерами" даже сложно.

Я сам писал нечто подобное лишь раз: это моя функция смены регистра с верхнего на нижний или наоборот; она кочует по моим прогам по одной хорошей причине: я сижу на разных компьютерах и компилю проги на разных системах. Дома у меня стоит Linux, в универе - Винда. Кодировки русского на обеих системах разные, это может быть KOI8-R, CP1251, UTF-8 или (о ужас, кто такое придумал в нашем универе) ISO 8859-5. Как следствие, обычный сдвиг ASCII\UTF значения попросту не работает, когда я конвертирую код в другую кодировку. Именно так в моих программах можно встретить:


char tolower(const char input){
switch (input){
case ('А'): return ('а');break;//надо же с чего-нибудь начинать
case 'Й': return ('й');break;//йцукенг удобнее абв
case 'Ё': return ('ё');break;//не забудем родную буковку
case 'Ц': return ('ц');break;//дети учат эту буковку первой.Кто сказал "А"?Вы всегда читает книгу с начала?
case 'У': return ('у');break;//Ни один порядочный ребёнок не будет читать книгу с начала
case 'К': return ('к');break;//Вместо этого он будет смотреть картинки
case 'Е': return ('е');break;//Причём все и без порядка
case 'Н': return ('н');break;//От У до Г
case 'Г': return ('г');break;//а потом обратно
case 'Ш': return ('ш');break;//от Ш до Г
case 'Щ': return ('щ');break;//да,он посмотрит Г два раза
case 'З': return ('з');break;//надо с детских лет приучать ребёнка уделять большое внимание всякой гадости
case 'Х': return ('х');break;//потому что он потом всю жизнь только этим и будет заниматься
case 'Ъ': return ('ъ');break;//так,сейчас у нас твёрдый знак
case 'Ф': return ('ф');break;//на Олимпийских играх в китае он получил медаль за твёрдость
case 'Ы': return ('ы');break;//Что не значит,что эта медаль была российской
case 'В': return ('в');break;
case 'П': return ('п');break;//помните,мы с чего-то начинали?
case 'Р': return ('р');break;//наверняка помните
case 'О': return ('о');break;//это - О.Познакомьтесь.Очень приятно.
case 'Л': return ('л');break;//здесь слишком много комментов
case 'Д': return ('д');break;//ненавижу комменты
case 'Ж': return ('ж');break;//люблю комменты
case 'Э': return ('э');break;//один из комментов лжёт
case 'Я': return ('я');break;//любимая буковка
case 'Ч': return ('ч');break;//два коммента лгут
case 'С': return ('с');break;//здесь вообще сборище борцов за правду
case 'М': return ('м');break;//думайте над этой логической задачей
case 'И': return ('и');break;//в этих комментах нет смысла..давайте закончим
case 'Т': return ('т');break;//держись,Саня,ещё немного и мы закончим эту муть...
case 'Ь': return ('ь');break;//ну ещё чуть-чуть...
case 'Б': return ('б');break;//ещё немного...
case 'Ю': return ('ю');break;//ДА!!!Закончили.
}
return input;
}



Люди,если вы тратите на подобное 100 килобайт - у вас должна быть причина. Если вы тратите 500 килобайт - весомая причина. Наконец, у вас должна быть просто КЛЯТВЕННАЯ УВЕРЕННОСТЬ в том,что вы знаете,что делаете, если вы тратите на это два мегабайта.

Напоследок, немного ещё интересных строчек.

public string GetUsername (string userName)
{
User user = DbLookup.GetUser(userName);
return user.Username;
}


Есть лишь два логичных объяснения такому: либо прогрев базы данных, либо надо выяснить, существует ли такой юзер. В любом случае, решения этих проблем занимают в 4 раза меньше строк.

string @string = @"new @string()".ToString();
@string = @string == @"string" ? @string : @"Hello World!";


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

if 1 <> 1 then
// <..>
end if


Классический пример творчества наших братьев по разуму. Действительно,а вдруг?
Это даже круче следующего:

if (someVariable == someVariable) {
// <..>
}


Это уже просто образец паранойи. Есть только одно логическое объяснение подобному: someVariable=NULL, так что такой код может иметь под собой какую-то почву. Но опять же, зачем городить эзотерику?

Чувствую,что я немного сбавляю темп, это всё равно что представлять публике сакраментальное #define NUMBER_1 1. Что же,исправлюсь. Проверка булевой переменной:

if (boolean.toString().length()<5){...}

if (value && System.Convert.ToBoolean("false")){...} else{...}

if (b.toString.substring(0, 1).equals("t")) {...}

Небольшая вариация:

if (b.ToString().ToLower()[0].Equals(Convert.ToChar("t"))){...}

Окончание парада - вычисление 1% от числа:

a=abs(b-(b*1.01));

Ей-богу,когда у меня что-то глючит, тормозит или просто плохо работает,я вспоминаю о таких перлах...

суббота, февраля 07, 2009

Нашёл качественный перевод любимой книги:

http://whiteunicorn.spb.ru/heap/daoprog.html

Оригинал лучше,но не все знают английский.
Также набрёл на http://amty.narod.ru/rootless-root.pdf. Не Бог весть что,почитаю на досуге.

Но я балдею от Джеффри Джеймса.

P.S. Сайт whiteunicorn классный. Напоминает старые добрые времена ФИДОнета. Словарик хакера там классический,и,например, слово КАКТУС я бы в жизни так не перевёл.
Ответ: Воспоминания, какой высокой она была n-дцать лет назад....
Вопрос (выделите для просмотра): Какова наивысшая форма ностальгии?

вторник, февраля 03, 2009

небольшая пауза

Сейчас у меня каникулы - я занят подготовкой к пересдаче функана, а также взялся заново за квест. Поэтому постов будет немного меньше...например, следить за Самыми Важными Ответами мне довольно непросто. К слову - сценарий квеста полностью закончен (в нём всё ещё остаётся пара-тройка недочётов в диалогах,но остальное прописано окончательно),хотя ещё ни на ком не опробован (приветствуются добровольцы),я медленно пишу документацию на сам движок и попутно пытаюсь его закодить. Много алгоритмов и идей я взял из книги "Всё,что вы хотели узнать о интерактивной фантастике, но в индустрии не осталось никого, у кого вы могли бы спросить" (это описание Z-машины),также спасибо Grom PE за хорошую корректировку моих бездумных планов и бешеных идей.
В движке запланировано намного больше функций,чем используется в квесте; это сделано на будущее, я не собираюсь останавливаться на одной игре. Скажем, я хочу поддержку некоторых RPG-элементов.
Да,и ещё - всех с Днём Сурка!
А.Я.

воскресенье, февраля 01, 2009

Ответ: DOOM.
Вопрос: (выделите для просмотра) Какую компьютерную игру описывает следующий абзац:
...эта игра не страшная,нет. Это - игра на достань-свою-самую-большую-пушку-и-пах-пах-пах-бах-бах-бах-трататрататрататрата-виииии-онет-очертпобериявкислоте-чертсвамивсеми-ялюблюэто-пах-пах-бах-какодемоныумритевмучениях-божемойэторакета-яненавижукибердемонов-ялюблюсекретныедверисомножествомвраговзаними-паф-паф-паф-трататрататрата-зззап-жжик-вжик-вжик-вжжжжик-виииииикргх-чёрт-чёрт-чёртмненужнобольшепатронов-морпехирулят-умригад-умри-умри-умри-вжжжик-чёртвысаминапросилисьнаДружбу-вжжжжжжжжжжжжжжжжжжжжжж-яненавижукибердемонов-вжжжик-паф-паф-паф-трататататататата-ктожемнепоможе-трататрата-тра-та-трататататата-пиф-паф-пиф-паф-трататрататата-итакбываетскаждымкто-умригад!-татататататататра-ктооставилздесьэтогомаленькогомилогорозовенького-ааааааагрх-умри!-умри!-бежим-бежать-бегу-бежит-бежит!-ааачёртятруп-бежать-бежать-бежать-бежать-очёртясновавкислоте-бежать-бежать-бежать-бежать-прыжок-прыжок-прыжок-прыжок-прыжоксракетнымускорением-ухтыянашёлБольшуюЁ...БУУУУУМ!!!!

пятница, января 30, 2009

Ответ: Пионерский.
Вопрос (выделите для просмотра): Через какой костёр сложнее всего прыгать?

четверг, января 29, 2009

Ответ: Три.
Вопрос (выделите для просмотра): Сколько программистов нужно, чтобы закрутить лампочку, выкрутить её, снова закрутить и зарубиться в Quake втроём?

среда, января 28, 2009

Ответ: Ваши зубы и волосы.
Вопрос (выделите для просмотра): Что пускает корни в вашем черепе?
Ответ: Кого ты видишь на этой картине?
Вопрос (выделите для просмотра): Каждый день я вижу во сне сад.
Это маленький красочный сад с миниатюрными деревьями, буквально с ноготочек.
Я хожу между деревьев, стараясь не примять их. Каждое дерево имеет свой цвет.
Одно - жёлтое, словно песок. Второе - зелёное, как лист. Третье - красное,как солнце на закате.
Из деревьев вырастают узоры, которые очень приятно изучать сверху.
Но по саду,кроме меня, ходит другой человек.
Он каждый день приходит и садится на большой камень в центре сада.
Он ничего не делает там,он просто сидит и смотрит на меня.
В конце концов,я не выдерживаю и подхожу к нему. Он встаёт с камня, слезает с него и камень исчезает.
Вместо камня я вижу постамент.
На постаменте прикреплена картина в дорогой раме.
Я гляжу на картину...и кровь стынет в моих жилах.
Но раньше,чем я успеваю понять,что же тому причиной, я просыпаюсь.

понедельник, января 26, 2009

Ответ: Не читать.
Вопрос (выделите для просмотра): Назовите самую строгую запрещающую табличку.

воскресенье, января 25, 2009

Ответ: Дождь,слякоть,и другие природные явления.
Вопрос (выделите для просмотра): Что мешает инопланетянам наблюдать за головами людей из космоса?
Определены точные координаты происхождения действий, описанных в квесте "Сожги Дом-2".

Это 55 градусов 49 минут 8 cекунд северной широты и 37 градусов 6 минут 41 секунда восточной долготы, берег р.Истра:

http://wikimapia.org/#lat=55.8210131&lon=37.10495&z=18&l=1&m=a&v=2



Прямоугольник в правой части карты - "Лобное Место"
В левой, нижний - место съемок размером чуть больше футбольного поля.
Верхний слева - место проживания съёмочной группы.

Местонахождение подземного бункера показано удобным крестиком.

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

Напомню: события в квесте происходят в далёком будущем.Через Nдцать лет,после постройки фонтана и колеса обозрения.

Анализировать расположение построек предлагаю в комментах. Напоминаю: север на карте - вверху.

P.S. Ниже по течению - кладбище.

пятница, января 23, 2009

Аськокапец

Я тоже не избежал аськокапца и,признаюсь,это поставило меня в очень неудобное положение. За два дня до экзамена - отрубили все клиенты. В линуксе офиц.клиент не запустить, винда стоит на одном компе из трёх и этот комп постоянно занят. Проблема.
К счастью, сейчас нашёл нормальный рабочий транспорт: jabber.sk.
Забугорный,поэтому и работает.
Пункт второй: кто собирается в Jabber, могу помочь с обрядом инициации. Аккаунты у вас уже есть, LJ Talk их предоставляет.

А.Яков.

четверг, января 22, 2009

Ответ: Сессия.
Вопрос (выделите для просмотра): Промежуток времени между "Я буду ходить на все пары" и "Да ну этот универ,я ещё спать хочу"?

среда, января 21, 2009

Ответ: Windows.
Вопрос (выделите для просмотра): Назовите произвольные 7 букв латинского алфавита без пробелов?

Стиляги

Только что посмотрел "Стиляг". Ну, вот выпал случай.
С первых кадров меня не покидало чувство неестественности всего происходящего. Это я уже видел, но здесь это настолько утрировано,что...ну, оно слишком красиво. Красиво до тошноты.
Прежде всего - это не 1955й. В 50-х такого не было даже на загнивающем Западе. Человек у микрофона шевелил руками - вот и все телодвижения. Можете посмотреть старые записи Animals,если не верите. Элвис был первым,кто танцевал на сцене. Но даже у него в то время не было много движений. Настолько много.
Это не джаз. Джаз был придуман в 20-х и человек с саксофоном - это именно его образ. Всё, что показано в этом фильме - всё это рок-н-ролл. Движения в танцах, музыка, причёски и костюмы - всё это рок-н-ролл. И песня "Я люблю буги-вуги" со словами Майка Науменко - это тоже рок-н-ролл. Всё,что показано в фильме,было придумано позже. И в СССР появилось намного позже. И хотя на кадрах герои берут саксофон, виолончель,гитару и ударную установку (что само по себе уже интересно), аудиодорожка содержит рок-н-ролльные клавишные. Не скажу,что я придираюсь, потому что хорошая аранжировка - это хорошая аранжировка, я не о том: я о жанрах. Слово "рок" в фильме не произносится ни разу,но ему подчинено всё.
Я ненавижу такого рода мюзиклы. Ненавижу,когда люди просто разговаривают, потом ни с того ни с сего один из них срывается с места,начинает петь и танцевать, причём ему помогают все,кто попадает в радиус ста метров. После окончания песни все возвращаются на свои места и разговор продолжается как обычно - это не просто неестественно, это просто спотыкательно. Ты сидишь и смотришь на обычный разговор, потом тебя трясут задорной песней и ты,возможно,даже подпеваешь - потом опять скучный разговор и полнейшее чувство неудовлетворённости.
О песнях - ухабисто.Есть такие песни, которые реально и к месту и классные. Есть такие, которые вставлены ни к селу ни к городу. Наконец,есть очень,очень знакомые песни, которые странно слышать в новом исполнении и смысле.
Теперь по рецепту следует добавить ложку мёда... Актёры хороши. Просто хороши. Без исключения. Здесь нечего сказать,это просто качественная работа. С душой.
Есть непонятки в сценарии, но чем больше я смотрел, тем меньше я обращал на них внимания, потому что происходящее бурное действо даже со стройным сценарием не уложилось бы в голове.
Фильм снят красиво, но это - слишком больная фантазия на тему борьбы с тоталитаризмом. Впрочем, смотреть другую фантазию по имени "Обитаемый остров", я даже не намерен. Ну не мазохист я, что поделаешь.

Как человек. который носит причёску вперёд и бакенбарды, который надевает цветные костюмы, для меня очень больно смотреть на подобное коверканье и насмешку над тем,что я люблю и уважаю.

А. Яков.

вторник, января 20, 2009

Ответ: Сказка.
Вопрос (выделите для просмотра): Что такое пятиметровая щука для рыбака и новая планета Солнечной системы для астронома?
Ответ: Разминка.
Вопрос (выделите для просмотра): Как называют землекопы новое русло реки, выкопанное поутру?

воскресенье, января 18, 2009

Ответ: Внутренности головы Петрова Ивана Ивановича, вышедшего на крыльцо подышать свежим воздухом.
Вопрос (выделите для просмотра): Что последним увидит метеорит, летящий на Землю в районе реки Змеинка, примерно в 6-04?

Интерфейс

Я поражаюсь.Поражаюсь графическому интерфейсу программ.Точнее,его непродуманности.
Особенно этим страдают OpenSource-проги.
Быстрый пример. Программа mousepad. Простейший текстовый редактор. Весь интерфейс состоит из меню, рабочей области и панели номеров строк (последняя опциональна). Превосходно! Но меню кошмарное.
Смотрите сами: группа меню "Справка" содержит единственный пункт - "О программе". Зачем?! Зачем этот пункт выносить в подменю,когда он один? Зачем вообще его выносить в меню,когда это же окно вызывается по F1 - непонятно.
Другой пример. Mozilla Firefox. Обожаю этот браузер. Почему? Потому что он очень хорошо настраивается и ещё кое из-за чего,о чём потом.
ПО умолчанию при запуске его мы видим,помимо рабочей области и строки состояния:
-панель меню
-панель закладок
-панель навигации с крупными кнопками и двумя строками
Теперь - моё решение. Убираем панель закладок,поскольку сложить её в кнопку,как в Google Chrome,не удастся. Оставляем меню по той же причине, так как от него отказаться нельзя. Кнопки назад-вперёд, обновить, остановить и новой вкладки (да,мне нужна и такая; я ненавижу искать на клаве Ctrl-T) ставим на панель меню. А теперь - то,за что я люблю Мозиллу: на ту же панель ставим только строку адреса.Строка поиска не нужна. Посудите сами: всё,что набрано в стркое адреса, отправляется прямиком в Гугл. Это лишает нас удобной возможности поиска по другим системам (Википедии, Price.ru...), но существенно упрощает интерфейс. Минус две большие панели - а это 20% экрана (на разрешении 1024х768).
Почему я сравниваю с Google Chrome - да потому что постарались. Всё продумано, на экране нет лишних элементов и ты ВСЕГДА знаешь,где искать нужный.Вообще,если бы везде вместо меню стояли красивые пиктограммы,я бы был не против.
Можно приводить бесконечное количество примеров хорошего интерфейса против плохого. Сейчас я пишу этот пост в программе LogJam. В ней 4 элемента: меню, поле темы поста, рабочая область и строка состояния, где есть кнопка "Отправить" и выбор журнала, куда отправляется сообщение. Всё! У аналогичного Semagic по умолчанию элементами интерфейса занято 50% экрана.А это - настройки доступа, тегов, музыки... В LogJam если тебе надо - ты можешь выбрать, какие элементы интерфейса тебе нужны.Нужно управлять тегами - пожалуйста. Доступом - пожалуйста. Но ведь не каждый юзер пишет "закрытые" посты. В общей сложности все включенные элементы интерфейса могут занять дополнительные 4 полосы. И не больше. Видно,что над программой всё-таки задумывались,даже окно "О программе" вынесено в раздел меню о программе, вместе с её настройками, настройками аккаунтов и прочим.То есть, всё логично. Ничего лишнего.
Знаю,что я никакой не гуру в этом деле, просто даже на мой взгляд, какой-то кошмар.Самое страшное,что это уже у многих вошло в привычку. Да что в привычку: в традицию.
Помню как я битый час пытался освоить видеоредактор Kino. Доки его читал,справку. Только нет в ней ни шиша. С документацией в Open Source тоже не очень-то. Хотя это уже другая история...

P.S. Для Mozilla Firefox есть дополнение Personal Menus, которое позволяет спрятать все меню в кнопку и настроить, что именно в этом меню и где будет отображаться. Конечно, это бы сделать разработчикам,а не пользователям, но - можно.

Постоянные читатели

Архив