воскресенье, 30 октября 2016 г.

PyCharm 2016.2.3 and Docker for Windows

I just spent a couple of days trying to configure PyCharm to use remote python interpreter in Docker container. Since then, as docker team released native Docker for Windows, all instructions on how to use python interpreter inside Docker container in PyCharm became useless.
On Windows there is no more VirtualBox machine with Docker API on 192.168.x.x:2376 and there is no more Certificates folder. Almost all conversations about this problem ended up with conclusion, that Docker for Windows now using named pipe npipe:////./pipe/docker_engine for its API, but Java client for Docker, which uses PyCharm, doesn't support Windows named pipes. So it seems that we have no choice, but to use different kinds of messy workarounds. But finally I found simple solution on docker forums: https://forums.docker.com/t/how-to-find-the-remote-api/20988?u=akinfold

Just use http://localhost:2375 as API URL in PyCharm and leave Certificates folder field blank. :)

среда, 13 марта 2013 г.

Install Psycopg2 to Virtualenv under Windows

Activate your vitualenv, and run:
easy_install http://www.stickpeople.com/projects/python/win-psycopg/2.4.6/psycopg2-2.4.6.win32-py2.7-pg9.2.2-release.exe
Psycopg2 precompiled Windows binaries: http://www.stickpeople.com/projects/python/win-psycopg/
Source: http://stackoverflow.com/a/5383266/1570936

воскресенье, 10 марта 2013 г.

Install Erlang on FreeBSD

$ fetch http://www.erlang.org/download/otp_src_R16B.tar.gz
$ gunzip -c otp_src_R16B.tar.gz | tar xf -
$ cd otp_src_R16B
$ ./configure --disable-hipe
$ gmake
# gmake install

