• Конвертация библиотеки lib.ru в epub формат средствами Java

      Доброго всем дня. Недавно у меня появился электронный ридер — Kobo Touch, и настал вопрос о том, откуда брать книги. Небезызвестная Флибуста конечно хорошая вещь и многие книгу я беру оттуда, но все-таки тянуло меня к lib.ru Да и ради интереса хотелось написать конвертер. Ненавистникам копро-кода стоит подумать о том. чтобы читать этот текст. Ибо код действительно неимоверно жестокий.
      Читать дальше →
      • +22
      • 1.7k
      • 9
    • Как самому нарисовать гравюру

      image

      Как нарисовать гравюру.


      В этой статье я хотел бы познакомить Вас с программой Strokes Maker, предназначенной для создания штриховых векторных гравюр, показать некоторые возможности и нарисовать портрет, например — Билла Гейтса (векторных — потому что получаемый результат экспортируется в векторный формат в виде набора замкнутых линий).
      Читать дальше →
    • Яндекс. Директ. Анализируем конкурентное окружение


        Представьте ситуацию. Вы разрабатываете сайты. Хорошие сайты для хороших людей. Ваши рекламные кампании работают давно, вы вышли на хороший уровень ROI, заказы идут с завидной периодичностью. Все казалось бы хорошо, пока в один прекрасный день мы не получаем кучу писем от Директа, о том что мы кем-то вытеснены с насиженных позиций. Мы идем в выдачу и видим на своей любимой позиции незнакомый сайт конкурента. Естественным нашим желанием будет узнать что это за фрукт и на основании этой информации принять стратегическое решение – ввязываться ли в войну бюджетов (если это серьезный и жирный конкурент) или подпереть снизу и помочь слить бюджет (если это мелочевка).

        «Но это же невозможно!» – Скажете вы. – «Любая система контекстной рекламы руководствуется принципами закрытого аукциона и не предоставляет своим рекламодателям информацию о конкурентах. Мы ведь не знаем ни ключевых запросов конкурента, ни настроек его РК. Не знаем использует он минус-слова или кавычки. Самое главное – мы не знаем его ставок и CTR»

        Спокойствие, только спокойствие! (с)

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

        Читать дальше →
      • Chatroulette своими руками — 50 строк кода

          image
          Пару месяцев назад я приглашал всех на веб-семинар о p2p во Flash, но сделал это слишком поздно, поэтому наверняка большое количество желающих на него не попало. Самое ценное, что я извлек из этого семинара — то, что peer-to-peer приложения во Flash делать очень легко. Правда у самого руки очень долго до этого не доходили.

          Но буквально вчера руки очень сильно зачесались, и посидев ночку я разобрался в том, как работает технология p2p во Flash. Соединить видеопотоки двух flash-клиентов мне показалось мало, поэтому решил сделать что-то более интересное:
          1. Пользователь открывает страничку
          2. Выбирает тему для разговора (один из постов на главной хабры)
          3. Разговаривает со всеми, кто выбрал эту же тему

          Сделал. Тут мой пример видеоконференции, исходники клиента и сервера можно скачать отсюда. Минимальные требования для примера — наличие Flash Player 10 и вэб-камеры.

          UPD: Все это добро хостится на AppEngine, могут закончиться бесплатные квоты и все перестанет работать. Перекинул клиента на narod.ru. Если работать не будет — заходите сюда
        • Как я становился разработчиком приложений для vkontakte.ru

            Чуть более месяца назад, я решил, что разработка приложений для контакта вполне может стать прибыльным делом, а прибыльное дело это как раз то, что мне надо. Никаких познаний в Action Script у меня на тот момент небыло. Так что я фактически начинал с нуля и решил задокументировать процесс. Надеюсь это кому-нибудь поможет. По мере возможностей, буду продолжать делиться своим опытом в этом блоге. Ниже мои записи точно в том виде, в каком я заносил их в evernote.
            Читать дальше →
          • 50 цитат о программировании всех времён

            • Translation
            Перевёл после прочтения комментариев к статье «О ненависти к C++». В цитатах можно найти ответы на большинство возникших там вопросов.

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

            49. Lisp — это не язык, а строительный материал.
            — Alan Kay

            48. Ходить по воде и разрабатывать программы, следуя спецификации, очень просто… если они заморожены.
            — Edward V Berard
            Читать дальше →
          • Мониторинг производительности PHP-кода с помощью Pinba

              Давайте представим себе типичный, набирающий популярность стартап, использующий, например, PHP или Python. Сначала все находится на одном сервере — PHP (или Python), Apache, MySQL. Затем вы выносите MySQL на отдельный сервер, устанавливаете nginx для раздачи контента, возможно, добавляете memcached для кеширования и еще несколько серверов приложений…

              Со временем число серверов будет расти, и рано или поздно вы зададитесь вопросами
              «А что сейчас вообще происходит с системой? Как часто выполняется тот или иной скрипт и как долго? Какие операции занимают большую часть времени?» Системы мониторинга типа Zabbix дают лишь общую, поверхностную картину состояния приложения.

              Чтобы получить ответы на эти вопросы, в Badoo был разработан сервиc мониторинга и статистики в реальном времени — Pinba. В данной статье мы расскажем о нашем опыте использования его для мониторинга и профайлинга нашей системы.
              Читать дальше →
            • Ремесло программиста. Золотые правила

                imageДанный пост представляет собой выдержку «золотых правил» из примечательной книги Питера Гудлифа «Ремесло программиста».

                Кто-то освежит память, кто-то сверится как с чек-листом, а кто-то заинтересуется и прочтет книгу. Т.к. пост получился достаточно объемным, можно добавить его в закладки и периодически к нему возвращаться.
                Читать дальше →
              • А как же всё-таки работает многопоточность? Часть I: синхронизация

                • Tutorial
                картинка для привлечения внимания(пост из серии «я склонировал себе исходники hotspot, давайте посмотрим на них вместе»)
                Все, кто сталкивается с многопоточными проблемами (будь то производительность или непонятные гейзенбаги), неизбежно сталкиваются в процессе их решения с терминами вроде «inflation», «contention», «membar», «biased locking», «thread parking» и тому подобным. А вот все ли действительно знают, что за этими терминами скрывается? К сожалению, как показывает практика, не все.

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

                Перед прочтением глубокого описания полезно убедиться в том, что вы в достаточной мере разбираетесь в Java Memory Model. Изучить её можно, например, по слайдам Сергея Walrus Куксенко или по моему раннему топику. Также отличным материалом является вот эта презентация, начиная со слайда #38.
                Читать дальше. Много.
              • TeaCSS – очевидный подход к созданию стилей

                  Введение


                  Хотя CSS-подобных языков не так уж и много – на слуху и на плаву сейчас и вовсе одни Sass и Less, я все же начну с ответа на вопрос «А зачем нужен еще один?».

                  Если коротко, то TeaCSS не плодит новых сущностей, ведь этот тот же CSS, в который в качестве языка добавили JavaScript.

                  У этого подхода есть свои плюсы и минусы.

                  Плюсы – практически никаких подводных камней. Файл tea преобразуется в JavaScript, наполненный простыми командами вывода. Этот JavaScript можно отлаживать, смотреть в FireBug и вообще его поведение предсказуемо. В этом и состоит очевидность подхода, в вебе уже и так превалирует JS, поэтому вам не придется учить ничего нового.
                  Читать дальше →
                • Практика прототипирования в софтверной компании

                    imageНет, это статья не об игре про заражённый вирусом Манхэттен и его мутантов. Речь пойдёт о прототипах другого рода — прототипах программного обеспечения.

                    Прототипирование ПО становится всё более популярным и часто используемым процессом в российских IT-компаниях. Причины видятся следующие: с одной стороны – это определенная дань моде, с другой – прототипирование обещает компании ряд весомых преимуществ.

                    Однако сделать процесс прототипирования полезным и эффективным — непростая задача. Встречаются подводные камни, появляются вопросы. Кто и когда должен прототипировать? Как делать прототипы? Как их использовать? Ответы на эти вопросы и последующие шаги определяют успешность и полезность нововведения. Если они будут неверными – прототипирование может стать не только вредным, но и крайне дорогостоящим процессом.

                    В статье я хочу поделиться опытом построения процесса прототипирования в моей компании. Расскажу, как мы ответили на озвученные вопросы и каких успехов достигли.
                    Читать дальше →
                  • О прямоугольных координатах и гексагональных сетках

                    Думаю, никому не нужно объяснять, насколько широко в играх (и не только) используются гексагональные сетки. Как для заданной шестиугольной ячейки найти координаты ее центра и вершин — достаточно очевидно. Обратное же преобразование (т.е. поиск ячейки, в которую попала данная точка с координатами x и y) уже не столь тривиально. О нём и пойдет речь в данном топике.
                    Читать дальше →
                  • Phonegap + NativeControls = нативное iPhone приложение на Javascript

                    PhoneGap многим известный фреймворк, который позволяет писать приложения под мобильные устройства на яваскрипте. О нем не раз писалось на хабре, поэтому останавливаться на его описании не будем.

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

                    Рассматриваемый плагин ранее был включен в PhoneGap, но с недавнего времени его необходимо доустанавливать отдельно. Речь идет об NativeControls. Сразу оговорюсь что в данной статье речь пойдет об использовании плагина для iOS. Под андроид использование аналогично.

                    NativeControls позволяет добавлять нативные UITabBar и UIToolBar (сначала я подумал что это UINavigationBar). Реализовано это таким образом, что центральная часть приложения это UIWebView – в котором собственно и располагается веб-приложение. И к этому UIWebView добавляются UITabBar и UIToolBar. И они взаимодействуют между собой в двустороннем порядке. Ниже я опишу основные методы взаимодействия между «веб-частью» приложения и «нативной» частью.
                    Перейдем к делу.
                    Читать дальше →
                  • Решение задачи «Яндекс интернет математика — 2011». Определение визуальной схожести изображений

                      В апреле-мае 2011 года компания Яндекс проводила очередной тур конкурса Яндекс интернет математика. Тема тура: «Определение визуальной схожести изображений».
                      Я публиковал новость про объявление победителей и обещал в скором времени описать решение поставленной задачи нашей командой — LookLikeIt, которая заняла 12-е место в финальном рейтинге.

                      И вот, не совсем скорое время наступило!
                      Читать дальше →
                    • Алгоритмы LZW, LZ77 и LZ78


                        Хочется продолжить свою предыдущую тему об алгоритмах сжатия. В этот раз я расскажу об алгоритме LZW и немного об его родственниках алгоритмах LZ77 и LZ78.

                        Алгоритм LZW


                        Алгоритм Лемпеля — Зива — Велча (Lempel-Ziv-Welch, LZW) — это универсальный алгоритм сжатия данных без потерь.
                        Читать дальше →
                      • Алгоритмы используемые при сжатии данных

                        Вступление

                        Одна из самых главных проблем при работе с данными — это их размер. Нам всегда хочется, что бы уместилось как можно больше. Но иногда этого не сделать. Поэтому нам на помощь приходят различные архиваторы. Но как они сжимают данные? Я не буду писать о принципе их работы, лишь расскажу о нескольких алгоритмах сжатия, которые они используют.
                        Читать дальше →
                        • +22
                        • 34.9k
                        • 8
                      • Секреты JDK


                          Про Unsafe в Java не слышал только ленивый, однако это не единственный магический класс в Sun/Oracle JDK, стирающий границы Java платформы и открывающий тропинки, не нанесенные на карту публичного API. Я расскажу про некоторые из них, принесшие пользу в реальных проектах. Но помните: недокументированные возможности лишают ваше приложение переносимости на другие Java платформы и, кроме того, являются потенциальным источником нетривиальных ошибок. Я даже зря написал слово «приложение». Лучше сказать, что описанные ниже классы вовсе не годятся для приложений! Скорее, они представляют интерес лишь для системного ПО и для любознательных программистов, т.е. для вас :)
                          Читать дальше →
                        • Теория шести рукопожатий: еще одно подтверждение

                          Однажды в студеную зимнюю пору я столкнулся с упоминанием того, что кто-то в Facebook пытается подтвердить теорию шести рукопожатий. Для тех кто не в курсе, эта теория заключается в том, что все жители земли в среднем знакомы друг с другом через цепочку из пяти друзей (т.е. шести рукопожатий). Подробнее об истории этой теории можно прочитать в википедии, там же можно узнать о том, что Майкрософт несколько лет назад пыталась подтвердить эту теорию на основе данных о контакт-листах мессенджера MSN — в результате у них получилось 6,6 рукопожатий, что вполне вписывается в теорию.

                          Очень мне захотелось эту теорию подтвердить самому, используя данные, которые есть под рукой — ВКонтакте. Для претворения моей странной идеи в жизнь надо было решить целый комплекс проблем:
                          1. На каких данных это все расчитывать.
                          2. Где эти данные взять.
                          3. Как эти данные сохранять.
                          4. Каким алгоритмом воспользоваться для расчетов.
                          подробнее о том, что получилось
                        • Мой open source велосипед

                            “Воин не бросит начатое.”
                            Мастер Шифу, м.ф. Кунг-фу Панда


                            Можно рассматривать этот топик не как технический, а как художественный. Тут не будет кусков кода, диаграмм классов и прочей ерунды. Будет история одного java open source проекта, который я разрабатываю уже около года.

                            Начало


                            Все началось, когда я был на четвертом курсе одного провинциального российского университета. С семестра, о котором ходили легенды на моей специальности, как о “семестре-убийце“ с его 55-ю лабораторными работами по графике, компиляторам и вычислительной математике (далее ВМ).
                            Читать дальше →
                          • История одной оптимизации



                              Аннотация


                              Статья раскрывает особенности высокоуровневых оптимизаций вычислительных алгоритмов на Java на примере кубического алгоритма перемножения матриц.

                              Шаг 0. Установи точку отсчета!


                              Определимся с окружением:
                              • Hardware: 1-socket/2-cores Intel Core 2 Duo T7300 2GHz, 2Gb ram;
                              • Java: HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing);

                              Читать дальше →