Новогодний выпуск Большой разницы с пародией на Макса +100500
Большая разница, здоровенная разница, ребята!
Tomcat – java.lang.OutOfMemoryError: PermGen space
При работе с Томкатом не хватило памяти. Исправляется добавлением в переменную окружения JAVA_OPTS следующих данных: -XX:PermSize=256m -XX:MaxPermSize=256m
Конференция «Zend Framework Day» пройдёт в Киеве 12 ноября 2011
12 ноября, в Киеве, пройдет конференция «Zend Framework Day» — посвященная популярному PHP фреймворку Zend Framework. Среди докладчиков непосредственные разработчики компонент Zend Framework. Событие соберет лучших PHP и Zend Framework специалистов из Украины, России, Белоруссии и других стран СНГ.
С текущим списком тем и докладчиков можно ознакомиться на странице.
Событие будет интересно не только тем, кто использует Zend Framework, но и всем веб-разработчикам и PHP программистам в частности.
Место проведения — отель «Казацкий», г. Киев, ул. Михайловская 1/3 (Площадь Независимости).
Со стоимостю участия и другой необходимой информацией вы можете ознакомиться на странице.
Для участия в конференции необходимо пройти регистрацию на странице, а затем произвести оплату из личного кабинета.
Сайт конференции — http://frameworksdays.com/event/zend-framework-day-2011
Новости в twitter — http://twitter.com/fwdays
Страница в facebook – http://facebook.com/fwdays
С чего бы MySQL server has gone away?
Пытался импортировать дамп базы данных на свой MySQL сервер, но никак не получалось, на многих записях сервер сообщал следующее: MySQL server has gone away. Сообщение забавное, но в чём же проблема, почему некоторые жирные insert-ы не проходили.
Не проходили пакеты. В my.ini прописал:
max_allowed_packet = 200M
Всё заработало.
Установка Symfony 2.0 на ZendServer
Из заголовка покажется идея бредовой, но устанавливать отдельный сервер ради другого проекта показалось роскошью. Работаю всегда с ZendFramework на ZendServer, но новые веяния заставляют изучать и рассматривать всё более новые решения и фреймворки. Так возникла необходимость установить Symfony 2.0, и главные грабли оказались в APC (Alternative PHP Cache).
Symfony 2 ругается при первом запуске проверки требований
http://localhost/Symfony/web/config.php
на устаревшую версию APC и просит поставить версию выше чем 3.0.7.
Через Zend Controller видно что подключен APC модуль, но его не видно в php.ini. При попытке отключить его через веб-интерфейс, он оставляет его включенным. Странное поведение модуля. Отключить его через веб-интерфейс не реально, он пишет Built-in (вроде как встроен).
Если вручную дописать в php.ini:
extension=php_apc.dll
то всё равно ничего не произойдёт, ZendServer проигнорирует его и даже не ругнётся ошибками. Symfony с тем же упорством требует обновлённый APC.
Проблема крылась в том, что ZendServer имеет целую кучу конфигурационных ini-файлов и находится рядом с php.ini файлом такой файл: datacache.ini.
В файле datacache.ini меняем в ноль значение совместимости с APC:
; When enabled, the Data Cache extension registers APC compatibility methods
zend_datacache.apc_compatibility=0
Далее уже когда ZendServer не видит своего встроенного APC, он подхватывает в php.ini наше дополнение:
extension=php_apc.dll
ZendServer использует PHP скомпилированный на VC9, потому модуль должен быть из его семейства.
http://downloads.php.net/pierre/php_apc-20110109-5.3-nts-vc9-x86.zip
Мультиязыковая поддержка на сайте при помощи Zend_Translate
Чаще всего в интернете сталкивался с решениями для разных языков на сайтах опираясь на URL.
Типа: http://sitename/en/index где язык (en) включался переменной из URL.
Но в моём случае я хочу хранить язык в сессии и не пропечатывать его в URL, так как все страницы мультиязычные в единственном экземпляре и в зависимости от контента меняется язык интерфейса. Пока это лишь Ru и En.
В bootstrap.php прописываю инициализацию переводов:
protected function _initTranslate() { //получаю из папки /application/languages языки en, потом ru. Беру их из массива. $tr = new Zend_Translate('array', APPLICATION_PATH . '/languages/en.php', 'en'); //$tr = new Zend_Translate('gettext', APPLICATION_PATH . '/languages/ru.mo', 'ru'); //под этим комментарием скрыт способ получения локализаций из gettext-овых файлов, тоже работает, но мне пока удобно было хранить в массиве, пока мало текста. Если будет кому интересно, про gettext расскажу в следующей заметке о Zend_Translate. $tr->addTranslation(APPLICATION_PATH . '/languages/ru.php', 'ru'); //создадим сессию и запишем текущий язык в неё $session = new Zend_Session_Namespace('session'); $langLocale = isset($session->lang) ? $session->lang : new Zend_Locale('en_US'); //пишем в регистр для дальнейшего использования в коде Zend_Registry::set('Zend_Locale', new Zend_Locale($langLocale)); Zend_Registry::set('Zend_Translate', $tr); Zend_Registry::set('Zend_Session_Namespace', $session); } |
Потом в сам контроллер пишу оно IndexController.php:
class IndexController extends Zend_Controller_Action { public function indexAction() { $session = Zend_Registry::get('Zend_Session_Namespace'); $langDefault = $session->lang; //get language from session $tr = Zend_Registry::get('Zend_Translate'); $tr->setLocale($langDefault); $this->view->title = $this->view->translate("Title"); $this->view->header = $this->view->translate("Header"); } } |
и в темлейте (index.phtml) спокойно выводим:
<h1><?=$this->view->title?></h1> |
Выводит на выбранном в сессии языке при условии что файлы в папке language: en.php и ru.php выглядят так:
<?php return array( "Title"=>"Title", "Header"=>"Header" );?> |
и так:
<?php return array( "Title"=>"Название", "Header"=>"Заголовок" );?> |
Если перевод разрастётся, применю gettext с программулиной POEDIT для редактирования файлов локализации.
Чистка в Мазурино
В парке Мазурино проведена акция «чистый лес», организованная группой «чистильщиков».
Добровольцами был предоставлен транспорт для вывоза. С каждым разом, мы находим мусора всё больше и больше.
Включаем в PHPWord (Cyrillic) Кириллицу
Завсегда пользовался этой прелестной библиотекой (PHPWord), но в основном для англоязычных проектов, и был сокрушён горем, когда попытался сохранить русский текст в .docx файле.
Пол дня потратил на анализ библиотеки, но не сразу понял, что они дважды делают utf8_encode(), благодаря чему текст нечитаем и было не ясно в какую кодировку конвертировать.
Поиски причины
Спасла команда: mb_detect_encoding($string);
Я вставил $string в проверку кодировки.
Затем сделал
$string = utf8_decode($string);
и ещё раз проверил,
echo mb_detect_encoding($string);
После раскодирования utf8, $string оставался всё равно в кодировке UTF-8.
Раскодировав второй раз, уже виднелась голая ASCII.
Решение
Находим файл PHPWord/Section.php и закомментируем все строчки, в которых есть utf8_encode(). Какой смысл что-то кодировать в UTF-8, если данные сразу приходят в UTF-8. Обращаем лишь внимание на строчку с переменной $givenText; Её комментировать не нужно. Можно прописать только $givenText = $text;
По итогу получается файлик:
<?php /** * PHPWord * * Copyright (c) 2011 PHPWord * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * @category PHPWord * @package PHPWord * @copyright Copyright (c) 010 PHPWord * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL * @version Beta 0.6.3, 08.07.2011 */ /** * PHPWord_Section * * @category PHPWord * @package PHPWord_Section * @copyright Copyright (c) 2011 PHPWord */ class PHPWord_Section { /** * Section count * * @var int */ private $_sectionCount; /** * Section settings * * @var PHPWord_Section_Settings */ private $_settings; /** * Section Element Collection * * @var array */ private $_elementCollection = array(); /** * Section Header * * @var PHPWord_Section_Header */ private $_header = null; /** * Section Footer * * @var PHPWord_Section_Footer */ private $_footer = null; /** * Create a new Section * * @param int $sectionCount * @param mixed $settings */ public function __construct($sectionCount, $settings = null) { $this->_sectionCount = $sectionCount; $this->_settings = new PHPWord_Section_Settings(); if (!is_null($settings) && is_array($settings)) { foreach ($settings as $key => $value) { if (substr($key, 0, 1) != '_') { $key = '_' . $key; } $this->_settings->setSettingValue($key, $value); } } } /** * Get Section Settings * * @return PHPWord_Section_Settings */ public function getSettings() { return $this->_settings; } /** * Add a Text Element * * @param string $text * @param mixed $styleFont * @param mixed $styleParagraph * @return PHPWord_Section_Text */ public function addText($text, $styleFont = null, $styleParagraph = null) { $givenText = $text; //$givenText = utf8_encode($text); $text = new PHPWord_Section_Text($givenText, $styleFont, $styleParagraph); $this->_elementCollection[] = $text; return $text; } /** * Add a Link Element * * @param string $linkSrc * @param string $linkName * @param mixed $styleFont * @param mixed $styleParagraph * @return PHPWord_Section_Link */ public function addLink($linkSrc, $linkName = null, $styleFont = null, $styleParagraph = null) { //$linkSrc = utf8_encode($linkSrc); if (!is_null($linkName)) { //$linkName = utf8_encode($linkName); } $link = new PHPWord_Section_Link($linkSrc, $linkName, $styleFont, $styleParagraph); $rID = PHPWord_Media::addSectionLinkElement($linkSrc); $link->setRelationId($rID); $this->_elementCollection[] = $link; return $link; } /** * Add a TextBreak Element * * @param int $count */ public function addTextBreak($count = 1) { for ($i = 1; $i <= $count; $i++) { $this->_elementCollection[] = new PHPWord_Section_TextBreak(); } } /** * Add a PageBreak Element */ public function addPageBreak() { $this->_elementCollection[] = new PHPWord_Section_PageBreak(); } /** * Add a Table Element * * @param mixed $style * @return PHPWord_Section_Table */ public function addTable($style = null) { $table = new PHPWord_Section_Table('section', $this->_sectionCount, $style); $this->_elementCollection[] = $table; return $table; } /** * Add a ListItem Element * * @param string $text * @param int $depth * @param mixed $styleFont * @param mixed $styleList * @param mixed $styleParagraph * @return PHPWord_Section_ListItem */ public function addListItem($text, $depth = 0, $styleFont = null, $styleList = null, $styleParagraph = null) { //$text = utf8_encode($text); $listItem = new PHPWord_Section_ListItem($text, $depth, $styleFont, $styleList, $styleParagraph); $this->_elementCollection[] = $listItem; return $listItem; } /** * Add a OLE-Object Element * * @param string $src * @param mixed $style * @return PHPWord_Section_Object */ public function addObject($src, $style = null) { $object = new PHPWord_Section_Object($src, $style); if (!is_null($object->getSource())) { $inf = pathinfo($src); $ext = $inf['extension']; if (strlen($ext) == 4 && strtolower(substr($ext, -1)) == 'x') { $ext = substr($ext, 0, -1); } $iconSrc = PHPWORD_BASE_PATH . 'PHPWord/_staticDocParts/'; if (!file_exists($iconSrc . '_' . $ext . '.png')) { $iconSrc = $iconSrc . '_default.png'; } else { $iconSrc .= '_' . $ext . '.png'; } $rIDimg = PHPWord_Media::addSectionMediaElement($iconSrc, 'image'); $data = PHPWord_Media::addSectionMediaElement($src, 'oleObject'); $rID = $data[0]; $objectId = $data[1]; $object->setRelationId($rID); $object->setObjectId($objectId); $object->setImageRelationId($rIDimg); $this->_elementCollection[] = $object; return $object; } else { trigger_error('Source does not exist or unsupported object type.'); } } /** * Add a Image Element * * @param string $src * @param mixed $style * @return PHPWord_Section_Image */ public function addImage($src, $style = null) { $image = new PHPWord_Section_Image($src, $style); if (!is_null($image->getSource())) { $rID = PHPWord_Media::addSectionMediaElement($src, 'image'); $image->setRelationId($rID); $this->_elementCollection[] = $image; return $image; } else { trigger_error('Source does not exist or unsupported image type.'); } } /** * Add a by PHP created Image Element * * @param string $link * @param mixed $style * @return PHPWord_Section_MemoryImage */ public function addMemoryImage($link, $style = null) { $memoryImage = new PHPWord_Section_MemoryImage($link, $style); if (!is_null($memoryImage->getSource())) { $rID = PHPWord_Media::addSectionMediaElement($link, 'image', $memoryImage); $memoryImage->setRelationId($rID); $this->_elementCollection[] = $memoryImage; return $memoryImage; } else { trigger_error('Unsupported image type.'); } } /** * Add a Table-of-Contents Element * * @param mixed $styleFont * @param mixed $styleTOC * @return PHPWord_TOC */ public function addTOC($styleFont = null, $styleTOC = null) { $toc = new PHPWord_TOC($styleFont, $styleTOC); $this->_elementCollection[] = $toc; return $toc; } /** * Add a Title Element * * @param string $text * @param int $depth * @return PHPWord_Section_Title */ public function addTitle($text, $depth = 1) { //$text = utf8_encode($text); $styles = PHPWord_Style::getStyles(); if (array_key_exists('Heading_' . $depth, $styles)) { $style = 'Heading' . $depth; } else { $style = null; } $title = new PHPWord_Section_Title($text, $depth, $style); $data = PHPWord_TOC::addTitle($text, $depth); $anchor = $data[0]; $bookmarkId = $data[1]; $title->setAnchor($anchor); $title->setBookmarkId($bookmarkId); $this->_elementCollection[] = $title; return $title; } /** * Create a new TextRun * * @return PHPWord_Section_TextRun */ public function createTextRun($styleParagraph = null) { $textRun = new PHPWord_Section_TextRun($styleParagraph); $this->_elementCollection[] = $textRun; return $textRun; } /** * Get all Elements * * @return array */ public function getElements() { return $this->_elementCollection; } /** * Create a new Header * * @return PHPWord_Section_Header */ public function createHeader() { $header = new PHPWord_Section_Header($this->_sectionCount); $this->_header = $header; return $header; } /** * Get Header * * @return PHPWord_Section_Header */ public function getHeader() { return $this->_header; } /** * Create a new Footer * * @return PHPWord_Section_Footer */ public function createFooter() { $footer = new PHPWord_Section_Footer($this->_sectionCount); $this->_footer = $footer; return $footer; } /** * Get Footer * * @return PHPWord_Section_Footer */ public function getFooter() { return $this->_footer; } } ?> |
Пользуйтесь наздоровье.
Теория разбитых окон
1980-х годах Нью-Йорк представлял собой адский ад. Там совершалось более 1 500 тяжких преступлений КАЖДЫЙ ДЕНЬ. 6-7 убийств в сутки. Ночью по улицам ходить было опасно, а в метро рисковано ездить даже днем. Грабители и попрошайки в подземке были обычным делом. Грязные и сырые платформы едва освещались. В вагонах было холодно, под ногами валялся мусор, стены и потолок сплошь покрыты граффити.
Вот что рассказывали о нью-йоркской подземке:
«Выстояв бесконечную очередь за жетоном, я попытался опустить его в турникет, но обнаружил, что монетоприемник испорчен. Рядом стоял какой-то бродяга: поломав турникет, теперь он требовал, чтобы пассажиры отдавали жетоны лично ему. Один из его дружков наклонился к монетоприемнику и вытаскивал зубами застрявшие жетоны, покрывая все слюнями. Пассажиры были слишком напуганы, чтобы пререкаться с этими ребятами: «На, бери этот чертов жетон, какая мне разница!» Большинство людей миновали турникеты бесплатно. Это была транспортная версия дантова ада».
Город был в тисках самой свирепой эпидемии преступности в своей истории.
Но потом случилось необъяснимое. Достигнув пика к 1990-му году, преступность резко пошла на спад. За ближайшие годы количество убийств снизилось на 2/3, а число тяжких преступлений – наполовину. К концу десятилетия в метро совершалось уже на 75 % меньше преступлений, чем в начале. По какой-то причине десятки тысяч психов и гопников перестали нарушать закон.
Что произошло? Кто нажал волшебный стоп-кран и что это за кран?[]
Его название – «Теория разбитых окон». Канадский социолог Малкольм Гладуэлл в книге «Переломный момент» рассказывает:«Разбитые окна» — это детище криминалистов Уилсона и Келлинга. Они утверждали, что преступность — это неизбежный результат отсутствия порядка. Если окно разбито и не застеклено, то проходящие мимо решают, что всем наплевать и никто ни за что не отвечает. Вскоре будут разбиты и другие окна, и чувство безнаказанности распространится на всю улицу, посылая сигнал всей округе. Сигнал, призывающий к более серьезным преступлениям».
Гладуэлл занимается социальными эпидемиями. Он считает, что человек нарушает закон не только (и даже не столько) из-за плохой наследственности или неправильного воспитания. Огромное значение на него оказывает то, что он видит вокруг. Контекст.
Нидерландские социологи подтверждают эту мысль (источник). Они провели серию любопытных экспериментов. Например, такой. С велосипедной стоянки возле магазина убрали урны и на рули велосипедов повесили рекламные листовки. Стали наблюдать – сколько народа бросит флаеры на асфальт, а сколько постесняется. Стена магазина, возле которого припаркованы велосипеды,
была идеально чистой.
Листовки бросили на землю 33% велосипедистов.
Затем эксперимент повторили, предварительно размалевав стену бессодержательными рисунками.
Намусорили уже 69 % велосипедистов.
Но вернемся в Нью-Йорк в эпоху дикой преступности. В середине 1980-х в нью-йоркском метрополитене поменялось руководство. Новый директор Дэвид Ганн начал работу с… борьбы против граффити. Нельзя сказать, что вся городская общественность обрадовалась идее. «Парень, займись серьезными вопросами – техническими проблемами, пожарной безопасностью, преступностью… Не трать наши деньги на ерунду!» Но Ганн был настойчив:
«Граффити — это символ краха системы. Если начинать процесс перестройки организации, то первой должна стать победа над граффити. Не выиграв этой битвы, никакие реформы не состоятся. Мы готовы внедрить новые поезда стоимостью в 10 млн. долларов каждый, но если мы не защитим их от вандализма – известно, что получится. Они продержатся один день, а потом их изуродуют».
И Ганн дал команду ощищать вагоны. Маршрут за маршрутом. Состав за составом. Каждый чертов вагон, каждый божий день. «Для нас это было как религиозное действо», — рассказывал он позже.
В конце маршрутов установили моечные пункты. Если вагон приходил с граффити на стенах, рисунки смывались во время разворота, в противном случае вагон вообще выводили из эксплуатации. Грязные вагоны, с которых еще не смыли граффити, ни в коем случае не смешивались с чистыми. Ганн доносил до вандалов четкое послание.
«У нас было депо в Гарлеме, где вагоны стояли ночью, – рассказывал он. – В первую же ночь явились тинейджеры и заляпали стены вагонов белой краской. На следующую ночь, когда краска высохла, они пришли и обвели контуры, а через сутки все это раскрашивали. То есть они трудились 3 ночи. Мы ждали, когда они закончат свою «работу». Потом мы взяли валики и все закрасили. Парни расстроились до слез, но все было закрашено снизу доверху. Это был наш мэссидж для них: «Хотите потратить 3 ночи на то, чтобы обезобразить поезд? Давайте. Но этого никто не увидит»…
В 1990-м году на должность начальника транспортной полиции был нанят Уильям Браттон. Вместо того, чтобы заняться серьезным делом – тяжкими преступлениями, он вплотную взялся за… безбилетников. Почему?
Новый начальник полиции верил – как и проблема граффити, огромное число «зайцев» могло быть сигналом, показателем отсутствия порядка. И это поощряло совершение более тяжких преступлений. В то время 170 тысяч пассажиров пробирались в метро бесплатно. Подростки просто перепрыгивали через турникеты или прорывались силой. И если 2 или 3 человека обманывали систему, окружающие (которые в иных обстоятельствах не стали бы нарушать закон) присоединялись к ним. Они решали, что если кто-то не платит, они тоже не будут. Проблема росла как снежный ком.
Что сделал Браттон? Он выставил возле турникетов по 10 переодетых полицейских. Они выхватывали «зайцев» по одному, надевали на них наручники и выстраивали в цепочку на платформе. Там безбилетники стояли, пока не завершалась «большая ловля». После этого их провожали в полицейский автобус, где обыскивали, снимали отпечатки пальцев и пробивали по базе данных. У многих при себе оказывалось оружие. У других обнаружились проблемы с законом.
«Для копов это стало настоящим Эльдорадо, – рассказывал Браттон. – Каждое задержание было похоже на пакет с поп-корном, в котором лежит сюрприз. Что за игрушка мне сейчас попадется? Пистолет? Нож? Есть разрешение? Ого, да за тобой убийство!.. Довольно быстро плохие парни поумнели, стали оставлять оружие дома и оплачивать проезд».
В 1994 году мэром Нью-Йорка избран Рудольф Джулиани. Он забрал Браттона из транспортного управления и назначил шефом полиции города. Кстати, в Википедии написано, что именно Джулиани впервые применил Теорию разбитых окон. Теперь мы знаем, что это не так. Тем не менее, заслуга мэра несомненна – он дал команду развить стратегию в масштабах всего Нью-Йорка.
Полиция заняла принципиально жесткую позицию по отношению к мелким правонарушителям. Арестовывала каждого, кто пьянствовал и буянил в общественных местах. Кто кидал пустые бутылки. Разрисовывал стены. Прыгал через турникеты, клянчил деньги у водителей за протирку стекол. Если кто-то мочился на улице, он отправлялся прямиком в тюрьму.
Уровень городской преступности стал резко падать – так же быстро, как в подземке. Начальник полиции Браттон и мэр Джулиани объясняют: «Мелкие и незначительные, на первый взгляд, проступки служили сигналом для осуществления тяжких преступлений».
Цепная реакция была остановлена. Насквозь криминальный Нью-Йорк к концу 1990-х годов стал самым безопасным мегаполисом Америки.
Волшебный стоп-кран сработал.
Источник: http://wowfacts.net/teoriya-razbityx-okon/


SAPE — покупка/продажа ссылок