Also I found (but doesn't try) interesting option to install Erlang https://github.com/spawngrid/kerl

суббота, 15 декабря 2012 г.

Install PIL on Windows

I'm tired to remember how to do it every time when I start new project. So here is how we doing.

Activate virtualenv:
> \Users\MyUser\.virtualenvs\myvirtualenv\Scripts\activate.bat

Building PIL C libraries from sources under Windows is rather painful, so we will install precompiled binaries, which can be found here:
> easy_install https://pypi.python.org/packages/2.7/P/Pillow/Pillow-2.0.0-py2.7-win32.egg

пятница, 14 декабря 2012 г.

DateTimeField doesn't accept ISO 8601 formatted date string



You can find roots of this problem here in django sources and here in python bugs.

You can even find some solutions for this problem which suggests you to append extended patterns (with %z key) to DATETIME_INPUT_FORMATS, but they doesn't work in most cases.

So here is my workaround to solve this problem: just install python-dateutil package and add to your settings.py following lines:

# Patch datetime field parser
from dateutil import parser
from django.forms import fields
fields.DateTimeField.strptime = lambda o, v, f: parser.parse(v)

суббота, 12 мая 2012 г.

Python UnicodeEncodeError: 'ascii' codec can't encode character

Я столкнулся с данной проблемой используя urllib.urlencode() для формирования POST запроса с юникодом внутри. Кто-то возможно сталкивался с этой ошибкой и при других обстоятельствах.

Проблема заключается в том, что urlencode применяет ко всем элементам передаваемого dict'а метод str() который и генерирует ошибку, когда ему пытаются скормить под видом строки не ASCII символы.

В Django проблема решается очень просто. Прежде чем отдавать параметры POST запроса в urlencode() нужно обработать их методом smart_str():

>>> import urllib
>>> from django.utils.encoding import smart_str
>>>
>>> data = {'name' : u'Иван'}
>>> data = smart_str(data)
>>> print urllib.urlencode(data)

Источники:

среда, 27 июля 2011 г.

Archos Internet Tablet. Установка Android Market

По следам предыдущей заметки про AppsLib.
Нашел лёгкий способ установки Android Market на Archos 101/70/43/32/28 Internet Tablet со всем вытекающим из этого профитом для владельца одного из перечисленных планшетов.


P.S.: Выбирать в Arctools пункт Default Apps & Market v2.2.7 вместо Default Apps & Market v3.0.26 не обязательно, у меня и с Default Apps & Market v3.0.26 всё работает.

Archos 43 Internet Tablet. Установка и обновление AppsLib

Появился сравнительно недавно у меня планшет под названием Archos 43 Internet Tablet - этакий смартфон без GPRS модуля. Аппарат имеет несколько неприятных ограничений от производителя, среди которых отсутствие Android Market, вместо которого по-умолчанию установлен AppsLib (жалкое подобие маркета с таким же жалким выбором), который при полном сбросе планшета куда-то пропадает. Чтобы вернуть AppsLib на место в своём Archos Internet Tablet нужно сделать следующее:
  1. Открыть браузер.
  2. Перейти по адресу: appslib.com/latest. Сразу начнётся загрузка приложения.
  3. Когда загрузка завершится, открыть статусбар и ткнуть по закачанному файлу.
  4. Далее, остаётся лишь следовать инструкциям установщика.

вторник, 26 июля 2011 г.

QIP. Отключение web-камеры

QIP 2012 не умеет адекватно обращаться с вэб-камерой, об этом уже много написано. Способа лечения данной проблемы 2:
  1. удалить QIP нафиг и забыть, как страшный сон;
  2. после каждого обновления QIP удалять из папки программы несколько папок и файл.
Первый способ не вариант (см. P.S.). Поэтому пользуюсь вторым. Однако заколебался я уже после каждого обновления этого чуда мучительно вспоминать, что там надо такое удалить, чтоб таки отучить QIP от камеры. В итоге накидал сегодня для себя небольшой батничек работающий исключительно под Windows 7 x64, если кто желает может переделать и поделиться универсальным батничком, а пока так:

C:
cd "C:\Program Files (x86)\QIP 2012"
rd /S /Q Protos\SIP
rd /S /Q Protos\XIMSS
del /F /Q Core\voip.dll

Ноги растут от сюда.

P.S.: QIP конечно отстой - хранит пароли от всех зарегистрированных в нём сервисов и т.п. Но пока не вижу альтернатив схожих по возможностям, а посему надо с ним как-то уживаться.

четверг, 14 июля 2011 г.

Порты необходимые для удалённого подключения VMware Remote Console

Для работы с виртуальными машинами развёрнутыми на удалённом сервере с помощью VMware Server 2 в firewall'е этого самого удалённого сервера надо открыть следующие порты:
  • 8222 -- http соединения (пока не понял для чего, ибо по http так ни разу и не довелось подключиться, но при установке VMware Server 2 просит этот порт).
  • 8333 -- https соединения. Через этот порт в основном и происходит всё взаимодействие с VMware Server 2.
  • 902 -- порт необходим для общения VMware Remote Console с VMware Server 2. Без него будет работать VMware Infrastructure Web Access, но достучаться до консолей виртуальных машин вы не сможете.

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

Отключение встроенного DHCP сервер в Virtual PC

На днях создал себе на Virtual PC небольшую виртуальную сеть из контроллера домена (dc) и двух рабочих станций (pc1 и pc2). На всех виртуальных машинах был настроен тип сети Внутренняя сеть. Естественно при такой организации все машины получали IP-шники вида 169.254.x.x.

После настройки на контроллере домена статических настроек соединения и поднятия DHCP, обнаружилась неприятная неожиданность: рабочие станции продолжили получать IP-шники вида 169.254.x.x, не смотря ни на что. Более того, клиентские машины утверждали, что они получили эти IP-шники от DHCP.
Как выяснилось, в режиме Внутренней сети Virtual PC включает встроенный DHCP сервер и раздаёт с него настройки сети с IP адресами вида 169.254.x.x. Встроенный DHCP сервер Virtual PC отвечает на запросы клиентских машин быстрее виртуального DHCP на контроллере домена.
Раскопки показали, что проблема со встроенным DHCP Virtual PC решается правкой конфигурационного файла Virtual PC Options.xml, расположенного в %LocalAppData%\Microsoft\Windows Virtual PC\. В этом файле есть секция preferences/virtual_network/virtual_server/dhcp, отвечающая за параметры встроенного DHCP и позволяющая его отключить установив параметр enabled равным false. После чего следует перезапустить виртуальные машины и радоваться корректной работе виртуальной сети.

воскресенье, 28 ноября 2010 г.

Как загрузить mp3 на HDD Sony Playstation 3

  1. Берём флэшку.
  2. Форматируем в FAT32 (если она в чём другом).
  3. Заливаем на неё музыку.
  4. Втыкаем флэшку в Sony Playstation 3.
  5. Идём на Playstation 3 в раздел "Музыка" выбираем в нём флэшку.
  6. Жмём "треугольник" на джойстике.
  7. В появившемся меню выбираем "Показать всё" и жмём "крестик" для принятия.
  8. Снова выбираем в разделе "Музыка" флэшку и жмём "крестик" - видим содержимое флэшки.
  9. Выбираем файл/папку которые нужно скопировать на жесткий диск Playstation 3 и жмём "треугольник" на джойстике.
  10. В открывшемся меню выбираем "Копировать" и жмём "крестик" для принятия.
  11. Ждём пока указанное содержимое флэшки скопируется на жесткий диск Playstation 3.

суббота, 3 апреля 2010 г.

Connecting Nokia BH-503 to Windows 7 via Asus USB-BT21

Давненько не писал в блог, всё дела, дела... Но сегодня появилась кое какая информация, которую хотелось бы увековечить в блоге, дабы в последствии не забыть.
Сразу к делу (о том, как всё это началось и о том какие всё таки чудесные аппараты делают финны в Китае как нибудь в другой раз).
Итак, имеем ноутбук без встроенного Bluetooth, блютуз адаптер Asus USB-BT21 (маленький такой удобный, почти не торчащий из корпуса ноута) и гранитуру Nokia BH-503.
Для того чтобы подключить блютуз гарнитуру Nokia BH-503 к ноутбуку/pc под Windows 7 через Bluetooth адаптер Asus USB-BT21 делаемследующее:
  1. Втыкаем в ноутбук BT21 и дожидаемся сообщения о том, что устройство установлено и готово к использованию.
  2. Отправляемся на сайт компании Broadcom -- производителя чипа на котором сделан наш Asus USB-BT21.
  3. На открывшейся страничке жмём кнопочку Download Now.
  4. На следующей страничке сайта соглашаемся с лицензионным соглашением, нажав кнопочку Accept.
  5. Сохраняем предложенный для загрузки файл, например, на рабочий стол.
  6. Запускаем скачанный файл и устанавливаем драйвер.
  7. После установки драйвера идём в Панель управления -> Оборудование и звук -> Диспетчер устройств.
  8. В Диспетчере устройств раскрываем пункт Радиомодули Bluetooth, выбираем подпункт Generic Bluetooth Adapter и заходим в его свойства.
  9. В свойствах переходим на вкладку Драйвер и нажимамем кнопку Обновить...
  10. В появившемся окне выбираем пункт Выполнить поиск драйверов на этом компьютере.
  11. Далее выбираем пункт Выбрать драйвер из списка уже установленных драйверов.
  12. В появившемся окне убираем галочку Только совместимые устройства.
  13. Теперь в левом списке под заголовком Изготовитель выбираем пункт Broadcom.
  14. Далее в правом списке выбираем пункт Broadcom 2046 Bluetooth 2.1 + ERD USB Device и устанавливаем этот драйвер несмотря на предупреждения Windows.
  15. После установки драйвера перезагружаемся для пущей надёжности.
  16. Теперь можно приступить к подключению гарнитурки! :)
  17. Отправляемся в Панель управления -> Оборудование и звук -> Добавление устройства Bluetooth.
  18. На гарнитуре Nokia BH-503 зажимаем т.н. Многофункциональную клавишу (проще говоря, кнопку с нарисованной телефонной трубкой) и держим до тех пор, пока индикатор не начнёт часто мигать синим (держать придётся долго, за это время гарнитура обычно успевает ещё раза два моргнуть зелёным).
  19. Теперь ждём пока Windows обнаружит нашу гарнитуру.
  20. После того, как гарнитура будет обнаружена, подключите и дождитесь сообщения о том, что устройство подключено и готово к использованию.
  21. Затем перезагружаемся не выключая ни блютуз ни гарнитуру.
  22. После перезагрузки Windows автоматически подключится к гарнитуре, если вы её не выключили, и начнёт передавать звук на неё.

