[info]mercury13_kiev


Мысли околокомпьютерные и не только


О моём ЖЖ
[info]mercury13_kiev
Буду краток.

1. Подзамочных постов нет.
2. Здесь будут большей частью мои скромные околокомпьютерные мысли.
3. Писать буду не часто, могу и месяцами не писать.

Джеймс Хэг: Когда-то написать проверку орфографии было подвигом
[info]mercury13_kiev

Оригинал: James Hague: A Spellchecker Used to Be a Major Feat of Software Engineering

От переводчика. Словарю русского языка придётся склонять слова. Поэтому считаем, что спеллчекер английский.

Вот ситуация: на дворе 1984 год, и надо написать проверку орфографии для нового текстового редактора под MS-DOS. У некоторых пользователей — но не у всех — в компьютерах 640 килобайт. Приходися поддерживать машины даже с 256 килобайтами памяти. Четверть мегабайта на редактор, редактируемый документ и операционную систему. Да, и на орфографию.

Для справок: на моём MacBook’е стандартный словарь в /usr/share/dict/words содержит 234 936 слов и занимает 2 486 813 байт.

Первое, что приходит на ум,— сжать словарь. Ведь в словаре UNIX есть не только stop, но и stopped, и stopping. Удачная реализация, может, и сработает — но нам надо 2 мегабайта превратить в сотню килобайт.

Вообще-то, даже если мы ужмём каждое слово до одного байта, мы уже заполним все наши 256 килобайт. Так что невозможно даже держать словарь на диске, а в памяти только индекс — не говоря уже о словаре в памяти.

Становится нехорошо. Наиболее используемые слова придётся хранить в памяти в сильно сжатом формате, а остальное — на медленном диске. Или просто хранить всё на диске, в нестандартной базе данных (помните — нельзя рассчитывать, что у пользователя есть жёсткий диск; словарь должен умещаться на 360-килобайтную дискету).

Ну и, наконец, придётся поддерживать дополнительные функции наподобие пополнения словаря.

В 1980-е написать проверку орфографии было очень тяжело. Программисты вырабатывали впечатляющие методы сжатия данных. Появлялись красивые структуры данных, позволявшие быстро найти нужное слово в сжатом словаре. Это была проблема, над которой программист мог трудиться месяцами. Конечно, словарь на 200 тыс. слов сокращали до 50 тыс. или даже до 20 тыс., но и этого многовато для примитивного подхода.

А теперь перенесёмся в сегодняшний день. Программа, загружающая /usr/share/dict/words в хэш-таблицу, занимает 3–5 строк на Python’е, в зависимости от того, насколько сжато вы пишете. Проверить, есть ли слово в хэш-списке — встроено в язык. И всё. Возможно, придётся уменьшить время загрузки или расход памяти, но это уже украшательство и вряд ли потребуется. Простейшая реализация настолько тривиальна, что её место может в учебнике по Python’у, в числе первых упражнений.

Это прогресс.

  • Leave a comment
  • Add to Memories

Qplaze-2005: юмор не по месту
[info]mercury13_kiev

Здесь смешные эпизоды из одной игры, которую я вёл. Называлась она Stirlitz: Umput Über Alles


Симпатяги, не правда ли? Два солдата, крутой солдат, ракетчик, гранатометатель, собака, эсэсовец, большая пушка, босс.

Кто такой Умпут? Был у нас некий Евгений, работавший дизайнером. Evgen не в той раскладке… правильно, «Умпут». Ещё до меня он неудачно отреагировал на анекдот: «Ты веришь в гномиков? А гномики в тебя верят!», и стал «диктатором гномиков».

Сначала Умпут должен был быть офицером Гитлера. Я сам настоял, чтобы он был главным боссом: «двух диктаторов на одну игру многовато». Да и сочетание знакомых из исторических книг элементов и буквы «U» вместо свастики должно было добавить игре комизма. Ну и плюс открутимся от «нацистской символики».

Ракеты с поля боя. В начале игры я поставил задачу: что будет в противовес ползанию — а то вся игра будет проходиться ползком. И знаете, что сказал Денис (главный художник)? «Будут пролетать случайные снаряды с поля боя». А я думал, что пригибаются для того, чтобы уберечься от случайных снарядов… А противовес нашли: стрелять лёжа нельзя.

