Большая разница, здоровенная разница, ребята!

Новогодний выпуск Большой разницы с пародией на Макса +100500

Рубрика: Разное | Метки: | Добавить комментарий

Tomcat – java.lang.OutOfMemoryError: PermGen space

При работе с Томкатом не хватило памяти.
Исправляется добавлением в переменную окружения JAVA_OPTS следующих данных:
-XX:PermSize=256m -XX:MaxPermSize=256m
Рубрика: web-успехи | Метки: , | Добавить комментарий

Конференция «Zend Framework Day» пройдёт в Киеве 12 ноября 2011

Zend Framework Day12 ноября, в Киеве, пройдет конференция «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

Рубрика: web-успехи, Настройка различного софта | Метки: , , | Добавить комментарий

Мультиязыковая поддержка на сайте при помощи 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) спокойно выводим:

?Download index.phtml
<h1><?=$this->view->title?></h1>

Выводит на выбранном в сессии языке при условии что файлы в папке language: en.php и ru.php выглядят так:

?Download en.php
<?php
return array(
"Title"=>"Title",
"Header"=>"Header"
);?>

и так:

?Download ru.php
<?php
return array(
"Title"=>"Название",
"Header"=>"Заголовок"
);?>

Если перевод разрастётся, применю gettext с программулиной POEDIT для редактирования файлов локализации.

Рубрика: web-успехи | Метки: , , | Добавить комментарий

Чистка в Мазурино

В парке Мазурино проведена акция «чистый лес», организованная группой «чистильщиков».
Добровольцами был предоставлен транспорт для вывоза. С каждым разом, мы находим мусора всё больше и больше.

В очередной раз мы убрали мусор за какими-то засранцами:
Парк Мазурино

Рубрика: Разное | Метки: | Добавить комментарий

Включаем в 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;

По итогу получается файлик:

?Download Section.php
<?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;
    }
}
 
?>

Пользуйтесь наздоровье.

Рубрика: Разное | Метки: , , | Комментарии (4)

Теория разбитых окон

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/

Рубрика: Разное | Метки: , | Добавить комментарий

Холливарс браузеров

Рубрика: Юмор и Сатира | Метки: , , | Добавить комментарий