пятница, 31 декабря 2010 г.

С Новым 2011 Годом!


Друзья.
Скоро наступает Новый 2011 год. Для меня всегда празднование Нового Года было
особенным событием. Есть в нем, на мой взгляд, нечто сказочно-волшебное. Пожелаю вам в Новом году крепкого здоровья, душевного и материального благополучия, встреч с умными и интересными людьми. Чтобы Новый год дарил вам одни только положительные эмоции. С наступающим Новым 2011 годом!

пятница, 5 ноября 2010 г.

Haskell Platform 2010.2.0.0 и Cabal под Windows XP

Давеча столкнулся с интересной проблемой обновления пакетов в Haskell Platform 2010.2.0.0 (от июля 2010 года) под Windows XP. Изучал пример, в котором для перекодировки символов использовался модуль Encoding. Из коробки данный модель не входит в состав библиотек, поставляемых c Haskell Platform 2010.2.0.0.

Качать пакеты можно с http://hackage.haskell.org - хранилища различных пакетов модулей для хаскеля. Можно пробовать либо устанавливать пакеты вручную, либо использовать идущий вместе с хаскелем Cabal - средство для автоматической установки пакетов. Конечно, более интересным показался второй вариант. Тут же наткнулся на первые грабли.

вторник, 2 ноября 2010 г.

Размер среды окружения при запуске DOS задач в Windows XP

Общеизвестно, что при запуске DOS-приложений размер окружения (Environment) ограничивается по-дефолту вполне определенной величиной (в XP, например, это значение равно 256 байт, если я правильно понял ). Как это проявляется ? Ну, вот, например, у вас есть переменные среды, в том числе и PATH, которые заданы средствами Windows (Мой Компьютер => Свойства => Дополнительно => Переменные Среды). При запуске DOS-приложений стартует виртуальная машина DOS-задач NTVDM, которая запускает command.com, получающий из всего пула переменных среды блок размером в 256 байт. То есть, если PATH у вас был длинный (а такое часто случается при установке приложений в папку Program Files, которые добавляют в переменную PATH пути к своим бинарниками или либам), то для DOS-задачи он будет урезан.

суббота, 2 октября 2010 г.

Firefox 4 и русская локаль

Не так давно обновил у себя Firefox 3.6.10 на Firefox 4 Beta 6. Что-то, видимо, изменилось в настройках, не могу понять только, что именно. Смысл в чем. Встроенный поиск в Google
перебрасывает, почему-то, на молдавский домен google.md с латинской графикой.
Видимо, по-дефолту поиск идет на домене google.com, который уже в зависимости от страны или настроек пользователя перебрасывает последнего на локальный домен.
Пока решил это включением галки "предлагается на русском языке" на странице google.md (видимо, гугль садит какую-то куку), но как-то это не по-людски. Хотелось бы урегулировать проблему раз и навсегда. Полазил по настройкам Firefox'а в about:config. Нашел 2 параметра, которые отвечают за локаль:
1. Строчный параметр "general.useragent.locale"
Вроде бы, устанавливает локаль в юзерагенте браузера. Пробовал менять дефолтное "en-US" на "ru-RU" - без особого успеха.
2. Булевый параметр "intl.locale.matchOS". В случае True (по-дефолту выставлен в False) заменяет вышестоящий параметр тем, что выставлено в локали OS (если я правильно понял). Изменение его на "True" также результатов не дало.
Сталкивался ли кто с таким ? Интересно, как можно решить ?

вторник, 14 сентября 2010 г.

Решение задачи о поиске двух недублирующихся элементов в потоке

Всем привет. Нашел, наконец-то, красивое решение задачи о поиске 2-ух недублирующихся элементов в большом входном потоке целых чисел (см. концовку моего предыдущего поста). Своим умом, к сожалению, до этого решения не дошел, но так как решение очень красивое, и мне оно понравилось, привожу его ниже (кстати, еще раз убедился во вменяемости практически абсолютного большинства участников форума rsdn.ru :).

Итак, напомню условие задачи. Есть большой входной поток целых чисел, про который известно, что в нем все числа дублируются кроме двух. Найти эти 2 числа за константное количество проходов с использованием константного количества памяти.

четверг, 2 сентября 2010 г.

Задача о поиске недублирующихся элементов в потоке