вторник, 20 октября 2009 г.

.NET Label with transparent background

Чтобы организовать средствами .NET Framework такое чудо современных технологий разработки GUI, как текстовое поле с прозрачным фоном размещённое поверх какой-то картинки в Win Forms нужно:
  1. Разместить на форме компонент Panel, задав в качестве свойства BackgroundImage желаемую картинку.
  2. Затем поместить на этот Panel новый Label и задать в качестве параметра BackColor значение Transparent.
Если же, по каким-то причинам использовать Panel с размещённым на нём Label вам не с руки, то можно использовать для этих целей компонент PictureBox (MyPicture) с нужной картинкой и расположенный поверх него Label со значением свойства BackColor равным Transparent и свойством Parent программно установленным в значение MyPicture (Label1.Parent = MyPicture;).

вторник, 22 сентября 2009 г.

Links: Trac & Apache with Open SSL on Windows

http://r3code.livejournal.com/77730.html - Немного уже устаревший, но всё ещё очень полезный материал годовой давности по настройке Trac 0.11.1 + Python 2.5 + Apache 2.0.x + Subversion 1.5.2 под Windows.

http://www.neilstuff.com/apache/apache2-ssl-windows.htm - Хорошая How-to-шка по настройке Apache + Open SSL.

http://vingrad.ru/blogs/Bishop/2009/07/19/ustanovka-trac-pod-windows/ - Тоже хорошая How-to-шка по установке Trac под Windows, но без Apache и Open SSL.