Старая пушка. Команда разработки пришла к выводу, что эти «случайные снаряды» должны выпускаться какой-то пушкой. Из имеющихся элементов Умпут собрал большую пушку. Стволом была базука, а лафет от пулемёта. Если пулемёт был «для мебели», то пушка реально стреляла и служила «минибоссом». После того как пушка взорвётся, требуется покончить с артиллеристом. Один недостаток: слишком уж она была старинной.

Не собака, а крыса. На тот момент на фирме качество анимации было не в почёте. Очень редко персонажи получались хорошо анимированными. Сделал я как-то собаку и потащил к художникам. Собака так виляла, что Денис сказал: «Крыса, а не собака». А с раскадровкой долго мучился, пока не получилось пристойно.

Штирлиц на каблуках. Движок обкатывался на ярком и красочном лесном мире. Как только стали делать тёмный бункер, два серых пикселя на сапогах Штирлица привели к интересному эффекту: казалось, что Штирлиц стоит на высоких каблуках. Пиксели убрали, проблема исчезла.

Солдат и мина. Новый сценарист очень много косячил. Как вам такое: на низшей сложности точку патрулируют два солдата, на средней ни одного, на тяжёлой один. А ещё мы долго разбирались: откуда свежий солдатский труп? В диапазоне патрулирования солдата была мина, на которую он и нарывался. Нарывался только тогда, когда Штирлиц подходило близко (солдаты далеко от камеры не просчитывались). Таких «камикадзе» на пятнадцати уровнях игры обнаружилось штук пять. Одного оставили: пусть натыкается, шутки ради!

Слона-то я и не приметил. На каком-то Samsung’е была проблема: в окне помощи мигало. Поскольку скорость игры была «лучше некуда», было решено забуферизировать всё, кроме игры. На Motorola A835 мигало везде. Спрашиваю напарника: «Ввёл буферизацию?» — «Ввёл, всё равно мигает». Смотрю — код содран 1:1, и в игре двойной буферизации не было.


VirtualTreeView: почему всё ещё опенсорсный
[info]mercury13_kiev

Компания Embracadero Technologies известна яростной скупкой компонентов. По крайней мере PNG for Delphi уже в общем доступе не найдёшь, да и FireMonkey изначально был разработан русскими.

Однажды на что-то потребовался VirtualTreeView. Скачал, установил, внедрил, переделал под себя… и вдруг удивился: Project Manager и Object TreeView явно сделаны на этом компоненте (VTV написан с полнейшего нуля, и его легко узнать по необычному способу множественного выделения и специфичным недоработкам с клавиатурой). Почему его-то не купили?

Хотя о причине догадываюсь. VTV, несмотря на 30 тыс. строк кода, всё ещё «сырой». Не работает множественное выделение с клавиатуры, да и «мышиное» небезгрешно. Хотелось бы заменять drag&drop на множественное выделение в тех местах, где таскать мышью не нужно. «Грязный» explorer'овский стиль. Глюки на крупных шрифтах. Наконец, ради скорости пожертвовали чистотой API.

  • Leave a comment
  • Add to Memories

Неочевидное свойство stdcall
[info]mercury13_kiev

Для того, чтобы устроить какое-нибудь API, нужно стандартизированное соглашение вызова. В UNIX это cdecl, в Win32 — stdcall.

Итак, stdcall. Аргументы передаются на стек в обратном порядке, результат возвращается через eax. Указатель стека на исходную позицию возвращает функция. Но — внимание!

Как возвращаются большие результаты, спецификация не говорит.

Да, это не стандартизировано. Embarcadero C++ Builder и MinGW возвращают результаты, не умещающиеся в регистр, по-разному. Поэтому…

SomeStruc WINAPI badApiFunction(int x);  // нельзя
void WINAPI goodApiFunction(int x, SomeStruc &r);  // можно

О рыбе и удочке
[info]mercury13_kiev

Коммунизм (социализм) — это социальное устройство, при котором все кому захочется работать возьмут удочки, пойдут и наловят рыбу, чтобы накормить всех кто есть и хочет есть.

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

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


Об объектно-ориентированном программировании
[info]mercury13_kiev

«Объектно-ориентированное программирование» в том виде, как оно описывается в большинстве учебников,— это показуха. На самом деле ООП — это всего лишь языковые средства для так называемой «объектной архитектуры».

