воскресенье, 10 июля 2011 г.

Парампампам

Синглтоны в программировании (пример для плюсов без мьютексов) +
Туториал по таблицам в Lua +
А ТЫ знаешь, что такое MMU? (ну, и не надо, действительно) +
Функция mmap для отображения файла в память +



Творчество Ли Вонг Яна (охохо! *украдено у Ф. Ядрени) +
Мудрый приподоватиль взгромоздился и насладил меня и я чуствовать какой он чуткий и теплый.
Друг и я мечтательни много. В дестве хотели поиметь корови или быков деревени. о потом ришил поступить в институты..
Ссылки на сайты, где вы можете изучить различные штуки (тут скажут, какой у вас уровень английского - никакой) +


четверг, 26 мая 2011 г.

Цитаты разных человеков №5

  • Они больше не делают баги, как Банни (Bugs Bunny). (с) Olav Mjelde.
  • Когда кто-то говорит: «Я хочу язык программирования, который может делать все, что ему скажу», то я даю этому человеку леденец. (с) Alan J. Perlis
  • Многие из вас знакомы с достоинствами программиста. Их всего три, и разумеется это: лень, нетерпеливость и гордыня. (с) Larry Wall
  • Программирование на С похоже на быстрые танцы на только что отполированном полу людей с острыми бритвами в руках (с) Waldi Ravens.
  • Я думаю, что Microsoft назвал технологию .Net для того, чтобы она не показывалась в списках директорий Unix. (с) Oktal
  • С — это причудливый, несовершенный, но невероятно успешный язык. (с) Dennis M. Ritchie.
  • Учитывая текущее плачевное состояние наших программ, можно сказать, что программирование определенно все ещё черная магия и, пока, мы не можем называть его технической дисциплиной. (с) Bill Clinton
50 цитат о программировании всех времён

вторник, 24 мая 2011 г.

Quite Something

Отличный поиск выгодных авиабилетов и ещё один+
Покупка электронных билетов на автобусы +
Таймер обратного отсчёта, который увеличит вашу производительность в 4 раза +
Оцени, как ты используешь своё время! Будь мужиком! +
Что-то сказочно-непонятное (украдено у Ф. Ядрени, которая украла с dirty.ru) +
Что-то попсовое 

суббота, 14 мая 2011 г.

AVR Studio 5

omg! :) Оно настоящее! Вышла новая версия AVR Studio (удовольствия на 400 мб больше)!
Теперь у нас есть "IntelliSense" по-атмеловски! Ну, и прочие нужные штуки, ага.
Да, и редактор очень напоминает VS2010.
Основные особенности, видосы и ссылочки тут.
По умолчанию .hex файл не создается при компиляции, как это сделать читайте тут и Встроенный ассемблер не совместим с ассемблером из AVR Studio 4 (раньше он назывался AVR Assembler 2). Старый AVRASM объявлен устаревшим и более не поддерживается. Так что не спешите сносить AVR Studio 4.

суббота, 7 мая 2011 г.

Quite Interesting №3

Xcode 4

Википедия ололо
В Xcode 4 программисты увидят новый пользовательский интерфейс: единое окно, куда встроен и Interface Builder, и сам Xcode, и Instruments; наличие помощника; новую систему анализа кода Debug Console с более сильным «движком», облегчающую исправление ошибок и осуществляющую поиск логических проблем в коде. Программа также получила дополнительный компилятор LLVM.

Чито нового в хкоде?
Обзор по-русски (читай по-русски).

четверг, 28 апреля 2011 г.

Цитаты разных человеков №4

  • Мужчинам живется гораздо лучше, чем женщинам. Во-первых, они женятся позже; во-вторых, умирают раньше. (с) Генри Луис Менкен 
  • Совет, данный на людях, звучит как упрек. (с) "Кабус-наме"
  • Метеорология: научное обоснование неверных прогнозов. (с) Ален Шеффилд 
  • Подлинный оптимизм покоится не на убеждении, что все будет хорошо, а на убеждении, что не всё будет плохо. (с) Жан Дютур
  • Чтобы оценить чье — либо качество, надо иметь некоторую долю этого качества и в самом себе. (c) Уильям Шекспир
  • Лучший фехтовальщик на свете не должен опасаться второго лучшего фехтовальщика; нет, бояться нужно невежды, который ни разу не держал шпаги в руках; он делает не то, чего от него ожидают, и поэтому знаток перед ним беспомощен. (с) Марк Твен
  • Если у Вас и седьмой блин получился комом... к черту блины! Пеките комочки!
  • Чтобы иметь то, что никогда не имел, надо делать то, чего никогда не делал.