http://stackoverflow.com/questions/309412/how-to-setup-setuptools-for-python-2-6-on-windows - setuptools под Python 2.6.

http://badwords.org/w/Compile_mod_python_for_Python_2.6 - Компиляция mod_python.so для Apache под Python 2.6. С этим делом у меня так ничего и не получилось, ибо исходники mod_python из релиза компилиться отказались, вывалив мне 2 какието ошибки во время компиляции, а до репозитория я достучаться так и не смог.

Из личного опыта
Процесс установки из статьи r3code, в принципе, очень прост, не занимает много времени и сил. Проблемы начинаются, когда хочется отойти от инструкций и поставить версию софта посовременне и сделать что нибудь, чего r3code не описал. С Apache 2.2 проблем никаких не возникло. При попытке настроить SSL шифрование только в директории /svn/ на одном из виртуальных хостов своего Apache пришлось долго и упорно плясать с бубном по причине отсутствия опыта и понимания опций конфига Open SSL. Далее мне приспичило вместо Python 2.5, как в статье, поставить Python 2.6. В итоге убил не один час на разбор вопроса "где взять setuptools для питона 2.6 под винду?" и попытки откомпилить mod_python.so для Apache под всё тот же Python 2.6. Провозившись с питоном 2.6 несколько часов, плюнул и установил 2.5.
P.S.: На этом процесс поднятия Trac пока застопорился по причине моей занятости на другом проекте. Позже отпишу, как прошли остальные этапы установки.