Хорошим примером будет старый добрый движок Doom. Написанный на чистом Си, он, тем не менее, стал неплохим примером объектного кода. В движке есть понятия «персонаж», «сектор» и «отрезок», отражённые в коде как mobj_t, sector_t и linedef_t.

Объект — это телевизор с разъёмами и кнопками. Телевизор можно включить, выключить, перенастроить. А что внутри телевизора — нас не интересует. Ну, есть ещё полиморфизм: если я заменю телевизор, новый будет действовать точно так же, как старый. Вот и весь принцип ООП.

А что же учебники? Учебные примеры вынуждены быть маленькими. А маленькую программу объектно писать не стоит. И я, когда классе этак в 10-м писал всякую мелочь, объектов не понимал. И второй дефект учебников: не поняв объектной архитектуры, ученик элементарно не понимает, на что сдались эти методы, простые и виртуальные.

  • Leave a comment
  • Add to Memories

Стране не нужны такие герои
[info]mercury13_kiev

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

Вот пост более знающего человека. Вкратце: солдат не был в бронежилете, кидал гранату с неподготовленной позиции и не был обучен на гранатах учебных. Вот так выходит: героизм одних против раздолбайства других.


Фигурное катание: ЧМ-2012, лидеры SP (женщины)
[info]mercury13_kiev

Лёд в Ницце нехороший. Русские пары и танцоры вообще не прокатали. Исправить положение взялась «пиратка» Леонова. Заслуженное первое место. «Вот я какая: может, у меня и манер нет, но я красиво катаюсь!»

Канако Мураками мне совсем не понравилась. Катание чёткое и умелое, второе место не менее заслуженное. Но, по-моему, «обезьянья» какая-то программа.

И, как и вчера, провал дня. Мао Асада. У неё не просто не получилось секретное оружие с кодовым названием «триксель». Вся её программа, по-моему, была «шалтай-болтай». А в музыке Римского-Корсакова действительно слышится что-то родное.

  • Leave a comment
  • Add to Memories

Фигурное катание: ЧМ-2012, лидеры SP (пары)
[info]mercury13_kiev

КрасотиШШа! И те, и другие достойны первого места. И даже ошибки сходные. Всё решил буквально случай: у китайца на тройном тулупе усмотрели недокрут, а у немца всего лишь две ноги.

На первом месте Алёна Савченко и Робин Шолковы. У них знакомая нам, исполненная в авангардном ключе программа. Саундтрек из фильма «Ангелы и демоны». Рваный ритм, скэт в «церковном» стиле. На льду «хорошая» и «плохой», вынужденные действовать рука об руку.

А на втором — хорошо нам известные, но не выступавшие в этом году Пан Цин и Тун Цзянь. Шопен, история любви и классическое советское катание.

«Байкеры» Волосожар и Траньков (8 место) на их фоне смотрелись как минимум выигрышно. Аранжировка другая, уже нет чувства, что «чего-то не хватает». Да, без тодеса остались, да и выброс нечистый. Но всё равно первое впечатление простого зеваки — засудили!

  • Leave a comment
  • Add to Memories

Qplaze-2005: я — инсайдер
[info]mercury13_kiev

Статьи товарного вида кончились. Но кое-какие воспоминания живы. Итак, что было главной проблемой в Qplaze?

Отсутствие внятного геймдизайна. В лучшем случае автор концепции самоустранялся, не принимая участия в тестировании; в худшем — концепция вырабатывалась всем миром. Иногда получались такие монстры! Например, была американская игра для ПК в пиццерию. Геймплей плохо помню, но мне казалось, что немаловажная часть этого самого геймплея — придумать рецепт пиццы, накладывая на блин куски начинки. Мы написали клон, и весь геймплей свёлся к… обеспечению непрерывного подвоза продуктов при отсутствии приборов (запасы видны только когда мы в меню, на паузе).

Самодурство художника, приближённого к власти. До нас, программистов, доходили только отголоски. Художники плевались.