воскресенье, 24 апреля 2011 г.

Quite Interesting №2

Эпиграммы о Программировании +
3. Синтаксический сахар вызывает рак точек с запятой.
51. Появление компьютеров в домах не изменит ни то, ни другое, но может возродить бар на углу.

Популярные вопросы на собеседовании по C++ и ответы на них +

Широкий символ (wchar_t) и тут, и (wstring) +
   

Тьюринговая трясина +
++++++++++[>++++++++++>+++++++++++>++++++++++++>+++++<<<<-]>.>+.<--.>+++.---.++++.----.>--.<<+++.>++++.+.------.>+++.>----.<<<++++-------.>--.+++.<+++++.>+.-.++++.+.>>.<<<----.>-----.--.

(=<`:9876Z4321UT.-Q+*)M'&%$H"!~}|Bzy?=|{z]KwZY44Eq0/{mlk**hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@98\6543W10/.R,+O<

Функция debug.traceback(), которая вернёт вам call stack в Lua. +
Браузер можно использовать для проверки синтаксиса xml документа.
В opera:

суббота, 16 апреля 2011 г.

Алан Тьюринг

Отличная статья про него, которая сама по себе является статьей по материалам другой статьи.

Алан Тьюринг (23.06.1912 -7.06.1954) - британец, работавший в Блетчли-Парк (дада, вы определённо знаете, где это), крутой мужик, математик, логик, криптограф иии основоположник информатики!

Давным-давно в тридевятом царстве в тридесятом государстве один мальчик пошёл в школу получать знания. В школе этот мальчик не проявлял никакого интереса к изучению Закона Божия, литературы и латыни. Он испытывал тягу к техническим наукам и в пятнадцать лет самостоятельно разобрался в теории относительности. Дирекция школы терпела долго, но однажды все-таки направила матери этого мальчика записку следующего содержания: «Ваш сын, видимо, хочет быть только научным специалистом. Может быть, математиком — такие ученики, как он, рождаются раз в 200 лет. Но что он вообще забыл в нашей школе?».

Чуть позже.
В 1936 году построил логическую модель своей знаменитой машины Тьюринга. Предложенная им абстрактная вычислительная "Машина Тьюринга" позволила формализовать понятие алгоритма и до сих пор используется во множестве теоретических и практических исследований.
В 1940 году Алан совместно с другом и коллегой Г.Уэлчманом сконструировал шифровальную машину "Бомба", которая расшифровывала сообщения нацистской шифровальной машины "Энигма" сразу после их перехвата. Затем сделал ещё более тыщи различных ЭВМ (Колосс, ACE, MADAM). Работы Алана по сооружению первых ЭВМ и развитию методов программирования имели неоценимую важность, дав основу большинства исследований в области искусственного интеллекта. Aaaight!

Тест Тьюринга - эмпирический тест, идея которого была предложена Аланом Тьюрингом в статье «Вычислительные машины и разум», опубликованной в 1950 году в философском журнале «Mind». Стандартное звучание закона: «Если компьютер может работать так, что человек не в состоянии определить, с кем он общается — с другим человеком или с машиной, - считается, что он прошел тест Тьюринга». Таки Suzette обманула одного. А в те годы крутыми были ELIZA и известный шизофреник PARRY.


Яблоко, от которого умер Тьюринг, было отравлено цианидом. За два года до смерти Тьюринг был осуждён за гомосексуализм, который был в то время запрещён в Великобритании. Чтобы избежать тюремного заключения, он согласился на годичные инъекции эстрогена, призванные подавить его сексуальные влечения. Как осуждённый, Тьюринг лишился допуска к секретным работам и возможности участия в дешифровальной контрразведывательной деятельности. Он покончил с собой в возрасте всего 41 года. Тем не менее, его мать считала, что он отравился случайно, так как всегда небрежно работал с химикатами. 
В 2009 году Премьер-министр Великобритании Гордон Браун публично принёс извинения за те методы, которым был подвергнут Алан Тьюринг.


Является кавалером Ордена Британской империи.
Премия Тьюринга является самой престижной премией в информатике.

понедельник, 11 апреля 2011 г.


Настоящие инновации невозможны без ... УСИЛИЯ. Чтобы заставить себя общаться с теми, кто способен утянуть вас в направлении, которое существенно отличается от вашей обычной дороги.
Крайним примером такого подхода был Эрнандо Кортес. Как гласит история, Кортес высадился на берег со своим отрядом в Веракрузе, Мексика. Оттуда они отправились в глубь материка. Они столкнулись с болезнями, невыносимыми условиями жизни и решительными врагами. Из опасения, что солдаты могут потерять решимость двигаться дальше, Кортес прибег к грубому и изумительно простому решению: СЖЕЧЬ КОРАБЛИ. (с) Том Питерс. Представьте себе! 

воскресенье, 10 апреля 2011 г.

Закон Мёрфи и эффект гремлина

Закон Мерфи
Если какая-нибудь неприятность может произойти, она случиться.
Следствия:
  1. Все не так легко, как кажется.
  2. Всякая работа требует больше времени, чем вы думаете.
  3. Из всех неприятностей произойдет именно та, ущерб от которой больше.
  4. Если четыре причины возможных неприятностей заранее устранимы, то всегда найдется пятая.
  5. Предоставленные самим себе события имеют тенденцию развиваться от плохого к худшему.
  6. Как только вы принимаетесь делать какую-то работу, находится другая, которую надо сделать еще раньше.
  7. Всякое решение плодит новые проблемы.
Эффект гремлина
Ситуация, когда теоретически исправная техника загадочным образом выходит из строя. В этом случае причину неисправности объясняют проделками мифического существа гремлина. Фраза произошла в результате упоминания гремлинов в связи с поломками самолётов британской авиации в 1940-х годах.

суббота, 9 апреля 2011 г.

Цитаты разных человеков №3

  • Мы живем в обществе, существование которого зависит от наук и технологий, но в котором с трудом можно найти людей хоть что-то понимающих в этих областях. (с) Carl Sagan
  • Годы потраченные на создание Искусственного Интеллекта любого заставят поверить в Бога. (с) Alan J. Perlis
  • Бурение земли в поисках нефти? Вы имеете в виду, что надо сверлить землю для того, чтобы найти нефть? Вы сошли с ума. (с) (ответ на проект Edwin L. Drake в 1859г)
  • Наши друзья с севера потратили более 5 миллиардов долларов на R&D и, похоже, собрались скопировать Google и Apple. (с) Стив Джобс. 2006, про Microsoft
  • Мы никогда не сделаем 32-разрядную операционную систему. (с) Билл Гейтс
  • Меня зовут Линус Торвальдс и я ваш бог. (с) Линус Торвальдс. 1998
  • Говори правду, и тогда не придется ничего запоминать. (с) Марк Твен

Немного о локализации Mac приложений

(Xcode 3)
Процесс локализации приложений в Mac OS легок и прост, когда знаешь, что делать. Исполняемый файл программы отделен от локализованных ресурсов (текстов, изображений, звуков), сгруппированных по отдельным папкам. Локализованные ресурсы хранятся в отдельной .lproj директории для каждого поддерживаемого языка. Папки .lproj названы согласно спецификациям ISO. Содержимое всех таких папок должно быть одинаковым.

В региональных настройках Mac OS вы указываете свой основной язык и список дополнительных языков. В случае, если приложение не поддерживает ваш основной язык, то будет использоваться язык из указанного списка. Если ни для одного из указанных языков не было найдено файлов перевода, то приложение будет использовать язык, указанный по умолчанию при разработке программы. Это значение указывается в переменной “Localization native development region” (эквивалент в xml-варианте - CFBundleDevelopmentRegion) в файле Info.plist.

Пример структуры локализованного приложения (Mac, iPhone, iPad..)


Calculator.app/                      сборка (bundle)
    Contents/
        MacOS/
            Calculator               исполняемый файл
        Info.plist
        Resources/                   папка с ресурсами
            Calculator.icns
            tapeButton.tif           не локализованные ресурсы
            English.lproj/           папка с ресурсами, локализованными для англоязычной аудитории
                Localizable.strings  динамически отображаемые строки
                Calculator.nib       интерфейс приложения
                CalculatorHelp/      файлы документации и помощи
            ru.lproj/                папка с ресурсами, локализованными для русскоязычной аудитории
                Localizable.strings
                Calculator.nib       
                CalculatorHelp/ ...
XCode берет на себя работу по созданию lproj директорий. При нажатии правой кнопкой на Info.strings выбираем Get Info, далее нажимаем Add Localization и пишем, например, для русского язык - ru (всё по ISO).
Важный момент. Локализацию English удалять не стоит, иначе другие локализации перестанут добавляться. English и en одно и то же. Получаем:

Теперь у нас в раскрывающемся списке InfoPlist.strings будет English и ru. 
Значения всех ключей (CFBundleName, CFBundleDisplayName и т.д.). Добавим в ru пару ключей:

* If you localize this key(CFBundleDisplayName), you should also include a localized version of the CFBundleName key.
Затем для нашего примера добавим в ..info.plist, если отсутствуют, следующие ключи (нажав Add Row) со значением ${PRODUCT_NAME}:

Чтобы увидеть результат проделанной работы необходимо изменить язык системы и перезапустить Finder, сделать это можно с помощью выхода из системы (Log Out).
В Finder'е:
И там сверху:

Если умеете читать по-английски(при этом понимая, что вы читаете), вам сюда.

Escape-последовательность в C++

Символьная константа состоит из символа, заключенного в одиночные кавычки (апострофы), как, например, 'х'. Значением символьной константы является численное значение символа в машинном наборе символов (алфавите). Символьные константы считаются данными типа int.
Некоторые неграфические символы, одиночная кавычка ' и обратная косая \, могут быть представлены в соответствие со следующей таблицей escape-последовательностей:
 символ новой строки              NL(LF)        \n
 горизонтальная табуляция         NT            \t
 вертикальная табуляция           VT            \v
 возврат на шаг                   BS            \b
 возврат каретки                  CR            \r
 перевод формата                  FF            \f
 обратная косая                   \             \\
 одиночная кавычка (апостроф)     '             \'
 набор битов                      0ddd          \ddd
 набор битов                      0xddd         \xddd
Escape-последовательность \ddd состоит из обратной косой, за которой следуют 1, 2 или 3 восьмеричных цифры, задающие значение требуемого символа. Специальным случаем такой конструкции является \0 (не следует ни одной цифры), задающая пустой символ NULL. Escape-последовательность \xddd состоит из обратной косой, за которой следуют 1, 2 или 3 шестнадцатеричных цифры, задающие значение требуемого символа. Если следующий за обратной косой символ не является одним из перечисленных, то обратная косая игнорируется. (с)

среда, 6 апреля 2011 г.

Запуск приложения с аргументами в XCode

Если у вас непреодолимое желание, чтобы ваше приложение запускалось с аргументами, например, с аргументом "--kill_them_all", то вам следует сделать это:
Project->Edit Active Executable "..."
В окне настройки выбрать Arguments и добавить нужный аргумент.

воскресенье, 3 апреля 2011 г.

Lua, lua, lua

Исключением в довольно свободном синтаксисе Lua является правило, по которому нельзя переходить на новую строку непосредственно перед символом '(' в вызове функции. Это ограничение позволяет избежать некоторой двусмысленности в языке. Если вы напишите

a = f
(g).x(a)


Lua трактует эту запись как выражение a = f(g).x(a). Поэтому, если вам нужно 2 выражения, вы должны добавить точку с запятой между ними. Если вы действительно хотите вызвать f, вам необходимо убрать переход на новую строку перед (g).


Lua приятный и чистый язык. (c) 
:)

Цитаты разных человеков №2

  • [Плохое] имя метода сродни предвыборным обещаниям политиков. Вроде о чем-то оно говорит, но если задуматься – непонятно о чем @ С. Макконнелл
  • Очень часто люди не знают чего хотят, пока ты не покажешь им это @ Стив Джобс
  • Perl – The only language that looks the same before and after RSA encryption. @ Keith Bostic
  • Всегда выбирайте самый трудный путь — там вы не встретите конкурентов @ Шарль де Голль
  • Руководить – это значит не мешать хорошим людям работат @ Петр Капица
  • При достаточном количестве глаз все ошибки лежат на поверхности @ Линус Торвальдс
  • Две вещи, изменившие миp, были созданы в Беpкли: LSD и Unix. Вряд ли это случайное совпадение @ Jeremy S. Anderson
  • Простота – необходимое условие прекрасного @ Лев Николаевич Толстой
  • Лучше промолчать и показаться дураком, чем раскрыть рот и развеять все сомнения @ Марк Твен

суббота, 2 апреля 2011 г.

Quite Interesting №1

Эзотерические языки программирования +


Хакерская ценность +
Google Scribe, который напишет за тебя книгу +

"Вдохновляющие логотипы со смыслом" +

Смешной язык программирования INTERCAL +
В INTERCAL есть 5 операторов — 2 бинарных и 3 унарных. Впрочем, в некотором смысле все операторы бинарны, поскольку все они оперируют с двоичным представлением аргументов, но эта игра слов уводит нас в сторону от изложения.
Quine в программировании
Компьютерная программа, которая выдаёт на выходе точную копию своего исходного текста.

Препроцессор в XCode

Позволит вам избежать добавления, например, "#define ya bog" в тысячи исходных файлов.
В настройках таргета:
А также:
"If you have multiple targets or projects that use the same prefix file, use Preprocessor Macros Not Used In Precompiled Headers instead, so differences in your macro definition don't trigger an unnecessary extra set of precompiled headers." (c)

среда, 30 марта 2011 г.

Переводы №1 (Назад, к основам)

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

Кто такой Шлемиэль? Это персонаж из старого анекдота:

Маляр Шлемиэль подрядился красить пунктирные осевые линии на дорогах. В первый день он получил банку краски, поставил её на дорогу, и к концу дня покрасил 300 метров осевой линии. "Отлично!" сказал прораб, "быстро работаешь!" -- и заплатил ему копейку.

На следующий день Шлемиэль покрасил 150 метров. "Мда, это, конечно, не так здорово, как вчера, но приемлемо." -- сказал прораб и заплатил ему копейку.

На следующий день Шлемиэль покрасил 30 метров. "Всего лишь 30!" заорал прораб. "Это никуда не годится! В первый день было в десять раз больше! В чём дело?"

"Ничего не могу поделать," -- говорит Шлемиэль. "Каждый день я ухожу всё дальше и дальше от банки!"


суббота, 26 марта 2011 г.

Цитаты разных человеков

  • Если вы не можете объяснить что-то шестилетнему ребёнку, значит, вы сами этого не понимаете © Эйнштейн
  • Если бы строители возводили здания так, как программисты пишут программы, первый же дятел уничтожил бы мировую цивилизацию © Джеральд Вайнберг
  • Если для понимания того, что происходит, нужно увидеть реализацию, это не абстракция © Ф. Дж. Плоджер
  • Есть два способа разработки проекта приложения: сделать его настолько простым, чтобы было очевидно, что в нём нет недостатков, или сделать его таким сложным, чтобы в нём не было очевидных недостатков © C. A. R. Hoare
  • Работая над проблемой, я никогда не думаю о красоте. Я думаю только о решении проблемы. Но если полученное решение некрасиво, я знаю что оно неверно © R. Buckminister Fuller
  • Интерфейсы классов должны быть полными и минимальными © Scott Meyers
  • Я никогда не встречал человека, желающего читать 17 000 страниц документации, а если бы встретил, то убил бы его, чтобы он не портил генофонд © Джозеф Костелло
  • Требования подобны воде. Опираться на них легче, если они заморожены 
  • Не стоит недооценивать важность метафор. Метафоры имеют одно неоспоримое достоинство: описываемое ими поведение предсказуемо и понятно всем людям. Это сокращает объём ненужной коммуникации, способствует достижению взаимопонимания и ускоряет обучение. По сути метафора - это способ осмысления и абстрагирования концепций, позволяющий думать в более высокой плоскости и избегать низкоуровневых ошибок © Фернандо Дж. Корбати

Статья про отладку в xcode

Cтатья про отладку приложений 2008 года. Фууу! Старьё!
Читать!

Рубен Люциус Голдберг

Кто этот человек?

Есть два способа достижения целей – простой и трудный. И вот что удивительно: большинство людей всегда выбирают именно тот, что сложнее (c)

среда, 16 марта 2011 г.

Параллельное присваивание

На примере языка Lua.

-- Multiple assignments allows one line to swap two variables.

print(a,b)
a,b=b,a
print(a,b)

-------- Output ------
1 2
2 1

Неплохо, так то..

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

t = a
a = b
b = t


пятница, 11 марта 2011 г.

четверг, 10 марта 2011 г.

Изучая иностранные языки

Making a basic .NET COM component is very straightforward.
Чито? Straightforward?? Что за страшное слово!? Когда видишь фразу COM component в связке со словом straightforward, думаешь, что открыв словарь ты увидишь что-то вроде "straightforward - сложно, блядь. очень". 


straightforward - простой.

среда, 9 марта 2011 г.

Язык программирования C и шуточки

char **argv
  argv: указатель на указатель char

int (*daytab)[13]
  daytab: указатель на массив[13] типа int

int *daytab[13]
  daytab: массив[13] указателей на int

void *comp()
  comp: функция, возвращающая указатель на void

void (*comp)()
  comp: указатель на функцию, возвращающую void

char (*(*x())[])()
  x: функция, возвращающая указатель на массив[] указателей на функцию, возвращающую char

char (*(*x[3])())[5]
  x: массив[3] указателей на функцию, возвращающую указатель на массив[5] типа char


вторник, 8 марта 2011 г.

inline-функции и макроподстановки

inline-функции:

При объявлении функции внутри программы C++ позволяет вам предварить имя функции ключевым словом inline. Если компилятор C++ встречает ключевое слово inline, он помещает в выполнимый файл (машинный язык) операторы этой функции в месте каждого ее вызова. Таким образом, можно улучшить читаемость ваших программ на C++, используя функции, и в то же время увеличить производительность, избегая издержек на вызов функций.

макроподстановки:
#define max(A, B) ((A)  > (B) ? (A) : (B))
Хотя внешне он напоминает вызов функции, на самом деле max разворачивается в тексте путём подстановки. Вместо формальных параметров (A или  B) будет подставлены фактические аргументы, обнаруженные в тексте. Возьмем, например, следующий макровызов:
x = max (p+q, r+s);
При компиляции он будет заменён на следующую строку:
x = ( (p+q) > (r+s) ? (p+q) : (r+s));
...
Если внимательно изучить способ подстановки макроса max, можно заметить ряд "ловушек". Так, выражения в развернутой форме макроса вычисляются дважды, и это даст неправильный результат, если в них присутствуют побочные эффекты наподобие инкремента-декремента или ввода вывода. Например, в следующем макровызове большее значение будет инкрементаровано два раза:
max(i++; j++)   
(c)The C Programming Language

понедельник, 7 марта 2011 г.

Тестовое задание

После пятиминутного собеседования в одну очень-очень известную компанию мне сказали, что отправят тестовое задание по C++! (weeehoooo) Как же я удивился, что программист на C++ должен знать как устроено приложение на WinAPI, как писать приложения на ATL, WTL, да ещё и с использованием GDI+ - какой же я наивный чукотский мальчик.

четверг, 24 февраля 2011 г.

The C Programming Language

Книга Брайана Кернигана и Денниса Ритчи "The C Programming Language" отличная.
С неё надо языки программирования изучать. Читается легко и понятно.

На ozon.ru

среда, 23 февраля 2011 г.

Из книги гуру менеджмента Тома Питерса "Представьте себе"

Инициаторами покупок большей части потребительских товаров являются женщины.
ОНИ ПРОДЕЛАЛИ СВОЙ ПУТЬ ПО ГАЗОНАМ
В 2001-м, после моей первой в году речи, ко мне подходит парень. Он присутствовал на моём семинаре три года назад, когда я только разминался для разговора на эту тему. Он говорит, что не придал значения моим замечаниям по поводу женского рынка, но позже решил отнестись к этому серьёзнее.
Он провёл "небольшое исследование". Результаты потрясли его. Оказалось, что 80% покупателей его основного товара - женщины.
А что у него за продукт?
Газонокосилки.

Книга на ozon.ru