Update
http://trac.edgewall.org/wiki/CookBook/Installation/TracOnWindowsWithAccountManager - Пошаговая инструкция по установке Trac под Windows (Eng).

среда, 19 августа 2009 г.

Last.fm recently played list by XternalX Userbars

Итак, наконец-то мой друг Виктор XternalX выпустил первую бета версию своих динамических юзербаров, с чем я его от всей души и поздравляю! :) И в этом блогпосте я постараюсь описать процесс создания юзербара отображающего списко последних пяти прослушанных мной на Last.FM композиций. Надо сказать, что родной сервис юзербаров от last.fm работает, мягко говоря, не корректно, поэтому сервис динамических юзербаров XternalX Userbars тут оказался, как нельзя кстати.

Last.FM XternalX Userbar

Первое, что мы делаем, регистрируем себе новый аккаунт в XternalX Userbars. Форма регистрации находится здесь. После чего войдя в XternalX Userbars под только что созданной учётной записью, мы попадаем в редактор юзербаров (Рис. 1).

Рис. 1 Панель управления XternalX Userbars


Не вдаваясь в подробности описания интерфейса, опишу непосредственно сам процесс создания моего юзербарчика.
Для начала, нам необходимо зайти в "Файловый менеджер" (Рис. 2) и выбрать там основу (или фон) нашего юзербара.

Рис. 2 Файловый менеджер

В файловом менеджере уже есть несколько картинок, которые можно использовать в качестве фона, но мы загрузим свою картинку. Для этого внизу окна файлового менеджера щёлкнем ссылку "Загрузить файл". Откроется диалог изображенный на рисунке 3.

Рис. 3 Диалог загрузки фона юзербара

Нажмём кнопку "Обзор..." и выберем нужный нам фон, в моём случае -- это давно заготовленная картинка, которую я безуспешно пытался, в своё время, скормить сервису юзербаров last.fm. Учтите, что картинка обязательно должна быть в формате PNG!
Теперь понравившийся нам фон выбран, жмём ссылку "Загрузить" внизу диалога загрузки фонового изображения. После загрузки мы снова окажемся в Файловом менеджере. Не спешите искать в списке файлов, только что загруженный нами, его там нет (бета версия как ни как ;)). Необходимо закрыть файловый менеджер, щелчком по крестику в его верхнем правом углу, и открыть его снова. Теперь список файлов в файловом менеджере обновился и мы можем спокойно найти только что загруженный нами файл и выбрать его (Рис. 4).

Рис. 4 Предпросмотр выбранного в файловом менеджере изображения

Теперь закрываем файловый менеджер (да-да, я не опечатался, именно закрываем). И в панели управления XternalX Userbars щёлкаем плюсик справа от поля "Основа юзербара". Теперь в текстовом поле "Основа юзербара" образовалось название только что загруженного нами файла. Для того, чтобы выбранный нами фон отобразился в предпросмотре юзербара нажмём кнопочку "Сохранить" внизу панели упарвления XternalX Userbars. Результат на рисунке 5.

Рис. 5 Предпросмотр юзербара

Теперь включим необходимые нам плагины. Для этого заходим в "Расширения" и приводим там всё в соответствие с рисунком 6.

Рис. 6 Менеджер расширений XternalX Userbars

Затем щёлкаем по гаечному ключу справа от расширения "Last.FM Track Feed" и настраиваем его (Рис. 7). В поле "Введите URL до Вашей RSS Ленты" вводим следующий адрес: http://ws.audioscrobbler.com/1.0/user/Akinfold/recenttracks.rss естественно, заменяя имя пользователя last.fm на своё. В поле "Формат даты и времени" вводим "H:i". И нажимаем "Сохранить".

Рис. 7 Настройки Last.FM Track Feed


Закрываем диалог менеджера расширений и теперь приступаем к написанию кода нашего юзербара. В листинге 1 приведён весь код, который я разберу подробно далее.