Недавно столкнулся с еще одной интересной задачей. Звучит она так: имеется входной поток целых чисел. Известно, что в нем все элементы дублируются, кроме одного. Найти этот один элемент за константное количество проходов (O(1)) , используя константное же количество памяти.
Первоначально пришла в голову идея использовать какой-то хэш-массив, в котором ключами будут значения элементов входного потока, а значениями - число вхождений того или иного элемента в поток. Сложность в том, что заранее неизвестно, в каком диапазоне числа входного потока. Если предположить, что размер int'а 32 бита, то в хэше возможно 2^32 элементов, что, в общем, достаточно круто )
Но затем неожиданно меня посетила неплохая идея: а что, если воспользоваться операцией XOR, для которой характерны следующие правила: A XOR A = 0 и 0 XOR A = A.
Тогда просто проксорив все элементы входного потока, мы получим на выходе значение недублирующегося элемента, ибо
             A XOR B XOR A XOR C XOR B = C
То есть, для решения задачи нужен всего 1 проход по всем элементам и одна переменная, аккумулирующая результат, что, согласитесь, неплохо.

А теперь внимание. Как можно решить задачу, если в потоке не один недублирующийся элемента, а два ? Мне пока что-то ничего в голову не приходит.

вторник, 10 августа 2010 г.

Почему нас так не любят за рубежом ? )

Лазил на днях по гуглю и нашел сервис Omegle, предоставляющий возможность пообщаться tet-a-tet с каким-нибудь случайным человеком (есть мнение, что таких сервисов достаточно много, но речь сейчас не об этом). Сервис забугорный, поэтому общение предполагает быть на инглише.
Май инглиш из вэри бэд, но всё равно попробовал ради шутки посмотреть, что получится. Ниже привожу логи 2-ух моих непродолжительных бесед с 2-мя разными представителями дальнего, как я понимаю, зарубежья.

четверг, 29 июля 2010 г.

Задача о картине, веревке и гвоздях

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

Для случая, когда гвоздь всего один, задача решается элементарно.
Будем разбираться, как её решить для 2-ух и более гвоздей. Рассмотрим ситуацию с 2-мя гвоздями. Обозначим их A и B. Введем операции (+) и (-), когда веревка обматывает гвоздь по часовой и, соответственно, против часовой стрелки. Таким образом, A + B означает, что гвозди A и B обмотаны веревкой по часовой стрелке 1 раз (по отдельности или вместе - в данном случае это не играет особой роли).
Также понятно, что A + (-A) = 0, так как мы оборачиваем гвоздь А по часовой стрелке, и тут же снимаем с него веревку против часовой стрелки. Итоговое значение 0 означает, что картину с веревкой ничего не удерживает, и они гарантированно упадут.
Удаление гвоздя будем отмечать заменой соответствующей буквы на число 0 (гвоздь перестает играть роль в процессе удержания картины). Таким образом, для того, чтобы условие задачи выполнялось, необходимо получить такую формулу, когда замена какой-либо одной (любой) буквы, обозначающей гвоздь, приводит всю формулу к нулевому значению.

суббота, 24 июля 2010 г.

Фильм "Рядовой Александр Матросов"

Сегодня посмотрел старый советский фильм "Рядовой Александр Матросов", снятый в 1947 году. Ну что сказать... Конечно, сейчас этот фильм выглядит немного наивным, и та сюжетная линия, по которой он построен, полностью совпадает с историей жизни Александра Матросова, широко известной в советское время. Это уже после развала СССР
начались какие-то подвижки в сторону открытия ранее неизвестных фактов из его биографии (оказывается, что и настоящее имя героя не Александр Матросов, и родился он совсем не в Днепропетровске, и подробности самого подвига весьма туманны).
Но с другой стороны - а так ли это важно на самом деле ? Главное - человек отдал самое дорогое, что у него есть - жизнь - за свободу Родины, за то, чтобы мы с вами могли сегодня жить...
Так что поклонимся героям Великой Отечественной войны. Всем - и тем, имена которых известны, и тем, чьи останки до сих пор лежат не найденными в земле.
Вечная Слава героям.

пятница, 23 июля 2010 г.

Утилита для очистки ключевых слов KCleaner

На днях написал на C++ небольшую утилиту KCleaner (от Keys Cleaner) в помощь веб-мастерам и SEO-шникам. Она позволяет чистить базы кеев по спискам стоп-слов. Утилита консольная, работает в среде OS Windows (гарантированно проверял работу в Windows XP SP2).

Главный упор при её написании я делал на возможность обработки больших массивов данных с сохранением высокой скорости работы. Так, например, для обработки базы ключевиков объемом ~500 000 ключевых слов при файле стоп-слов объемом ~50 000 слов моей утилите требуется около 7-8 секунд на железе Sempron 2500 1.4GHz + 512MB RAM.

понедельник, 19 июля 2010 г.

Рассказ Густава Майринка "Звон в ушах"