Проблемные телефоны. Перечислю их по пальцам. Siemens'ы все — висли с неочевидными разглючками. Nokia S40a — мало памяти и архива. Nokia S60, серия b и выше — где-то звук глючил, кто-то не принимал крупных картинок… Motorola V300 и аналоги — мало памяти. Samsung — крайняя труднодоступность кабелей, а WAP-карточки уходили очень быстро. Все мобильники с экранами 320×240 и 101×80 — геймплей к ним приспосабливался с большой натяжкой, да и перерисовывать требовалось много.

Самонадеянность начальства, которая довела Qplaze до кризиса. Три отличных игры ушли «в стол». Тяжёлые были полгода, но потом все долги раздали. Ещё полтора года Qplaze как-то барахтался — и ушёл на дно окончательно. Сейчас «остатки» работают в компании Nomoc. Говорят, начали писать под современные смартфонные платформы — но я не в курсе. Давно их не видал.

А что хорошего?

Такое тестирование, что комар не пролетит. Если концепция хорошая, будьте уверены, багов не будет. Правда, и длилось оно долго.

Утилиты. В лучшие времена в Qplaze на ~60 человек персонала работали три штатных утилитчика (среди них и я). Редакторы спрайтов, редакторы уровней, экспортёр строк… У каждого из этой троицы свой почерк, мой был таков: «минималистично, но неубиенно».

Хорошая компания. Не «фирма», а «люди». Мы ходили на каток (именно тогда я после 14-летнего перерыва встал на коньки). Мы играли в доту и Unreal, мы подкалывали друг друга… Но случился кризис, и лучшие люди или не выдержали затянутых поясов, или были уволены пинком. Сам я жил на припасах и кризис нормально перенёс, долги выплатили на 100%. Вообще-то, мой уход был импульсом, но импульсом, как впоследствии оказалось, удачным: через два месяца случился такой кризис, от которого Qplaze больше не оправилась.


Второе правило веб-интерактивности
[info]mercury13_kiev

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

Если запрос получает данные, хотелось бы передавать ссылку на результат поиска. Поэтому GET. Запрос, который данные изменяет (закончить редактирование, добавить или удалить что-то…), наоборот, не должен исполняться ни через строку браузера, ни через форму на «левом» сайте. Для этого годятся одноразовые коды, подтверждение пароля, проверка referer’а. В простейших случаях подойдёт и POST, но он ненадёжен: фабрикуется заполненной формой.

А если запрос сначала изменяет данные, а потом возвращает, есть первое правило.

  • Leave a comment
  • Add to Memories

Фигурное катание: Юлия Липницкая, ЧМЮ-2012, FS
[info]mercury13_kiev

Пропустил я как-то юниорский чемпионат, а зря. Посторонитесь, Аделина и Лиза! Чрезвычайно гибкая и очень техничная, Юлия может стать третьей надеждой Сочи (ей будет как раз пятнадцать). «Детскость» в катании ещё есть, но посмотрите на её первый каскад — 2A+3T+2T. Даже по взрослым меркам высший класс.

  • 3
  • Leave a comment
  • Add to Memories

Рекомендую девайс: Microsoft Comfort Curve 2000
[info]mercury13_kiev

Клавиатура не дешева. А что же там в коробочке?

Первое. Удачный компромисс между классической и эргономичной клавиатурой. Как метко выразился СамиЗнаетеКто, эргономичными клавиатурами никто не хочет пользоваться. А почему? А потому, что набор действий среднего компьютéрика не ограничивается «слепым восьмипальцевым набором». Я, допустим, программист, и набираю ключевые слова Паскаля и Си на полном автомате без всякой техники. Во многих программах «горячие» кнопки привязаны к раскладке QWERTY. Да и поиграть хочется.

Второе. Хорошая отдача от кнопок. Сама клавиатура тонкая, ход у клавиш короткий, но чёткий, как в ноутбуках IBM.

Третье. Удачные мультимедийные кнопки. Их ровно столько, сколько надо, чтобы долго не выискивать нужную. И заметили, где кнопка «Калькулятор»? Правильно, около цифровой клавиатуры.

Четвёртое. Надписи сделаны светоотражающим материалом. Темнеет, а ты спокойно себе печатаешь: в свете монитора клавиатура начинает тускло светиться. И лампочки удачные, не слепят ночью и отлично видны днём. Моя домашняя клавиатура практически не светится, но Curve 2000 более позднего образца, которую я купил себе на работу — просто офигенно!