Листинг 1.
str(100,12,7,0,arial,000000,lastfm(1,date))
str(130,7,12,0,arial,000000,lastFm(1,title))

str(100,24,7,0,arial,666666,lastfm(2,date))
str(130,23,8,0,arial,666666,lastFm(2,title))

str(100,36,7,0,arial,666666,lastfm(3,date))
str(130,35,8,0,arial,666666,lastFm(3,title))

str(100,48,7,0,arial,666666,lastfm(4,date))
str(130,47,8,0,arial,666666,lastFm(4,title))

str(100,60,7,0,arial,666666,lastfm(5,date))
str(130,59,8,0,arial,666666,lastFm(5,title))
Как мы видим, код юзербара разбит на 5 однотипных блоков. Каждый блок кода отвечает за вывод одной строки формата <время> <композиция>. Каждый такой блок состоит из двух вызовов функции str, которая отвечает за вывод текста в XternalX Userbars. Эта функция принимает 7 параметров:
  1. Горизонтальное положение левой границы надписи относительно левого края юзербара. Или, проще говоря, координата текста по оси X.
  2. Вертикальное положение верхней границы надписи относительно верхнего края юзербара. Или, проще говоря, координата надписи по оси Y.
  3. Размер шрифта в пикселях.
  4. Угол поворота текста.
  5. Шрифт, которым будет отрисовываться текст на юзербаре.
  6. Цвет шрифта.
  7. Текст. В нашем случае текст возвращает функция lastFm речь о которой пойдёт далее.
Таким образом, каждая первая строка блока отображает время, когда была прослушана композиция, а каждая вторая строка отвечает за отображение названия и автора композиции. В нашем примере для вывода информации о композициях мы используем функцию lastfm, которая принимает два параметра:
  1. Номер композиции в списке недавно прослушанных композиций. Последняя прослушанная композиция имеет номер 1, прослушанная до неё композиция имеет номер 2 и так далее.
  2. Ключевое слово, сообщающее функции, какую информацию о композиции выводить. В нашем случае мы выводим время прослушивания композиции (ключевое слово date) и название композиции (ключевое слово title).
Ну вот, наконец-то всё готово и мы жмём ссылку "Сохранить" внизу панели управления XternalX Userbars. Теперь результат наших трудов отображается в предпросмотре юзербара (Рис. 8).

Рис. 8 Юзербар готов к употреблению

Теперь смело копируем ссылку на наш юзербар из поля "Ссылка на Ваш юзербар" и вставляем в подпись на форумах, в блогах и т.д. и т.п. кому на что фантазии хватит. ;)

Форум XternalX Userbars.

пятница, 14 августа 2009 г.

Google Sync, а счастье было так близко, казалось рукой подать...

... ан нет! Оказалось не всё так просто.

Google Sync -- это новый, хотя уже и не особо, сервис от google inc. Идея сервиса заключается в глобальной синхронизации контактов, календарей, почтовых ящиков и т.д. и т.п. на мобильных девайсах с гуглесервисами. На данный момент синхронизируются только контакты и календарь. Синхронизация происходит с помощью протокола Microsoft® Exchange ActiveSync®, поэтому google настоятельно рекомендует для синхронизации использовать спец. софтину Nokia Mail for Exchange. Хотя в интернете мелькают инструкции по настройке синхронизации и без неё (но у меня сей вариант не прошёл).

Скачав и установив на свой Nokia 3250 спец. софтину, я бэкапнул все настройки телефона с помощью Nokia PC Suite и полез в инструкцию по установке Google Sync. Первое и единственное на чём я споткнулся, было поле "Домен", которое по инструкции следовало бы оставить пустым, но mail for exchange категорически отказалась принимать настройки с пустым полем "Домен", пришлось написать там "m.google.com", не знаю на сколько это решение было верно, ибо после первого же запуска, залез в настройки и опустошил это поле, как того требует инструкция. В принципе, установка и настройка потребовали минимум времени и прошли легко и не принуждённо.

