2011-09-29

PCRE поддерживает Posix литералы

Я уже писал, что нужно сделать, чтобы заменить в коде Posix регулярные выражения, которые в PHP 5.3 стали deprecated, на Perl совместимые. Оказывается Rerl совместимые регулярные выражения поддерживают литералы используемые в Posix такие как [[:allnum:]], [[:space:]] и т.д. В одном месте чужёго кода заметил это, и вот дошли руки проверить на практике: конструкция вида preg_match('/[[:space:]]/','df d') работает идентично конструкции вида preg_match('/\s/','df d') т.е. совсем не нужно при замене ereg на preg_match заменять еще и литералы, достаточно добавить слева и справа слеши "/". Кстати кроме слешей можно использовать любой другой символ, например "#" это полезно когда в регулярном выражении уже есть слеши - чтобы их не экранировать и не ухудшать читаемость кода.

 

Оставить комментарий

 
  2011-09-28

Как вводить японские иероглифы в Ubuntu

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

Здесь подробно написано как установить IME на Ubuntu 10.04 - у меня прекравсно все встало с первого раза.

お疲れさまです。

 

Оставить комментарий

 
  2011-09-20

Пипец - бардак

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

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

Ювелирные изделия. В Турции нет своего золота — все золото для своих ювелирных украшения они покупают в Швейцарии.

Не могу сказать, что цены в Турции какие то очень низкие. Скорее, это у нас с России цены на кожу задраны до небес, как будто, корова - это наше священное животное и говядину мы не едим. У меня сложилось впечатление, что цены на кожу в Турции почти такие же как в Европе - т.е. в два три раза ниже, чем в России при более высоком качестве.

В Турции принято торговаться, причем искусство торговаться возведено в ранг искусства. Неискушенного человека в Турецких магазинах так грамотно разведут, что купив вещь в втридорога он уйдет счастлив, что разорил магазин. В торговых залах торгуют как правило женщины, но когда дело доходит до торговли обычно приглашаются продавцы мужчины. Цена на товарах пишется обычно в два три раза больше чем та цена с которой начинается торговля, причем без указания денежных единиц. Торговля начинается с более низкой цены, чем та что написана, типа, продавец по своей доброте сделал вам такую королевскую скидку. Потом, этот факт будет использоваться продавцом в последующей торговле, типа, он и так уже вам сделал королевский подарок снизив цену ниже всех мыслимых пределов. Думаю, эту цену смело можно снизить еще в два раза но у меня пока такое ни разу не получилось. Туристические гиды рекомендуют такой алгоритм: продавец называет цену, покупатель должен предложить цену в два раза ниже, после этого если продавец не снижает свою цену или предлагает новую цену недостаточно низкую нужно развернуться и сделать вид что ты уходишь. Слишком быстро уходить не следует — продавец назовет цену пониже, после этого покупатель должен назвать свою новую цену. Цикл повторяется до тех пор пока продавец и покупатель не придут к компромиссной цене.

P. S. спросите что за странный заголовок в этом посте? Это нам сегодня гид рассказала прикол. Стакан по-турецки "бардак", соломинка чтобы пить воду по-турецки - "пипет", поэтому если служащему отеля сказать "пипец бардак" то с большой долей вероятности вам принесут именно эти две вещи.

 

Оставить комментарий

 
  2011-09-18

Турция

Решил сделать себе и семье небольшой подарок - съездить отдохнуть на море. Для отдыха выбрали Турцию - как страну с минимальным уровнем цен и максимальным уровнем сервиса. Остановились в отеле Tekirova Corinthia.

Сам отель стоит в живописном месте на берегу средиземного моря. Территория довольно большая, много зелени. Растут апельсины, бананы, финики, много знакомых растений растущих у нас дома в горшках - фикус, алое, гибискус и еще много всего названия которого я не знаю.

Вода в Средиземном море солёная. Гораздо солонее чем, скажем, в Черном море. Средиземное море - третье по солености в мире - на втором стоит Красное море, на первом Мертвое море в Израиле.

Теперь Федя о главном. Интернет нормально работает только на ресепшене и возможно в номерах главного корпуса. На всей остальной территории отеля интернет вроде есть и вроде как соединяется но работать вряд ли получится. В нашем бунгало загрузка страницы занимает от тридцати секунд а посылка данных вообще занимает бесконечность.
Похоже не территории есть точки доступа, но только в прикрученных номерах. Я прошелся по территории отеля со смартфоном - есть с десяток точек доступа, похоже, все они стоят в VIP бунгало - до других бунгало вроде бы и добивают но очень нестабильно, местами.

В отеле полно русских, есть немцы, в основном пенсионеры, французы, видел несколько человек из Сербии. Люди все очень дружелюбные.