Пятое. Почти классическая раскладка. Разве что Backspace большой и Enter маленький; впрочем, это уже на любителя.

Шестое. Отлично моется мокрой щёткой. Я её за три года ни разу не разбирал!

Недостатки? Есть и они. Несколько шире и глубже типичной клавиатуры (кому-то места может и не хватать). Маленький Enter, маловаты клавиши Ctrl, которые я приспособил для переключения алфавитов. Громкий пробел. Латинские и русские буквы одним цветом.

Да, важно. Клавиатура подключается по USB. Многие ОС в аварийных режимах USB поддерживают плохо, так что если у вас не ноутбук, дешёвенькая PS/2-клавиатура всегда должна быть в ящике. А в одном из BIOS’ов вообще дошло до абсурда: чтобы вызвать встроенное в BIOS меню загрузки, надо нажать F12 (и с USB-клавиатуры это работает), но в этом меню с USB уже ничего не выберешь. Но это уже проблема не Microsoft как такового, а производителей ОС и BIOS.

  • Leave a comment
  • Add to Memories

О башорге и старом стиле
[info]mercury13_kiev

БОР № 415713

xxx: Во всём мире ждут конца света 21.12.12. И лишь в России ждут ещё 03.01.13 старый конец света!

Есть известная задача: почему старая Октябрьская революция (25 октября) раньше новой (7 ноября), а старый Новый год (14 января) позже обычного (1 января)?

Итак, с марта 1900 до марта 2100 между старым и новым стилем (т.е. между юлианским и григорианским календарём) 13 дней. И 25 окт ю.к. = 7 ноя г.к. Вот вам и «раньше»: Октябрьская революция — это событие, которое не бывает «старым» и «новым». А эти две даты — один и тот же день по разным календарям!

А с новым годом фиксирован не момент времени, а дата. Естественно, 1 янв ю.к. = 14 янв г.к > 1 янв г.к. Конец света — это не дата, а событие, так что «старый» конец света должен быть 8 декабря. По юлианскому календарю, конечно же.

Примерно то же самое с часовыми поясами. В Москве UTC+4, на Урале — UTC+6. Фиксируем момент — скажем, парад Победы в Москве — 9:00 UTC+4 = 11:00 UTC+6. А теперь фиксируем время — например, вечерние новости в 21:00 — получаем, что 21:00 UTC+4 = 23:00 UTC+6 > 21:00 UTC+6.

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


Фигурное катание: Патрик Чан, чемпионат 4 континентов 2012, FS
[info]mercury13_kiev

Чемпионат Европы я как-то пропустил. А тем временем на чемпионате «всего остального»…

Нет равных китайскому телосложению вкупе с канадским воспитанием. Смотрим и удивляемся. А ещё в середине программы крайне редкий каскад: тройной лутц, ойлер, тройной сальхов.

  • Leave a comment
  • Add to Memories

Рекомендую программу: RusLat95
[info]mercury13_kiev

Стандартный переключатель раскладок Windows NT (так называемая «языковая панель») никуда не годится! Причин много.

  • Для того, чтобы циклически переключать раскладку, надо осознать, в какой раскладке ты находишься. Лучше переключать напрямую. Старшие помнят русификаторы ДОС: правый Ctrl — русский, правый Alt — украинский, левый Ctrl — английский.
  • Shift-Ctrl — клавиши труднодоступные.
  • Занимает много места на экране, а иконки языков плохо схватываются.

Давным-давно брат на компакт-диске журнала «Чип» обнаружил программу SwitchIt. Я с этой программой жил 12 лет, но всё когда-то кончается. Переключение было только между двумя раскладками, а перенастраивать между русской и украинской далеко. Ну и нет поддержки Win64.

Искал я подходящую программу долго. Некоторое время висел на Punto Switcher, но тот не давал украинского языка. И, наконец, нашёл: RusLat95.

RusLat95 «из коробки» требует изрядной обработки напильником. Зато название обманчиво, программа не ограничивается переключением между русским и латинским! Можно, например, сделать циклическое переключение между редко используемыми немецкой и французской раскладкой, а между важными английской и русской — прямое. Настраиваются иконки и звуки. Кстати, для звука можно указать как частоту бипа в герцах, так и WAV-файл.

Я на раскладки себе поставил иконки, выдранные из SwitchIt. Несколько старомодны, но схватываются очень легко.

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