Далее, причесав контакты в Gmail аккаунте, я попытался синхронизировать контакты gmail'а и телефона. Залез в "Мои приложения", запустил Mail for Exchange, и начал синхронизацию. Порадовало, что и этот процесс прошел без малейших осложнений. Софтина аккуратно в течении всего процесса синхронизации показывала сколько записей она обновила и где, хотя вполне можно было и не следить за этим, закрыв приложение.

Собственно вот тут то, сразу после синхронизации, меня и ждало первое и последнее разочарование. Оказалось, что гугыль не понимает русских ФИО и пытается "колбасить" все контакты на буржуйский лад (ИФ). В итоге я получил телефонную книжку телефона полную всяких Ивановичей Ивановых, Сидоровичей Сидоровых и Петровичей Петровых. Первой мыслью было причесать контакты в gmail на буржуйский лад. Сделал. Синхронизировал всё. Получил полную записную книжку почти нормальных записей, благо кроме ФИО ни с чем больше проблем не возникло, все остальные поля синхронизируются великолепно. Однако gmail решил не передавать на телефон отчества контактов. Сначала я решил, что с этим минусом, скрепя сердце, ещё как то можно ужиться, но вскоре пришло понимание и второго минуса. Заключался он в том, что теперь все мои контакты в gmail оказались отсортированы не по фамилии, а по имени. В итоге у меня получилась две какие-то дефективные синхронизированные запсиные книжки. В одной нет отчеств контактов (зато картинки были аккуратненько выкачаны из гмэйла и установлены на контакты в телефоне), по другой не возможно никого найти. Потом выискался ещё один минус, gmail не понимает группы контактов со смарта, а последний, в свою очередь, не хочет понимать группы gmail'овских контактов.

Итог. После экспериментов с контактами, пробовать тоже самое и на календаре желание как-то само собой отпало. Удалил с телефона Nokia Mail for Exchange и решил на полгодика-годик забыть о тотальной синхронизации девайсов, а там поглядим...

вторник, 11 августа 2009 г.

Следование стандартам...

Так сложилось, что вот уже несколько месяцев занимаюсь программированием на PHP, пишу свои классы и модули, попутно ковыряя чужие, верстаю и т.д. и т.п. И за всё это время я не видил НИ ОДНОГО продукта (естественно опенсорс) полностью соответствующего стандартам W3C и парадигмам ООП. Интересно, почему разработчики столь наплевательски относятся к стандартам, по сути писавшимся для них, дабы облегчить их нелёгкий труд?

С ООП всё, более или менее, понятно. PHP изначально был процедурным языком и ни о каком ООП в нём речи не шло. Да и сейчас в версии 5.1 часть парадигм ООП не полностью поддерживается или поддерживается с помощью всевозможных "костылей" выдаваемых за преимущества PHP.
Например в PHP нет т.н. акцессоров и мутаторов, точнее они "как бы" есть, предлагается пользоваться следующей конструкцией:
<?php
class MyClass {
private $properties;
function __set($name, $value) {
echo "задание нового свойства $name = $value";
$this->properties[$name]=$value;
}
function __get($name) {
echo "чтение значения свойства ", $name;
return $this->properties[$name];
}
}
$obj = new MyClass;
$obj->property = 1; // Выводит "задание нового свойства property=1"
$a = $obj->property; // Выводит "чтение значения свойства property"
echo $a; // выводит 1;
?>

Таким методом конечно можно обрабатывать изменения свойств объектов, но для того чтобы заставить класс принимать только нужные (запланированные) параметры придётся писать switch и в нём проверять имена указываемых пользователем параметров, что не слишком то удобно.