Персонал, в основном, понимает русский язык.

Номер. Номера в гостинице нескольких видов. У нас то, что называется Garten Room. Комната чистая. Насекомых не наблюдается. Телевизор показывает несколько русских каналов. Халатов в номере нет. Для тех кому нужны халаты их предлагается купить. Это первый пятизвездочный отель без халатов который я встретил, не знаю, это характерная для Турции особенность, или это только в этом отеле. Возможно в более дорогих номерах халаты все-таки есть.

Еда. Шведский стол практически круглые сутки. Столики не прикреплены к номеру. Вино в Турции так себе но не хуже чем в дешевых забегаловках в Саратове. Хуже чем в Европе. Пиво в Турции хорошее.

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

 

Коментариев: 3

 
  2011-09-15

Организация систем разграничения доступа на примере детских сказок

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

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

Али-Баба и сорок разбойников: Пещера Али-Бабы была защищена простым легкозапоминаемым паролем который передавался по незашифрованному каналу связи, доступному для прослушивания — чуть лучше, чем в сказке про красную шапочку, но не айс.

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

Три поросёнка - два сервера Ниф-Нифа и Нуф-Нуфа оказались никуда не годными - атаки типа brute-force легко сломали защиту серверов вместе с самими серверами. Защита Наф-Нафа оказалась спроектирована более грамотно - это пример того как нужно проектировать подобные системы.  Организована надежная система распознавания свой-чужой в виде дверного глазка. Кирпичные стены гарантируют надежную защиту от brute-force. Закрыты все возможные уязвимости - двери, окна. Единственное уязвимое место - труба оснащена системой предупреждения атак - поросята сразу услышали шум характерный для вторжения и приняли соответствующие меры - поставили в печь кастрюлю с кипятком.

Казалось бы ­— сказки, а какие полезные уроки можно из них извлечь!

 

Оставить комментарий

 
  2011-09-13

Развитие интерфейсов

Интересно, раньше, поставив Window XP я сначала убивал XP-шную тему, заменяя её классической NTшной, потом переключал красивое синее меню пуска на классиеский NT-шный вариант. И тогда на этой системе было можно работать.

Сегодня поставил на ноутбук распоследнюю Ubuntu 11.04 я первым делом преключился с этой пальцезаточенной нетбукоориентированной Unity на классическую Gnome, и вернул нормальное расположение кнопок закрытия окошек которые в Ubuntu слева в правый угол где им и полагается быть.

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

Но всё равно, ничего удобнее Linux на сегодняшний день для меня нет.

 

Коментариев: 1

 
  2011-09-03

Сравнение различных методов вызова функций в PHP

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

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

Для оценки скорости доступа к методам синглетона я сделал небольшой скрипт. Скрипт генерирует тестовые последовательности вызовов функций в различных вариантах - и сравнивает время вызовов этих последовательностей.

Вот исходный код скрипта.

Результат работы скрипта представлен в таблице ниже:

generation_time 11.7576429844
php_version 5.3.2-1ubuntu4.9
Case try 1 try 2 try 3 try 4 middle
Same plain function called 10000 times 0.0166 0.0187 0.0183 0.0135 0.0168
Different plain functions called 10000 times 0.0163 0.0221 0.018 0.0163 0.0182
Same static method 10000 times 0.0193 0.0265 0.0206 0.0194 0.0214
Different static methods called 10000 times 0.0221 0.0283 0.0229 0.0229 0.024
Static methods of different classes called 10000 times 0.0236 0.0279 0.0251 0.0242 0.0252
Same dynamic method called 10000 times 0.0166 0.0193 0.0169 0.0169 0.0174
Different class methods called 10000 times 0.02 0.02 0.0202 0.02 0.02
Singleton method called 10000 times 0.0403 0.0446 0.0409 0.041 0.0417
Different singletons called 10000 times 0.0562 0.0631 0.0548 0.0572 0.0578

В тестовом скрипте, я сравнил обычные PHP функции, статические методы класса, обычные методы и методы синглетона.

Результаты тестирования показали, что вызов методов синглетона, примерно в два - четыре раза медленнее, чем вызов обычных методов, что, в принципе, меня порадовало — я ожидал, что будет хуже.

При этом выяснилось несколько дополнительных вещей: cтатические вызовы функций объявленных без модификатора "static" примерно в два раза медленнее, чем с ним, cтатические методы немного медленнее, чем динамические.

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

 

Оставить комментарий

 
  2011-09-01

Еще один странный глюк в PHP