Tags:

Игрушки для Танюшки: групповые SQL-запросы
[info]mercury13_kiev

Предисловие

Есть у меня одна знакомая Танюшка. Работает в США «программистом на побегушках» на крупную сеть одежды. И вечно у меня что-то спрашивает.

Поскольку она широко имеет дело с MySQL, нам придётся делать запросы — и убеждаться, что они работают. Примером будет вполне себе «боевая» (хоть и устаревшая) база, доставшаяся мне в виде текстового дампа. Полчаса — и информация переведена в MySQL. Не полностью, конечно же: адреса, телефоны и фамилии-имена ответственных упускаю. Если потребуются какие-нибудь новые поля — добавим по мере надобности…

Да, я понимаю, что БД не совсем нормализована, но из песни слов не выкинешь.

Преамбула

Итак, приходит ко мне Танюшка по ICQ и говорит:

— А у нас в БД названия городов пишут кто как горазд: есть и «Oxen Hill», и «Oxon Hill», и «Oxenhill» (штат Мэриленд).

— (смотрю Википедию) Правильно «Oxon Hill». Если это единичный акт — исправь сама. А если налаженный поток информации — пни ответственного.

— Я-то пну, но компания — тяжёлая махина. Лучше бы сделать отчёт по всем найденным ошибкам.

— Хорошо, предлагаю такой запрос. Выводит все индексы, на которых два разных города.

SELECT zip, city
FROM store
GROUP BY zip
HAVING COUNT(DISTINCT city)>=2;

А дальше уже разбирайся вручную с каждым случаем. Допустим, Cayey где-то записан как Caye.

— А WHERE не надо?

— Нет, не надо.

Собственно, лекция

Итак, мы можем вывести все магазины в Мэриленде.

SELECT *
FROM store
WHERE state='MD';

Если нужно узнать только количество, нечего вытаскивать всю информацию по магазинам. Для этого в SQL есть так называемые «групповые операции». Наобум из них помню COUNT() и SUM(). Групповые операции «схлопывают» кучу строчек в одну. Например, введём вот такой запрос.

SELECT COUNT(*)
FROM store
WHERE state='MD';

На выходе — одна-единственная строчка, количество магазинов в Мэриленде.

А теперь вопрос. А что делать, если нужно вывести эту же информацию по всем штатам?

SELECT state, COUNT(*)
FROM store
GROUP BY state;

Мы заметили, что оператор GROUP BY изменил поведение групповой функции COUNT(): теперь она берёт количество магазинов только по одному штату. А как, например, вывести только те штаты, где не менее 10 магазинов? Можно, конечно, поступить так.

SELECT *
FROM (
  SELECT state, COUNT(*) AS cnt
  FROM store
  GROUP BY state) AS q
WHERE q.cnt>=10;

Тяжеловат запрос? В SQL есть способ и попроще.

SELECT state, COUNT(*)
FROM store
GROUP BY state
HAVING COUNT(*)>=10;

Разница между WHERE и HAVING проста. Сначала действует WHERE, потом GROUP BY, потом HAVING. То есть, WHERE — это ценз отбора в группу, HAVING отбирает из готовых групп (и без GROUP BY смысла не имеет). Если нам, например, нужно узнать, в каких штатах количество детских отделов не менее 10, код будет таким.

SELECT state, COUNT(*)
FROM store
WHERE hasKids=1
GROUP BY state
HAVING COUNT(*)>=10;

Да, и не пишите в HAVING то, что можно написать в WHERE. Например, задача: вывести количество магазинов по тем штатам, которые начинаются на M.

!! Неоптимально !!
SELECT state, COUNT(*)
FROM store
GROUP BY state
HAVING state LIKE 'M%';

!! Правильно !!
SELECT state, COUNT(*)
FROM store
WHERE state LIKE 'M%'
GROUP BY state;

И напоследок — про COUNT(DISTINCT city). COUNT(field) устроен так, что выдаёт всего лишь количество строк, независимо от того, что поставишь аргументом. COUNT(DISTINCT field) выдаёт количество различных значений.

  • Leave a comment
  • Add to Memories

Qplaze-2005: Хоп-бот, или Туда = обратно
[info]mercury13_kiev

Ещё одна моя история прошла на IT Happens.