А вот со стандартами косорциума W3C всё не так просто. По какой то не ведомой мне причине практически все разработчики плюют на эти стандарты и воротят ТАКОЕ, что хватаешься за голову.
Вроде бы HTML все в школе/техникуме/институте изучают, да и W3C на месте не сидит, создавая для разработчиков всякие валидаторы, обнаруживающие ошибки в гипертексте странички и подробно разбирая каждую в соответствии со стандартом. В инете полно русско-язычных (и не только русско) ресурсов с подробным объяснением всех этих стандартов. И тем не менее разработчики продолжают испытывать браузеры на прочность своим бредом в гипертексте и жабаскрипте. Просто ради интереса зайдите вот сюда -> http://validator.w3.org/check?uri=http%3A%2F%2Fwww.lastfm.ru%2F&charset=%28detect+automatically%29&doctype=Inline&group=0&user-agent=W3C_Validator%2F1.654 и обалдейте от количества ошибок и варнингов найденных валидатором в коде странички (страничка подвернулась случайно, просто этот сайт упорно отказывается у меня работать под оперой уже в течении двух его версий).
А вот и тест любимого ВКонтакта -> http://validator.w3.org/check?uri=http%3A%2F%2Fvkontakte.ru&charset=%28detect+automatically%29&doctype=Inline&group=0
Причём заметьте, и тот и другой -- являются коммерческими проектами. Про не коммерческий код я вообще молчу...

SEF Service Map & UTF-8 encoded URLs

SEF Service Map это компонент, перед которым стоит задача создания полной карты сайта.
Кроме того компонент совместим со всеми стандартными расширениями Joomla! (статьи, RSS ленты, ссылки, контакты и т.д.),
SEF Service Map является открытым компонентом - это позволяет интегрировать его с другими компонентами,
такими как галереи, форумы, каталоги и другие, благодаря встроенным механизмам интеграции!

SEF Service Map создает не только карту сайта, но и карту совместимую со стандартом sitemaps.org :
- XML карта (например: для Google)
- TXT карта (например: для Yahoo)

Но эта зараза на отрез отказывается работать совместно с русскоязычными UTF-8 урликами вида: http://some.site/Новости/Новости-сайта/Превеееед-медвед.html
Точнее работать то она с ними работает и даже HTML-карту генерирует валидную, а вот с XML- и TXT- картами проблема. Все красивые русские урлики в них выглядят примерно так: http://some.site/Ð�овоÑ�ти/Ð�овоÑ�ти-Ñ�айта/

Порывшись в коде нашёл проблему. Разработчики при генерации XML- и TXT- карт выполняют перекодировку линка на статью в UTF-8. Вобщем проблема решается таким образом:
  1. Открываем файлик /components/com_sefservicemap/sefservicemap.html.php
  2. Закомменчиваем или удаляем все вхождения строки "$link = utf8_encode($link);" (их 2)
  3. Радуемся жизни... ;)

суббота, 8 августа 2009 г.

Автопрокрутка многострочного Textbox из .NET Framework

Понадобилось сегодня сделать автопрокрутку лога приложения, нашёл для себя два способа реализовать задуманное.
Первый и, пожалуй, самый простой способ:
Устанавливать, например в обработчике события TextChanged, позицию начала выделения текста равной длине текста в textbox'е и, затем, перематывать scrollbar textbox'а до текущей позиции каретки.
private void tbLog_TextChanged(object sender, EventArgs e)
{
this.tbLog.SelectionStart = this.tbLog.TextLength;
this.tbLog.ScrollToCaret();
}

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

Второй способ немного интереснее и лишён вышеописанного недостатка, хотя и немного сложнее:
Посылать textbox'у, например всё в томже обработчике события TextChanged, сообщение WM_VSCROLL.
private const int WM_VSCROLL = 0x115;
private const int SB_BOTTOM = 7;

[DllImport("user32.dll", CharSet=CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

private void tbLog_TextChanged(object sender, EventArgs e)
{
SendMessage(this.tbLog.Handle, WM_VSCROLL, (IntPtr) SB_BOTTOM, IntPtr.Zero);
}