Два дня бился со странным глюком  - в скрипте в определенном месте отваливается соединение с базой данных - выдает "MySQL server is gone away". При этом отваливается всегда в одном и том же месте после куска кода с большим объемом вычислений, но без единого вызова базы данных. И только на сервере - на локальном компьютере всё тип-топ. Путем небольших, почти шаманских манипуляций с кодом удалось проблему купировать, правда неизвестно, где она может всплыть в дальнейшем. Налицо проблема в самом интерпретаторе PHP.

Upd: Нашел источник проблемы

Такое себе позволял только PHP4. Похоже, PHP5 вступил в ту стадию зрелости за которой уже наступает старческий маразм...

 

Коментариев: 3

 
  2011-08-26

I need money, not a job

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

С другой стороны, данные статистики говорят, что средняя зарплата по городу составляет десять тысяч рублей. У думающих людей это вызывает некий когнитивный диссонанс.

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

Занятно, что на людей которые более или менее имеют потенциал роста эти настроения влияют сильнее всего, они чувствуют, что что-то из себя представляют, это приводит к тому, что скорее всего они не пойдут работать на дядю - они чувствуют что есть другие способы получения денег. И в результате большинство оказывается выброшенными из нормального производственного процесса. С пивком у телевизора время пролетает веселее. Лишь единицы могут найти в себе силы начать что-либо делать.

Есть старомодное мнение, что чтобы стать классным специалистом - нужно развиваться, а как можно развиваться ни чем не занимаясь? Да, чтобы развиваться надо работать. Многие вчерашние студенты думают, что, чтобы добиться успеха нужно сразу начинать свое дело. Но успешно раскрутить своё дело получается у 0.00001 процента. Остальные промучившись год, два, так и не заработав ничего идут работать на дядю.

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

Надеюсь, все же, что ситуация не настолько плоха, скорее всего, просто толковые люди никогда не появляются на рынке труда - они как нейтрино — неуловимы и не заметны, делают своё дело и не высовываются, а работодатели, которым посчастливилось найти таких людей помалкивают - а то как конкуренты переманят.

 

Коментариев: 8

 
  2011-08-24

Как поставить dav_svn если у вас cpanel

Опять возникла необходимость сделать репозиторий с доступом через http на сервере с cpanel. Ранее я уже об этом уже писал, но половина ссылок в том посте на сегодняшний день уже не работают, поэтому пришлось восстанавливать инструкцию заново, наступая на те же грабли повторно. На этот раз пост без ссылок - просто инструкция шаг за шагом:

Скачиваеме исходники Subversion и распаковываем:

> wget http://subversion.tigris.org/downloads/subversion-1.6.17.tar.gz

> tar -xzf subversion-1.6.17.tar.gz

Скачиваем SQLite распаковываем и копируем в папку с Subversion:

> wget http://www.sqlite.org/sqlite-amalgamation-3.6.13.tar.gz

> tar -xzf sqlite-autoconf-3070701.tar.gz

> cp -r sqlite-3.6.13 subversion-1.6.17/sqlite-amalgamation

Теперь компилируем и устанавливаем:

> ./configure --with-ssl --with-apxs=/usr/local/apache/bin/apxs --with-apr=/usr/local/apache/bin/apr-config --with-apr-util=/home/cpeasyapache/src/httpd-2.0.63/srclib/apr-util

> make

> make install

Создаем репозиторий:

> mkdir /home/username/data

> mkdir /home/username/data/svn

> cd /home/username/data/svn

> svnadmin create --fs-type fsfs repo

Настраиваем конфигурационные файлы апача:

> vi /usr/local/apache/conf/userdata/std/2/username/svn.hostname.com/custom.conf

Содержимое файла:

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
<Location /svn>
        DAV svn
        SVNParentPath /home/svncleve/data/svn
        SVNListParentPath on
        SVNPathAuthz off
        AuthType Basic
        AuthName "Private SVN repositories"
        AuthUserFile /home/username/svn.passw
        Require valid-user
</Location>

Задаем пароль для пользователя SVN:

/usr/local/apache/bin/htpasswd  /home/svncleve/svn.passw svnuser

Проверяем конфигурацию сервера, пересобираем конфиги и рестаруем сервер:

/scripts/verify_vhost_includes

/scripts/rebuildhttpdconf

/scripts/restartsrv_httpd

Делаем чистый чекаут на локальной машине:

> svn checkout http://hostname.com/svn/repo .

Если svn update работает хорошо а svn commit выдает 403 ошибку то проверьте .htaccess в document root - cpanel по умолчанию пишет в .htaccess правила, ограничивающие использование методов PUT и DELETE - а именно они как раз и используются в WEBDAW через который работает Subversion. Несколько раз уже на это напарывался.

 

Оставить комментарий