Писал я как-то для мобилок deathmatch в 2D. Однажды замечаю: у ботов фраги идут в минус. Сила оружия такова, что убиться, в принципе, можно, но крайне трудно. В чём дело? Отключаю технический интеллект, чтобы больше не стреляли, и наблюдаю. Бот перепрыгивает через яму, затем разворачивается и падает в неё с понятным результатом.

Наставил кучу операторов вывода и в конце концов понял. Когда я ввёл новый тип узла — «перепрыгнуть через яму», — в экспортёре спутал лево и право. Бот бежит вправо, нарывается на узел, подпрыгивает, оказывается на противоположной стороне, а там «вправо» — это влево. То есть в яму.

  • Leave a comment
  • Add to Memories

Хреновина: Бомба-липучка
[info]mercury13_kiev

Заигравшись в Team Fortress 2, я обнаружил странную вещь: на Википедии ссылка «sticky bomb» оказалась синей! А что оказалось за ссылкой — об этом я и хочу рассказать.

В начале Второй мировой Великобритания бросила почти все свои противотанковые средства во Францию. Не помогло. Если Гитлер высадится — против танков нет ни пушек, ни снарядов. И тут «выскочила» идея неких Джеффриса и Макрея.

Но давайте сначала расскажем, чем вообще можно пробить броню.

  1. Бронебойный калиберный снаряд — штука, известная ещё со времён японской войны. Снаряд пробивает броню за счёт кинетической энергии и прочного «носа». В отличие от снарядов корабельных, главный поражающий элемент — осколки брони (взрывчатки мало или нет вообще). Снаряд очень дальнобоен, но пробивная сила невысока. Так что придумали…
  2. Бронебойный подкалиберный снаряд — это твёрдая (вольфрамовая или урановая) стрела. А чтобы такую стрелу зарядить в пушку, есть отделяющийся поддон. В советских танках времён Второй мировой поддон был похож на катушку.
  3. Кумулятивный снаряд содержит взрывной заряд с конической выемкой, и при взрыве получается струя с хорошей пробивной силой. Идея витала в воздухе, но первыми её реализовали всё-таки немцы со своим «фаустпатроном», аж в 1943 году. Ну и...
  4. Бронебойно-фугасный снаряд частично сделан из мягкой жести и заряжен пластичной взрывчаткой. Снаряд расплющивается и в таком виде подрывается. Броню-то не пробьёт, но от внутренней стороны брони (как минимум гомогенной — не многослойной) всё равно получается достаточно осколков.

Вот четвёртый вариант и разрабатывался этой парочкой. Достаточно отпустить гранату с третьего этажа, чтобы вывести танк из строя. А наклон брони даже помогает, улучшая растекание взрывчатки. Все компоненты известные: нитроглицериновый гель хорошо растекается и не менее хорошо взрывается. Браконьеры издавна ловили птиц на особый клей. А дистанционный взрыватель ручных гранат мало изменился с 20-х годов. Но оказалось, что наполненный жидкостью мешок неудобно кидать, да и как уберечь клей? В конце концов пришли к такому устройству.

Внутри — стеклянная колба со взрывчатым гелем. Поверх — матерчатый «носок», пропитанный птичьим клеем. А для защиты всё это покрыто жестяным корпусом так, чтобы ничего не контактировало с клеем. Выдёргиваем первую чеку — раскрывается корпус. Выдёргиваем вторую — включается взрыватель. И только после этого бросаем бомбу в цель. Она прилипает к танку и взрывается.

Оружие необычное и было принято на вооружение только по личному вмешательству Черчилля. Но не всё было просто. Выяснилось, что к грязному пыльному танку граната прилипала плохо. Так что лучшим способом приклеить бомбу к танку оказалось именно бросить её из окна — или приклеить рукой (заодно пожертвовав собой); в конце концов именно это написали в наставлениях по гранате. Да и бомба липла чаще к форме, чем к танкам, и надо было отклеить её, удерживая спусковой рычаг.

Когда выяснилось, что вторжения не будет, большинство бомб раздали экспедиционным корпусам Содружества и местным ополченцам. Насколько эффективным было столь необычное оружие — информации нет. Насколько я понял, отношений к ней было простым: бомба плохая, но без неё хуже.


You are viewing [info]mercury13_kiev's journal