Сегодня случайно в одном из ЖЖ-комментариев Ильи Прутова наткнулся на короткий рассказ Густава Майринка "Звон в ушах". Про Майринка, к сожалению, до сего дня практически ничего не знал, хотя фамилию писателя раньше уже слышал. Рассказ (написанный им, как оказалось, еще в 1903 году!) просто чудовищен по красоте. Очень здорово передана мрачная, угнетающая атмосфера, а последняя фраза ("Кто заткнет уши, может услышать, как звенит он внутри"), которая как бы повисает в воздухе, служит замечательным финальным аккордом.
Еще раз убедился, что даже в небольшом по размеру литературном произведении можно передать очень много всего. А этот рассказ, на мой взгляд, стоит иных многостраничных романов и повестей. В общем, рекомендую к прочтению. Ну и, так как размер рассказа очень мал, привожу ниже целиком этот сгусток мастерства Автора:

воскресенье, 18 июля 2010 г.

Монетизация блогов

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

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

Эх, люблю я море... )

Недавно закончился у меня очередной отпуск. Провел его как обычно бестолково, за исключением поездки на море в Затоку на несколько дней.
Море, почему-то, очень люблю (сам не знаю, откуда такая страсть :)) Украинская Затока от нас достаточно близко, поэтому стараюсь ездить туда по мере возможности. В этот раз поездка прошла на удивление легко  (на таможнях практически не стояли), да и в Затоке погода была отличная . Только в последний день было пасмурно, но когда немного обгоришь на Солнце, такая погода  даже к лучшему :) В общем, удалось чуть отдохнуть, накупаться и назагораться. Сейчас вот смотрел фотографии, там сделанные.... и снова на море захотелось )) А ждать еще почти год, до следующего отпуска, как минимум )) Мда.... Ну всё, надо заканчивать просмотр, а то весь слюной изойду ))))

пятница, 30 апреля 2010 г.

Задача об удалении элемента массива с получением максимального произведения оставшихся элементов

Вчера знакомый подкинул интересную задачку. Условие формулируется следующим образом:
===
Имеется непустой массив целых чисел. Необходимо удалить из него один элемент таким образом, чтобы произведение всех оставшихся элементов было максимальным.
===
Задачка показалась любопытной.

четверг, 15 апреля 2010 г.

Сессии и register_globals в PHP, или как я пытался получить инвайт на Habrahabr.ru

Недавно решил получить инвайт на Habrahabr.ru. Не то, чтобы я являлся активным писателем, но хотелось бы иной раз иметь возможность черкнуть пару-тройку комментариев к какой-либо заинтересовавшей заметке. В общем, прочитал на их сайте, что любой может заработать инвайт, что называется, своим собственным умом. Всё, что для этого нужно - написать интересную статью и поместить её в тамошнюю "песочницу". Если статья понравится кому-либо из читателей, кто имеет возможность дать инвайт, он его отправит на email, указанный при помещении статьи соискателем. Да, и еще один нюанс - статья висит в "песочнице" ровно одну неделю. То есть, если за неделю вас никто не отметил - ну что ж... вам просто не повезло :)
В общем, 7 апреля сего года выложил я собственноручно написанный материал (статья идет ниже). Но вот вчера - 14 апреля - обнаружил, что и статьи уже в "песочнице" нет, и инвайта в "мыле" :) Видимо, пока не судьба.
Ну а чтобы статья не пропадала даром, решил поместить её в блог. Возможно, кому-то она пригодится.

воскресенье, 14 февраля 2010 г.

Добавляем счетчики от Google Analytics и LiveInternet.ru на блог, базирующийся на Blogspot.com

Каждый человек, заведший себе блог, хочет знать, пользуется ли его творчество популярностью, сколько человек заходит почитать его записи. Всё, что нужно для этого - просто установить счетчик, который бы показывал количество посещений для требуемого сайта. Итак, давайте добавим на наш блог, базирующийся на Blogspot.com, пару наиболее популярных счетчиков: один будет от Google Analytics, а другой - от LiveInternet.ru.

пятница, 12 февраля 2010 г.

Обработка выдачи wordstat.yandex.ru при помощи небольшого скрипта на Ruby

На днях столкнулся с небольшой проблемой по обработке выдачи сервиса Wordstat от Yandex. То есть, при простом копировании ключевых фраз по Ctrl+C - Ctrl+V мы имеет файл такого вида:
====
Ключевая фраза1 23434
Ключевая +фраза2 5435
...
====
В данном случае, нам необходимо избавиться от заключительных числовых значений (количество запросов данной ключевой фразы в месяц), а также заодно убрать из строчных значений ключевых фраз символ "+". Если бы строк в выдаче было не очень много, можно было бы обойтись и ручным трудом, но, в любом случае, каждый понимает, что ручной труд - это плохо и негодно :) В общем, будем это дело автоматизировать. Попробуем написать небольшой скрипт на Ruby.