<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>The Rpsl Blog</title><link>https://blog.rpsl.info/</link><description>Recent content on The Rpsl Blog</description><generator>Hugo</generator><language>ru-RU</language><copyright>© Rpsl</copyright><lastBuildDate>Sat, 12 Sep 2020 20:35:50 +0000</lastBuildDate><atom:link href="https://blog.rpsl.info/index.xml" rel="self" type="application/rss+xml"/><item><title>Перенос комментариев на GitHub</title><link>https://blog.rpsl.info/2020/09/how-migrate-comments-from-disqus-to-github/</link><pubDate>Sat, 12 Sep 2020 20:35:50 +0000</pubDate><guid>https://blog.rpsl.info/2020/09/how-migrate-comments-from-disqus-to-github/</guid><description>&lt;p&gt;&amp;hellip; и отказ от Disqus.&lt;/p&gt;&#10;&lt;p&gt;Много лет для комментариев в блоге я использовал &lt;a href="http://disqus.com/"&gt;Disqus&lt;/a&gt;. В те времена, когда я начал его использовать, выбор был не большой: Disqus, &lt;a href="https://www.intensedebate.com/"&gt;IntenseDebate&lt;/a&gt;, встроенные системы комментирования и еще пара аналогов, названия которых я уже не вспомню.&lt;/p&gt;&#10;&lt;p&gt;Это была середина двухтысячных годов, сервисы которые загружались через javascript, позволяли писать комментарии, автоматически боролись со спамом, имели сквозную авторизацию, а еще и строили внутри себя подобие социальной сети - &lt;strong&gt;казались фантастикой&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Я уже точно не помню почему я начал использовать Disqus, вероятно из-за того что это казалось удобным, а еще он был жутко модным и устанавливался почти везде.&lt;/p&gt;&#10;&lt;p&gt;Альтернативой ему была стандартная форма от WP, которая пропускала спам и предлагала регистрироваться в каждом блоге чтобы писать комментарии.&lt;/p&gt;&#10;&lt;div class="callout"&gt;&#10;&#9;&lt;div&gt;🤓&lt;/div&gt;&#10;&#9;&lt;div class="text"&gt;Приколитесь, мы регистрировались в блогах, чтобы писать друг-другу комментарии&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;С тех пор Disqus так и жил, заменять его на стандартные комментарии от WP мне не хотелось, а после того как блог переехал на генерацию статических файлов, то внешние системы комментариев остались единственным вариантом, кроме того чтобы убрать комментарии полностью.&lt;/p&gt;</description></item><item><title>Nativefier. Создание приложений из сайтов</title><link>https://blog.rpsl.info/2020/05/nativefier-how-create-native-application/</link><pubDate>Sun, 31 May 2020 09:50:02 +0000</pubDate><guid>https://blog.rpsl.info/2020/05/nativefier-how-create-native-application/</guid><description>&lt;p&gt;Несколько месяцев назад я открыл для себя &lt;a href="https://github.com/jiahaog/nativefier"&gt;Nativefier&lt;/a&gt; — это инструмент который позволяет создавать типовые приложения на базе electron из web-сайтов.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Electron — это фреймворк, разработанный GitHub. Позволяет разрабатывать нативные графические приложения для настольных операционных систем с помощью веб-технологий. Фреймворк включает в себя Node.js для работы с back-end и библиотеку рендеринга из Chromium&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.electronjs.org/"&gt;Сайт проекта, с примерами и документацией&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.electronjs.org/apps"&gt;Каталог приложений на базе electron&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Я целенаправленно начал искать такой инструмент, когда осознал, что уже четыре года использую Safari исключительно для того чтобы держать открытым окно с метриками в Grafana. Safari, в моем случае, выступает в роли отдельного приложения, к которому можно легко получить доступ через cmd+tab&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/nativefier-how-create-native-application/4b03c34eb35269067726c12bb0ada0de.png" alt="macos grafana application"&gt;&lt;/p&gt;&#10;&lt;p&gt;Разбираясь какие есть сервисы для этого - обнаружилось что их множество. В основном это сайты на которых нужно отметить несколько чекбоксов, ввести название и загрузить иконку. Затем они соберут приложение, как я понял, почти у всех под капотом именно Nativefier.&lt;/p&gt;&#10;&lt;p&gt;Если интересно и не хотите заморачиваться с установкой и сборкой, то список сервисов есть в конце статьи.&lt;/p&gt;</description></item><item><title>Zero Inbox. Гайд по наведению порядка в почте</title><link>https://blog.rpsl.info/2020/03/zero-inbox/</link><pubDate>Tue, 17 Mar 2020 11:42:39 +0000</pubDate><guid>https://blog.rpsl.info/2020/03/zero-inbox/</guid><description>&lt;h2 id="проблематика"&gt;Проблематика&lt;/h2&gt;&#10;&lt;p&gt;Моему почтовому ящику на gmail много лет. Более десяти лет самостоятельного существования, а также в нем лежат архивы из других почтовых систем. Все эти годы я использовал его так как и нужно использовать умные продукты:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Не сортировал письма, так как для этого есть хороший поиск&lt;/li&gt;&#10;&lt;li&gt;Не удалял письма с большими вложениями, так как для этого есть куча пространства&lt;/li&gt;&#10;&lt;li&gt;Не категоризировал письма и позволял сервису обучаться на моих привычках, для автоматических эвристик&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;И это было чудесное время, пока мне не захотелось навести в нем порядок.&lt;/p&gt;&#10;&lt;p&gt;Задача навести порядок не была самоцелью, скорее меня начало раздражать что весь inbox завален каким-то мусором: заказы из магазинов, рекламные письма, обновления от почты, все это вперемешку с периодическими дайджестами и личной перепиской.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/zero-inbox/3450d54cbe1f5ee4a36447a82fb19b42.png" alt="gmail inbox"&gt;&#10;&lt;em&gt;^^ Это не настоящий скрин моей почты. Просто картинка для превью.&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="задача"&gt;Задача&lt;/h2&gt;&#10;&lt;p&gt;Прежде чем переходить к действиям я постарался сформулировать задачу которую хочу решить, получилось следующее:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Навести порядок в Лейблах. Сгруппировать их в логические блоки, добавить нужные и удалить лишние&lt;/li&gt;&#10;&lt;li&gt;Создать правила для автоматического присвоения ярлыков от основных источников. Пересмотреть правила попадания в Inbox для этих правил&lt;/li&gt;&#10;&lt;li&gt;Отписаться от лишних рассылок&lt;/li&gt;&#10;&lt;li&gt;Удалить письма которые посчитаю мусорными&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Во втором пункте, говоря про &amp;ldquo;правила попадания в inbox&amp;rdquo;, я имею ввиду, что новые письма, которые попадают под фильтры, могут сразу переходить в архив, но, при этом, остаются непрочитанными. Их не будет видно во &amp;ldquo;входящих&amp;rdquo;, но к ним всегда можно вернуться. Это удобно для различных уведомлений или дайджестов.&lt;/p&gt;</description></item><item><title>Накрутка рефералов или "нубский CPA"</title><link>https://blog.rpsl.info/2019/12/newbie-cpa/</link><pubDate>Fri, 20 Dec 2019 22:00:00 +0000</pubDate><guid>https://blog.rpsl.info/2019/12/newbie-cpa/</guid><description>&lt;p&gt;Некоторые сервисы предоставляют возможность получить доступ к своим платным услугам, за счет привлечения рефералов. В этой статье хочу поделиться самой простой техникой, которая позволит привлекать рефералов без необходимости рассылать ссылки по социальным сетям.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/newbie-cpa/65d48e6d9bf58e64aea1eca6849f9542.png" alt="notion"&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;a href="https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D1%84%D0%B5%D1%80%D0%B0%D0%BB"&gt;Реферал&lt;/a&gt; (или реферрал, от англ. referral — «направление») — участник партнёрской программы, зарегистрировавшийся по рекомендации другого участника. Такая схема маркетинга широко распространена в интернете и предполагает регистрацию на сайтах, предоставляющих некие услуги. В этом случае рекомендация сопровождается «реферальной ссылкой», содержащей информацию об учётной записи участника, который получит вознаграждение за привлечение новичков. Вербующего участника принято по аналогии называть «реферер» (англ. referrer).&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h3 id="вводная"&gt;Вводная&lt;/h3&gt;&#10;&lt;p&gt;Началось все с того, что некоторое время назад я переехал на &lt;a href="https://notion.so"&gt;Notion&lt;/a&gt;, как на основное средство для ведения заметок. До него я много лет пользовался &lt;a href="https://evernote.com/"&gt;Evernote&lt;/a&gt;, но он совсем испортился и перестал отвечать моим потребностям, обрастая при этом дополнительными функциями. Некоторое время мне удавалось заменять его на &lt;a href="http://alternoteapp.com/ru/"&gt;Alternote&lt;/a&gt;, это такая надстройка на Evernote, срезающая все излишества, но Evernote решил поменять модель монетизации, ограничив количество устройств с которыми он будет синхронизироваться в бесплатной версии.&lt;/p&gt;&#10;&lt;p&gt;Так началась моя миграция от одного приложения к другому. Я пробовал &lt;a href="https://bear.app/"&gt;Bear&lt;/a&gt;, но как-то не смог с ним подружиться. Долгое время сидел на &lt;a href="https://www.devontechnologies.com/apps/devonthink"&gt;DEVONthink&lt;/a&gt;, даже оплатил лицензию, но его функциональность была одновременно его достоинством и недостатком. Обилие ненужных функций компенсировалось отсутствием нужных &lt;em&gt;(я опираюсь на опыт полученный от второй версии, сейчас, вроде, вышла третья, но я её не пробовал)&lt;/em&gt;. Пробовал &lt;a href="https://simplenote.com/"&gt;Simplenote&lt;/a&gt; и даже оставил его когда нужно что-то быстро записать, альтернатива Заметкам от Apple, но он оказался слишком скудный.&lt;/p&gt;</description></item><item><title>Перенос mac приложений в brew</title><link>https://blog.rpsl.info/2019/03/mac-move-apps-into-brew/</link><pubDate>Sat, 23 Mar 2019 11:45:50 +0000</pubDate><guid>https://blog.rpsl.info/2019/03/mac-move-apps-into-brew/</guid><description>&lt;p&gt;Думаю что многим разработчикам, работающим в macOS, знаком &lt;a href="https://brew.sh/"&gt;Homebrew&lt;/a&gt;. Изначально он развивался как менеджер пакетов пришедший на замену &lt;code&gt;macports&lt;/code&gt; и &lt;code&gt;fink&lt;/code&gt;, но, со временем, начал обрастать дополнениями которые поддерживаются сообществом.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/mac-move-apps-into-brew/ed3f2015cc5be55839f62e5524c62214.png" alt="Homebrew"&gt;&lt;/p&gt;&#10;&lt;p&gt;Одно из таких дополнений это &lt;code&gt;Cask&lt;/code&gt;, оно позволят работать с приложениями с закрытым исходным кодом, которые устанавливаются в систему путем перемещения в директорию &lt;code&gt;/Applications&lt;/code&gt;.&#10;&lt;code&gt;Cask&lt;/code&gt; реализует возможность устанавливать и следить за обновлениями таких приложений как:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Google Chrome&lt;/li&gt;&#10;&lt;li&gt;Mozilla Firefox&lt;/li&gt;&#10;&lt;li&gt;1password&lt;/li&gt;&#10;&lt;li&gt;Sublime Text Edit&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://formulae.brew.sh/cask/"&gt;И множество других&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/mac-move-apps-into-brew/6dffa9044e4f0d50e4ebcb7c3471155f.gif" alt="Homebrew Cask Install"&gt;&lt;/p&gt;&#10;&lt;p&gt;После установки приложения через &lt;code&gt;Cask&lt;/code&gt; ничего не меняется. Оно будет работать также как работало до этого, будет предлагать обновления через собственные механизмы. Однако, &lt;code&gt;brew&lt;/code&gt; тоже будет отслеживать состояние приложения и обновлять его если выйдет новая версия, &lt;code&gt;brew&lt;/code&gt; создает команды запуска для терминала, если они предусмотрены и сможет удалить приложение под чистую, если это потребуется.&#10;А еще, с его помощью, можно сделать &lt;code&gt;Brewfile&lt;/code&gt;, который позволит установить нужные приложения на новом компьютере одной командой.&lt;/p&gt;&#10;&lt;p&gt;В какой-то момент я обратил внимание что у меня не систематизированы установленные приложения: часть установлена через &lt;code&gt;brew&lt;/code&gt;, другая часть руками и мне захотелось навести порядок в этой системе.&lt;/p&gt;</description></item><item><title>MikroTik автоматическое обновление листов</title><link>https://blog.rpsl.info/2019/03/mikrotik-auto-update-address-list/</link><pubDate>Sun, 17 Mar 2019 23:08:27 +0000</pubDate><guid>https://blog.rpsl.info/2019/03/mikrotik-auto-update-address-list/</guid><description>&lt;p&gt;В &lt;a href="%7Bfilename%7D./mikrotik-use-vpn.md"&gt;прошлой статье&lt;/a&gt; мы разобрали как настроить маршрутизацию трафика через VPN, на основе &lt;code&gt;Address Lists&lt;/code&gt;. В этой статье хочется собрать информацию и способы для автоматического обновления и создания листов. &lt;/p&gt;&#10;&lt;p&gt;Обновление листов представляет из себя выполнение shell команд, которые исполняются на Router OS. Их можно предварительно сгенерировать и выполнить на маршрутизаторе, либо выполнять сразу, в runtime, без создания отдельного файла.&lt;/p&gt;&#10;&lt;h4 id="шаблон-файла-обновления"&gt;Шаблон файла обновления&lt;/h4&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-routeros" data-lang="routeros"&gt;/ip firewall address-list&#10;remove numbers=[find list=spotify]&#10;add list=spotify address=104.154.127.47&#10;add list=spotify address=78.31.8.0/21&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;В моем случае обновление листа подразумевает удаление всех правил и добавление новых. Необходимости делать точечные изменения у меня не возникало.&lt;/p&gt;&#10;&lt;p&gt;В листе выше, мы удаляем все адреса которые присутствуют в листе &lt;code&gt;spotify&lt;/code&gt; - &lt;code&gt;remove numbers=[find list=spotify]&lt;/code&gt;. &#10;Затем идут команды добавления новых адресов &lt;code&gt;add list=spotify address=78.31.8.0/21&lt;/code&gt; их можно добавлять сколь угодно много, но большие обработка больших листов будет отнимать ресурсы роутера, поэтому заливать туда полный список от РКН не рекомендую.&lt;/p&gt;</description></item><item><title>Настройка маршрутизации трафика через VPN в RouterOS</title><link>https://blog.rpsl.info/2019/03/mikrotik-use-vpn/</link><pubDate>Fri, 08 Mar 2019 18:53:24 +0000</pubDate><guid>https://blog.rpsl.info/2019/03/mikrotik-use-vpn/</guid><description>&lt;p&gt;В качестве домашней точки доступа я использую маршрутизатор &lt;a href="https://mikrotik.com/product/hap_ac2"&gt;MikroTik hAP ac2&lt;/a&gt;. Я выбрал его из-за обилия настроек и возможности реализации таких сценариев которые недоступны его конкрурентам.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/mikrotik-use-vpn/52e5f921d308ffdacf0fb201e3c86258.jpg" alt="mikrotik hap ac2"&gt;&lt;/p&gt;&#10;&lt;p&gt;Один из таких сценариев - настройка автоматического соединение с некоторыми хостами через VPN.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Зачем это может быть нужно:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Сайт недоступен из интернета. Например, он находится в корпоративной сети&lt;/li&gt;&#10;&lt;li&gt;Вы не хотите чтобы провайдер знал что вы посещаете данный сайт&lt;/li&gt;&#10;&lt;li&gt;У сайта есть ограничения на доступ из вашей локации. Spotify или Telegram&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Youcast. Просмотр youtube через подкасты</title><link>https://blog.rpsl.info/2019/02/youcast-show-youtube-as-podcast/</link><pubDate>Tue, 26 Feb 2019 19:18:10 +0000</pubDate><guid>https://blog.rpsl.info/2019/02/youcast-show-youtube-as-podcast/</guid><description>&lt;p&gt;Хочу рассказать вам еще об одном стартапе который я пилю на досуге. &amp;ldquo;Пилю&amp;rdquo; - это, конечно, громко сказано, так как проект был запущен три года назад и с тех пор почти не развивался, но обо всем по порядку.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/youcast-show-youtube-as-podcast/ca09419178564de38c998d25f99247dd.jpg" alt="/images/youcast-show-youtube-as-podcast/ca09419178564de38c998d25f99247dd.jpg"&gt;&lt;/p&gt;</description></item><item><title>Идея стартапа "Рассказчик"</title><link>https://blog.rpsl.info/2018/04/startup-story-combinator/</link><pubDate>Sat, 28 Apr 2018 19:32:07 +0000</pubDate><guid>https://blog.rpsl.info/2018/04/startup-story-combinator/</guid><description>&lt;p&gt;Для начала чуть-чуть контекста. Я смотрю достаточно много сериалов. Я ознакамливаюсь с большинством новинок которые обладают вменяемым описанием. К сожалению большинство из них я бросаю после нескольких серий, другие по инерции досматриваются до конца сезона на быстрой перемотке. Быстрая перемотка для меня это не ускоренное воспроизведение, а просмотр сериала с телефона, когда можно в одно касание перемотать серию на 10-20 секунд вперед. Таким образом за 25 минут в метро я умудряюсь посмотреть часовую серию проходного шоу.&lt;/p&gt;&#10;&lt;p&gt;И вот уже много лет я мечтаю о сервисе который бы позволил не использовать быструю перемотку, а сразу собирать серию из интересных мне сюжетных линий. Самостоятельно такой проект я никак не потяну, поэтому максимум что могу сделать рассказать тут об идее. Хотя, велика вероятность, что когда-нибудь он появится, а может и уже где-нибудь существует.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/startup-story-combinator/34d9506a0171cc32d085584813923127.png" alt="картинка для привлечения внимания"&gt;&lt;/p&gt;&#10;&lt;p&gt;В моем видение это должен быть проект с генерируемым пользовательским контентом. На рисунке я постарался схематически изобразить как он должен выглядеть для пользователя, но внутренняя механика должна быть схожа с какой-нибудь википедией. У всех серий есть хронометраж и мы точно знаем что он не меняется, а построение большинства серий сводится к тому что это последовательный набор сцен. Значит каждую серию можно нарезать на сцены и далее эти сцены помечать различными &amp;ldquo;сюжетными линиями&amp;rdquo;. Далее любой человек может самостоятельно добавлять различные сюжетные линии и голосовать за уже созданные, если хочет, разумеется. А если не хочет, то может просто выбрать популярные сюжетные линии прочитав их описание.&lt;/p&gt;&#10;&lt;p&gt;Представьте как бы было здорово смотреть сериалы без всех этих нудных разговоров по 5 минут. Вот если из &amp;ldquo;The Walking Dead&amp;rdquo; выкинуть всю ересь про их личные взаимоотношения и получить только историю про выживание и зомби. Если из первых сезонов &amp;ldquo;Homeland&amp;rdquo; выкинуть большую часть страданий про семью Броуди, оставив только ключевые моменты и расследование Кэрри. Ну, или если вы страдает острой формой мазохизма, то наоборот собрать себе из ходячих мертвецов только сюжетную линию их личных взаимоотношений.&lt;/p&gt;&#10;&lt;p&gt;Все зависит от вашей фантазии.&lt;/p&gt;</description></item><item><title>AdBlock блокировка лидогенераторов</title><link>https://blog.rpsl.info/2018/02/adblock-leadgenerator-list/</link><pubDate>Sat, 24 Feb 2018 20:15:05 +0000</pubDate><guid>https://blog.rpsl.info/2018/02/adblock-leadgenerator-list/</guid><description>&lt;p&gt;Уже полтора года я собираю лист фильтров для AdBlock который блокирует виджеты лидогенераторы. Это та навязчивая херня которая издает разные звуки, мигает на половину страницы и предлагает оставить вам свой номер для обратного звонка от сейлов сайта.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/adblock-leadgenerator-list/fadd2661c628d0eb67ab1b3fde447dd7.png" alt="Mega shit widget"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/Rpsl/adblock-leadgenerator-list"&gt;Код лежит на гитхабе&lt;/a&gt;, можно легко контрибьютить. Я добавляю в него только те системы которые встречаю самостоятельно и которые не являются разработкой конкретного сайта, т.к. гоняться за последними жизни не хватит.&lt;/p&gt;&#10;&lt;p&gt;Для подписки можно нажать на &lt;a href="abp:subscribe?location=https%3A%2F%2Fraw.githubusercontent.com%2FRpsl%2Fadblock-leadgenerator-list%2Fmaster%2Flist%2Flist.txt&amp;amp;title=Adblock%20Leadgenerator%20list"&gt;эту ссылку&lt;/a&gt;, либо добавить вручную:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;https://raw.githubusercontent.com/Rpsl/adblock-leadgenerator-list/master/list/list.txt&#10;&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Борьба с телефонным спамом</title><link>https://blog.rpsl.info/2018/02/anti-phone-spam/</link><pubDate>Sat, 24 Feb 2018 16:07:33 +0000</pubDate><guid>https://blog.rpsl.info/2018/02/anti-phone-spam/</guid><description>&lt;p&gt;Свой первый телефонный номер я приобрел примерно в 2002 году, может раньше, но точно не позже. Тогда Мегафон только появился на рынке и заходил он сразу с козырей предлагая тариф &amp;ldquo;безлимит за $25&amp;rdquo;. Номер я купил в ближайшей палатке и пользовался им примерно до 2012 года. Примерно в 2012 году, когда начали появляться новые форматы сим карт я с горечью осознал, что номер зарегестрирован на незнакомого мне человека и переоформить на себя его уже не получится. Я реально сделал очень много попыток, пытался договориться с сотрудниками и знакомыми которые имеют отношение к Мегафону, но все разводили руками. В какой-то момент я даже рассматривал вариант устройства на работу в салон связи, чтобы получить доступ к исправлению информации и уволиться, но там не сразу эти доступы давали, и я решил забить.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/anti-phone-spam/cf12fcc04f4649b9f02d64d4b596ef81.gif" alt="spam 80 lvl"&gt;&lt;/p&gt;&#10;&lt;p&gt;В итоге пришлось оформлять новый контракт, т.к. старая сим карта не подходила к новым телефонам, да и выглядела так что вот-вот развалится. Поэтому в момент покупки iphone 5 я купил новый номер. Старый отключать не стал и поддерживал его в живом состояние еще несколько лет, чтобы убедиться что звонки/смс/оповещения на него больше не приходят. В какой-то момент я отпустил его, да и к тому времени я им уже не пользовался.&lt;/p&gt;</description></item><item><title>macOS: Предотвращение оглушения</title><link>https://blog.rpsl.info/2018/02/macos-prevention-of-lound-sound/</link><pubDate>Sun, 04 Feb 2018 18:47:26 +0000</pubDate><guid>https://blog.rpsl.info/2018/02/macos-prevention-of-lound-sound/</guid><description>&lt;p&gt;За компьютером я сижу в наушниках. Наушники подключены к внешней звуковой карте &amp;ldquo;&lt;a href="http://ru.creative.com/p/sound-blaster/sound-blaster-omni-surround-5-1"&gt;Sound Blaster Omni&lt;/a&gt;&amp;rdquo; и в этом конфиге громкость наушников в 20% является достаточной, а громкость выше 40% процентов уже слишком громкой.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/macos-prevention-of-lound-sound/8c4b7c821b01dc25da45b0a410d958ea.jpeg" alt="когда забыл убавить громкость"&gt;&lt;/p&gt;&#10;&lt;p&gt;Изначально я решил этот вопрос простым скриптом &lt;code&gt;login.sh&lt;/code&gt; который выполняется при входе в систему:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#!/bin/bash&#10;&#10;osascript -e &amp;#39;set volume 1&amp;#39;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;При входе звук сбрасывается в минимальное значение, а его делаю громче когда мне нужно. Жил я с такой системой много лет, пока не начал использвать iPad в качестве второго монитора. Для подключения iPad у меня стоит программа &lt;a href="https://www.duetdisplay.com/"&gt;Duet&lt;/a&gt; и либо с ней проблемы, либо с системой из-за переодического подключения/отключения мониторов, но, временами, громкость звука стала подниматься до 90%-100%.&lt;/p&gt;&#10;&lt;p&gt;90% громкость в моей системе это можно наушники бросить под стол и прекрасно слышать все происходящее, абсолютно без проблем.&lt;/p&gt;&#10;&lt;p&gt;Так вот, дабы не оглохнуть раньше времени, пришлось добавить &amp;ldquo;бота&amp;rdquo; в систему который каждые несколько секунд проверяет громкость звука и если она выше положенной, то возвращает её на допустимый уровень.&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;~/Library/LaunchAgents/com.local.volumelevel.plist&#10;&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;#34;-//Apple//DTD PLIST 1.0//EN&amp;#34; &amp;#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;#34;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0550ae"&gt;&amp;lt;plist&lt;/span&gt; &lt;span style="color:#1f2328"&gt;version=&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0550ae"&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#0550ae"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Label&lt;span style="color:#0550ae"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#0550ae"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;com.local.volumelevel&lt;span style="color:#0550ae"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#0550ae"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;ProgramArguments&lt;span style="color:#0550ae"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#0550ae"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&#9;&lt;span style="color:#0550ae"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/usr/bin/osascript&lt;span style="color:#0550ae"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&#9;&lt;span style="color:#0550ae"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;-e&lt;span style="color:#0550ae"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&#9;&lt;span style="color:#0550ae"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;if (output volume of (get volume settings)) &amp;gt; 25 then set volume output volume 25&lt;span style="color:#0550ae"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#0550ae"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#0550ae"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StartInterval&lt;span style="color:#0550ae"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#0550ae"&gt;&amp;lt;integer&amp;gt;&lt;/span&gt;10&lt;span style="color:#0550ae"&gt;&amp;lt;/integer&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0550ae"&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0550ae"&gt;&amp;lt;/plist&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Нативный обработчик Apple Script, запускается каждые 10 секунд и выполняет команду&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;if (output volume of (get volume settings)) &amp;gt; 25 then set volume output volume 25&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Все. Теперь не оглохну.&lt;/p&gt;</description></item><item><title>Будильник из Banana Pi (Raspberry Pi)</title><link>https://blog.rpsl.info/2017/03/alarm-from-raspberry-pi/</link><pubDate>Mon, 20 Mar 2017 21:49:44 +0000</pubDate><guid>https://blog.rpsl.info/2017/03/alarm-from-raspberry-pi/</guid><description>&lt;p&gt;Скопирую сюда &lt;a href="https://geektimes.ru/post/240803/"&gt;статью которую писал&lt;/a&gt; в 2014 году на geektimes, про то как я будильник из микрокомпьютера делал.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;Несколько месяцев назад в моей голове поселилась идея, что я хочу просыпаться не просто под музыку, а под интернет-радио. “Просто куплю будильник, который это умеет” - подумал я и отложил эту мысль. Когда дело дошло до покупок, то я был сильно удивлен в связи тем, что не смог найти подходящих мне моделей в продаже. Критерии, по которым я подбирал будильник:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Уметь играть интернет-радио в качестве будильника.&lt;/li&gt;&#10;&lt;li&gt;Работать по Wi-Fi (wpa2, “N” режим, желательно уметь без wps).&lt;/li&gt;&#10;&lt;li&gt;Желательно уметь показывать время и работать как часы.&lt;/li&gt;&#10;&lt;li&gt;Желательно иметь возможность настройки через телефон или компьютер.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Не могу сказать, что я требовал слишком много, т.к. обязательным требованием было только проигрывание интернет-радио, но все девайсы, которые мне встречались, были либо слишком большими, либо слишком дорогими, либо морально устаревшими.&lt;/p&gt;</description></item><item><title>Wunder digest</title><link>https://blog.rpsl.info/2017/03/wunder-digest/</link><pubDate>Mon, 06 Mar 2017 19:12:33 +0000</pubDate><guid>https://blog.rpsl.info/2017/03/wunder-digest/</guid><description>&lt;p&gt;Для ведения личных дел я пробовал использовать различные менеджеры заданий, но всегда возвращаюсь на wunderlist. Он меня жутко раздражает своим интерфейсом и отсутствием нужных мне функций, поэтому раз в год я закипаю и пытаюсь мигрировать в другой продукт, несколько дней настраиваю все под себя, устанавливаю мобильный клиент, красиво веду задания, а потом запал проходит, я начинаю замечать недостатки и возвращаюсь туда откуда начинал.&lt;/p&gt;&#10;&lt;p&gt;В последний раз я попытался сформулировать чего мне не хватает в wunderlist и постараться исправить эту проблему. В первую очередь мне не хватало дайджеста дел которые просрочились или запланированы на сегодня, поэтому я написал простенький скрипт, который получает из api wunderlist список дел, отбирает нужные и отправляет этот список на почту.&lt;/p&gt;&#10;&lt;p&gt;Не могу сказать что жизнь прямо наладилась и я стал образцом продуктивности, но не забывать о важных вещах стало удобнее.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/Rpsl/wundrelist-digest"&gt;&lt;img src="https://blog.rpsl.info/images/wunder-digest/69e6e356d6f52c093867cceba7c22953.png" alt="wunder digest"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/Rpsl/wundrelist-digest"&gt;https://github.com/Rpsl/wundrelist-digest&lt;/a&gt;&lt;/p&gt;</description></item><item><title>И трех лет не прошло</title><link>https://blog.rpsl.info/2017/02/lte-3-years/</link><pubDate>Sun, 26 Feb 2017 21:30:34 +0000</pubDate><guid>https://blog.rpsl.info/2017/02/lte-3-years/</guid><description>&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/lte-3-years/ddb24d9338881d5d85026cdbc83ecc2a.png" alt="pelican is good"&gt;&lt;/p&gt;&#10;&lt;p&gt;Не был уверен что это когда-нибудь случится, но, иногда, от скуки, я заставлял себя реанимировать этот блог.&#10;В данный момент я полностью отказался от wordpress и переехал на генератор статических блогов. &lt;a href="http://blog.getpelican.com/"&gt;Pelican&lt;/a&gt;, если кому интересно.&lt;/p&gt;&#10;&lt;h3 id="почему-не-wordpress"&gt;Почему не wordpress?&lt;/h3&gt;&#10;&lt;p&gt;Это долгая история.&lt;/p&gt;&#10;&lt;p&gt;Если начинать сначала, то этот блог был на Wordpress еще 2006 году, как раз в те времена, когда блоги уже были популярны, но LiveJournal уже начинал умирать. Несколько раз платформа менялась. Помню как-то психанул и полностью переехал на Movable Type, это такая блог платформа на перле. В ней была админка, а весь контент она так-же генерировала в статические файлы. Но Movable Type оказался ошибкой и я вернулся на Wordpress спустя некоторое время.&lt;/p&gt;&#10;&lt;p&gt;Менялись домены, менялось оформление, блог кое-как работал.&lt;/p&gt;&#10;&lt;p&gt;Wordpress, он ведь тоже не статичный механизм, время от времени обновляется платформа, обновляются плагины, темы обновляются, даже если его не трогаешь годами. Один плагин обновился, выполнил что-то, другой отключился, тоже обновил базу, в итоге ломается разметка, портятся ссылки, куски кода разваливаются и все выглядит не красиво.&lt;/p&gt;&#10;&lt;p&gt;В результате не было никакого желания сюда писать, даже когда было о чем рассказать, я знал что сейчас открою, посмотрю, там все нужно чинить и легче не трогать.&lt;/p&gt;</description></item><item><title>Leprosorium++</title><link>https://blog.rpsl.info/2014/08/leprosorium/</link><pubDate>Wed, 20 Aug 2014 10:58:00 +0000</pubDate><guid>https://blog.rpsl.info/2014/08/leprosorium/</guid><description>&lt;p&gt;Некоторое время назад, примерно в мае, Jovan, Vicont и прочие веселые ребята выкатили новую версию Лепрозория и всё было замечательно, кроме отвалившихся юзерскрипт плагинов.&lt;/p&gt;&#10;&lt;p&gt;Я очень привык к расшринию Lepra+, которое добавляет удобную кнопочки в браузер и включает в себя различные скрипты. Первым делом я полез патчить исходники, но просидев ночь понял что гораздо проще будет написать всё заново, тем более что технологии уже ушли вперед и можно сделать расшриние сразу для всех браузеров, а не ограничивать себя Google Chrome.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/leprosorium/0d77aa58449fa9ffe9a54e621e67765a.png" alt="leprosorium++"&gt;&lt;/p&gt;&#10;&lt;p&gt;С выбором платформы проблем не было, еще давно когда я работал в Корпорации ГУРУ мне довелось познакомиться с платформой &lt;a href="http://kangoextensions.com/"&gt;Kango&lt;/a&gt;, что занятно, её авторы тоже Леперы.&lt;/p&gt;&#10;&lt;p&gt;Платформа позволяет работать с внутренним api, которое транслирует необходимые вызовы к api конкретного браузера, таким образом можно в кратчайшие сроки делать расшрирения «Кнопки», но делать специфические нативные вещи становится невозможно.&lt;/p&gt;&#10;&lt;p&gt;Первую пригодную версию я сделал за ночь, потом еще несколько дней провел в режиме хакатона, пока фиксил баги и добавлял новые фичи, но тут нужно понимать что 99% времени ушло на адаптацию различных плагинов, а сам скелет приложения был сделан за один или два часа.&lt;/p&gt;&#10;&lt;p&gt;В дальнейших планах было переделать страницу настроек, добавить красивые описания со скриншотами, но руки так и не дошли, а сейчас запал уже прошел и я занимаюсь только поддержкой текущего функционала.&lt;/p&gt;&#10;&lt;p&gt;Всех энтузиастов приглашаю в репозиторий, а так же рекомендую познакомиться с Kango.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/Rpsl/leprosorium/issues"&gt;https://github.com/Rpsl/leprosorium/issues&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Turboloader - автоматическое скачивание сериалов</title><link>https://blog.rpsl.info/2013/01/turboloader-avtomaticheskoe-skachivanie-serialov/</link><pubDate>Tue, 15 Jan 2013 11:35:00 +0000</pubDate><guid>https://blog.rpsl.info/2013/01/turboloader-avtomaticheskoe-skachivanie-serialov/</guid><description>&lt;p&gt;Я уже несколько раз упоминал что у меня в шкафу живет &lt;a href="https://blog.rpsl.info/tag/nas/"&gt;старенький nas&lt;/a&gt;, я его использую для всего, и торренты он качает и бэкапы на него делаются и просто хранилище всякой-всячины. Так вот, уже около года он у меня и новые серии с Turbofilm.tv скачивает, раскладывает по папкам, отправляет на почту сообщение о том что серия скачалась.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/Rpsl/turboload" title="Turboloader"&gt;&lt;img src="https://blog.rpsl.info/images/turboloader-avtomaticheskoe-skachivanie-serialov/50f58f7d07ea84cd3f9e9d5ac4c3f74d.jpg" alt="turbofilm_m"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Изначально я не напрягался, а смотрел серии прямо на сайте через встроенный броузер playstation или apple tv, но бродилки там ущербные и работают совсем не так как все привыкли.&lt;/p&gt;&#10;&lt;p&gt;После очередного апдейта на турбофильме они просто перестали логиниться, т.к. у них форма была на js и тэг &lt;code&gt;a&lt;/code&gt; был без аттрибута &lt;code&gt;href&lt;/code&gt;, хромы и файрфоксы такое кушают на ура, а эти скромники отказываются. Так как сериалы мне все равно смотреть хотелось, я решил что нужно это исправлять. Сначала пошел по пути легкого сопротивления и сделал на другом сайте простую кнопку, по нажатию которой отправлялся хитрый POST запрос и меня логинило на сайте, но все равно навигация превращалась в ад.&lt;/p&gt;&#10;&lt;p&gt;Поэтому я решил, что будет не плохо написать простенький парсер, который раз в несколько часов будет проверять наличие серий и скачивать если таковые имеются. Про техническую реализацию я не буду сильно распинаться, все это было написано за один вечер на коленке и в условиях весьма ущербного линукса, я, вроде, спорные места отмечал комментариями.&lt;/p&gt;&#10;&lt;p&gt;На данный момент он умеет скачивать &amp;ldquo;все ваши сериалы&amp;rdquo;, скачивать только новые серии, скачивать серии только в хорошем качестве, скачивать серии с правильным языком, отмечать серию просмотренной после удачного скачивания и генерировать &amp;ldquo;правильные имена&amp;rdquo; для серий.&lt;/p&gt;&#10;&lt;p&gt;Субтитры не делал т.к. не нуждаюсь, но при желании наверно можно прикрутить. Ну и само-собой он работает только с оплаченными аккаунтами, никакой халявы тут нету, а просто упрощение схемы.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/Rpsl/turboload"&gt;Turboloader - скачать на гитхаб&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Несколько людей сообщали что им удалось его запускать на роутерах, но я подтвердить это не могу, если что пишите в комментариях.&lt;/p&gt;&#10;&lt;p&gt;Пример конфигурации описан на гитхабе. Только я вас прошу, не ставьте проверку часто, а то нас всех выпилят и останемся без сериалов.&lt;/p&gt;</description></item><item><title>Про сервис</title><link>https://blog.rpsl.info/2012/12/pro-servis/</link><pubDate>Thu, 06 Dec 2012 10:39:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/12/pro-servis/</guid><description>&lt;p&gt;После участия в нескольких жарких спорах, я понял что некоторые люди вокруг меня не понимаю что значит &amp;ldquo;сервис&amp;rdquo;. Ну или я не понимаю и пытаюсь всем навязать свою точку зрения, но свои размышления я изложу ниже и, как мне кажется, они вполне логичные.&lt;/p&gt;&#10;&lt;p&gt;Не буду ходить далеко и выдумывать сложные примеры, а расскажу о том, с чем сталкиваюсь постоянно.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/pro-servis/a0101c974f2d3a03aa7bb928a43431ca.png" alt="apple product"&gt;&lt;/p&gt;&#10;&lt;p&gt;Вот например мне нравится мой провайдер интернета, onlime.ru. Я к нему подключился году в 2007, когда он еще не был онлаймом, а был НКС (Национальные кабельные сети) или что-то в этом духе. Мне нравится им пользоваться, честно.&lt;/p&gt;&#10;&lt;p&gt;Они не достают меня рекламными смс и ежемесячными звонками с предложениями о подключении дополнительных услуг, в отличие от &lt;span style="text-decoration: line-through;"&gt;акадо&lt;/span&gt;. У них не бывает ремонтных работ, а если и бывают, то я этого не замечаю.&lt;/p&gt;&#10;&lt;p&gt;Серьезно за все эти годы интернет не работал несколько раз. Мне нравится заходить в личный кабинет раз в год, узнавать что мой тарифный план устарел и за эти деньги я могу перейти на более выгодный тариф. Они сами подписали меня на программу лояльности и у меня есть куча бонусных баллов, которые я могу потратить на всякие фичи.&lt;/p&gt;&#10;&lt;p&gt;Но самое главное в том, что они делают свою работу так, что мне не приходится думать об этом или забивать себе голову, я уверен что интернет у меня работает, а остальное мне не важно.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/pro-servis/af85873a8fbde2bc70248a05e5f3fd16.png" alt="google product"&gt;&lt;/p&gt;&#10;&lt;p&gt;Мне нравится мой хостинг, &lt;a href="https://firstvds.ru/?from=17604"&gt;firstvds.ru&lt;/a&gt;, я знаю что они являются реcселерами от хетзнера, но мне не жалко переплачивать им чуть-чуть денег и иметь взамен возможность платить любым удобным мне способом и общаться с их сотрудниками на родном языке.&lt;/p&gt;&#10;&lt;p&gt;Мне нравится, что когда в полночь я случайно запустил update-lilo и он попытался перепрошить загрузочный сектор на жестком диске, то я написал об этом в поддержку, они через 15 минут отреагировали на мою заявку, сами подключили KVM и под присмотром произвели тестирование и перезагрузку сервера.&lt;/p&gt;&#10;&lt;p&gt;Я конечно мог и сам это делать, но тут я получил помощь адекватных специалистов, которые явно больше меня разбираются в вопросе и с их помощью убедился что сервер работает как нужно, может самостоятельно перезагружаться и не испытывает серьезных проблем. Разве это не замечательно?&lt;/p&gt;&#10;&lt;p&gt;Раньше мне очень нравился Альфа-Банк, потому что они были удобными и приветливыми. Мне хотелось пользоваться их услугами и рекомендовать его друзьям. Сейчас они продолжают предоставлять отличный сервис, но как только ты сталкиваешься с их сотрудниками хочется застрелиться, потому что терпеть это невыносимо.&lt;/p&gt;&#10;&lt;p&gt;Ну сами представьте, когда после посещения офиса и четырех звонков в службу поддержки в течение месяца они не могут изменить номер мобильного на который приходят уведомления об операциях с деньгами или смс для входа в интернет банкинг.&lt;/p&gt;&#10;&lt;p&gt;Как можно доверять свои деньги компании которая может без спроса поменять ваш контактный email и секретное слово, а ее сотрудники обманным путем навязывают дополнительные услуги.&lt;/p&gt;&#10;&lt;p&gt;Добавлю что вчера они, вроде как, исправили эту проблему, проблема была техническая и кто-то что-то не так у них подключил, но мы ведь понимаем, что их проблемы это их проблемы, а жизнь они портят мне.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/pro-servis/17e2fddc98ef2ba769a7934cc14c8e84.png" alt="your company product"&gt;&lt;/p&gt;&#10;&lt;p&gt;Я люблю работать с paypal, т.к. у них все просто. Один раз зашел в личный кабинет, прошел несколько простых проверок и пользуйся на здоровье. Я желаю обанкротиться компании WebMoney из-за её ебучих систем авторизаций, проверок, привязок, попаболи и прочей адовой херни с которой приходится сталкиваться, я уже писал пост про это.&lt;/p&gt;&#10;&lt;p&gt;Тут можно приводить еще очень много примеров, но смысл от этого не будет меняться.&lt;/p&gt;&#10;&lt;p&gt;Сервис - это когда ты платишь немного денег за услуги, а взамен получаешь спокойствие и уверенность что большая часть проблем не возникнет или компания решит их самостоятельно.&lt;/p&gt;</description></item><item><title>Странности с Google Chrome</title><link>https://blog.rpsl.info/2012/12/strannosti-s-google-chrome/</link><pubDate>Wed, 05 Dec 2012 12:12:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/12/strannosti-s-google-chrome/</guid><description>&lt;p&gt;В последнее время замечаю, что Chrome периодически не правильно показывает страницу. Причем это явно не косяк верстки, а именно как будто видео карта глючит. Такое ломанное изображение, после совершения ajax действий над dom деревом, как только подводишь мышку к этому месту все становится хорошо. Компьютер его перерисовывает.&lt;/p&gt;&#10;&lt;p&gt;Сделать скриншот не получается, т.к. при этом все исправляется, но я попытался изобразить на картинке как это выглядит.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/strannosti-s-google-chrome/a11fdb591fb3ad0b5e842320cfe8e654.png" alt="chrome broken"&gt;&lt;/p&gt;&#10;&lt;p&gt;Еще иногда бывает что гифки не показываются. Для их запуска приходится щелкнуть рядом, что бы выделить гифку, тогда запускается. Проверял на разных сайтах и без расширений - без результата. Не знаю что с этим делать, на всякий случай воткнул на сайт такой код, success для ajax действий.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;$&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;#tab_content&amp;#39;&lt;/span&gt; &lt;span style="color:#1f2328"&gt;).&lt;/span&gt;&lt;span style="color:#1f2328"&gt;height&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#1f2328"&gt;$&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;#tab_content&amp;#39;&lt;/span&gt; &lt;span style="color:#1f2328"&gt;).&lt;/span&gt;&lt;span style="color:#1f2328"&gt;height&lt;/span&gt;&lt;span style="color:#1f2328"&gt;()&lt;/span&gt;&lt;span style="color:#0550ae"&gt;+&lt;/span&gt;&lt;span style="color:#0550ae"&gt;1&lt;/span&gt; &lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Может сталкивался кто? Подскажите куда копать.&lt;/p&gt;</description></item><item><title>Как стать "Rock Star" программистом</title><link>https://blog.rpsl.info/2012/11/kak-stat-rock-star-programmistom/</link><pubDate>Thu, 08 Nov 2012 07:14:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/11/kak-stat-rock-star-programmistom/</guid><description>&lt;p&gt;Вот несколько советов:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Найдите хорошего руководителя который будет критиковать ваш код, пусть он научит вас решать проблемы на собственном примере. Вы поймете что выросли, когда сможете оспорить его мнение правильными аргументами.&lt;/li&gt;&#10;&lt;li&gt;Всегда увеличивайте сложность и масштабы проблем которые пытаетесь решать. Запомните что у большинства людей нет 20-летнего опыта, у них есть один год опыта повторяющийся 20 раз. Не становитесь таким.&lt;/li&gt;&#10;&lt;li&gt;Заботьтесь о таких вещах как документация, имена методов и функций, покрывайте код тестами. Ваш код должен выглядеть профессионально и доступно, ведь с ним будут работать и другие люди.&lt;/li&gt;&#10;&lt;li&gt;Изучайте все доступные библиотеки и модули, даже если они не требуются сейчас, вы все равно должны знать об их существование. Если вам приходится работать с незнакомыми компонентами — старайтесь полностью разобраться с их назначением.&lt;/li&gt;&#10;&lt;li&gt;Если вы что-то не понимаете, то это должно стать стимулом пойти и разобраться в этом. Всегда погружайтесь глубоко.&lt;/li&gt;&#10;&lt;li&gt;Используйте лучшую IDE для вашего языка, максимально изучите ее и выучите все хоткеи. Хорошая IDE очень сильно ускорит вас.&lt;/li&gt;&#10;&lt;li&gt;Когда вы сталкиваетесь с новой проблемой, например вы никогда не работали с SOAP/XML, прежде чем начинать программировать почитайте что пишут в интернете на эту тему. Это поможет вам понять как другие люди решают задачи и с какими проблемами сталкиваются.&lt;/li&gt;&#10;&lt;li&gt;Семь раз отмерь, один раз отрежь.&lt;/li&gt;&#10;&lt;li&gt;Не забывайте что вы делаете продукт которым будут пользоваться другие. Постоянно общайтесь с заказчиками, следите за их ожиданиями, убеждайтесь что они знают чем вы занимаетесь и вы понимаете чего они хотят.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Это вольный перевод &lt;a href="http://www.quora.com/How-does-one-become-a-rockstar-developer#"&gt;этой заметки&lt;/a&gt;, просто захотелось оставить тут.&lt;/p&gt;</description></item><item><title>Gmail Show-M.-Later</title><link>https://blog.rpsl.info/2012/10/gmail-show-m-later/</link><pubDate>Wed, 10 Oct 2012 11:19:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/10/gmail-show-m-later/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rpsl/Show-M-Later"&gt;&lt;img src="https://blog.rpsl.info/images/gmail-show-m-later/cde2ab935b7c311fb58222e58a67843f" alt="Gmail Show M later"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Если кратко, то эта фича позволяет создать в вашем ящике ярлыки (папки),&#10;положив письмо в которые, оно будет лежать пока не пройдет нужный срок,&#10;а потом оно снова переместится в inbox и станет не прочитанным. Мне&#10;такой штуки очень давно не хватало, т.к. часто приходят письма, на&#10;которые нужно отреагировать, но в данный момент реагировать на них&#10;возможности нету.&lt;/p&gt;&#10;&lt;p&gt;Есть более древние варианты в галерее скриптов, Gmail Snooze например,&#10;но они позволяют работать только с дневными интервалами и устроены таким&#10;образом, что письмо добавленное в 23:00, в 01:00 снова окажется в&#10;инбоксе. Поэтому я сначала модифицировал, а потом полностью переписал. В&#10;моей реализации, письма живут более правильной жизнью.&lt;/p&gt;&#10;&lt;p&gt;Испытательный срок длился две недели. Это только последней стабильной&#10;версии, до этого были еще другие реализации, пробовал использоваться&#10;Cache вместо ScriptDB, но он слишком часто терял ключи. С этой версией&#10;проблем не возникало, пару раз, было что скрипт зависал, но я забил на&#10;это дело, т.к. повторить ошибку мне не удалось.&lt;/p&gt;&#10;&lt;p&gt;Касательно объемов данных. Каждому пользователю google выделяется 50мб&#10;под ScriptDB, но может быть и больше, если у вас платный аккаунт. Что бы&#10;упереться в размер данных, нужно будет очень постараться, поэтому до&#10;первой проблемы, решать ее не собираюсь. Тестировал максимум на 20&#10;активных письмах, все прошли полный цикл без ошибок. Наверно, если писем&#10;будет больше, то возможен тайм–аут. Если столкнулись с проблемой,&#10;пишите, буду исправлять.&lt;/p&gt;&#10;&lt;p&gt;Инструкцию и комментарии мне писать было лень, поэтому они не сильно&#10;подробные, но я постарался все расписать максимально доступно, в стиле&#10;пойди сюда — кликни тут.&lt;/p&gt;&#10;&lt;p&gt;Буду рад ответить на вопросы.&lt;br&gt;&#10;Буду очень рад, если появится перевод на другие языки.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/Rpsl/Show-M-Later"&gt;https://github.com/Rpsl/Show–M–Later&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Nginx изменение картинки по рефереру</title><link>https://blog.rpsl.info/2012/09/nginx-change-image-by-referer/</link><pubDate>Sun, 16 Sep 2012 18:02:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/09/nginx-change-image-by-referer/</guid><description>&lt;p&gt;В последнее время, стало модным вместо борьбы с хотлинками, выдавать вместо ожидаемого контента несколько другой. Я это заметил на примере мем сайтов, которые при обращение к их картинкам с других сайтов, отдают эту картинку, но приделывают к ней футер с адресом сайта или подобной рекламной информацией.&lt;/p&gt;&#10;&lt;p&gt;В целом весьма логично, если раньше все боялись за свой трафик, то теперь вопросы трафика мало кого интересуют, поэтому и приоритеты сместились в другую сторону. Хотя я видел ситуацию, когда на одном из рабочих ресурсов, образовался хотлинк канал японского трафика на 250mb/s.&lt;/p&gt;&#10;&lt;p&gt;Попробуйте открыть это изображение в новой вкладке (убедитесь что броузер не закешировал)&lt;/p&gt;&#10;&lt;p&gt;%раньше тут была картинка%&lt;/p&gt;&#10;&lt;p&gt;Рассматривая разные решения, я нашел самый простой способ, делать это с помощью nginx и встроенного модуля&#10;&lt;a href="http://nginx.org/ru/docs/http/ngx_http_referer_module.html"&gt;ngx_http_referer_module&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;test_images.conf&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;server&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;listen&lt;/span&gt; &lt;span style="color:#0550ae"&gt;80&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;server_name&lt;/span&gt; &lt;span style="color:#0a3069"&gt;images.dev&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;root&lt;/span&gt; &lt;span style="color:#0a3069"&gt;/www/data/test_images&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;location&lt;/span&gt; &lt;span style="color:#0a3069"&gt;/test_images&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;valid_referers&lt;/span&gt; &lt;span style="color:#0a3069"&gt;none&lt;/span&gt; &lt;span style="color:#0a3069"&gt;blocked&lt;/span&gt; &lt;span style="color:#0a3069"&gt;server_name&lt;/span&gt; &lt;span style="color:#0a3069"&gt;images.dev&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;if&lt;/span&gt; &lt;span style="color:#0a3069"&gt;(&lt;/span&gt;&lt;span style="color:#953800"&gt;$invalid_referer&lt;/span&gt;&lt;span style="color:#0a3069"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;rewrite&lt;/span&gt; &lt;span style="color:#0a3069"&gt;^(.*)/(.*)&lt;/span&gt;$ &lt;span style="color:#0a3069"&gt;/images_bad/&lt;/span&gt;&lt;span style="color:#953800"&gt;$2&lt;/span&gt; &lt;span style="color:#0a3069"&gt;last&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;rewrite&lt;/span&gt; &lt;span style="color:#0a3069"&gt;^(.*)/(.*)&lt;/span&gt;$ &lt;span style="color:#0a3069"&gt;/images_ok/&lt;/span&gt;&lt;span style="color:#953800"&gt;$2&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;location&lt;/span&gt; &lt;span style="color:#0a3069"&gt;/images_ok&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;internal&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;alias&lt;/span&gt; &lt;span style="color:#0a3069"&gt;/www/data/images/test_images/ok&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;location&lt;/span&gt; &lt;span style="color:#0a3069"&gt;/images_bad&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;internal&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;alias&lt;/span&gt; &lt;span style="color:#0a3069"&gt;/www/data/images/test_images/bad&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Собственно механика очень простая. Мы определяем с помощью &amp;ldquo;valid_referers&amp;rdquo; список правильных доменов, можно добавить в него домены поисковиков, например, что бы при поиске картинок пользователю показывалась правильная картинка. Потом мы создаем два внутренних location, которые отвечают за показ правильных и не правильных картинок. В случае не правильного реферера, в конструкции if мы делаем редирект на локейшн с картинками, которые должны отдаваться жуликам, которые ленятся скачивать картинку на свой сервер.&lt;/p&gt;&#10;&lt;p&gt;Ну вот, в общем и все. Осталось только позаботиться, что-бы у нас были необходимые картинки.&lt;/p&gt;&#10;&lt;p&gt;Тут можно решать разными путями, например, при создание оригинальной картинки создавать ее &amp;ldquo;обработанный&amp;rdquo; вариант. Но мне больше нравится ленивая загрузка, которую я, когда-то давно, делал в &lt;a href="https://blog.rpsl.info/2011/03/php-kehshirovanie-kartinok-chast-vtoraya/"&gt;iCacher&lt;/a&gt;, основная идея проста: при попытке запроса &amp;ldquo;обработанной&amp;rdquo; картинки, если ее нету, управление передается скрипту, который проверяет ее оригинал и делает ее &amp;ldquo;обработанную&amp;rdquo; копию, которая отдается пользователю.&lt;/p&gt;&#10;&lt;p&gt;При повторном обращение, запрос не дойдет до скрипта и пользователю отдастся статический файл. Таким образом мы получаем генерацию изображений по требованию. Еще можно добавить крон скрипт, который будет удалять &amp;ldquo;обработанные&amp;rdquo; картинки через 30 дней.&lt;/p&gt;&#10;&lt;p&gt;Я не уверен, что моя реализация хороший пример и буду рад если вы ее покритикуете. Плюс, я так и не придумал как избавиться от &lt;code&gt;if&lt;/code&gt; в данном случае (вариант хранения файлов в images_ok/1/ считаю плохим).&lt;/p&gt;</description></item><item><title>Шутка дня</title><link>https://blog.rpsl.info/2012/07/shutka-dnya/</link><pubDate>Wed, 18 Jul 2012 06:43:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/07/shutka-dnya/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;!‐‐[if lte IE 7]&amp;gt; &amp;lt;style&amp;gt; * {font-family: &amp;#34;Comic Sans&amp;#34; !important;} &amp;lt;/style&amp;gt; &amp;lt;![endif]‐‐&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Почему жилье дорожает</title><link>https://blog.rpsl.info/2012/07/pochemu-zhil-e-dorozhaet/</link><pubDate>Fri, 06 Jul 2012 06:42:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/07/pochemu-zhil-e-dorozhaet/</guid><description>&lt;p&gt;Вообще, у меня сегодня были планы рассказать вам про мои ощущения от&#10;xhprof, что мне удалось с его помощью прооптимизировать и обругать&#10;несколько статей в которых его пытаются использовать не правильно, но я&#10;нашел великолепную заметку, которая показывает принципы работы нашей&#10;экономики. Наверняка боян дикий, но мне очень понравилось и как минимум&#10;на память я это опубликую.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Я Вам сейчас очень просто объясню, почему дома подорожали к зарплате -&#10;бензин тут ни при чем. Допустим, мы - я, Вы и Хроноскопист летели на&#10;самолете через Тихий океан. В пути мы втроем накушались абсента,&#10;надебоширили, отломали дверь от туалета, и нас за это выкинули в море&#10;через аварийный выход. По счастью, рядом с местом нашего падения&#10;обнаружился маленький безымянный полинезийский остров. Выбравшись на&#10;берег, мы посовещались, и решили считать его новым государством под&#10;названием Соединенные Штаты Абсента (США).&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Когда нас выкидывали из самолета, то багажа нам, естественно, не&#10;выдали. Поэтому, всех материальных и нематериальных активов у нас -&#10;только туалетная дверь, которую Вы таки прихватили с собой. И вообще,&#10;несмотря на абсент, Вы у нас оказались самым запасливым - в бумажнике&#10;у Вас, совершенно случайно, обнаружилась банкнота в $100. Таким&#10;образом, в наших США имеются нефинансовые активы - дверь, и финансовые&#10;активы, они же денежная масса - $100. Это все наши сбережения.&#10;Поскольку у нас больше вообще ничего нет, то можно сказать и так - у&#10;нас есть один материальный актив - дверь, обеспеченный денежной массой&#10;в $100. Т. е. наша дверь стоит $100.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Немного протрезвев, мы решаем, что надо как-то обустраиваться. Самый&#10;быстрый из нас оказался Хроноскопист. Он тут же объявил, что создает&#10;банк и готов взять в рост имеющиеся у населения денежные сбережения&#10;под 3% годовых - ну не сидится человеку без дела. Вы отдаете ему&#10;$100, и он их записывает в блокнот в статью &amp;ldquo;Пассивы - Дипазиты&amp;rdquo;.&#10;Но я тоже не лаптем щи хлебал - зря я что ли столько времени занимаюсь&#10;расследованием экономического мухлежа - я знаю как изъять у Вас и&#10;дверь и $100. Я предлагаю Вам взять Ваши $100 в рост под 5% годовых.&#10;Вырываю листик из своего блокнота и пишу на нем - &amp;ldquo;Аблегиция на $100&#10;под 5% годовых&amp;rdquo;. Вы чувствуете, что Вам поперло. Забираете деньги у&#10;расстроенного Хроноскописта с дипазита и отдаете их мне в обмен на мою&#10;аблегацию.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Я беру Ваши $100 и кладу их на дипозит в банк обратно обрадованного&#10;Хроноскописта.&lt;br&gt;&#10;По хорошему, на этом можно было бы и успокоиться и пойти всем&#10;заняться делом - пальму потрясти или за моллюсками понырять, снискать&#10;себе хлеб насущный, так сказать. Но Вы ж знаете - я неуемный&#10;финансовый гений, такие пустяки как кокосы и устрицы меня не&#10;интересуют. Помыкавшись по нашему острову - 50 шагов от южного&#10;побережья до северного, и 30 с запада на восток, я придумываю&#10;гениальную комбинацию. Я подхожу к Вам и предлагаю на пустом месте&#10;заработать еще 1% годовых. Взять в банке Хроноскописта кредит под 4%,&#10;и купить у меня еще одну аблигацию под 5%. Вторую аблегацию на $100 я&#10;тут же выписываю на блокнотном листике, и машу ею у Вас перед носом.&#10;Недолго думая, Вы бежите в банк и берете кредит $100 под залог моей&#10;первой аблегации на $100. Они там есть - я их туда положил на&#10;дипазит. Вы отдаете мне заемные $100 и прячете вторую аблегацию к&#10;себе в бумажник - теперь у Вас есть моих аблегаций на $200. А $100 я&#10;кладу в банк - теперь у меня там $200 на дипазите. Хроноскопист аж&#10;подпрыгивает от радости - кредитный бизнес попер.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Думаете я на этом остановлюсь? Ага, сейчас - я уже выписал Вам третью&#10;аблегацию. Бегом в банк за кредитом под залог второй аблегации. Ближе&#10;к вечеру, набегавшись по острову с этой сотней баксов и изодрав все&#10;листочки из блокнота на аблегации, мы имеем следующую картину. У Вас&#10;на $5000 моих аблегаций, а у меня на $5000 дипазитов в банке.&#10;Теперь, я чувствую, что пришло время прибрать Вашу дверь к рукам. Я&#10;предлагаю купить ее у Вас за $100. Но Вы вредничаете - дверь-то всего&#10;одна, и заламываете цену в $1000. Ну, $1000 так $1000 - в конце&#10;концов у меня на депозите лежит целых $5000. Я на последнем&#10;блокнотном листочке направляю платежное поручение Хроноскописту,&#10;перевести $1000 с моего дипазита на Ваш, и забираю Вашу дверь.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Если нашу бухгалтерию отдать американскому экономисту с гарвардским&#10;дипломом, он сообщит нам, что наши США располагают $1000 материальных&#10;активов в виде двери, и $10000 финансовых активов в виде аблегаций и&#10;дипазитов. Т. е. что стоимость нашего совокупного имущества&#10;увеличилась за день в 110 раз.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Менее тонкий и образованный человек сказал бы, что мы - три дебила, у&#10;нас как была одна дверь и $100, так и осталось, и что только&#10;конченные дебилы могли целый день рвать листочки из блокнота, вместо&#10;того, чтобы нарвать кокосов. Кто из них прав - решайте сами. Но&#10;механизм относительного роста цен на дома именно такой, что в США, что&#10;в Японии, что в России.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Percona Server Configuration Wizard</title><link>https://blog.rpsl.info/2012/07/percona-server-configuration-wizard/</link><pubDate>Thu, 05 Jul 2012 10:38:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/07/percona-server-configuration-wizard/</guid><description>&lt;p&gt;Возможность генерировать удобный конфиг для mysql прямо &lt;a href="https://tools.percona.com/"&gt;на сайте перконы&lt;/a&gt; для меня стало открытием. Есть возможность указать различные характеристики железа и роль данного сервера, а сайт постарается подобрать оптимальные настройки.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/percona-server-configuration-wizard/80bf635c97274dbdf097c04e6155555e.jpg" alt="percona"&gt;&lt;/p&gt;&#10;&lt;p&gt;Проходим небольшой тест, отвечая на вопросы и на выходе имеем подобный конфиг:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;# Generated by Percona Configuration Wizard (http://tools.percona.com/) version REL5-20120208&#10;# Configuration name zlo generated for gmail@rpsl.info at 2012-07-05 10:31:23&#10;&#10;[mysql]&#10;&#10;# CLIENT #&#10;port = 3306&#10;socket = /srv/mysql/mysql/mysql.sock&#10;&#10;[mysqld]&#10;&#10;# GENERAL #&#10;user = mysql&#10;default_storage_engine = InnoDB&#10;socket = /srv/mysql/mysql/mysql.sock&#10;pid_file = /srv/mysql/mysql/mysql.pid&#10;&#10;# MyISAM #&#10;key_buffer_size = 32M&#10;myisam_recover = FORCE,BACKUP&#10;&#10;# SAFETY #&#10;max_allowed_packet = 16M&#10;max_connect_errors = 1000000&#10;skip_name_resolve&#10;sysdate_is_now = 1&#10;innodb = FORCE&#10;&#10;# DATA STORAGE #&#10;datadir = /srv/mysql/mysql/&#10;&#10;# CACHES AND LIMITS #&#10;tmp_table_size = 32M&#10;max_heap_table_size = 32M&#10;query_cache_type = 0&#10;query_cache_size = 0&#10;max_connections = 500&#10;thread_cache_size = 50&#10;open_files_limit = 65535&#10;table_definition_cache = 1024&#10;table_open_cache = 256&#10;&#10;# INNODB #&#10;innodb_flush_method = O_DIRECT&#10;innodb_log_files_in_group = 2&#10;innodb_log_file_size = 128M&#10;innodb_flush_log_at_trx_commit = 1&#10;innodb_file_per_table = 1&#10;innodb_buffer_pool_size = 1456M&#10;&#10;# LOGGING #&#10;log_error = /srv/mysql/mysql/mysql-error.log&#10;log_queries_not_using_indexes = 1&#10;slow_query_log = 1&#10;slow_query_log_file = /srv/mysql/mysql/mysql-slow.log&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ну и в качестве бонуса, рекомендую почитать доклад &amp;ldquo;[Optimizing MySQL Configuration](&lt;a href="http://www.percona.com/files/presentations"&gt;http://www.percona.com/files/presentations&lt;/a&gt; WEBINAR2012-03-Optimizing-MySQL-Configuration.pdf)&amp;rdquo; от Percona&lt;/p&gt;</description></item><item><title>Nginx allow POST static files</title><link>https://blog.rpsl.info/2012/07/nginx-allow-post-static-files/</link><pubDate>Tue, 03 Jul 2012 14:10:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/07/nginx-allow-post-static-files/</guid><description>&lt;p&gt;dotZero, этим утром выложил &lt;a href="http://blog.dotzero.ru/2012/7/3/nginx-facebook-iframe/"&gt;свое решение проблемы&lt;/a&gt;, но мне оно показалось не правильным, поэтому я предлагаю свой вариант.&lt;/p&gt;&#10;&lt;p&gt;Мое решение лучше тем, что оно не требует поднятия второго сервера на отдельном порту и вообще эстетически красивое.&lt;/p&gt;&#10;&lt;p&gt;Кратко о проблеме:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Все знают о том что в Facebook&amp;rsquo;e есть iframe страницы, но не все знают&#10;что Facebook эти страницы запрашивает через POST, а не через GET, как&#10;делают все остальные. Поэтому все fb:iframe приложения запрашивая у&#10;Nginx&amp;rsquo;а страницы в ответ будут получать ошибку:&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;405 &amp;ldquo;Method Not Allowed&amp;rdquo;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Вариант который предлагает dotZero выглядит примерно вот так (это я для истории и поисковых запросов оставлю):&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;upstream&lt;/span&gt; &lt;span style="color:#0a3069"&gt;fb_static&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;server&lt;/span&gt; localhost&lt;span style="color:#1f2328"&gt;:&lt;/span&gt;&lt;span style="color:#0550ae"&gt;8001&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;server&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;listen&lt;/span&gt; &lt;span style="color:#0550ae"&gt;443&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;server_name&lt;/span&gt; &lt;span style="color:#0a3069"&gt;_&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#57606a"&gt;#allow_static_post on;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;error_page&lt;/span&gt; &lt;span style="color:#0550ae"&gt;405&lt;/span&gt; &lt;span style="color:#1f2328"&gt;=&lt;/span&gt;&lt;span style="color:#0550ae"&gt;200&lt;/span&gt; &lt;span style="color:#0a3069"&gt;@405&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;location&lt;/span&gt; &lt;span style="color:#0a3069"&gt;@405&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;proxy_method&lt;/span&gt; &lt;span style="color:#0a3069"&gt;GET&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;proxy_pass&lt;/span&gt; &lt;span style="color:#0a3069"&gt;http://fb_static&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;server&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;listen&lt;/span&gt; &lt;span style="color:#0550ae"&gt;8001&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;server_name&lt;/span&gt; &lt;span style="color:#0a3069"&gt;_&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;location&lt;/span&gt; &lt;span style="color:#0a3069"&gt;/&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;root&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;/var/www/fb&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Вариант конечно хороший и самое главное рабочий. Но давайте попробуем так:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;server&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;listen&lt;/span&gt; &lt;span style="color:#0550ae"&gt;80&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;server_name&lt;/span&gt; &lt;span style="color:#0a3069"&gt;_&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#57606a"&gt;# Тут мы описываем поведение&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#57606a"&gt;# для нашей кастомной ошибки&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;error_page&lt;/span&gt; &lt;span style="color:#0550ae"&gt;405&lt;/span&gt; &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#953800"&gt;$uri&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#57606a"&gt;# Дефолтный location&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;location&lt;/span&gt; &lt;span style="color:#0a3069"&gt;/&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;access_log&lt;/span&gt; &lt;span style="color:#0550ae"&gt;off&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;root&lt;/span&gt; &lt;span style="color:#0a3069"&gt;/srv/path&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;try_files&lt;/span&gt; &lt;span style="color:#953800"&gt;$uri&lt;/span&gt; &lt;span style="color:#953800"&gt;$uri/index.html&lt;/span&gt; &lt;span style="color:#0a3069"&gt;/index.php&lt;/span&gt;&lt;span style="color:#953800"&gt;$is_args$args&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Что тут происходит? Мы складываем весь статический контент который будет запрашивать facebook в отдельную директорию, просто, для красоты. Определяем location для этой директории, который будет всегда возвращать код ошибки, например, 599. И определяем поведение для обработки этой ошибки, как попытку отдать данные по этому урлу.&lt;/p&gt;&#10;&lt;p&gt;Вот и все, работает. Читайте мануалы.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;UPD:&lt;/strong&gt; вернул конфиг до состояние обработки напрямую 405 error_page, т.к. поведение описанное до этого, не совсем соответствовало реальности.&#10;Таким образом, после запроса файла через POST, будет выдана 405 ошибка, которая обработается в &lt;code&gt;error_page 405 = $uri&lt;/code&gt; и будет отправлена в &lt;code&gt;location /&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;То есть либо файл найдется и будет отдан, либо управление будет передано в &lt;code&gt;index.php&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>PHP: detect UTF-8</title><link>https://blog.rpsl.info/2012/07/php-detect-utf-8/</link><pubDate>Mon, 02 Jul 2012 07:39:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/07/php-detect-utf-8/</guid><description>&lt;p&gt;Пару недель назад, мне кто-то доказывал, что mb_detect_encoding, работает в разы быстрее своих надуманных конкурентов. Задача простая, проверить входящую строку на принадлежность к UTF-8. Логика простая, либо UTF-8, либо нет. В повседневной жизни, обычно не приходится выбирать из зоопарка кодировок и, чаще всего, строка либо в utf8, либо в cp1251.&lt;/p&gt;&#10;&lt;p&gt;Сделал простой синтетический тест. Прогнал определение через функцию 10000 раз. Посмотрел кто быстрее.&lt;/p&gt;&#10;&lt;p&gt;Вариант 1, который мне нравится:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$s&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;microtime&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#cf222e"&gt;true&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;for&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$i&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#0550ae"&gt;0&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt; &lt;span style="color:#953800"&gt;$i&lt;/span&gt;&lt;span style="color:#0550ae"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;10000&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt; &lt;span style="color:#953800"&gt;$i&lt;/span&gt;&lt;span style="color:#0550ae"&gt;++&lt;/span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;$string&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;sdf;gklaj;skdjf;sdkfls;dfjk&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;if&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#1f2328"&gt;preg_match&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;//u&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#953800"&gt;$string&lt;/span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$e&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;microtime&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#cf222e"&gt;true&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;echo&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\n\n&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#953800"&gt;$e&lt;/span&gt;&lt;span style="color:#0550ae"&gt;-&lt;/span&gt;&lt;span style="color:#953800"&gt;$s&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Средний результат выполнения скрипта на моей машине ~0.020 сек. Сравнивал я его с более правильным решением, которое выглядит так:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$s&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;microtime&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#cf222e"&gt;true&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;for&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$i&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#0550ae"&gt;0&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt; &lt;span style="color:#953800"&gt;$i&lt;/span&gt;&lt;span style="color:#0550ae"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;10000&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt; &lt;span style="color:#953800"&gt;$i&lt;/span&gt;&lt;span style="color:#0550ae"&gt;++&lt;/span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;$string&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;sdf;gklaj;skdjf;sdkfls;dfjk&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;mb_detect_encoding&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$string&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#cf222e"&gt;array&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;UTF-8&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;),&lt;/span&gt; &lt;span style="color:#cf222e"&gt;true&lt;/span&gt; &lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$e&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;microtime&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#cf222e"&gt;true&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;echo&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\n\n&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#953800"&gt;$e&lt;/span&gt;&lt;span style="color:#0550ae"&gt;-&lt;/span&gt;&lt;span style="color:#953800"&gt;$s&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Средний результат выполнения скрипта на моей машине ~0.050 сек.&#10;После этих тестов, решил прогнать на больших объемах данных, сгенерировал текст размером 10к байт и пропустил через функции.&#10;Для preg_match время выполнения составило ~0.120 сек, для mb_detect_encoding ~0.7 сек.&#10;Из этих изысканий можно сделать вывод, что определение через preg_match работает в разы быстрее чем стандартные механизмы, но, вероятно, проигрывает в количестве доступых фич.&lt;/p&gt;&#10;&lt;p&gt;На самом деле, есть еще три миллиона разных способов решить эту задачу, расскажите чем пользуетесь вы?&lt;/p&gt;</description></item><item><title>Про webmoney</title><link>https://blog.rpsl.info/2012/06/pro-webmoney/</link><pubDate>Fri, 29 Jun 2012 07:10:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/06/pro-webmoney/</guid><description>&lt;p&gt;В прошлом посте я писал про молоток, вспомнил, что несколько месяцев&#10;назад со мной приключилась беда. Каким то неведомы макаром, мои ключи к&#10;киперу стали не действительными. Примерно в это же время, на одном&#10;несуществующем сайте, появился чувак который занимает руководящую&#10;должность в этой конторе. Он попросил всех рассказать свои &lt;em&gt;&lt;span&#10;style="color: #ff0000;"&gt;success story&lt;/span&gt;&lt;/em&gt; про пользование системой.&#10;Ну вот я и рассказал. Сюда перенесу на память.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/pro-webmoney/f943d6c04ee76aaa61ada62a9f04ce94.png" alt="webmoney"&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Есть у меня виртуалка, живет уже много лет, в ней крутится только Win&#10;XP и кипер класик. Апдейты там еще какие–то ставятся хз. Кроме кипера&#10;и Google Chrome в ней вообще ничего нету используется раз в месяц для&#10;вывода денег из sape и транзита этих денег на оплату мобильника,&#10;инета, серверов.&lt;/p&gt;&#10;&lt;p&gt;Нажал в сапе на вывод денег, через пару дней запускаю виртуалку, т.к.&#10;деньги уже должны придти, ебать–колотить–супер–ошибка, вы вводите&#10;правильный пароль от файла ключей, но не правильный пароль от&#10;аккаунта. &lt;span style="color: #ff0000;"&gt;&lt;em&gt;Наркоман штоле сука?&lt;/em&gt;&lt;/span&gt;,&#10;ну ок, следую инструкциям, нахожу в бэкапе файл ключей, скармливаю его&#10;киперу — вы используете устаревший файл ключей, блядь, да вы же сами&#10;просили его сохранить на дискету, не менял я пароли в кипере, вообще&#10;ничего не делал кроме как получить деньги — заплатить деньги. Пиздуйте&#10;на наш сайт, авторизуйтесь, подтвердите емаил, введи код из смс,&#10;заполните заявку на восстановление, авторизуйтесь, введите код из смс,&#10;сколько денег на счету? какие ваши доказательства? какой айпи? укажите&#10;емаил? фамилия вашей кузины, пришлите нотариально заверенную сетчатку&#10;глаза? Молодец, для подвтерждения что вы это вы загрузите сканы вашего&#10;пасспорта. Вы наркоманы там, у меня кипер к альфе привязан, у меня&#10;есть ебучий аттестат который я заебался получать, который гарантирует&#10;что я это я. Заявка без документов отменена. Начианайте квэст заново.&lt;/p&gt;&#10;&lt;p&gt;Через пару дней собрался силами и прошел этот квест снова, далее&#10;неделя ожидания и куча ебанутых писем на почту о статусе моей заявки&#10;&amp;ldquo;Костя из саппорта проверил ваши данные&amp;rdquo;, &amp;ldquo;Дима из саппорта подтвердил&#10;ваши данные&amp;rdquo;, &amp;ldquo;Ваша заявка передана из отдела саппорта в отдел&#10;заявок&amp;rdquo; — Нахуй мне это знать??? Мне важно что заявка получена вами и&#10;что на нее пришел ответ. Спустя неделю получил новый файл ключей,&#10;залогинился, снова, блядь, активируйте вашу систему, ссылка&#10;отправленна на почту.&lt;/p&gt;&#10;&lt;p&gt;Потом я уже почитал этот пост, решил сделать себе из кипер классик —&#10;кипер мини, енум, клиент для мака, полтора часа попыток понять что это&#10;и нахуй оно вообще нужно, 2000 пройденых каптч, 50 полученых смс и&#10;ачивка &amp;ldquo;Вебмани в МакОС&amp;rdquo; получена.&lt;/p&gt;&#10;&lt;p&gt;Спасибо. Охуеть. Сдохните.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Молоток.ру и забота о пользователях</title><link>https://blog.rpsl.info/2012/06/molotok-ru-i-zabota-o-pol-zovatelyah/</link><pubDate>Wed, 27 Jun 2012 07:56:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/06/molotok-ru-i-zabota-o-pol-zovatelyah/</guid><description>&lt;p&gt;В последнее время я достаточно щепетильно отношусь к своему почтовому ящику. Я начал это делать, после того как понял, что мне в день приходит более сотни левых писем о всяких акциях, скидках, конкурсах и прочие дайджест рассылки. Я отписался от 90% сервисов которые не представляют для меня интереса и жизнь вроде наладилась, дышать стало свободнее. Только остаются некоторые уебищные сервисы, отписаться от которых - дикий квест. Молоток.ру один из таких. Не помню по какому роковому стечению обстоятельств лет 8 назад я случайно завел там аккаунт, но точно помню, что с тех пор я его больше не посещал, а вот письма со всякой херней они продолжают слать мне до сих пор.&lt;/p&gt;&#10;&lt;p&gt;У вас кстати есть карточка от много.ру? Я ее случайно лет 10 назад завел. Прошло лет 9 как я ее потерял, но письма они продолжают слать, у них видимо не хватает мозгов додумать, что аккаунты которые не подавали активности последние 10 лет можно считать не валидными.&lt;/p&gt;&#10;&lt;p&gt;Так вот, возвращаясь к молотку. Как меня бесит, что нельзя отписаться от рассылки в один клик. Чтобы отписаться от рассылки, нужно пройти на их сайт, войти в свой аккаунт и там настроить систему уведомлений.&lt;/p&gt;&#10;&lt;p&gt;Ну ок, давайте попробуем так сделать. После ввода своего логина (для восстановления пароля), оказывается я должен ввести &amp;ldquo;некую&amp;rdquo; секретную фразу, которая, видимо, является вторым паролем. У меня такой нету, соответственно я должен пройти процедуру установки этой секретной фразы, несколько валидаций, только что бы отписаться от их рассылки. И что самое уебищное, то, что раздел &amp;ldquo;обратная связь&amp;rdquo;, тоже, работает только с авторизованными пользователями.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/molotok-ru-i-zabota-o-pol-zovatelyah/999a743b71233d1126f695765564fee6.png" alt="trololo"&gt;&lt;/p&gt;&#10;&lt;p&gt;Главной мыслью этой заметки является обращение к веб мастерам. &lt;strong&gt;Пожалуйста, делайте то, что нужно пользователям, а не то, чем вы занимаетесь.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt; &lt;/p&gt;</description></item><item><title>Nginx detect mobile browser</title><link>https://blog.rpsl.info/2012/06/nginx-detect-mobile-browser/</link><pubDate>Mon, 25 Jun 2012 07:11:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/06/nginx-detect-mobile-browser/</guid><description>&lt;p&gt;Регулярка для Nginx&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;set&lt;/span&gt; &lt;span style="color:#953800"&gt;$mobile_rewrite&lt;/span&gt; &lt;span style="color:#0a3069"&gt;do_not_perform&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;if&lt;/span&gt; &lt;span style="color:#0a3069"&gt;(&lt;/span&gt;&lt;span style="color:#953800"&gt;$http_user_agent&lt;/span&gt; &lt;span style="color:#1f2328"&gt;~&lt;/span&gt;&lt;span style="color:#0a3069"&gt;*&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;android.+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge|maemo|midp|mmp|netfront|opera&lt;/span&gt; &lt;span style="color:#0a3069"&gt;m(ob|in)i|palm(os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows&lt;/span&gt; &lt;span style="color:#0a3069"&gt;(ce|phone)|xda|xiino&amp;#34;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;set&lt;/span&gt; &lt;span style="color:#953800"&gt;$mobile_rewrite&lt;/span&gt; &lt;span style="color:#0a3069"&gt;perform&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;if&lt;/span&gt; &lt;span style="color:#0a3069"&gt;(&lt;/span&gt;&lt;span style="color:#953800"&gt;$http_user_agent&lt;/span&gt; &lt;span style="color:#1f2328"&gt;~&lt;/span&gt;&lt;span style="color:#0a3069"&gt;*&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a&lt;/span&gt; &lt;span style="color:#0a3069"&gt;wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r&lt;/span&gt; &lt;span style="color:#0a3069"&gt;|s&lt;/span&gt; &lt;span style="color:#0a3069"&gt;)|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1&lt;/span&gt; &lt;span style="color:#0a3069"&gt;u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;i|ip)|hs\-c|ht(c(\-||_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(|\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;|\/)|klon|kpt&lt;/span&gt; &lt;span style="color:#0a3069"&gt;|kwc\-|kyo(c|k)|le(no|xi)|lg(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-|&lt;/span&gt; &lt;span style="color:#0a3069"&gt;|o|v)|zz)|mt(50|p1|v&lt;/span&gt; &lt;span style="color:#0a3069"&gt;)|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v&lt;/span&gt; &lt;span style="color:#0a3069"&gt;)|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|&lt;/span&gt; &lt;span style="color:#0a3069"&gt;)|webc|whit|wi(g&lt;/span&gt; &lt;span style="color:#0a3069"&gt;|nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)&amp;#34;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;set&lt;/span&gt; &lt;span style="color:#953800"&gt;$mobile_rewrite&lt;/span&gt; &lt;span style="color:#0a3069"&gt;perform&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;if&lt;/span&gt; &lt;span style="color:#0a3069"&gt;(&lt;/span&gt;&lt;span style="color:#953800"&gt;$mobile_rewrite&lt;/span&gt; &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;perform)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;rewrite&lt;/span&gt; &lt;span style="color:#0a3069"&gt;^&lt;/span&gt; &lt;span style="color:#0a3069"&gt;http://m.site.com/&lt;/span&gt; &lt;span style="color:#0a3069"&gt;redirect&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;break&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ну и собственно &lt;a href="http://detectmobilebrowsers.com/"&gt;вот тут&lt;/a&gt; собранные подобные рецепты для различных языков и сервисов.&lt;/p&gt;</description></item><item><title>7000 rps на Nginx - Achievement unlocked</title><link>https://blog.rpsl.info/2012/06/7000-rps-na-nginx-achievement-unlocked/</link><pubDate>Sun, 03 Jun 2012 14:48:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/06/7000-rps-na-nginx-achievement-unlocked/</guid><description>&lt;p&gt;Вчера, мой уютный сервачок подвергся очередному стресс тесту.&lt;/p&gt;&#10;&lt;p&gt;Для тех кто не в теме, у меня тут еще живет сайт и форум &lt;a href="http://centrgroup.ru"&gt;группы CENTR&lt;/a&gt;, а вчера в Питере проходил концерт HipHop All Stars 2012. Организаторы повели себя достаточно круто и предложили всем заинтересованным смотреть прямую трансляцию с концерта. Мы стали одним из проектов, которые на главной странице разместили флеш плеер, по которому велась трансляция. Что бы людям не было скучно, подключил еще и комментарии от Вконтакте.&lt;/p&gt;&#10;&lt;p&gt;Респект Вконтакту, в пиковые моменты комментарии в прямом эфире появлялись со скоростью 3-4 штуки в секунду. Всего за день на странице появилось примерно 15 000 комментариев.&lt;/p&gt;&#10;&lt;p&gt;Когда я вечером зашел посмотреть модные графики, то был приятно удивлен. Пиковая нагрузка на MySQL была примерно 3000 rpm, на Nginx ~8000 rps.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/7000-rps-na-nginx-achievement-unlocked/f424e13b883b2b8a599e61749d46b3b1.png" alt="mysql"&gt;&lt;/p&gt;&#10;&lt;p&gt;Cудя по логам, ни одного slow request не было, как и не было 404 и 50x страниц.&lt;/p&gt;&#10;&lt;p&gt;Пользуясь случаем, еще раз рекламирую &lt;a href="https://firstvds.ru/?from=17604"&gt;свой хостинг&lt;/a&gt;, а тем кто станет моим рефералом обещаю оказывать всяческое содействие.&lt;/p&gt;</description></item><item><title>PHP Memoize</title><link>https://blog.rpsl.info/2012/06/php-memoize/</link><pubDate>Fri, 01 Jun 2012 11:41:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/06/php-memoize/</guid><description>&lt;p&gt;Вчера ради интереса пересматривал pecl каталог модулей для php, наткнулся на интересный модуль memoize. Вспомнил, что сам делал его реализацию на уровне php+memcached.&lt;/p&gt;&#10;&lt;p&gt;Идея модуля крайне проста, у вас есть функция, результаты которой зависят исключительно от входных параметров, с помощью memoize можно закэшировать результаты выполнения и в последующие вызовы пересчет производиться не будет.&lt;/p&gt;&#10;&lt;p&gt;Так же нужно понимать, что код будет выполнен только один раз, поэтому использование, например, sql запросов в ф-ции не допустимо. Недопустимо использование global и его аналогов &lt;code&gt;Static::$data&lt;/code&gt;, недопустимо использование ветвлений в зависимости от времени или окружения.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;function&lt;/span&gt; &lt;span style="color:#6639ba"&gt;my_expensive_function&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#953800"&gt;$x&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;sleep&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0550ae"&gt;10&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;return&lt;/span&gt; &lt;span style="color:#953800"&gt;$x&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;bar&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;memoize&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;my_expensive_function&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;// now calls to my_expensive_function() are cached by their arguments&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;echo&lt;/span&gt; &lt;span style="color:#1f2328"&gt;my_expensive_function&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt; &lt;span style="color:#57606a"&gt;// returns &amp;#34;foobar&amp;#34; in 10s&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;echo&lt;/span&gt; &lt;span style="color:#1f2328"&gt;my_expensive_function&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt; &lt;span style="color:#57606a"&gt;// returns &amp;#34;foobar&amp;#34; in 0.0001s&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;В общем идея понятна, на уникальность никак не претендует, но свою нишу может занять. Зачем использовать свой велосипед?&lt;/p&gt;</description></item><item><title>В уме</title><link>https://blog.rpsl.info/2012/05/v-ume/</link><pubDate>Sun, 20 May 2012 12:06:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/05/v-ume/</guid><description>&lt;p&gt;Я, вообще, редко занимаюсь рекламой софта, а тем более приложений для айфона, поэтому когда такое происходит, значит что продукт действительно хороший.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/v-ume/012886b773b5f93e8dd09a7c4f994d14.jpg" alt="v-ume"&gt;&lt;/p&gt;&#10;&lt;p&gt;В следующий раз, когда вы пройдете очередное обновление Angry Birds и полезете в AppStore в поисках новой убивалки времени, то вместо игрушек, поставьте себе это приложение. «В уме» — это сборник математических задач на устный счет. Задачи действительно интересные. И больше всего меня радует сам форм-фактор, да, это именно та игрушка с которой удобно работать, например, в транспорте. Нет нужды постоянно фокусироваться на экране, тут ничего не зависит от твоей ловкости и координации, только полезная разминка для мозгов.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/v-ume/d1f400e6c07d6e0fb523f1549e3a4a56.jpg" alt="v-ume"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/v-ume/d5dc36b8c9405e5d821fbfda76d20cac.jpg" alt="v-ume"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://itunes.apple.com/ru/app/v-ume/id482487701?mt=8"&gt;Ссылка в AppStore&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Варианты загрузки</title><link>https://blog.rpsl.info/2012/05/varianty-zagruzki/</link><pubDate>Thu, 17 May 2012 06:30:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/05/varianty-zagruzki/</guid><description>&lt;p&gt;Меня добивает на некоторых сайтах страницы загрузки софта. Сегодня с утра скачивал новый релиз &lt;a href="http://confluence.jetbrains.net/display/WI/Web+IDE+EAP"&gt;PhpStorm&lt;/a&gt;, обратите внимание на список.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/varianty-zagruzki/82eed664663b7d049a0e137db589d897.png" alt="phpstorm-download"&gt;&lt;/p&gt;&#10;&lt;p&gt;Windows, Mac OS X, Unix, ZIP. &lt;strong&gt;ZIP!&lt;/strong&gt;. Вот что там внутри? Под какую это платформу?&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/varianty-zagruzki/010170560cbbf87900de46e8f403f157.png" alt="phpstorm-download"&gt;&lt;/p&gt;&#10;&lt;p&gt;Внутри там, кстати, бинарники для windows&lt;/p&gt;</description></item><item><title>Вернемся к этому позже</title><link>https://blog.rpsl.info/2012/05/vernemsya-k-e-tomu-pozzhe/</link><pubDate>Sat, 12 May 2012 08:53:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/05/vernemsya-k-e-tomu-pozzhe/</guid><description>&lt;p&gt;Внезапно понял какой фичи мне не хватает в Gmail.&lt;/p&gt;&#10;&lt;p&gt;Я очень хочу, что бы появился плагин, который позволяет отметить письмо&#10;как &amp;ldquo;временно прочитанное&amp;rdquo;. Например: приходит мне днем письмо с&#10;напоминанием оплатить сервера или прочитать интересную статью, днем у&#10;меня нету времени или возможности этим заниматься и к данным вещам нужно&#10;будет вернуться вечером. Если оставить это письмо не прочитанным, чтобы&#10;не забыть вечером на него среагировать, то оно будет целый день мешаться&#10;на видном месте, почтовый клиент будет говорить что есть новые письма, а&#10;иконка на айфоне будет надоедать цифрой в красном кружке. С другой&#10;стороны, если отметить его как прочитанное, то велика вероятность забыть&#10;о нем и оно потеряется в сотне других писем проходящих через мой ящик.&lt;/p&gt;&#10;&lt;p&gt;Некоторые решают эту проблему с помощью хитрой системы ярлыков, другие&#10;держат под рукой evernote или remember the milk, а мне лень отвлекаться&#10;и делать столько действий, просто чтобы не забыть, уж лучше запомнить,&#10;реально.&lt;/p&gt;&#10;&lt;p&gt;Мне нужна простая кнопка, которая позволяет отметить письмо как&#10;прочитанное, а через 6 или 12 часов сделает его снова не прочитанным, а&#10;потом я смогу еще раз ее нажать и в итоге я не буду отвлекаться на новые&#10;письма, никогда не потеряю их в груде других вещей и отреагирую, когда&#10;будет время или посчитаю это нужным.&lt;/p&gt;&#10;&lt;p&gt;Реально, эта фича спасла бы мир.&lt;/p&gt;</description></item><item><title>Failed to validate oauth signature and token</title><link>https://blog.rpsl.info/2012/02/failed-to-validate-oauth-signature-and-token/</link><pubDate>Tue, 07 Feb 2012 18:05:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/02/failed-to-validate-oauth-signature-and-token/</guid><description>&lt;p&gt;На досуге, решил навоять один сервис, который тесно интегрирован с социальными сетями, в частности с твиттером. Во время работы, натолкнулся на интересную ошибку, в &amp;ldquo;некоторый момент&amp;rdquo;, апи твиттера вылетает и начинает на любые запросы отдавать 401 ошибку. Не авторизован ты и все.&lt;/p&gt;&#10;&lt;p&gt;Ну, а я чё? Я парень простой и решил идти по дебаг трейсу и разбираться в чем ошибка. Предварительно я конечно погуглил эту проблему и даже почитал автора либы которую я использую для связи с твиттером, но решений там не нашел.&lt;/p&gt;&#10;&lt;p&gt;Тихо и не спеша, я просрал на это дело около трех вечеров, по 1-2 часа вечером выделяю на проекты. Что самое странное, апи то работало, то не работало и уловить динамику появления ошибки у меня не получалось.&lt;/p&gt;&#10;&lt;p&gt;А решение, как обычно было рядом, проблема была в том, что я захлопывал крушку ноутбука :D Точнее так, сервисы я стараюсь сразу делать в родной среде, тобишь на линуксе, для этих делов, у меня есть virtualbox, в котором живут виртуалки с линуксом. Пока я работаю над одним сервисом, выключать виртуалки не приходится. Я их просто перетащил на другой рабочий стол и сижу себе спокойно по ssh, делаю tail -f на лог ошибок.&lt;/p&gt;&#10;&lt;p&gt;Собственно, паттерн работы с ноутбуком, подразумевает что выключать его приходится редко, а засыпать часто. Ну и вот, после просыпания, в виртуалках время не синхронизировалось, а оставалось тем, в какой момент ноутбук засыпал. Из-за этого, при подписывание запросов, они подписывались не правильно и апи твиттера посылал меня на фиг считая жуликом.&lt;/p&gt;</description></item><item><title>Про ценообразование при разработке сайтов.</title><link>https://blog.rpsl.info/2012/01/pro-tsenoobrazovanie-pri-razrabotke-sajtov/</link><pubDate>Mon, 23 Jan 2012 08:38:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/01/pro-tsenoobrazovanie-pri-razrabotke-sajtov/</guid><description>&lt;p&gt;Наткнулся на замечательный текст, от парня из&#10;&lt;a href="http://owlbox.ru/"&gt;OwlBox&lt;/a&gt;. Хочу сохранить сюда на память, что бы&#10;перечитывать когда в очередной раз мне предложат &amp;ldquo;помочь с сайтом&amp;rdquo; за&#10;кегу пива.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Каждый раз, когда я начинал трогать мышку менее чем за 1000$ я потом&#10;сильно жалел, не бывает &amp;ldquo;простеньких сайтов&amp;rdquo;, аппетит приходит во&#10;время еды, требования плывут, и все в рот имели итеративный подход,&#10;если итерации сопровождаются соответствующими выплатами и этапами по&#10;договору. Это даже с точки зрения бухгактерии не выгодно. Это нижний&#10;порог. У хороших студий эта планка в 10 раз выше. На мой взгляд это&#10;правильная политика. При скудном бюджете есть миллион разных способов&#10;продвижения в интернете своих услух, не требующих сайта, работающего&#10;на имидж или выполняющего роль инструмента продаж.&lt;br&gt;&#10;Если обсуждается сумма ниже 1000$ — мы друг–друга просто не поймем,&#10;может быть кто–то другой поймет. От заказов нужно уметь оказываться.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Имидж — это декларация того, что мы можем потратить приличные бабки за&#10;хороший, годный, красивый и эффективный относительно целей заказчика&#10;сайт. Возможны комбинации. Но ключевой момент — потратить бабки и&#10;какие–то положительные свойства сайта. Я принципиально против того,&#10;что унитаз, покрытый позолотой эквивалентен золотому унитазу и вообще&#10;когда одно выдается за другое. Так как то, что король голый, как&#10;правило, все равно очевидно. Ну если вы не являетесь говносыночком&#10;пидораса из говноправительства, заказывающего сайт для говносколково.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Средний ценник среднего проекта под ключ у меня получается в районе&#10;$5000. Всякая верстка — это 1–15% от объема работ работы. Основной&#10;объем падает на тестирование и удовлетворение меняющихся требований.&#10;Пусть дизайн будет 1000$, программирование — 1000$ верстка и&#10;изготовление графического контента — еще $1000. На пальцах — это&#10;расклад при котором все участники процесса довольны.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;С огромной вероятностью стоимость проекта относительно объема работ в&#10;итоге составит 5000–10000$ — косвенные расходы, непредвиденные&#10;работы, тестирование, изменений, детализация требований,&#10;дополнительные встречи с заказчиком, переговоры и т.д. Вот и&#10;получилось x2.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Если натягивается готовый шаблон на готовый движок, то все равно&#10;внезапно окажется что у нас не два уровня иерархии разделов, а&#10;все–таки 3, секретарша не справляется с wysywig редактором, гамма&#10;должна быть несколько светлее, внезапно образуется еще 200 единиц&#10;графического контента, шаблон выглядит как полное говно в IE6, которым&#10;пользуется заказчик из–за своей внутрикорпоративной политики и т.д.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Если вы не поняли — именно на это говно уйдет половина вашей работы.&#10;Если вам заказывают сайт по вашей оценке на 10k$, но бюджет заказчика&#10;позволяет всего лишь 7,5k$ а сам он видел что &amp;ldquo;что–то такое же&amp;rdquo;&#10;вообще делали за штуку и считает что за такие бабки получит священный&#10;грааль с элексиром вечной молодости, то это не клевый крупный заказ.&#10;Это плохая мерзкая жопа в которую вы гарантированно влезете. К тому&#10;же, с большой вероятностью, вы и объем работ оценили неправильно и он&#10;не на 10k$, а на 15k$ или больше.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Другой взгляд: если заказчик хочет хоть как–то заниматься&#10;продвижением, то либо сам сайт или его услуги должны быть просто&#10;замечательными, а это либо дорого либо сложно, соответственно, либо,&#10;если, это хоть сколько ни будь конкурентный рынок и область&#10;продвижения, стоимость продвижения будет составлять большое количество&#10;штук баксов. Очень странно, если конечная точка, куда приходит&#10;посетитель, будет стоит 100$&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Кто в итоге будет в пролете — выбирайте сами. Приведенные в качестве&#10;примера суммы можно уменьшить или увеличить, суть при этом не очень&#10;меняется.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Picasa vs. Flickr</title><link>https://blog.rpsl.info/2012/01/picasa-vs-flickr/</link><pubDate>Sun, 22 Jan 2012 20:06:00 +0000</pubDate><guid>https://blog.rpsl.info/2012/01/picasa-vs-flickr/</guid><description>&lt;p&gt;Опять я оказался в ситуации, когда являюсь не типичным пользователем. На&#10;этот раз проблема коснулась фотографий. Ситуация следующая: у меня есть&#10;оплаченный google storage на 20 или 25 гб, есть огромное колличество&#10;фотографий в пикасе, есть много новых фотографий которые я хочу залить в&#10;хранилища, знать что они в безопастности и иметь возмножность показывать&#10;их друзьям и родственникам, но у меня нету возможности.&lt;/p&gt;&#10;&lt;p&gt;Это вечная проблема, когда есть несколько сервисов и каждый из них по&#10;своему хорош, но приятных фич из второго в нем нету.&lt;/p&gt;&#10;&lt;p&gt;Наверно тут стоит бросить камень в сторону Aperture, которым я пользуюсь&#10;как инструментом для обработки и каталогизации фотографий. Для меня&#10;всегда было странно, что подобные, крупные, программы или сервисы не&#10;делают все возможное для расширения. Да, безусловно, можно установить&#10;PicasaUploader, который позволит загружать выбранные фотографии в&#10;пикасу, но мне это не нравится. Я хочу, что-бы можно было нажать&#10;кнопочку &amp;ldquo;Sync this gallery&amp;rdquo; и далее она будет автоматически&#10;синхронизироваться с сервисом, а именно вносить изменения в фотографии&#10;если я сделал их у себя, обновлять/удалять определенные фото ну и&#10;остальные приятныем мелочи.&lt;/p&gt;&#10;&lt;p&gt;Для меня не понятно, почему поддержка flickr есть из коробки, а picasa&#10;нету.&lt;/p&gt;&#10;&lt;p&gt;Я полез искать информацию, как написать собственны плагин, который будет&#10;делать все что мне необходимо, думаю ну ладно, если готового нету, то за&#10;пару вечеров напишу свой, пусть и костыль, но который будет работать.&#10;Нет, не нашел. Может искал плохо, но все равно информации мало.&lt;/p&gt;&#10;&lt;p&gt;К слову говоря, про Aperture, для меня остается загадкой, почему в 2012&#10;году, они не научились делать некоторые фотографии скрытыми. Нельзя&#10;сделать как в пикасе, отметить несколько фотографий в альбоме как&#10;скрытые и их показ будет возможен только после ввода пароля.&lt;/p&gt;&#10;&lt;p&gt;Что делать в итоге - не решил. Ясно, что использовать пикасу, по&#10;определенным обстоятельствам, у меня не получится, но и пользоваться&#10;фликром желания тоже нету. Хотя, видимо это вопрос времени и если я не&#10;научусь делать свои плагины, то сдамся и начну переезд на фликр.&lt;/p&gt;</description></item><item><title>PHP - fastcgi_finish_request</title><link>https://blog.rpsl.info/2011/09/php-fastcgi_finish_request/</link><pubDate>Tue, 20 Sep 2011 07:49:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/09/php-fastcgi_finish_request/</guid><description>&lt;p&gt;А вы знаете про эту замечательную функцию?&lt;/p&gt;&#10;&lt;p&gt;Если кратко, то используя ее можно заставить приложение отдавать контент пользователю гораздо быстрее, разделяя логику приложения на &amp;ldquo;это необходимо пользователю&amp;rdquo; и &amp;ldquo;это пользователю не очень важно&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;Когда php работает в fastcgi режиме, например, в популярной связке nginx+php-fcgi, у вас появляется возможность сначала посчитать все данные которые необходимы что бы отдать пользователю страницу, а уже потом, когда страница отдана и nginx отдает ее клиенту, можно выполнить все остальные действия, например отправить письма или обновить кэш или запустить некие&#10;механизмы очистки.&lt;/p&gt;&#10;&lt;p&gt;Нужно отдельно упомянуть, что для правильной работы, fastcgi_finish_request должен запускать после &lt;code&gt;session_write_close&lt;/code&gt; и &lt;code&gt;ob_*&lt;/code&gt; функций.&lt;/p&gt;&#10;&lt;p&gt;Простой пример:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;echo&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;Hello word&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;// В данной реализации, данные отдадутся в клиенту сразу,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;// а если закомментировать вызов fastcgi_finish_request(),&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;// клиент будет ждать 10 секунд, до того, как получит ответ.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;fastcgi_finish_request&lt;/span&gt;&lt;span style="color:#1f2328"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;sleep&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0550ae"&gt;10&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>9 million hits/day with 120 megs RAM</title><link>https://blog.rpsl.info/2011/09/9-million-hits-day-with-120-megs-ram/</link><pubDate>Tue, 13 Sep 2011 18:55:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/09/9-million-hits-day-with-120-megs-ram/</guid><description>&lt;p&gt;Оставлю у себя в закладках.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;After checking this for about 9 months, I can tell you this almost always reads that number: 300 microseconds. This is about one third the time a camera flash illuminates. That’s, well, pretty quick. When I started, my software was taking about 0.25 seconds (250 000 microseconds) to produce the front page of my website. I needed to improve performance by over 800x.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;a href="http://tumbledry.org/2011/08/31/9_million_hits_day_with_120"&gt;Далее&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Node Saver</title><link>https://blog.rpsl.info/2011/08/node-saver/</link><pubDate>Tue, 30 Aug 2011 00:00:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/08/node-saver/</guid><description>&lt;p&gt;Примерно в марте месяце, пока мне было скучно и хотелось поиграться с MongoDB, я решил сделать свой аналог замечательного сайта &lt;a href="http://www.peeep.us/"&gt;peeep.us&lt;/a&gt;. Дело в том, что peeep.us хоть и жутко удобный, но не совсем безопастный, добавленные туда страницы потом хрен удалишь и самое ужасное, он открыт к индексации. Кстати все кто хочет почитать лепру но не имеют туда доступа могут &amp;hellip;, ну короче намек поняли, все как с мегафоном.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/node-saver/bdfa0e2024277d599aca335979965960.png" alt="save.rpsl.info"&gt;&lt;/p&gt;&#10;&lt;p&gt;Первую версию, которая на момент публикации поста, живет на &lt;a href="http://save.rpsl.info"&gt;save.rpsl.info&lt;/a&gt; я написал часа за четыре, из них примерно два часа я искал у кого своровать дизайн :D&lt;/p&gt;&#10;&lt;p&gt;После этого, я решил что связка php и mongodb для такой микрозадачи не нужна и решил переписать ее на node.js. За несколько вечеров я разобрался и сделал и то, что хотел. В конечном варианте полностью отказалася от MongoDB и заменил его на Memcached. Зачем мне тут монго? Данные я кладу на несколько дней, данных мало, заодно и решится вопрос с их очисткой, а то, что не надежно, ну и фиг с ним. Ничего ценного там хранить смысла нету, а статистика ребута memcached&amp;rsquo;a на серваке говорит о том, что если раз в полгода я и потеряю данные, то ничего страшного не произойдет.&lt;/p&gt;&#10;&lt;p&gt;И все бы было хорошо, но я не решил главную проблему - сохранение работает только для открытых источников, как передавать страницу с сайта, которая закрыта basic auth я не придумал. У меня есть конечнонесколько идей, но проверять их мне слишком лениво. Вторая проблема в том, что мне не хочется из-за этой мелочи поднимать на боевом серваке Node.JS, в какой-то момент пробовал взять виртуалку у clodo.ru, заодно потестировать его, но тесты оказались плачевными, потом хотел у alice2k стрельнуть кусочек vds, но уехал в Испанию и снова забил на это.&lt;/p&gt;&#10;&lt;p&gt;В итоге с марта месяца, у меня на рабочем столе лежит папка node, которую я все время хочу удалить и в последний момент вспоминаю, что этого делать не стоит. Несколько раз приходилось доставать из бэкапа.&lt;/p&gt;&#10;&lt;p&gt;Сегодня мне захотелось ее удалить, поэтому я решил выложить сорцы на github&lt;/p&gt;&#10;&lt;p&gt;В общем форкайте меня, все дела. &lt;a href="https://github.com/Rpsl/node-saver"&gt;https://github.com/Rpsl/node-saver&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Проверка multi_query в mysqli</title><link>https://blog.rpsl.info/2011/08/proverka-multi_query-v-mysqli/</link><pubDate>Mon, 29 Aug 2011 08:06:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/08/proverka-multi_query-v-mysqli/</guid><description>&lt;p&gt;Увидел сегодня красивое решение проверки выполнения &lt;a href="http://php.net/manual/en/mysqli.multi-query.php"&gt;мультизапроса в mysqli&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Если кто не в курсе, то можно сформировать в одну строку кучу запросов, разделяемых точкой с запятой, а потом отдать это на выполнение. Так вот проверять ошибки можно разными способами, а можно просто в конец добавить некий абстрактный SELECT &amp;lsquo;complete&amp;rsquo;. Это подходит для запросов типа INSERT, DELETE, UPDATE.&lt;/p&gt;&#10;&lt;p&gt;Eще, у меня в примере указан не прямой вызов multi_query, а обертка для запросов, думаю что это и зачем вам объяснять не нужно.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;if&lt;/span&gt; &lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$DB&lt;/span&gt;&lt;span style="color:#1f2328"&gt;()&lt;/span&gt;&lt;span style="color:#0550ae"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;multi&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; UPDATE someshit SET bla=bla-1 WHERE id=&amp;#39;%d&amp;#39;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; DELETE FROM someshit WHERE category=&amp;#39;%d&amp;#39;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; DELETE FROM someshit WHERE id=&amp;#39;%d&amp;#39;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; SELECT &amp;#39;complete&amp;#39;;&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;$id&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#953800"&gt;$category&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#953800"&gt;$id&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;!=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;complete&amp;#34;&lt;/span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;self&lt;/span&gt;&lt;span style="color:#0550ae"&gt;::&lt;/span&gt;&lt;span style="color:#953800"&gt;$resultCode&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;self&lt;/span&gt;&lt;span style="color:#0550ae"&gt;::&lt;/span&gt;&lt;span style="color:#1f2328"&gt;DB_ERROR&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;return&lt;/span&gt; &lt;span style="color:#cf222e"&gt;false&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;self&lt;/span&gt;&lt;span style="color:#0550ae"&gt;::&lt;/span&gt;&lt;span style="color:#953800"&gt;$resultCode&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;self&lt;/span&gt;&lt;span style="color:#0550ae"&gt;::&lt;/span&gt;&lt;span style="color:#1f2328"&gt;SUCCESS&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Обновил NAS</title><link>https://blog.rpsl.info/2011/08/obnovil-nas/</link><pubDate>Sun, 28 Aug 2011 17:28:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/08/obnovil-nas/</guid><description>&lt;p&gt;У меня дома, уже почти год живет &lt;a href="https://blog.rpsl.info/2010/10/byudzhetnyjj-nas/"&gt;ReadyNAS Duo&lt;/a&gt;, вчера мне было скучно и я подумал, что будет неплохо обновить его.&lt;/p&gt;&#10;&lt;p&gt;Изначально планировал купить в него второй жесткий диск, т.к. с момента покупки, в нем живет только один seagate на полтора террабайта и бэкапам time machine, в последнее время, там очень тесно. Хотел купить второй такой-же, но почитав документацию, обнаружил, что покупка второго hdd не позволит увелить общий объем устройства, а позволит сделать только raid. Так как raid на 1.5 террабайта мне совсем не нужен, я решил отказаться от этой идеи и потом, когда будут ресурсы, купить жесткий диск от 3 террабайт.&lt;/p&gt;&#10;&lt;p&gt;Таким образом, из возможного обновления, мне оставалась только оперативка. По спецификации, в него можно засунуть до 1гб оперативной памяти, SODIMM на 200pin. В целом, мне вполне хорошо жилось и на 256. Nas тихо стоит в шкафу, качает торренты, принимает бэкапы и ничего больше не делает, но когда кол-во активных торрентов переваливает 10-15, то веб-интерфейс начинает жутко тупить.&lt;/p&gt;&#10;&lt;p&gt;Почитав несколько заметок и упоминаний на сайте производителя, что этому величеству не всякая память подходит, остановил свой выбор на &amp;ldquo;&lt;a href="http://market.yandex.ru/model.xml?modelid=6045125&amp;amp;hid=191211&amp;amp;text=CT12864X40B&amp;amp;srnum=3"&gt;Crucial CT12864X40B&lt;/a&gt;&amp;rdquo;.&#10;Заказал, проехался до магазина, привез, запустил.&lt;/p&gt;&#10;&lt;p&gt;Вообще я не ожидал сильных изменений, да и на глаз ничего нового не увидел. Работать, вроде, стал шустрее, торренты качаются, time machine стала работать быстрее, но т.к. никаких тестот я не проводил, мне кажется все эти улучшения &lt;a href="http://ru.wikipedia.org/wiki/%D0%9F%D0%BB%D0%B0%D1%86%D0%B5%D0%B1%D0%BE"&gt;эффект плацебо&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Scrollbar и центрирование</title><link>https://blog.rpsl.info/2011/08/scrollbar-i-centrirovanie/</link><pubDate>Mon, 15 Aug 2011 13:45:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/08/scrollbar-i-centrirovanie/</guid><description>&lt;p&gt;Столкнулся сегодня с косяком, допустим есть однотипные страницы, на которых основной контент автоматически центрируется.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;#&lt;/span&gt;&lt;span style="color:#24292e"&gt;content&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;margin&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#0550ae"&gt;0&lt;/span&gt; &lt;span style="color:#cf222e"&gt;auto&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Так вот, при загрузке страницы, до момента пока основной контент еще не подгрузился, а шапка уже появилась, то scroll&amp;rsquo;a справа нету, как только контент подгружается, то сбоку появляется scrollbar и весь контент из-за этого прыгает на несколько пикселей влево. В целом этот баг можно решить, если задать основному блоку min-height, но это не универсальное решение. Тем более это может вызывать косяки, если вдруг окажется, что контента у нас на странице нету, будет большой вентум.&lt;/p&gt;&#10;&lt;p&gt;Думали-думали, не знали что делать, в итоге решили сделать как у fb, что бы скроллбар был всегда на странице, не важно активный или нет.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0550ae"&gt;body&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;overflow-y&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#cf222e"&gt;scroll&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Возможно это не самое лучшее решение, но гарантировано убирает проблему с прыганьем контента и избавляет от вероятности появления вентумов на странице.&lt;/p&gt;&#10;&lt;p&gt;Может расскажите другие способы решения?&lt;/p&gt;</description></item><item><title>PHP - Переворот числа</title><link>https://blog.rpsl.info/2011/08/php-perevorot-chisla/</link><pubDate>Tue, 09 Aug 2011 22:14:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/08/php-perevorot-chisla/</guid><description>&lt;p&gt;Видать &lt;a href="http://dotzero.ru/"&gt;dotZero&lt;/a&gt; почувствовал, что я уже устал переворачивать строки, поэтому подкинул сегодня задачу, которую я до этого не решал. Днем разбираться с ней было некогда, а вечером, решил все-таки уделить ей внимание и разобраться как это работает.&lt;/p&gt;&#10;&lt;p&gt;Задача простая. Перевернуть любое целое число используя только математические операторы. Было 5432, должно стать 2345.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;function&lt;/span&gt; &lt;span style="color:#6639ba"&gt;reverseInt&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$a&lt;/span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;$tmp&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#953800"&gt;$a&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;$return&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0550ae"&gt;0&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;while&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$tmp&lt;/span&gt; &lt;span style="color:#0550ae"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;0&lt;/span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#57606a"&gt;/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; Играть с числами очень весело, можно находить и открывать для себя&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; их волшебные свойства. Так, например, если 432 разделить на 10,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; то мы получим 43.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; Выделяя остаток от деления, нам очень легко решить нашу&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; задачу по перестановке числа.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; Таким образом, проходим по каждому разряду числа,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; умножая его после каждой итерации на 10&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; и прибавляя к результату остаток от деления,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; получаем нужное нам число.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;$return&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$return&lt;/span&gt; &lt;span style="color:#0550ae"&gt;*&lt;/span&gt; &lt;span style="color:#0550ae"&gt;10&lt;/span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;+&lt;/span&gt; &lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$tmp&lt;/span&gt; &lt;span style="color:#0550ae"&gt;%&lt;/span&gt; &lt;span style="color:#0550ae"&gt;10&lt;/span&gt; &lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#57606a"&gt;/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; Каждый раз делим исходное число на 10, что-бы обойти каждый его разряд.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;$tmp&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;intval&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$tmp&lt;/span&gt; &lt;span style="color:#0550ae"&gt;/&lt;/span&gt; &lt;span style="color:#0550ae"&gt;10&lt;/span&gt; &lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;return&lt;/span&gt; &lt;span style="color:#953800"&gt;$return&lt;/span&gt; &lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$foo&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0550ae"&gt;123456789&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;echo&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;Start: &amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#953800"&gt;$foo&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\n&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$bar&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;reverseInt&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$foo&lt;/span&gt; &lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;echo&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;End: &amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#953800"&gt;$bar&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\n&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Как видно, все достаточно просто, нужно просто понять как это работает. Теперь хочу найти все варианты с решением этой задачи, думаю что если сделать это с помощью битовых операций получится еще быстрее и красивее.&lt;/p&gt;</description></item><item><title>Request uri в nginx</title><link>https://blog.rpsl.info/2011/08/request-uri-v-nginx/</link><pubDate>Tue, 09 Aug 2011 16:28:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/08/request-uri-v-nginx/</guid><description>&lt;p&gt;Второй раз натыкаюсь.&lt;/p&gt;&#10;&lt;p&gt;В первый раз я не мог понять почему на php скрипт приходил GET запрос, хотя я отправлял POST и при этом массив был пустой, но при просмотре &lt;code&gt;php://input&lt;/code&gt; нужные мне переменные были видны.&lt;/p&gt;&#10;&lt;p&gt;Тут ситуация была простой, но не очевидной, при запросе, я не попадал в нужный location и nginx успешно отправлял меня на @404, в следствие чего, php получал уже GET запрос.&lt;/p&gt;&#10;&lt;p&gt;Сейчас, эта фича, помогает работать с ssi включениями, т.к. при сборе &amp;ldquo;блоков&amp;rdquo; страницы у нас есть возможность получить оригинальный URL и добраться до нужных нам GET параметров.&lt;/p&gt;&#10;&lt;p&gt;Из доков nginx:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;code&gt;$request_uri&lt;/code&gt; - эта переменная равна полному первоначальному URI вместе с аргументами;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Пример, вывод $_SERVER из подключенного ssi блока:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;[QUERY_STRING] =&amp;gt; do=search&amp;amp;action=search&lt;/li&gt;&#10;&lt;li&gt;[REQUEST_URI] =&amp;gt; /?q=творог&amp;amp;lr=213&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Что бы получить нужный нам фэйковый $_GET, можно сделать что-нибудь типо этого:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;parse_str&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#1f2328"&gt;str_replace&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;/?&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#1f2328"&gt;getenv&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;REQUEST_URI&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;),&lt;/span&gt; &lt;span style="color:#953800"&gt;$original_get&lt;/span&gt; &lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Хитрожопые инкорпорейтед</title><link>https://blog.rpsl.info/2011/08/khitrozhopye-inkorporejjted/</link><pubDate>Tue, 09 Aug 2011 14:23:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/08/khitrozhopye-inkorporejjted/</guid><description>&lt;p&gt;Наткнулся сегодня на еще одно решение задачи, про переворот строки.&#10;Вспомнил этот комикс.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$a&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;abcdefgh&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;// Напишите здесь недостающий код,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;// чтобы результатом работы скрипта&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;// была строка $a, повернутая наоборот&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;echo&lt;/span&gt; &lt;span style="color:#953800"&gt;$a&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$a&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;abcdefgh&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$a&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;hgfedcba&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;echo&lt;/span&gt; &lt;span style="color:#953800"&gt;$a&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/khitrozhopye-inkorporejjted/b38c97727d3bb46af322678755acb41c.png" alt="welcome aboard"&gt;&lt;/p&gt;</description></item><item><title>Про блоги</title><link>https://blog.rpsl.info/2011/08/pro-blogi/</link><pubDate>Wed, 03 Aug 2011 23:48:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/08/pro-blogi/</guid><description>&lt;p&gt;Давно уже в голове крутится мысль, что современные блог движки, они&#10;такие сухие, безидейные, не вдохновляющие. Вот тот-же самый wordpress,&#10;есть он, у меня на нем блог работает, при этом я 100500 раз переезжал на&#10;другие движки и пробовал вести блог на них, но все равно возвращался&#10;обратно. Они не вдохновляют на то, что-бы в них писать. Тем на которые&#10;можно и хочется написать много, а желания нету. Это не потому что я&#10;такой ленивый, а потому что написать новый пост превращается в&#10;тягомотину.&lt;/p&gt;&#10;&lt;p&gt;Когда-то давно, когда у меня не было стандалон блога, я тусил в жж. В&#10;2004 году в жж было интересно, а сейчас он стал убогим, политизированным&#10;уг.&lt;/p&gt;&#10;&lt;p&gt;Идея написать свой блог движег не покидает меня уже миллион лет, но это&#10;такая морока, что мне не хочется этим заниматься. Читая интернеты,&#10;обнаружил что Бирман выложил очередной релиз своего блог&#10;&lt;a href="http://blogengine.ru"&gt;движка&lt;/a&gt;. Снаружи очень красивая, внутри какой-то&#10;дикий пиздец творится. Я всегда был уверен, что дизайнеры не должны&#10;заниматься программированием, а программисты дизайном ( именно поэтому,&#10;в моем блоге, такой убогий диз ). Но учитывая, что Эгея носит еще статус&#10;беты, я не буду выражать свое &amp;ldquo;фи&amp;rdquo;, ведь если не заглядывать под капот,&#10;то это действительно очень красивый и лаконичный продукт.&lt;/p&gt;&#10;&lt;p&gt;Вот честно, я заинсталил его себе и даже тешил себя мыслями, что смогу&#10;перенести свой блог туда, мол буду писать там, но две вещи меня держат:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;​1) Все ссылки на страницы моего блога поломаются, но это не проблема,&#10;это решаемо.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;Оформление постов в данном движке происходит с помощью wiki&#10;разметки и соответсвенно все посты едут, полез в гугл поискать&#10;механизм который умеет конвертировать html в wiki формат, но&#10;адекватных механизмов не нашел.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;На этом и забил.&lt;/p&gt;&#10;&lt;p&gt;Но все же мысль избавить от Wordpress&amp;rsquo;a не дает мне покоя. Он меня жутко&#10;достал. Он медленный. Он уродует контент. #hate, #hate.&lt;/p&gt;&#10;&lt;p&gt;Мне тут подсказывали еще попробовать LiveStreet в качестве личного&#10;блога. Но спасибо, я на LiveStreet сейчас веду один проект, в основном&#10;&lt;a href="http://ihiphop.ru"&gt;клипы хип-хоп тематики&lt;/a&gt; и затрахался с ним до&#10;глубины души. Я не знаю что в головах у авторов, но внутреннее&#10;устройство движка это такой лютый бред. Навернуть такое кол-во ООП на&#10;единицу кода и при этом суметь использовать все анти-паттерны&#10;визуального оформления кода, это надо быть действительно смелым и&#10;уверенным в себе человеком.&lt;/p&gt;&#10;&lt;p&gt;Вот опять я всех обругал, а ведь не хотел. ((&lt;/p&gt;</description></item><item><title>Про отображение ошибок</title><link>https://blog.rpsl.info/2011/04/pro-otobrazhenie-oshibok/</link><pubDate>Fri, 22 Apr 2011 22:38:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/04/pro-otobrazhenie-oshibok/</guid><description>&lt;p&gt;Меня жутко, прямо до костей, бесят люди, которые делают логику сайта такой, что в случае возникновения ошибки на сайте, тебя перебрасывает на страницу вида&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://site.ru/wow/it/is/error/page/"&gt;http://site.ru/wow/it/is/error/page/&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Ну реально полный кретинизм.&lt;/p&gt;&#10;&lt;p&gt;Ок, допустим произошла ошибка, допустим база отвалилась и сайт не может нам ничего показать кроме ошибки. Ну так покажи ошибку, а не перебрасывай меня на другую страницу. Ведь у меня нет возможности обновить страницу с ошибкой через 5 минут и увидеть интересный мне контент.&lt;/p&gt;&#10;&lt;p&gt;Прям вот ваще. Если у вас так - то я вас ненавижу.&lt;/p&gt;</description></item><item><title>Самое простое ускорение сайта</title><link>https://blog.rpsl.info/2011/04/samoe-prostoe-uskorenie-sajjta/</link><pubDate>Fri, 15 Apr 2011 15:00:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/04/samoe-prostoe-uskorenie-sajjta/</guid><description>&lt;p&gt;В итернете есть куча более правильных статей на тему организации дружбы между nginx и memcache. Я же, покажу самый простой пример, который можно сделать за пять - десять минут и который поможет разгрузить основные страницы вашего сайта.&lt;/p&gt;&#10;&lt;p&gt;Что я предлагаю ?&lt;/p&gt;&#10;&lt;p&gt;Давайте засунем главную страницу сайта, в memcache, и настроим nginx что бы он отдавал ее прямо из memcache не обращаясь к интерпретаторам. Будем класть раз в минуту сроком жизни на 60 секунд. Стоит понимать, что данный способ нужно дорабатывать, если у вас на страницах используется динамичные данные, то есть данный способ актуален только для &amp;ldquo;гостей&amp;rdquo; сайта, благо nginx умеет работать и cookie.&lt;/p&gt;&#10;&lt;p&gt;Пример настройки nginx&amp;rsquo;a&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;location / {&#10;&#10; default_type text/html;&#10;&#10; if ( $request_uri = &amp;#39;/&amp;#39;)&#10; {&#10; set $memcached_key &amp;#34;index_page&amp;#34;;&#10; memcached_pass 127.0.0.1:11211;&#10;&#10; error_page 404 503 = @fallback;&#10; }&#10;&#10; error_page 404 = @fallback;&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Пример cron скрипта, который можно повесить на выполнение.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;error_reporting&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#cf222e"&gt;E_ALL&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;ini_set&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;display_errors&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#0550ae"&gt;1&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;if&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#1f2328"&gt;class_exists&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;Memcache&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#cf222e"&gt;FALSE&lt;/span&gt;&lt;span style="color:#1f2328"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;$mem&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#cf222e"&gt;new&lt;/span&gt; &lt;span style="color:#1f2328"&gt;Memcache&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;$mem&lt;/span&gt;&lt;span style="color:#0550ae"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;connect&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#0550ae"&gt;11211&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;$html&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;file_get_contents&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;http://blog.rpsl.info/?asd&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;if&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0550ae"&gt;!&lt;/span&gt;&lt;span style="color:#cf222e"&gt;empty&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$html&lt;/span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#57606a"&gt;//$mem-&amp;gt;delete(&amp;#39;index_page&amp;#39;, 0);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;$mem&lt;/span&gt;&lt;span style="color:#0550ae"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;set&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;index_page&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#953800"&gt;$html&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#0550ae"&gt;0&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#0550ae"&gt;60&lt;/span&gt; &lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#57606a"&gt;//echo $html;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;echo&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;no memcache&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Стоит обязательно обратить внимание, что бы запрашивая урл страницы, вы точно получали свежий ответ, т.к. возможна ситуация, когда произойдет зацикливание и ваш скрипт будет брать страницу из кэша и класть ее обратно в кэш.&lt;/p&gt;</description></item><item><title>Dive into Python :)</title><link>https://blog.rpsl.info/2011/04/dive-into-python/</link><pubDate>Thu, 14 Apr 2011 21:11:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/04/dive-into-python/</guid><description>&lt;p&gt;Шесть месяцев назад я нашёл в Интернете книжку &amp;ldquo;Dive into Python&amp;rdquo;.&#10;Странная книжка, толстая, да ещё на не русском языке. Усердно прочитал&#10;её, методично и вдумываясь, но таки ничего и не понял. Но что–то не&#10;отпускало меня — я пошёл на python.org и стал изучать стандартную&#10;библиотеку, старательно, скрупулезно, от корки до корки. Гугля примеры&#10;кода, я наткнулся на пост в блоге одного гуру, где было написано про&#10;PEP8. То, что рассказывал этот умудрённый опытом кодер, настолько&#10;впечатлило меня, что я словно в припадке безумия бросился зубрить эту&#10;конвенцию по написанию питоньего кода. У меня тряслись руки, по телу&#10;прокатывали волны возбуждения, я, можно сказать, бился в экстазе всё это&#10;время — и теперь могу процитировать наизусть любой пункт, даже если меня&#10;разбудить посреди глубокой ночи.&lt;/p&gt;&#10;&lt;p&gt;Новые знания окрыляли меня, я бросился писать (что бы вы подумали?)&#10;очередную имиджборду. Я не писал раньше имиджборд, эта была моей первой.&#10;По пути пришлось освоить азы вёрстки на html и css, но там всё оказалось&#10;совсем не сложно.&lt;/p&gt;&#10;&lt;p&gt;Я плавно двигался вперёд, наращивая функционал. И знаете что? Я упёрся в&#10;недостаток производительности. Ну, так мне показалось. Я делал замеры,&#10;устранял места с тяжёлым кодом. Тысячи раз запускал ab, но так и не&#10;сумел перейти порог в 300 запросов в секунду. Я как–то ожидал большего и&#10;был немного разочарован.&lt;/p&gt;&#10;&lt;p&gt;Гугл, снова гугл. Десятки статей и тем на форуме… Довольно быстро я&#10;заметил, что люди часто пишут про какие–то &amp;ldquo;асинхронные веб–сервера&amp;rdquo;.&#10;Часто встречались названия Tornado и Gevent. Я прочитал про них&#10;подробнее — и был просто ошеломлён. Как мне это раньше не приходило в&#10;голову?! Это же, это просто гениально, чёрт меня побери!&lt;/p&gt;&#10;&lt;p&gt;Исходники в ведро, всё переписать! Меня переполняло новое знание, поток&#10;мыслей ровно ложился в строчки кода. Я просто не мог остановиться. Чашка&#10;кофе… Ещё чашка… Мой небольшой кусочек софта приобретал кристальную&#10;чистоту, я смертельно устал, но продолжал в умилении полировать его&#10;зудящими руками, нанося последние штрихи.&lt;/p&gt;&#10;&lt;p&gt;Пять тысяч. Я получил производительность в пять тысяч запросов в&#10;секунду. В ту ночь я так и не смог заснуть.&lt;/p&gt;&#10;&lt;p&gt;Увлекательнейший мир хай–лоада открылся передо мной. Позже я изучил ещё&#10;много классных вещей типа сверх-быстрых асинхронных key–value–хранилищ,&#10;или, например, такого необычного подхода к обработке данных, как&#10;map–reduce.&lt;/p&gt;&#10;&lt;p&gt;Это уже был другой я, новый, обновлённый. С незашоренным взглядом, с&#10;жаждой новых знаний и незнакомых концепций. Я летел вперёд, оставляя за&#10;спиной ступень за ступенью.&lt;/p&gt;&#10;&lt;p&gt;За пол–года я сменил несколько мест работы, и моя зарплата взлетела до&#10;умопомрачительных сумм. Сотни замечательных мест открыли передо мной&#10;свои двери. Любые, самые изысканные девушки проявляли просто чудеса&#10;изобретательности, чтобы находиться рядом со мной.&lt;/p&gt;&#10;&lt;p&gt;А ещё, я никогда не забуду тот момент, когда на одной из конференций я&#10;впервые в жизни поймал на себе завистливый взгляд. Это был взгляд&#10;какого–то сливающегося с толпой неудачника, взгляд преисполненный&#10;ненависти, презрения и желчного вожделения, направленного на мой Олимп.&#10;Наверное, он всю свою никчёмную жизнь писал на каком–нибудь си–шарпе или&#10;там на джаве, проводя долгие дни в одиночестве. И теперь начинал&#10;подсознательно догадываться, что долгие годы безуспешно пытался&#10;построить замок из навоза.&lt;/p&gt;</description></item><item><title>Как разрабатывают ПО для шатлов</title><link>https://blog.rpsl.info/2011/03/kak-razrabatyvayut-po-dlya-shatlov/</link><pubDate>Sat, 26 Mar 2011 12:48:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/03/kak-razrabatyvayut-po-dlya-shatlov/</guid><description>&lt;p&gt;Утром кто-то в твиттере скинул ссылку на статью, рассказ о том, как разрабатывают ПО для шатлов. Для расширения кругозора полезно почитать.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;В то время, когда 120-ти тонный шаттл стоит, окруженный почти 4-мя&#10;миллионами фунтов ракетного топлива, источая ядовитые пары, с явным&#10;желанием бросить вызов земной гравитации; его бортовые компьютеры&#10;получают команду. Четыре идентичных компьютера, работающие под&#10;управлением идентичного ПО, собирают информацию из тысяч датчиков,&#10;принимая сотни миллисекундных решений, утверждая каждое решение,&#10;сверяясь друг с другом 250 раз в секунду. Пятый компьютер, с другим&#10;ПО, готов взять управление на себя в случае сбоя остальных четырех.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;В момент времени -6.6 секунды, если давления, насосы и температуры в&#10;норме, компьютеры дают приказ зажечь главные двигатели шаттла – каждый&#10;из трех двигателей вспыхивает ровно через 160 миллисекунд, тонны&#10;сверхохлажденного жидкого топлива попадают в камеры сгорания, корабль&#10;дрожит на своей пусковой площадке, удерживаемый на земле только&#10;креплениями. Когда главные двигатели достигают силы тяги в миллион&#10;фунтов, их выхлопы превращаются в голубые бриллианты пламени.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Тогда и только тогда, в момент времени -0 секунд, если компьютеры&#10;убедились, что двигатели работают правильно, они дают приказ поджечь&#10;массивные ракетные ускорители. Менее чем за секунду, они развивают&#10;силу тяги в 6.6 миллионов фунтов. И именно в этот момент, компьютер&#10;отдает приказ взрывчатым креплениям взорваться, и корабль весом 4.5&#10;миллионов фунтов величественно поднимается над стартовой площадкой.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Это удивительное проявление доблести оборудования. Но ни один человек&#10;не нажимает на кнопки, чтобы это произошло, ни один астронавт не&#10;манипулирует джойстиком, чтобы вывести шаттл на орбиту.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>PHP Перевернуть строку без буфера</title><link>https://blog.rpsl.info/2011/03/php-perevernut-stroku-bez-bufera/</link><pubDate>Thu, 24 Mar 2011 15:45:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/03/php-perevernut-stroku-bez-bufera/</guid><description>&lt;p&gt;Еще один способ как перевернуть строку. Не используется дополнительный буфер, просто красивая работа с данными.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$str&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#1f2328"&gt;string&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;123456789&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;echo&lt;/span&gt; &lt;span style="color:#953800"&gt;$str&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\n&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$count&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;strlen&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$str&lt;/span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;-&lt;/span&gt; &lt;span style="color:#0550ae"&gt;1&lt;/span&gt; &lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;for&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$i&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#0550ae"&gt;0&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt; &lt;span style="color:#953800"&gt;$i&lt;/span&gt;&lt;span style="color:#0550ae"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color:#953800"&gt;$count&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt; &lt;span style="color:#953800"&gt;$i&lt;/span&gt;&lt;span style="color:#0550ae"&gt;++&lt;/span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;$str&lt;/span&gt;&lt;span style="color:#1f2328"&gt;[&lt;/span&gt; &lt;span style="color:#953800"&gt;$count&lt;/span&gt; &lt;span style="color:#0550ae"&gt;+&lt;/span&gt; &lt;span style="color:#953800"&gt;$i&lt;/span&gt; &lt;span style="color:#0550ae"&gt;+&lt;/span&gt; &lt;span style="color:#0550ae"&gt;1&lt;/span&gt; &lt;span style="color:#1f2328"&gt;]&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#953800"&gt;$str&lt;/span&gt;&lt;span style="color:#1f2328"&gt;[&lt;/span&gt; &lt;span style="color:#953800"&gt;$count&lt;/span&gt; &lt;span style="color:#0550ae"&gt;-&lt;/span&gt; &lt;span style="color:#953800"&gt;$i&lt;/span&gt; &lt;span style="color:#1f2328"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;$str&lt;/span&gt;&lt;span style="color:#1f2328"&gt;[&lt;/span&gt; &lt;span style="color:#953800"&gt;$count&lt;/span&gt; &lt;span style="color:#0550ae"&gt;-&lt;/span&gt; &lt;span style="color:#953800"&gt;$i&lt;/span&gt; &lt;span style="color:#1f2328"&gt;]&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;echo&lt;/span&gt; &lt;span style="color:#953800"&gt;$str&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\n&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Результатом выполнения будет&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0550ae"&gt;123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0550ae"&gt;987654321&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Все просто.&lt;/p&gt;</description></item><item><title>Preg Match на уровне Дьявола</title><link>https://blog.rpsl.info/2011/03/preg-match-na-urovne-dyavola/</link><pubDate>Wed, 16 Mar 2011 22:45:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/03/preg-match-na-urovne-dyavola/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$pattern&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;/\w{0,5}[хx]([хx\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[уy]([уy\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[ёiлeеюийя]\w{0,7}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt;|\w{0,6}[пp]([пp\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[iие]([iие\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[3зс]([3зс\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt;[дd]\w{0,10}|[сcs][уy]([уy\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[4чkк]\w{1,3}|\w{0,4}[bб]([bб\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt;[lл]([lл\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[yя]\w{0,10}|\w{0,8}[её][bб][лске@eыиаa][наи@йвл]\w{0,8}|\w{0,4}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt;[еe]([еe\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[бb]([бb\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[uу]([uу\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt;[н4ч]\w{0,4}|\w{0,4}[еeё]([еeё\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[бb]([бb\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[нn]([нn\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt;{0,6})[уy]\w{0,4}|\w{0,4}[еe]([еe\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[бb]([бb\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt;[оoаa@]([оoаa@\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[тnнt]\w{0,4}|\w{0,10}[ё]([ё\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[б]\w{0,6}|\w{0,4}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt;[pп]([pп\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[иeеi]([иeеi\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[дd]([дd\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt;[oоаa@еeиi]([oоаa@еeиi\s\!@#&lt;/span&gt;&lt;span style="color:#0a3069"&gt;\$&lt;/span&gt;&lt;span style="color:#0a3069"&gt;%\^&amp;amp;*+-\|\/]{0,6})[рr]\w{0,12}/i&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Кто скажет что это?&lt;/p&gt;</description></item><item><title>Еще немного про собеседования</title><link>https://blog.rpsl.info/2011/03/eshhe-nemnogo-pro-sobesedovaniya/</link><pubDate>Sun, 13 Mar 2011 17:46:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/03/eshhe-nemnogo-pro-sobesedovaniya/</guid><description>&lt;p&gt;Решил дополнить поднятую тему про собеседования и рассказать о вопросахкоторые задают чаще всего.&lt;/p&gt;&#10;&lt;p&gt;Изначально, я хотел в этом посте написать все самые интересные вопросы и дополнить их ответами, но когда начал его писать, то понял что ответы тут не нужны. Те кому это действительно надо, сами порешают данные задачи, остальные могут просто пролистать.&lt;/p&gt;&#10;&lt;p&gt;Первое на что хочу обратить ваше внимание, это то, что вопросы которые задают php(?) программистам, в основной своей сути имеют довольно академический характер и в жизненных циклах проектов встречаются не часто, но тем не менее, нужно уметь решать эти задачи. Это обусловленно тем, что у работодателей нету времени и желания давать вам типичные задачи, в стиле - &amp;ldquo;Напиши класс, который будет отвечать за работу с пользователями&amp;rdquo;. 99 процентов всех вопросов задаются по заготовленному листку и должны быть решены на листке бумаги. Никаких IDE, никаких гуглов, никаких ответов типа &amp;ldquo;я не помню синтаксис&amp;rdquo;. Если вы настроены решительно и хотите произвести хорошее впечатление, то уделите время, что бы потренироваться и чувствовать себя уверенно.&lt;/p&gt;&#10;&lt;p&gt;Все вопросы можно разделить на три категории: PHP, MySQL(?), все остальное.&lt;/p&gt;&#10;&lt;p&gt;Любой из этих пунктов, так же делится на две части: теория и практика. Начну пожалуй с PHP. С теоретическими вопросами, в целом, не сложно. Они почти везде одинаковые: Отличия между PHP 5.2 и 5.3, основные приципы ООП. Не частый, но вопрос с подвохом - &amp;ldquo;В каких случаях использование ООП, является убыточным?&amp;rdquo;. Дальнейшие вопросы на теорию, в основном, зависят от ваших ответов, и несут цель узнать на сколько хорошо вы разбираетесь в материале о котором говорили выше.&lt;/p&gt;&#10;&lt;p&gt;Практические вопросы, это чаще всего просьба написать некую ф-цию, которая делает какую либо хрень. Почти на каждом собеседование меня просили написать функцию которая переворачивает строку, без использования дополнительных буферов, можно попробовать схитрить и ответить что-то в стиле&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;function&lt;/span&gt; &lt;span style="color:#6639ba"&gt;revert&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$string&lt;/span&gt; &lt;span style="color:#1f2328"&gt;){&lt;/span&gt; &lt;span style="color:#cf222e"&gt;return&lt;/span&gt; &lt;span style="color:#1f2328"&gt;strrev&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#953800"&gt;$string&lt;/span&gt; &lt;span style="color:#1f2328"&gt;);&lt;/span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt; &lt;span style="color:#57606a"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#f6f8fa;background-color:#82071e"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Но это не cамый лучший вариант ответа. Выучите алгоритм с обращением к символом строки как к объекту массива.&lt;/p&gt;&#10;&lt;p&gt;Очень частые задачи, на написание рекурсивных функций или на понимание работы операторов кода.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#953800"&gt;$a&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0550ae"&gt;10&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;echo&lt;/span&gt; &lt;span style="color:#0550ae"&gt;++&lt;/span&gt;&lt;span style="color:#953800"&gt;$a&lt;/span&gt; &lt;span style="color:#0550ae"&gt;+&lt;/span&gt; &lt;span style="color:#953800"&gt;$a&lt;/span&gt;&lt;span style="color:#0550ae"&gt;++&lt;/span&gt; &lt;span style="color:#0550ae"&gt;-&lt;/span&gt; &lt;span style="color:#0550ae"&gt;++&lt;/span&gt;&lt;span style="color:#953800"&gt;$a&lt;/span&gt; &lt;span style="color:#0550ae"&gt;+&lt;/span&gt; &lt;span style="color:#953800"&gt;$a&lt;/span&gt; &lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;На днях пока решал задачи, попалось интересное задание, у меня такое ни разу не спрашивали, но думаю что к такому надо быть готовым:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;var_dump&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0550ae"&gt;0123&lt;/span&gt; &lt;span style="color:#0550ae"&gt;==&lt;/span&gt; &lt;span style="color:#0550ae"&gt;123&lt;/span&gt; &lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Думаю, что на счет PHP я достаточно ясно изложил типовые вопросы, если что-то осталось не понятно, то спрашивайте в комментариях.&lt;/p&gt;&#10;&lt;p&gt;Теоретические вопросы про MySQL или любую другую СУБД почти всегда касаются индексов и насколько вы понимаете как их использовать, в каких случаях и на что их ставить и в каких случаях индексы могут быть вредны. Обязательно спросят про различия между версиями. Поинтересуются насколько глубоко вы знаете тонкости работы СУБД и вкурсе ли вы про то, что такое тригеры, хранимые процердуры, представления.&lt;/p&gt;&#10;&lt;p&gt;Практические задачи - это просьба нарисовать две таблицы с различными данными и просьба написать запрос, который покажет умеете ли вы использовать операторы HAVING, GROUP BY, &amp;hellip; etc. Обязательно знать разницу между &lt;a href="https://blog.rpsl.info/2009/07/sql-joins-vidy-tipy-razlichiya/"&gt;JOIN запросами&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Еще часто спрашивают про верстку, про css, про javascript. Но расписывать это все не вижу смысла.&lt;/p&gt;</description></item><item><title>Немного про собеседования</title><link>https://blog.rpsl.info/2011/03/nemnogo-pro-sobesedovaniya/</link><pubDate>Sun, 06 Mar 2011 13:51:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/03/nemnogo-pro-sobesedovaniya/</guid><description>&lt;p&gt;Когда в середине 2010 года я понял, что пора искать новое место, я посетил много собеседований, т.к. мне не хотелось уходить с довольно теплого места в абы куда, я метил в крупные, стабильные компании, с высокой зп, большими перспективами, туда где я буду средничком на общем фоне, что бы был стимул развиваться.&lt;/p&gt;&#10;&lt;p&gt;В некоторые компании меня не пригласили, от некоторых я отказывался после первого посещения, в одну хорошую фирму даже позвали, но пришлось бы ездить через весь город и после доглих размышлений я отказался.&lt;/p&gt;&#10;&lt;p&gt;Вообще собеседования, для меня стали большим мотиватором в саморазвитии. Помню как я пошел на самое первое, был уверен что я такой крутой и смогу все рассказать сходу, расскажу какие &lt;del&gt;крутые&lt;/del&gt; штуки я умею делать и меня сразу возьмут. ХА ХА Лох. На первом собеседование, меня за пять минут смешали с грязью и больше всего мне хотелось провалиться сквозь землю. Когда перед тобой сидят несколько взрослых человек и задают тебе серьезные вопросы, на которые ты не знаешь как ответить, но говорить &amp;ldquo;я не знаю&amp;rdquo; считаешь не приемлемым, то разволноваться в общем не проблема.&lt;/p&gt;&#10;&lt;p&gt;Первый вопрос, с которого было начато собеседование звучал так: &amp;ldquo;Что из себя представляют индексы (MySQL) в физическом плане&amp;rdquo;. Блядь. Да я никогда в жизни не задумывался, о том, что они из себя представляют в физическом плане. Начал рассказывать про B-Tree, бла-бла-бла, но я понятие не имею что это за файлы и какая у них структура. Сказал честно, что никогда этим не интресовался, но попытался предположить как и что это. В общем был полный FAIL. Хотя думаю что даже если бы и попал в ту контору, очень быстро бы сгорел работать по китайскому календарю и тратить по два часа на общественный транспорт.&lt;/p&gt;&#10;&lt;p&gt;В другой, на первый взгляд, не плохой конторе, меня встретили директор отдела разработок и его заместитель. Рассказали мне про контору, задавали кучу вопросов из книги про гору фудзи, все бы хорошо, но это было в двухпоточном режиме. Директор мне задавал задачи, я решал их на листочке, а его заместитель при этом активно общался со мной и мне приходилось решая задачу, общаться с ним на тему сколько шариков для тениса поместиться в боинг, сколько автомобилей и заправок для них в Москве и попытаться ответить на самый не нормальный, но не менее интересный вопрос &amp;ldquo;Как называется наша вселенная?&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;Собеседования я там прошел на плюс-минус, обещали перезвонить через пару дней. Не позвонили. Ну и пофиг, их офис спустя две недели переехал с филей в Крылатское, а ездить в Крылатское каждый день я бы не осилил.&lt;/p&gt;&#10;&lt;p&gt;Кстати вот дебильное качество. Зачем HR говорят что перезвонят, но не перезванивают. Я понимаю прекрастно, что после собеседования нужен перерыв, нужно подумать, посмотреть других кандидатов, но не ужели трудно перезвонить или отписать на почту, что мол так и так, мы не готовы вас пригласить. Это деловые отношения, а в деловых отношениях, я считаю, нельзя давать обещаний и не выполнять их, либо не обещай, либо держи слово.&lt;/p&gt;&#10;&lt;p&gt;К слову говоря, чувак из конторы, офис которой находится в жутких ебенях, зарплата серая, никаких обязательств и прочих штук, перезвонил мне и сказал что не готов пригласить меня. Хотя странно, собеседования я прошел отлично, решил все задачи, рассказал кучу интересных вещей и был уверен что даже не ловко будет, когда буду отказываться.&lt;/p&gt;&#10;&lt;p&gt;Сейчас, пока поднимаю воспоминания, вспомнил про еще довольно странную контору. Офис - несколько этажей в довольно крупном бизнес центре. Очень крутой пакет (страховка/обеды/&amp;hellip;), достаточно высокая зарплата на старте ( &amp;gt;80 000 ), корпоративная лицензия на PhpStorm :)))&lt;/p&gt;&#10;&lt;p&gt;Так вот, к собеседованию я готовился почти неделю. Вызубрил все различия между версиями php и mysql, поднял все знания какие есть по паттернам программирования и мог с ходу написать кучу разных интересных штук. Выспался, пришел в отличном настроение и так нелепо обломался.&lt;/p&gt;&#10;&lt;p&gt;Вопросы которые мне задавали, были настолько простые, что я оказался к ним не готов. Я не смог вспомнить, что различия между одинарной кавычкой не только в автопарсинге переменных, но еще и преобразование спецсимволов, запутался в &lt;em&gt;&lt;strong&gt;htmlentities&lt;/strong&gt;&lt;/em&gt; и &lt;em&gt;&lt;strong&gt;html_entity_decode&lt;/strong&gt;&lt;/em&gt; и вообще очень сильно лажал на примитивных вещах, на которые до этого никогда не обращал внимание. Было стыдно и был очень злой на себя.&lt;/p&gt;&#10;&lt;p&gt;Вообще это не всё, есть еще много историй, возможно, потом, расскажу. Но подводя краткий итог, хочу сказать, что иногда стоит ходить на собеседования. Даже если не собираетесь уходить со своего места работы, это сильный стресс, как резкое погружение в холодную воду, которое вытаскивает тебя из рутинной обыденности и позволяет оценить свои силы. За те четыре месяца, которые прошли с моего первого собеседования, до того на котором меня пригласили, я узнал больше вещей и заполнил пробелов, чем за весь прошлый год.&lt;/p&gt;&#10;&lt;p&gt;Ну и тем крутым, которые знают php отлично, я процитирую&#10;&lt;a href="http://bolknote.ru/2010/10/09/~2763/#18"&gt;Bolk&amp;rsquo;a&lt;/a&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;От собеседований, которые я недавно проводил, у меня осталась масса листочков с заковыристыми вопросами. Например, если человек говорил, что знает PHP на 10 из 10, то я ему давал, например, такой тест:&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Сказать есть ли тут ошибки, если нет, то что получим и что вообще тут происходит.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;var_dump&lt;/span&gt;&lt;span style="color:#1f2328"&gt;((&lt;/span&gt;&lt;span style="color:#1f2328"&gt;bool&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;print_r&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#953800"&gt;${&lt;/span&gt;&lt;span style="color:#1f2328"&gt;strrev&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;SLABOLG&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)}&lt;/span&gt; &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0550ae"&gt;1&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#953800"&gt;$GLOBALS&lt;/span&gt;&lt;span style="color:#1f2328"&gt;[&lt;/span&gt;&lt;span style="color:#0550ae"&gt;1&lt;/span&gt;&lt;span style="color:#1f2328"&gt;]{&lt;/span&gt;&lt;span style="color:#0550ae"&gt;1&lt;/span&gt;&lt;span style="color:#953800"&gt;}&lt;/span&gt; &lt;span style="color:#0550ae"&gt;==&lt;/span&gt; &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#1f2328"&gt;unset&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;b&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;==&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;00&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>PHP Кэширование картинок часть вторая</title><link>https://blog.rpsl.info/2011/03/php-kehshirovanie-kartinok-chast-vtoraya/</link><pubDate>Sat, 05 Mar 2011 13:38:00 +0000</pubDate><guid>https://blog.rpsl.info/2011/03/php-kehshirovanie-kartinok-chast-vtoraya/</guid><description>&lt;p&gt;Я уже когда-то писал про &lt;a href="https://blog.rpsl.info/2009/08/php-images-cache/"&gt;мой способ кэшировать картинки&lt;/a&gt;, а сейчас заметил, что не выкладывал сюда переделанный варинт.&lt;/p&gt;&#10;&lt;p&gt;Идея осталась прежней, только работа с изображениями была отдана либе &lt;a href="http://phpthumb.gxdlabs.com/"&gt;http://phpthumb.gxdlabs.com/&lt;/a&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * Скрипт iCacher создан что бы облечить кеширование изображений на сайте&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * и организовать лаконичную возможность генерации картинок различных размеров.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * iCacher является т.н. роутером для http://phpthumb.gxdlabs.com/ и не будет&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * работать правильно при отсутвие данной библиотеки.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * Для правильно работы подразумевается соблюдение нескольких правил:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * 1. В папке MAIN_FOLDER хранятся оригинальные изображения.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * 2. В папку CACHE_FOLDER будут храниться измененные изображения.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * 3. При обращение к несуществующему файлу из папки CACHE_FOLDER происходит&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * перенаправление на данный файл*, который в свою очередь создает&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * необходимый файл либо возвращет 404 ошибку.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * * .htaccess rewrite rule:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * RewriteRule ^images_folder/([0-9a-z]+)/([0-9a-z]+)/(.*)$ iCacher.php?param=$1&amp;amp;size=$2&amp;amp;file=$3 [L,QSA]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * 4. После генерации изображений они должны быть доступны по прямому запросу.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * 5. Для обновления миниатюр вы должны самостоятельно организовать удаление&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * созданых скриптом файлов.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * В крайнем случае можно использовать GET параметр flush с любым значением.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; * При необходимости создавайте собственные плагины или ф-ции обработки.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Скрипт лежит на github.com - &lt;a href="https://github.com/Rpsl/iCacher/blob/master/iCacher.php"&gt;https://github.com/Rpsl/iCacher/blob/master/iCacher.php&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;В целом все хорошо, скрипт местами дебильный и с не логичной реализацией, но уже пол года работает на одном хайлоад проекте.&lt;/p&gt;&#10;&lt;p&gt;Кстати, на папку с кэшироваными изображениями натравлен скрипт, который удаляет файлы созданные более 30 дней назад, что бы не скапливать мусор.&lt;/p&gt;</description></item><item><title>C новым годом</title><link>https://blog.rpsl.info/2010/12/novym-godom/</link><pubDate>Wed, 29 Dec 2010 15:06:00 +0000</pubDate><guid>https://blog.rpsl.info/2010/12/novym-godom/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=~&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;(?{&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;%&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;!&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;\\$&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;==&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;||&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;;&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;=&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;;&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;=&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;;-&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;\\$&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;=;&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;(&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;!&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;_\\{&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;(\\$&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;;=(&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;\\$=|&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\|&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;((&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;).&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;\\&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.+&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;{&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;%&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;))&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;\\&amp;#34;.\\&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;(&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;))&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;\\&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;#&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;!!--&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;\\$=.\\&amp;#34;&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;{&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\&amp;amp;&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;{&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\[&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\%&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\%&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;))&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;\\&amp;#34;).\\&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;{&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\/&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\.&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;{&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\[&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\/&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\(&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\%&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;{&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\[&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\,&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\!&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\,&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;))&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;\\&amp;#34;\\}&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.+&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\+&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\)&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\)&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\.&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;))&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;+_,\\&amp;#34;,&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;{&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;))&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;\\$;!&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;!&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\+&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;{&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\/&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\!&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\+&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\%&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;{&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\[&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\/&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\.&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\%&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;{&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\[&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\$&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\/&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\,&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;))&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;((&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;{&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\[&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\`&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;!&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\[&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;(&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\[&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;(&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\{&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\`&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\[&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\{&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\`&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;!&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\[&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\`&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\[&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\`&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\`&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;$&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\,&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;!&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;))&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;\\&amp;#34;,_,\\&amp;#34;&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;!&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\!&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\!&amp;#34;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;\\&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\(&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\)&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;\,&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;%&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;))&lt;/span&gt;&lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;++\\$=&amp;#34;})&amp;#39;&lt;/span&gt; &lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&lt;span style="color:#953800"&gt;$:&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;~&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&lt;span style="color:#953800"&gt;$~&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;@&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;|&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;(&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&lt;span style="color:#953800"&gt;$^&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span style="color:#0550ae"&gt;^&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&lt;span style="color:#953800"&gt;$/&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;`&amp;#39;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Кстати, это &lt;a href="http://99-bottles-of-beer.net/language-perl-737.html"&gt;исходный код&lt;/a&gt; на perl&lt;/p&gt;</description></item><item><title>Бюджетный NAS</title><link>https://blog.rpsl.info/2010/10/byudzhetnyjj-nas/</link><pubDate>Sat, 30 Oct 2010 16:13:00 +0000</pubDate><guid>https://blog.rpsl.info/2010/10/byudzhetnyjj-nas/</guid><description>&lt;p&gt;Уже почти месяц у меня дома живет NAS ( Network Attachment Storage ). Желание приобрести подобную игрушку появилось после того, как я устал держать включенным ноутбук для скачивания и транслирования торрентов на телек/playstation. Из первых попыток прощупывания почвы и выяснения оптимальных решений пришел к выводу, что мне нужен &lt;a href="http://www.readynas.com/?cat=3"&gt;ReadyNAS duo&lt;/a&gt; от компании Netgear.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/byudzhetnyjj-nas/2d8c2f2ef1cc1e5eb5fd123f75ffa34d.jpg" alt="Netgear"&gt;&lt;/p&gt;&#10;&lt;p&gt;Кстати весьма странная ценовая политика в готовых решениях. Есть два варианта покупки:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Купить nas без жестких дисков&lt;/li&gt;&#10;&lt;li&gt;Купить nas в комплекте с жестким диском.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Так вот, в комплекте с жестким диском на 500гб, средняя цена 10-11 тысяч рублей. Без жесткого диска устройство стоит 8 тысяч рублей, а на оставшиеся две тысячи я докупил жесткий диск на 1500гб. ???. Профит.&lt;/p&gt;</description></item><item><title>seo rewrite rule</title><link>https://blog.rpsl.info/2010/10/seo-rewrite-rule/</link><pubDate>Thu, 28 Oct 2010 10:21:00 +0000</pubDate><guid>https://blog.rpsl.info/2010/10/seo-rewrite-rule/</guid><description>&lt;p&gt;Оптимизаторы не знают что такое реврайты и эстетическая красота. А меня жутко бесит, когда в корне сайта лежит 100500 html файлов, которые очень нужны для продвижения.&lt;/p&gt;&#10;&lt;p&gt;Приходится постоянно лечить.&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-htaccess" data-lang="htaccess"&gt;RewriteRule ^([a-z0-9_-]+).html$ static/seo_pages/$1.html [L,QSA]&#10;&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>WordPress — gallery shorttag highslide</title><link>https://blog.rpsl.info/2010/10/wordpress-gallery-shorttag-highslide/</link><pubDate>Wed, 13 Oct 2010 10:32:00 +0000</pubDate><guid>https://blog.rpsl.info/2010/10/wordpress-gallery-shorttag-highslide/</guid><description>&lt;p&gt;Два примера, для решения одной и той же задачи.&lt;/p&gt;&#10;&lt;p&gt;В первом примере полный идиотизм, во втором хорошее решение. Вот теперь вопрос, почему большая часть всех CMS работает как первый пример. ?&lt;/p&gt;</description></item><item><title>Варианты разные</title><link>https://blog.rpsl.info/2010/08/varianty-raznye/</link><pubDate>Tue, 24 Aug 2010 05:46:00 +0000</pubDate><guid>https://blog.rpsl.info/2010/08/varianty-raznye/</guid><description>&lt;p&gt;В детстве можно всегда лезть в драку, прыгать с тарзанки и гонять на велосипеде быстрее всех, ежегодно ломая себе что–нибудь. А можно обходить хулиганов стороной и вообще предпочитать телевизор. В 15 тебе будет наплевать, что у Васи был круче велосипед и все окрестные пацаны его боялись. 15 лет уже, взрослые люди, к чему этот детсад.&lt;/p&gt;&#10;&lt;p&gt;В школе можно учиться на одни пятерки, учить химию и писать сочинения про Онегина, действительно размышляя о мотивах главных героев. А можно обойтись шаблонными фразами, домашку списать и закончить четверть как максимум без троек. В 18 лет внезапно выяснится, что с полным трояков аттестатом можно поступать хоть в МГУ, всем похуй. Школа она и есть школа, все ее заканчивают.&lt;/p&gt;&#10;&lt;p&gt;В институте можно ходить на все лекции и семинары, записаться на три интересных спецсема, выбрать клевого научника и двигать с ним что–нибудь актуальное, тусуясь на конференциях. Можно выебать всех клевых однокурсниц, ездить в Крым автостопом, отвисая с хиппанами в Лисьей Бухте, основать митол–группу и записать альбом. А можно сидеть в интернетах и контре по ночам, пить пиво с такими же задротами, никуда не ходить, ботать экзамены в последнюю ночь и получать свой законный трояк. «Обзор существующих методов…» сойдет за тему диплома, потерять девственность по пьяни поможет подвернувшаяся каракатица а соседи по общаге сойдут за друзей.&lt;/p&gt;</description></item><item><title>Кэширование MySQL - MySimpleCache</title><link>https://blog.rpsl.info/2010/07/kehshirovanie-mysql-mysimplecache/</link><pubDate>Tue, 06 Jul 2010 21:33:00 +0000</pubDate><guid>https://blog.rpsl.info/2010/07/kehshirovanie-mysql-mysimplecache/</guid><description>&lt;p&gt;Собственно возвращаясь к прошлому посту - &lt;strong&gt;&lt;a href="https://blog.rpsl.info/2010/06/php-keshirovanie-mysql/"&gt;PHP Кэширование MySQL&lt;/a&gt;&lt;/strong&gt;, хочу сказать спасибо всем, кто помог советами.&lt;/p&gt;&#10;&lt;p&gt;По разным причинам, спустя несколько дней после прошлого поста, я все таки сел и написал этот велосипед. Перевел на него десяток говносайтов и наблюдал две недели за их поведением.&lt;/p&gt;&#10;&lt;p&gt;Проблем не заметил, все работает хорошо, нагрузка на базу данных значительно упала, а это именно то, что и требовалось.&lt;/p&gt;&#10;&lt;p&gt;Проект поселился на &lt;a href="http://github.com/Rpsl/MySimpleCache"&gt;github.com&lt;/a&gt;, маловероятно, но возможно он еще будет обновляться, так что актуальная версия всегда там.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://github.com/Rpsl/MySimpleCache"&gt;&lt;img src="https://blog.rpsl.info/images/kehshirovanie-mysql-mysimplecache/f46bd1c2b0cf47e3b056cefa4bb35064.png" alt="github.com"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Логика работы проста. Что бы &lt;strong&gt;закэшировать MySQL&lt;/strong&gt; запрос, вы подключаете класс и делаете замену стандартных вызовов, на вызовы функций кеширования. Они являются синонимами, а значит вам нужно только перед вызовом дописать название класса.&lt;/p&gt;&#10;&lt;p&gt;При вызове mysql_query, скрипт попытается закешировать данный запрос и либо вернет ссылку на закешированный массив, либо вернет ссылку на ресурс.&lt;/p&gt;&#10;&lt;p&gt;Все последующие операции будут проверять является ли ссылка ресурсом и уже по обстоятельствам будут либо доставать данные из &lt;strong&gt;memcache&lt;/strong&gt;, либо получать их напрямую.&lt;/p&gt;&#10;&lt;p&gt;Буду рад любым комментариям и повторяю еще раз, что крайне не рекомендую прикручивать этот скрипт на сайты которые чуть более серьезнее чем сателит.&lt;/p&gt;</description></item><item><title>PHP Кеширование Mysql</title><link>https://blog.rpsl.info/2010/06/php-keshirovanie-mysql/</link><pubDate>Sun, 27 Jun 2010 16:04:00 +0000</pubDate><guid>https://blog.rpsl.info/2010/06/php-keshirovanie-mysql/</guid><description>&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/php-keshirovanie-mysql/519474e6a1485684b2751348ed65baf3.png" alt="mysql"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;UPD:&lt;/strong&gt; Рабочая версия php&#10;&lt;a href="https://blog.rpsl.info/2010/07/kehshirovanie-mysql-mysimplecache/"&gt;MySimpleCache&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Други, мне требуется ваша помощь или совет.&lt;/p&gt;&#10;&lt;p&gt;Такая ситуация, есть большая куча сайтов, написанных давным-давно. Они представляют из себя кучу файлов, в которых идет в перемешку php/html/sql запросы. Ни о каких современных паттернах программирования там речи нету. Переписывать эти сайты нет ни времени, ни желания, но они ужастно грузят БД.&lt;/p&gt;&#10;&lt;p&gt;Задача добавить на эти сайты кеширование sql запросов. Переписывать их и править дело очень не благодарное и потребует кучу времени.&lt;/p&gt;&#10;&lt;p&gt;Я поразмышлял и решил, что проще всего будет написать класс, который будет содержать в себе ф-ции синомы всех ф-ций для работы с бд.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;mysql_query&lt;br&gt;&#10;mysql_fetch_assoc&lt;br&gt;&#10;mysql_fetch_array&lt;br&gt;&#10;mysql_num_rows&lt;br&gt;&#10;mysql_result&lt;br&gt;&#10;&amp;hellip;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Фишка в том, что они должны внутри себя пробовать кешировать запрос и либо возвращать результат запроса, либо возвращать закешированный результат.&lt;/p&gt;&#10;&lt;p&gt;Данная идея мне кажется крутой, так как, она позволит легкой автозаменой включить кеширование на сайте и лишь потом в нужных местах его допилить.&lt;/p&gt;&#10;&lt;p&gt;Теперь главное, я уверен что должны быть аналоги, а я пытаюсь изобрести велосипед. Возможно вы сталкивались с такими вещами и их решениями. Ну или просто можете высказать свое мнение по этому поводу. Не поленитесь, буду очень благодарен.&lt;/p&gt;</description></item><item><title>Обфускатор Javascript</title><link>https://blog.rpsl.info/2010/06/obfuskator-javascript/</link><pubDate>Fri, 11 Jun 2010 21:04:00 +0000</pubDate><guid>https://blog.rpsl.info/2010/06/obfuskator-javascript/</guid><description>&lt;p&gt;На Хабре нашел ссылку на отличный инструмент для шифрования js от чужих глаз:&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://utf-8.jp/public/jjencode.html"&gt;&lt;strong&gt;http://utf-8.jp/public/jjencode.html&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Например, &lt;code&gt;alert(&amp;quot;test&amp;quot;);&lt;/code&gt; превращается вот в такую конструкцию:&lt;/p&gt;</description></item><item><title>Ну вот и обновились</title><link>https://blog.rpsl.info/2010/06/nu-vot-i-obnovilis/</link><pubDate>Fri, 11 Jun 2010 00:11:00 +0000</pubDate><guid>https://blog.rpsl.info/2010/06/nu-vot-i-obnovilis/</guid><description>&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/nu-vot-i-obnovilis/4a6f5f94a6747ae13efefaab01e19887.png" alt="blog.rpsl.info"&gt;&lt;/p&gt;&#10;&lt;p&gt;Мелочей еще конечно много, но буду править и постараюсь снова начать писать.&lt;/p&gt;</description></item><item><title>Чат для vbulletin</title><link>https://blog.rpsl.info/2010/03/chat-dlya-vbulletin/</link><pubDate>Fri, 05 Mar 2010 11:47:00 +0000</pubDate><guid>https://blog.rpsl.info/2010/03/chat-dlya-vbulletin/</guid><description>&lt;p&gt;Главное что бы было желания, все остальное уже дело техники.&lt;/p&gt;&#10;&lt;p&gt;Очень давно я хотел сделать чатик для нашего уютного форума. Если кто-то помнит, то он даже был там очень давно, но тогда по техническим и эстетическим причинам его пришлось убрать.&lt;/p&gt;&#10;&lt;p&gt;Несколько выходных назад я решил вернуться к этому вопросу, скачал стандартный чат для форума, но он как и все остальные подобные реализации являлся унылым говном. Это глупое окошко которое предлагается разместить после навбара или перед футером&amp;hellip; Решение было принято моментально, а бутылка ликера добавила мне решительности.&lt;/p&gt;&#10;&lt;p&gt;В итоге, просидев около 4 часов над сорцами чата и переделкой его стилей у нас получилась отличная консоль, которая открывается - закрывается по нажатию горячих клавиш и доступна всем зарегистрированным пользователям. Единственная проблема с которой я столкнулся - это кривое отображение в ie6, но решать её, по своим внутренним убеждениям я не собираюсь.&lt;/p&gt;&#10;&lt;p&gt;Живой пример на &lt;a href="http://forum.centrgroup.ru"&gt;http://forum.centrgroup.ru&lt;/a&gt; (для зарегистрированных) Если кому интересна сама реализация - пишите в комменты, постараюсь рассказать.&lt;/p&gt;</description></item><item><title>Livejournal in google reader</title><link>https://blog.rpsl.info/2009/12/livejournal-in-google-reader/</link><pubDate>Wed, 23 Dec 2009 16:28:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/12/livejournal-in-google-reader/</guid><description>&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/livejournal-in-google-reader/2cf513ca339e64a3d2ba84a7e725881f.jpg" alt="livejournal"&gt;&lt;/p&gt;&#10;&lt;p&gt;Давным давно, в одной далекой галактике, я сделал себе standalone блог и &lt;strong&gt;livejournal&lt;/strong&gt;, потихоньку начал пропадать из списка сайтов которые я посещаю ежедневно. Учитывая, что я читаю около пары сотен человек, то вариант захождения раз в неделю и чтения всех записей начинал сильно утомлять, т.к. трудно осилить пару сотен постов. В то же время я начал активно пользоваться &lt;strong&gt;google reader&lt;/strong&gt;&amp;lsquo;ом для чтения &lt;strong&gt;rss&lt;/strong&gt; каналов сайтов которые мне интересны.&lt;/p&gt;&#10;&lt;p&gt;К сожалению и по не сильно понятным мне причинам, &lt;strong&gt;livejournal&lt;/strong&gt; не даёт читать френделенту через rss, но зато он позволяет подписаться на rss конкретных пользователей которые вам интересны. В то же время, в &lt;strong&gt;Google reader&lt;/strong&gt; есть возможность сортировать каналы по папкам, и если читать сразу всю папку, то получается как раз подобие френдленты. В целом всё хорошо, только этот вариант не подходит тем, у кого друзья пишут под замочные записи, но и тут тоже livejournal предусмотрел вариант аутентификации, для получения ленты с закрытыми записями.&lt;/p&gt;&#10;&lt;p&gt;В интернете есть различные серивисы, включая pipes.yahoo.com и freemyfeed.com, которые могут выступать в роли прокси, но меня не устраивает вариант, когда мои пароли будут храниться не понятно где. Поэтому я сделал маленький прокси, которые автоматически авторизует вас для google reader&amp;rsquo;а и на выходе вы получаете полный feed ваших друзей.&lt;/p&gt;</description></item><item><title>Twitter it для vBulletin</title><link>https://blog.rpsl.info/2009/11/twitter-it-dlya-vbulletin/</link><pubDate>Wed, 04 Nov 2009 20:21:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/11/twitter-it-dlya-vbulletin/</guid><description>&lt;p&gt;На днях, мне захотелось сделать наш форум еще более интегрированным в, не побоюсь этого слова, великую социальную сеть twitter.&lt;/p&gt;&#10;&lt;p&gt;Сначала была идея сделать возможность автоматической отправки новых тем из выбранных разделов в некий твиттер аккаунт, потом это обдумывалось и свелось до того, что бы была возможность отправлять в твиттер ссылки на темы, но при этом не сам форум будет спамить темы, а пользователи сам должны решать за себя.&lt;/p&gt;&#10;&lt;p&gt;Первый вариант, который был реализован, заключался в простом добавление кнопки в шаблон, которая содержит в себе необходимый URL, но как выяснилось, это вариант не очень удобен, т.к. он не будет работать с некоторыми символами, которые встречаются в тексте.&lt;/p&gt;&#10;&lt;p&gt;В итоге я просто создал модуль который генерирует ссылку, а в шаблон добавил простую кнопку и ву-аля.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://blog.rpsl.info/images/twitter-it-dlya-vbulletin/284c31b5ea0fab411d2c93ce2e62d6d5.png"&gt;&lt;img src="https://blog.rpsl.info/images/twitter-it-dlya-vbulletin/284c31b5ea0fab411d2c93ce2e62d6d5.png" alt="twitterit"&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Фотоблоги / фотоблог / фото блог</title><link>https://blog.rpsl.info/2009/10/fotoblogi-fotoblog-foto-blog/</link><pubDate>Wed, 07 Oct 2009 21:44:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/10/fotoblogi-fotoblog-foto-blog/</guid><description>&lt;p&gt;Честно говоря, я очень удивлен, что у нас не очень популярны фотоблоги.&#10;У всех есть мобильные телефоны, почти у всех они с фото камерами, у&#10;большинства с камерами приемлемого качества. Многие используют твиттер,&#10;почту, icq на телефоне, но мало кто делает фотографии и выкладывает их в&#10;сеть.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://blog.rpsl.info/images/fotoblogi-fotoblog-foto-blog/photoblog.png"&gt;&lt;img src="https://blog.rpsl.info/images/fotoblogi-fotoblog-foto-blog/c4d8a39b39b6ea715333ae4b1ec3d72e.png" alt="photoblog"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Сейчас я расскажу о нескольких способах организации этого дела.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Фотоблог — вебсайт, содержащий в своей основе регулярно публикуемые&#10;фотографии, часто сопровождаемые названием снимка, датой/временем,&#10;текстовым описанием, сведениями Exif и др. Фотоблог часто содержит&#10;возможность добавления комментариев, выставления рейтинга и т. п.&#10;Фотоблог может поддерживать технологию RSS или Atom.&lt;/p&gt;&#10;&lt;p&gt;Фотоблог может быть авторским или коллективным. Встречаются мобильные&#10;фотоблоги (сделанные с помощью фотокамер, встроенные в мобильные&#10;телефоны). Как разновидность, появились текстовые фотоблоги (в которых&#10;фотография заменена авторским текстовым описанием).&lt;/p&gt;&#10;&lt;p&gt;wikipedia&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>PHP Кэширование картинок</title><link>https://blog.rpsl.info/2009/08/php-images-cache/</link><pubDate>Thu, 27 Aug 2009 15:05:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/08/php-images-cache/</guid><description>&lt;p&gt;Недавно была необходимость сделать функцию &lt;strong&gt;кэширования картинок на php&lt;/strong&gt; ну я и написал простой скрипт, который отлично справляется с этой задачей.&lt;/p&gt;&#10;&lt;p&gt;Логика работы скрипта очень простая. Он смотрит входящие параметры, проверяет есть ли картинка заданного размера и отдает её если она есть или создает в подпапке  такую картинку и отдает её.&lt;/p&gt;&#10;&lt;p&gt;Это спасает нас от необходимости делать кучу ресайзов при загрузке картинки + это универсальный способ, который можно использовать в любом проекте.&lt;/p&gt;&#10;&lt;p&gt;Листинг под катом.&lt;/p&gt;</description></item><item><title>SQL Joins Виды, типы, различия</title><link>https://blog.rpsl.info/2009/07/sql-joins-vidy-tipy-razlichiya/</link><pubDate>Mon, 27 Jul 2009 22:56:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/07/sql-joins-vidy-tipy-razlichiya/</guid><description>&lt;p&gt;В первую очередь шпаргалка для себя, но надеюсь кому нибудь окажется полезным.&lt;/p&gt;&#10;&lt;p&gt;Для начала оговорим, что у нас есть две таблицы: &lt;strong&gt;Table A&lt;/strong&gt; и &lt;strong&gt;Table B&lt;/strong&gt;:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;id name id name&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;1 &lt;span style="color: red"&gt;Pirate&lt;/span&gt; 1 Rutabaga&lt;br&gt;&#10;2 Monkey 2 &lt;span style="color: red"&gt;Pirate&lt;/span&gt;&lt;br&gt;&#10;3 &lt;span style="color: red"&gt;Ninja&lt;/span&gt; 3 Darth Vader&lt;br&gt;&#10;4 Spaghetti 4 &lt;span style="color: red"&gt;Ninja&lt;br&gt;&#10;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Теперь можно рассмотреть, варианты и различия возможных JOIN запросов.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Inner join&lt;/strong&gt; выведет записи, которые соответствуют  таблице A и&#10;таблице B.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://blog.rpsl.info/images/sql-joins-vidy-tipy-razlichiya/join-inner.png"&gt;&lt;img src="https://blog.rpsl.info/images/sql-joins-vidy-tipy-razlichiya/f0fcf5762a49546af7addc7d37210d80.png" alt="join-inner"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;SELECT * FROM TableA&lt;br&gt;&#10;&lt;strong&gt;INNER JOIN&lt;/strong&gt; TableB&lt;br&gt;&#10;ON TableA.name = TableB.name&lt;/p&gt;&#10;&lt;p&gt;id name id name&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;1 Pirate 2 Pirate&lt;br&gt;&#10;3 Ninja 4 Ninja&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Человеческий фактор</title><link>https://blog.rpsl.info/2009/06/chelovecheskij-faktor/</link><pubDate>Mon, 08 Jun 2009 00:44:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/06/chelovecheskij-faktor/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Для человеческой глупости нет патча (с) Kevin Mitnick&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Последние пару месяцев просто поражают спонтанностью происшествий,&#10;главное, что потом, когда анализируешь их становится &amp;ldquo;и смешно и&#10;грустно&amp;rdquo;. Я конечно могу и дальше списывать всё на злой рок и на дядьку&#10;Мерфи, на которого уже ссылался несколько постов назад, но делу это не&#10;поможет.&lt;/p&gt;&#10;&lt;p&gt;Например последней ситуацией, которую можно назвать только как &amp;ldquo;Пиздец&#10;подкрался незаметно&amp;rdquo;, когда с утра меня разбудили звонком, в котором&#10;сообщали что вместо сайта &lt;strong&gt;группы CENTR&lt;/strong&gt; (centrgroup.ru) открывается&#10;страница от reg.ru сообщающая, что домен не оплачен бла-бла-бла. Сначала&#10;подумал, что это шутка. Домены я оплачиваю вовремя, а у centr&amp;rsquo;a домены&#10;оплачиваются когда на улице снег лежит, так что подвох. Открыл, смотрю и&#10;правда, не работает. Резолвю, ip совсем другой.&lt;/p&gt;&#10;&lt;p&gt;Лезу в админ панель доменов посмотреть что там, попутно звоню в суппорт&#10;и насилую консоль что бы понять в чем дело. В голове и мысли об&#10;уязвимости DNS пролетели, и про киберсквотеров подумал, но решение&#10;оказалось куда проще. Некто, проебал оплату домена, на котором весят NS&#10;(name server) и так как его стало форвардить на другой ip, то и&#10;остальные сайты, к которым он был привязан поехали в след за ним.&lt;/p&gt;&#10;&lt;p&gt;Благо проблему решили довольно быстро и успели как раз к 12 часовому&#10;апу. Так, что те, у кого провайдер не косячит с обновлением dns, скорее&#10;всего и не заметили ошибку.&lt;/p&gt;</description></item><item><title>Грамотный backup</title><link>https://blog.rpsl.info/2009/05/true-backup/</link><pubDate>Sat, 23 May 2009 14:28:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/05/true-backup/</guid><description>&lt;p&gt;В последнее время, всё больше и больше озадачиваюсь вопросами организации &amp;ldquo;резервного хранилища&amp;rdquo;. Пока еще не делал никаких подвижек в эту сторону, а просто думаю над возможными вариантами. Сильно в эту тему тоже не углублялся, так что пост больше походит на &amp;ldquo;мысли в слух&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;Для начала нужно определиться, что нужно бэкапить:&lt;/p&gt;&#10;&lt;p&gt;Необходимо:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;сайты&lt;/li&gt;&#10;&lt;li&gt;рабочие папки (home folder) cо всех машин за которыми работаю.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Желательно:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Музыкальное хранилище.&lt;/li&gt;&#10;&lt;li&gt;Видео хранилище. Причем под видео, я воспринимаю не только папку&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;Downloads&amp;rdquo;, а в первую очередь накопленный почти за год архив с Creative VADO.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Из возможных решений проблемы, рассматривал несколько вариантов:&lt;/p&gt;</description></item><item><title>Почему не работал centrgroup.ru</title><link>https://blog.rpsl.info/2009/05/pochemu-ne-rabotal-centrgroupru/</link><pubDate>Fri, 15 May 2009 13:48:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/05/pochemu-ne-rabotal-centrgroupru/</guid><description>&lt;p&gt;3 суток даунтайма - это не &amp;ldquo;хухры-мухры&amp;rdquo;. Я конечно постарался всех подготовить, но сам не ожидал что выйдет так долго.&lt;/p&gt;&#10;&lt;p&gt;Как все должно было быть:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;12 числа в 11:00 мы забираем сервер из старого ДЦ&lt;/li&gt;&#10;&lt;li&gt;14:00 он уже в новом ДЦ&lt;/li&gt;&#10;&lt;li&gt;15:00 заканчиваем с настройками, ставим в стойку и ждем когда у всех  обновятся &lt;a href="http://ru.wikipedia.org/wiki/Domain_Name_System" title="Domain Name System"&gt;DNS&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Радуемся жизни&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Как все получилось на самом деле:&lt;/p&gt;&#10;&lt;p&gt;Мы забрали сервер из ДЦ, привезли его на нашу площадку, но запускаться он категорически отказывался т.к. несколько демонов вешали его работу.&lt;/p&gt;&#10;&lt;p&gt;Пока пытались их утихомирить, из-за неведомо-опастной-хуйни упал &lt;a href="http://ru.wikipedia.org/wiki/RAID"&gt;RAID&lt;/a&gt;. Начали танцевать с бубном и восстанавливать инфу. Промучались до 14 числа. 14 числа когда система была заново установленна, переносили весь день файлы, восстанавливали настройки хостинга и демонов.&lt;/p&gt;&#10;&lt;p&gt;Короче пздц полный. Все эти дни проклинал дядьку &lt;a href="http://murphy-law.net.ru/"&gt;Мерфи и егозаконы&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Автоматическое обновление wordpress</title><link>https://blog.rpsl.info/2009/05/automatic-upgrade-wordpress/</link><pubDate>Thu, 14 May 2009 00:06:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/05/automatic-upgrade-wordpress/</guid><description>&lt;p&gt;Есть в wordpress&amp;rsquo;e такая занимательная опция, как автоматическая установка и обновление плагинов. Просит от вас только указать хост, логин и пароль для ftp sftp доступа, а далее делает всё сама. К сожалению &amp;ldquo;из коробки&amp;rdquo; эта опция заводится далеко не у всех. Если вы тоже стали одним из счастливых обладателей сообщения:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Downloading update from&#10;http://downloads.wordpress.org/plugin/%plugin-name%.zip&#10;&#10;Download failed.: Could not create Temporary file&#10;Installation Failed&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;hellip; то сделать вам нужно следующие&lt;/p&gt;</description></item><item><title>Hotkeys для wordpress</title><link>https://blog.rpsl.info/2009/05/hotkeys-dlya-wordpress/</link><pubDate>Mon, 11 May 2009 20:29:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/05/hotkeys-dlya-wordpress/</guid><description>&lt;p&gt;В этой заметке, я расскажу как легко добавить в ваш блог поддержку hotkey&amp;rsquo;s.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Hotkey - это определенное сочетание клавиш, по нажатию которых происходит определенное действие. Мы уже привыкли использовать ctrl+c/ctrl+v. Тенденции развития интернета диктуют свою моду и многие уже привыкли использовать для перехода между страницами сайта сочетание &amp;ldquo;ctrl+left&amp;rdquo; или &amp;ldquo;ctrl+right&amp;rdquo;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Для добавления этого функционала, первое что нам потребуется - плагин hotkey для библиотеки jquery.&lt;/p&gt;&#10;&lt;p&gt;jQuery hotkey&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://code.google.com/p/js-hotkeys/"&gt;Скачать&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://jshotkeys.googlepages.com/test-static-01.html"&gt;Демо&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Теперь о том, как это сделать. У нас есть два варианта:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Генерировать код в самом шаблоне с помощью встроенных функций&lt;/li&gt;&#10;&lt;li&gt;Генерировать код &amp;ldquo;на лету&amp;rdquo;, с помощью JS&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Я выбрал второй вариант, т.к. он мне показался более правильным, во первых мы не напрягаем шаблон лишними вызовами, и главное мы уверенны что будем получать правильные ссылки. Ведь нам нужно на главной странице листать все записи, в категории листать записи категории, а внутри поста листать посты. Таким образом, всё что нам осталось, это добавить в header шаблон (скорее всего header.php) нижеприведенный код.&lt;/p&gt;</description></item><item><title>Интеграция phpbb3 с любым сайтом</title><link>https://blog.rpsl.info/2009/04/integraciya-phpbb3-s-lyubym-sajtom/</link><pubDate>Fri, 24 Apr 2009 14:00:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/04/integraciya-phpbb3-s-lyubym-sajtom/</guid><description>&lt;p&gt;Не очень давно, по работе, пришлось делать &lt;strong&gt;интеграцию&lt;/strong&gt; уже имеющегося сайта, &lt;strong&gt;с форумом на системе phpBB&lt;/strong&gt; 3-ей версии.&lt;/p&gt;&#10;&lt;p&gt;После разбора полетов и курения мануалов по работе форума, организовалась очень интересная и простая система. Если говорить о её плюсах, то она полностью независима от форума, таким образом, при обнолении движка, мы уверены что не потерям правленные нами ранее файлы и что ничего не поломается.&lt;/p&gt;&#10;&lt;p&gt;Для того, что бы понимать зачем и как это делать, сначала я постараюсь объяснить логику работы. Из уже готовых изменений, нам нужно добавить в БД сайта, дополнительное поле, например - &lt;code&gt;user_f_id&lt;/code&gt;, в которое мы будем записывать информацию о сопоставлении профилей пользователей сайта, с профилями пользовталей форума (предполагается числовой идентификатор, &lt;code&gt;user_id&lt;/code&gt; из БД форума - таблицы &lt;code&gt;%prefix%_users&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>PlayStation 3 - мысли вслух</title><link>https://blog.rpsl.info/2009/04/playstation-3-misli-v-slux-ili-luchi-v-storonu-ps3/</link><pubDate>Sun, 05 Apr 2009 14:34:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/04/playstation-3-misli-v-slux-ili-luchi-v-storonu-ps3/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Я не сомневаюсь, что ребята из Sony гораздо лучше меня знаю как делать деньги, что нужно пользователям и т.д., но мне все таки хочется выразить свои мысли об этой игровой системе.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/playstation-3-misli-v-slux-ili-luchi-v-storonu-ps3/0b93a6e714b67b6fe33aef5361517661.jpg" alt="2477189721_57e2f2ba25.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;Начать хочется с цены, средняя по Мск ~16000 за приставку на 80гб, два джойстика &lt;strong&gt;sixaxis dualshock 3&lt;/strong&gt; и какую либо игру в подарок.&lt;/p&gt;&#10;&lt;p&gt;Согласитесь, не маленькая. Есть более дешевые варианты, с меньшим жестким диском и отсутствием одного джойстика, но как показывает практика, если покупать &lt;strong&gt;ps3&lt;/strong&gt; не &amp;ldquo;просто что бы было&amp;rdquo;, то лучше раскошелиться на нормальный вариант, чем потом докупать составляющие.&lt;/p&gt;</description></item><item><title>Google Picasa on your site</title><link>https://blog.rpsl.info/2009/03/google-picasa-on-your-site/</link><pubDate>Thu, 26 Mar 2009 13:48:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/03/google-picasa-on-your-site/</guid><description>&lt;p&gt;Уже давно, в &lt;a href="http://twitter.com/Rpsl"&gt;своем твиттере&lt;/a&gt;, я обещал рассказать как встроить фото галерею пикасы в свой сайт.&lt;/p&gt;&#10;&lt;p&gt;Идея довольно простая: &amp;ldquo;Зачем изобретать велосипед, если можно использовать мотокомбайн?&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;Рыская по глубинам интернета, я нашел замечательный скрипт picasaViewer. Написан он на JavaScript и является плагином для mooTools.&lt;/p&gt;&#10;&lt;p&gt;Настройки весьма простые: в файле picasaViewer.js указываем username пользователя, фото галереи которого хотим отображать.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/google-picasa-on-your-site/347b8a72bfd26863e07beb142458cd92.png" alt="picasa.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;Из плюсов стоит отметить то, что он работает почти со всем современными броузерами и не требуют серверных мощностей для выполнения.&lt;/p&gt;&#10;&lt;p&gt;Из минусов то, что написан он на moo и возможно, что будет конфликтовать с другими js фреймворками.&lt;/p&gt;&#10;&lt;p&gt;Готовый пак (с slimbox дополнением), забираем с зеркала в моем блоге.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Download:&#10;picasaview.zip&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Удачного использования.&lt;/p&gt;</description></item><item><title>Моvable Type 4.25</title><link>https://blog.rpsl.info/2009/03/movable-type-425/</link><pubDate>Thu, 26 Mar 2009 13:17:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/03/movable-type-425/</guid><description>&lt;p&gt;Обновил. Вроде всё прошло как по маслу, благо бэкапы делаются постоянно и сильно не переживал.&lt;/p&gt;&#10;&lt;p&gt;Единственный косяк был на этапе обновления mySQL, когда MT начал ругаться:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;**undefined type: mediumtext**&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Пришлось вспоминать, как эту проблему я победил в прошлый раз, вспомнил. Просто на время обновления отключил все плагины путем переименования папки &amp;ldquo;plugins&amp;rdquo;. Обновилось, включил, всё хорошо.&lt;/p&gt;&#10;&lt;p&gt;Порадовало обновление плагинов авторизации. Теперь повесить коммент под своим ником еще проще чем раньше.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/movable-type-425/dcfb96d54f7a64dac50a970067844e53.png" alt="auth.png"&gt;&lt;/p&gt;</description></item><item><title>F.lux - ритмы вашего монитора</title><link>https://blog.rpsl.info/2009/03/flux-ritmy-vashego-monitora/</link><pubDate>Wed, 18 Mar 2009 01:17:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/03/flux-ritmy-vashego-monitora/</guid><description>&lt;p&gt;Несколько дней назад познакомился с этой программой. Она выполняет очень простую функцию, в зависимости от времени суток, меняет яркость и контрастность монитора, что бы глаза не уставали.&lt;/p&gt;&#10;&lt;p&gt;Поработав с ней несколько суток, понимаю что это утилита из разряда &lt;strong&gt;musthave&lt;/strong&gt;, благо есть версии для всех систем.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/flux-ritmy-vashego-monitora/3ee2eb3a369a9daf3dd52c3fde7146f9.png" alt="flux-shot.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;Для настройки необходимо указать ваши координаты (latitude), которые можно узнать на &lt;a href="http://stereopsis.com/flux/map.html"&gt;сайте программы&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Настоятельно рекомендую всем, оссобенно тем кто много торчит перед монитором.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://stereopsis.com/flux/"&gt;F.lux Скачать&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Идея беслатного wifi</title><link>https://blog.rpsl.info/2009/03/ideya-beslatnogo-wifi/</link><pubDate>Tue, 03 Mar 2009 13:46:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/03/ideya-beslatnogo-wifi/</guid><description>&lt;p&gt;В очередной раз, просматривая доступные сети на мобиле, задумался &amp;ldquo;Почему они все закрыты?&amp;rdquo;. Закрыты они по понятным причинам, что бы всякие умники не качали через вас торренты и не тратили ваш трафик.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/ideya-beslatnogo-wifi/8b09388f45762ae4a137793221b4b05c.png" alt="wifilogo.png"&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Это вопрос скорее к производителям, чем к пользователям.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Вот у меня назрел вопрос, неужели так трудно, на одной точке раздавать две сети.&lt;/p&gt;</description></item><item><title>Лучшее враг хорошего</title><link>https://blog.rpsl.info/2009/02/luchshee-vrag-xoroshego/</link><pubDate>Wed, 25 Feb 2009 14:36:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/02/luchshee-vrag-xoroshego/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Любое ваше улучшение и действие, должно в конечном счете, решать какую&#10;либо проблему, если эта проблема к концу всех операций останется не&#10;решенной или появятся новые, то смело можно считать, что вы зазря&#10;потратили свое время.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;img src="https://blog.rpsl.info/images/luchshee-vrag-xoroshego/424de15c58fb1139b7bcf50636ab020f.jpg" alt="Cisco-systems-GSR-small.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;Я хочу поделиться с вами еще одной житейской мудростью, а точнее историей, которую рассказал мне мой друг. Он очень хороший человек, специалист по офисным сетям, сейчас заканчивает ВУЗ и пишет диплом, на какую то &amp;ldquo;офисно-компьютерную&amp;rdquo; тему.&lt;/p&gt;&#10;&lt;p&gt;Зарабатывает на жизнь тем, что работает &amp;ldquo;приходящим&amp;rdquo; администратором, в нескольких компаниях. Маленький офисные сетки, на 5 - 20 компьютеров. От вирусов там почистить, принтеры настроить, обычная рутина, ничего интересного. Единственный плюс этой работы, что на рабочем месте не нужно находиться постоянно. Когда все работает, то ездить по офисам можно только &amp;ldquo;За зарплатой&amp;rdquo;, но такое обычно бывает редко и в одну контору он заезжает в среднем раз в неделю.&lt;/p&gt;</description></item><item><title>Найти авто инструктора</title><link>https://blog.rpsl.info/2009/02/nayti-avto-instruktora/</link><pubDate>Fri, 13 Feb 2009 10:07:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/02/nayti-avto-instruktora/</guid><description>&lt;p&gt;Опа опа! Чё я вижу, сегодня очередное произведение от &lt;a href="http://futurecolors.ru"&gt;FC&lt;/a&gt; увидело свет или вышло из закрытого теста в паблик.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://spokoino.ru"&gt;&lt;img src="https://blog.rpsl.info/images/nayti-avto-instruktora/d3279bef09a3987a3e7fe91a17a9e42f.png" alt="Спокойно.Ру - Поиск авто инструктора."&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;На этот раз, это стартап, социальная сеть для &lt;strong&gt;авто инструкторов&lt;/strong&gt;. Так что, если вы собираетесь в ближайшем времени идти на курсы или вы очень круто водите и хотите зарабатывать деньги давая уроки, то дорожка туда вам просто заказана.&lt;/p&gt;&#10;&lt;p&gt;База правда еще маленькая, но проект выточен под весьма высокую нагрузку, да и толк от него будет, когда там будут сотни инструкторов, но всему своё время.&lt;/p&gt;</description></item><item><title>Google Disk aka GDrive</title><link>https://blog.rpsl.info/2009/01/google-disk-aka-gdrive/</link><pubDate>Fri, 30 Jan 2009 23:43:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/01/google-disk-aka-gdrive/</guid><description>&lt;p&gt;А тем временем. Пока космические корабли бороздят просторы вселенной и&#10;мощщностей моего компьютера хватает что бы управлять всеми Российскими&#10;боевыми спутниками, но их (мощщностей) мало что бы печатать красивый&#10;текст с рюшечками, в умах людей всё больше и больше разгорается интерес&#10;к новому сервису от гугла под кодовым именем &amp;ldquo;GDrive&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt; &lt;/p&gt;&#10;&lt;p&gt; &lt;/p&gt;&#10;&lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image"&#10;style="display: inline;"&gt;&lt;img src="https://blog.rpsl.info/images/google-disk-aka-gdrive/572c916017c9286f7a9b46b3ea407d25.png" alt="gdrive.png"&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt; &lt;/p&gt;&#10;&lt;p&gt;Очень понравился комментарий от некого&#10;&amp;ldquo;&lt;a href="http://tangro.habrahabr.ru/"&gt;tangro&lt;/a&gt;&amp;rdquo;, который предложил свой вариант&#10;описания сервиса:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;«Компания Google рада представить Вам еще один сервис, вышедший из&#10;Google Labs. Сервис GDrive позволяет загружать, хранить, и скачивать с&#10;серверов Google Ваши файлы. В рамках стандартного пользовательского&#10;соглашения Вы можете хранить несколько (объем постоянно&#10;увеличивается!) гигабайт данных. За определенную плату Вы можете&#10;купить дополнительное место на сервере. Доступна интеграция с Gmail и&#10;Google Documents. Есть API для загрузки и скачивания файлов. Есть&#10;возможность корпоративной подписки. Есть возможность хранения файлов в&#10;„приватном&amp;quot; режиме или открытия доступа к нему для других&#10;пользователей. Компания Google не несет ответственности за содержимое&#10;информации, загруженной на сервер пользователем. Контент, защищенный&#10;чужими авторскими правами может быть удален без согласия&#10;пользователя.»&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Я уже придумал около 3 вариантов его использования, сейчас рассказывать&#10;не буду. Когда откроется, когда будет доступна лицензия, тогда и&#10;расскажу.&lt;/p&gt;</description></item><item><title>Не будет у меня Agora Pro</title><link>https://blog.rpsl.info/2009/01/ne-budet-u-menya-agora-pro/</link><pubDate>Tue, 20 Jan 2009 09:45:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/01/ne-budet-u-menya-agora-pro/</guid><description>&lt;p&gt;Только что пришло &lt;a href="http://www.kogan.com.au/blog/2009/jan/16/kogan-agora-be-delayed/"&gt;уведомление на&#10;почту&lt;/a&gt;.&#10;Не знаю действительно ли они так озадачены совместимостью и удобством&#10;пользователя, или просто проект провалился и они не собрали нужное&#10;кол-во пред. заказов. Не суть. Все деньги будут возвращенны, всем&#10;предлагают полюбовно разойтись.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;em&gt; &#10;The Agora did reach a very late stage of development. Manufacturing&#10;had commenced and it was a matter of days from being shipped to you.&#10;However, it now seems certain the Agora in it's current form will&#10;limit its compatibility and interoperability in the near future.&#10;&lt;p&gt;One of the potential issues is the screen size and resolution. It&#10;seems developers will be creating applications that are a higher&#10;resolution than the Agora is currently capable of handling.&lt;/em&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Только вот что же делать мне.?? Мне нужен нормальный телефон вместо&#10;&lt;em&gt;&lt;span style="font-size: xx-small;"&gt;(fucked, fucked, fucked)&lt;/span&gt;&lt;/em&gt;&#10;e71, а такого на просторах яндекс.маркета найти не удалось.&lt;/p&gt;&#10;&lt;p&gt;Отстой&lt;/p&gt;</description></item><item><title>Разобрал автомат, собрал...</title><link>https://blog.rpsl.info/2009/01/razobral-avtomat-sobral/</link><pubDate>Sat, 17 Jan 2009 03:21:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/01/razobral-avtomat-sobral/</guid><description>&lt;p&gt;&amp;hellip; получилась соковыжималка с ручным приводом.&lt;/p&gt;&#10;&lt;p&gt;Еще несколько дней убил на то, что бы &lt;a href="https://blog.rpsl.info/"&gt;привести МТ&lt;/a&gt; к человеческому виду. Вроде немного получается, в целом всё хорошо, натянул простенький, подрезанный откуда то, дизайн. Прикрутил пару плагинов, работает. По поводу кросспостинга в жж, курил исходники весьма долго. Реальное ощущение что плагины писал Равшан в паре с Джамшутом. В sixapart.com походу не сильно в курсе про визуальное форматирование кода.&lt;/p&gt;&#10;&lt;p&gt;Сейчас активно занялся за написание плагинов для &lt;a href="http://plugins.movabletype.org/action-streams/"&gt;ActionStreams&lt;/a&gt;. Как только приведу их божеский вид, выкину в &amp;ldquo;паблик&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;Пытался запустить несколько плагинов из &lt;a href="http://code.sixapart.com/svn/mtplugins/trunk/"&gt;svn&lt;/a&gt;, но там все слишком сырое и работать отказывается. Печально.&lt;/p&gt;&#10;&lt;p&gt;Выпил за 4 дня литровую бытылку виски и 3 литра колы. Спать ложусь когда еще темно, просыпаюсь когда уже темно.&lt;/p&gt;&#10;&lt;p&gt;При всем при этом делаю несколько проектов по работе и пытаюсь доделать фотогаллерею для &lt;a href="https://www.ugw.ru"&gt;www.ugw.ru&lt;/a&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;Кстати, ужастно интересно читать(?), скорее смотреть чужие фотоблоги. Подписался на несколько штук, смотрю на жизнь других людей, весьма интересно. Ссылки выкладывать не буду, кому надо сами найдут, очень много на vox.com.&lt;/p&gt;</description></item><item><title>Movable Type: Поигрались и хватит</title><link>https://blog.rpsl.info/2009/01/movable-type-poigralis-i-xvatit/</link><pubDate>Tue, 13 Jan 2009 00:43:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/01/movable-type-poigralis-i-xvatit/</guid><description>&lt;p&gt;Четыре месяца назад, я наткнулся на это двигло и мне стало интересно, а как же оно работает? Захотелось пощупать, потрогать изнутри, пропатчить чего нибудь. Тут и господин &lt;a href="http://saahov.ru/"&gt;saahov&lt;/a&gt; нашелся очень кстати. Поставил, вот уже сколько играюсь и всё больше и больше склоняюсь к мысли, что ну его в пень.&lt;/p&gt;&#10;&lt;p&gt;Блог, должен быть тем инструментом, который один раз настроил, поставил, дизайн нарисовал и больше проблем возникать не должно. А тут, как ни попытка копнуть глубже, так гемморой.&lt;/p&gt;&#10;&lt;p&gt;Ладно, молчу про то, что он (MT) такой весь из себя для гиков. Просто меня он не устраивает.&lt;/p&gt;&#10;&lt;p&gt;Не устраивает то, что на подсос всех библиотек и обработку обычного логина ему нужно почти 100мб оперативки и только на машине с более чем 500мГц на борту он перестает занимать cpu на 100%.&lt;/p&gt;&#10;&lt;p&gt;Не утраивает довольно тупая система стилей. С шаблонами все просто великолепно, только вот со стилями проблемы и ладно то, что через css можно извратиться как хочешь и поменять местами, но ведь остальная его часть замурована. Может мне просто не хватило терпения и внимательности, но попробуйте что угодно ввести слева в строку поиска. Удивитесь. =)&lt;/p&gt;</description></item><item><title>Цветовая идентификация</title><link>https://blog.rpsl.info/2009/01/cvetovaya-identifikaciya/</link><pubDate>Tue, 13 Jan 2009 00:43:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/01/cvetovaya-identifikaciya/</guid><description>&lt;p&gt;Довольно приятная идея возникла у &lt;a href="http://subz.habrahabr.ru/" title="subz"&gt;subz&lt;/a&gt; в &lt;a href="http://habrahabr.ru/blog/humour/43358.html"&gt;топике на хабрабабре&lt;/a&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;function&lt;/span&gt; &lt;span style="color:#6639ba"&gt;get_username_html_color&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#953800"&gt;$username&lt;/span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;return&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;#&amp;#39;&lt;/span&gt; &lt;span style="color:#0550ae"&gt;.&lt;/span&gt; &lt;span style="color:#1f2328"&gt;substr&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt; &lt;span style="color:#1f2328"&gt;md5&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#953800"&gt;$username&lt;/span&gt; &lt;span style="color:#1f2328"&gt;),&lt;/span&gt; &lt;span style="color:#0550ae"&gt;0&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#0550ae"&gt;6&lt;/span&gt; &lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Пользователь &amp;ldquo;&lt;a href="http://dreadatour.habrahabr.ru/"&gt;Dreadatour&lt;/a&gt;&amp;rdquo; сразу накидал &lt;a href="http://dreadatour.ru/username/"&gt;скрипт&lt;/a&gt; который в реал тайме отобржает ваш цвет&lt;/p&gt;&#10;&lt;p&gt;Идея класс, обязательно куда нибудь прикручу.&lt;/p&gt;</description></item><item><title>Нелепо вышло...</title><link>https://blog.rpsl.info/2009/01/nelepo-vyshlo/</link><pubDate>Tue, 06 Jan 2009 04:53:00 +0000</pubDate><guid>https://blog.rpsl.info/2009/01/nelepo-vyshlo/</guid><description>&lt;p&gt;Пока подготавливал площадку для &amp;ldquo;Movable Type&amp;rdquo;, вышел не приятный казус. Копаюсь в ./cgi-bin/ и делаю:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;*mkdir ./mt &#10;cp -r ./\* ./mt*&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Наблюдаю как сервак уходит в глубокую рекурсию, и тут меня дисконектит из ssh, из ftp и на пинги отвечать он перестает.&lt;/p&gt;&#10;&lt;p&gt;Начинаю ломить в админку у хостера, там тоже бодяга, ничего не работает. Пишу в саппорт:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;От: Виктор Викторович&lt;br&gt;&#10;Дата: 2009-01-06 01:00:56&lt;/p&gt;&#10;&lt;p&gt;Доброй ночи, ссылка &amp;ldquo;Перейти в VDSmanager&amp;rdquo; из &lt;a href="https://my.ispsystem.com"&gt;https://my.ispsystem.com&lt;/a&gt;&#10;не работает.&lt;br&gt;&#10;Мой VDS повис, подскажите как ребутнуть или ребутните сами.&lt;br&gt;&#10;Спасибо.&lt;/p&gt;&#10;&lt;p&gt;От: Leonid Popov&lt;br&gt;&#10;Дата: 2009-01-06 01:03:52&lt;/p&gt;&#10;&lt;p&gt;Проблемы не с вашим VDS. На головном сервере произошёл сбой. Сейчас он&#10;перезагружается. В течении 10 минут будет работать.&lt;br&gt;&#10;Приносим извинения.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;И кто мне там втирал что чудес и совпадений не бывает? А?&lt;/p&gt;</description></item><item><title>Почта на 5 минут или temp mail box</title><link>https://blog.rpsl.info/2008/06/pochta-na-5-minut-ili-temp-mail-box/</link><pubDate>Fri, 27 Jun 2008 22:59:00 +0000</pubDate><guid>https://blog.rpsl.info/2008/06/pochta-na-5-minut-ili-temp-mail-box/</guid><description>&lt;p&gt;Думаю знакомая ситуация, когда необходимо где то зарегистрироваться, но светить свою почту желания нету. Например что бы просто посмотреть на функционал какого нибудь сервиса, или что бы получить ссылку с форума, администрация которых любит их прятать от гостей.&lt;/p&gt;&#10;&lt;p&gt;Для таких случаев существует несколько почтовых сервисов, которые предоставляют &amp;ldquo;временный&amp;rdquo; почтовый ящик.&lt;/p&gt;&#10;&lt;p&gt;Суть заключается в том, что вы просто вводите имя ящика или сервис генерирует его вам и получаете в распоряжение mailbox в который можно получить письмо, а потом о нём забыть.&lt;/p&gt;&#10;&lt;p&gt;Подобные сервисы делятся на два типа, те которые просто предоставляют ящик и те которые предоставляют форвардинг на ваш email. К второму типу я отношусь скептически ибо зачем оставлять свой ящик, не известно кому, если цель всех этих действий его скрыть. Но всё таки ссылки на них приведу ведь не стоит забывать, что если вы сделали себе ящик с именем &amp;lsquo;asd&amp;rsquo;, то его кроме вас посетят ещё много-много людей.&lt;/p&gt;</description></item><item><title>date.centrgroup.ru</title><link>https://blog.rpsl.info/2008/05/datecentrgroupru/</link><pubDate>Thu, 29 May 2008 14:14:00 +0000</pubDate><guid>https://blog.rpsl.info/2008/05/datecentrgroupru/</guid><description>&lt;p&gt;Последние несколько дней полностью посвятил &amp;ldquo;&lt;a href="http://date.centrgroup.ru"&gt;ЦАО Календарю&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;Знаете, как обычно это бывает, по крайней мере у меня. Пришла в голову идея, начал думать, через 20 минут сел за комп и проебался куда то на &amp;ldquo;n&amp;rdquo; часов. В итоге получилось почти то, что хотел увидеть изначально.&lt;/p&gt;&#10;&lt;p&gt;Почему почти? Да потому что, по мере реализации в голову приходят, какие то ещё, более оригинальные решения и конечный продукт может сильно отличаться от того что было задумано.&lt;/p&gt;&#10;&lt;p&gt;Вот также и с календарём. Когда то давно я его сделал можно сказать на коленке, он работал и славно. Потом, из-за какой то непонятной хуйни появились лаги в виде неправильного отображения дней недели и т.п. +реализация его мне совсем перестала нравиться. В итоге за примерно 2 дня я написал полностью новый вариант, и ещё за 2 дня подправил мелкие баги.&lt;/p&gt;&#10;&lt;p&gt;Из новых функций стоит отметить активное использование &lt;a href="http://jquery.com/" title="jQuery is a new type of JavaScript library"&gt;Jquery&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Собственно после знакомства с ним, начал на него молиться. Кто сразу не заметил, теперь месяца можно листать по &amp;ldquo;Ctrl + Right&amp;rdquo; и &amp;ldquo;Ctrl + Left&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;Осталось две незаконченные вещи:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Rss - вот думаю а нужен ли он вообще там? С одной стороны удобно, с&#10;другой как то так&amp;hellip;. Не решил ещё.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Версия для печати - тоже не могу решить, стоит ли она того. Тоесть как её реализовывать? Фунцию мгновенной отправки на принтер использовать не буду сто процентов, только если открывать в новом окне, на белом фоне, с красивым размещением информации на странице. Но нормальных пресс-релизов там тоже очень мало. Организаторы не могут потрудиться и прислать инфу. Ослы. Так что стоит ли её делать тоже не решил.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;</description></item><item><title>Вскрытие запароленых архивов в линуксе</title><link>https://blog.rpsl.info/2008/05/linux-how-to-crack-rar-password/</link><pubDate>Sun, 04 May 2008 02:10:00 +0000</pubDate><guid>https://blog.rpsl.info/2008/05/linux-how-to-crack-rar-password/</guid><description>&lt;p&gt;Бывают же такие ситуации, когда поставил пароль на архив, положил его в &lt;code&gt;/home/kladovka&lt;/code&gt; и забыл.&#10;Вспомнил о нём через пару лет, хочешь посмотреть что же туда прятал, а пароль вспомнить не можешь. Эх досада.&lt;/p&gt;&#10;&lt;p&gt;Для начала, стоит установить следующие пакеты:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install libxml2-dev build-essential&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Теперь качаем последнею версию программы &lt;a href="http://rarcrack.sourceforge.net/" title="rar crack, взлом запароленных архивов в линуксе"&gt;rarcrack&lt;/a&gt; (на момент написания версия 0.2).&#10;После скачивания необходимо распаковать и собрать программу:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;tar -xjf rarcrack-*.tar.bz2&#10;cd rarcrack-*&#10;make&#10;sudo make install&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Готово. Использование:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;rarcrack cripted_file.rar [--threads thread_num] [--type rar|zip|7z]&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;После запуска, программа создаст в каталоке с архивом, .xml файл, в который будет записан текущий результат, в случае успешного подбора хороший результат и символы для подбора&lt;/p&gt;</description></item><item><title>KDE App's in Gnome</title><link>https://blog.rpsl.info/2008/04/kde-apps-in-gnome/</link><pubDate>Sun, 27 Apr 2008 23:39:00 +0000</pubDate><guid>https://blog.rpsl.info/2008/04/kde-apps-in-gnome/</guid><description>&lt;p&gt;Возможно вы так же как и я используете некоторые приложения KDE в среде Gnome. У меня это только &lt;a href="http://amarok.kde.org/"&gt;Аmarok&lt;/a&gt; &amp;ldquo;Amarok, KDE music player&amp;rdquo;, всему остальному есть достойные замены. Так вот, не знаю как с остальными, но &lt;a href="http://amarok.kde.org/"&gt;Аmarok&lt;/a&gt; отказывается воспринимать multimedia клавиши клавиатуры.&lt;/p&gt;&#10;&lt;p&gt;Какое-то время я не обращал на это внимание: ибо обычно напихаю чего хочу в плейлист и доволен, но тут в мои руки попало 9Гб минусов (спасибо &lt;a href="http://torrents.ru"&gt;торрентс.ру&lt;/a&gt; и релизеру) и прослушивание их стало просто отвратительным. Слушать все от начало до конца это ужасно нудно, а каждый раз открывать &lt;a href="http://amarok.kde.org/"&gt;Аmarok&lt;/a&gt; и листать дальше ничем не лучше.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://google.ru"&gt;Google&lt;/a&gt; и тут в очередной раз мне помог. Качаем замечательный скрипт написанный на питоне и выполняем. Вуаля, все хоткеи работают, осталось только скопировать его в /usr/bin/ и добавить в rc.d для автозагрузки.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://www.kde-apps.org/content/show.php?content=60910&amp;amp;vote=bad&amp;amp;tan=22122447"&gt;Gnome Multimedia Keys&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://amarok.kde.org/"&gt;Amarok&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Динамический favicon.ico</title><link>https://blog.rpsl.info/2008/04/dinamicheskiy-faviconico/</link><pubDate>Sat, 26 Apr 2008 00:24:00 +0000</pubDate><guid>https://blog.rpsl.info/2008/04/dinamicheskiy-faviconico/</guid><description>&lt;p&gt;Яркий пример динамического обновления favicon это сайт &amp;ldquo;Вконтакте&amp;rdquo;,&#10;когда включаешь музыкальный плеер, иконка меняется и на ней&#10;отображается, что в данный момент играет музыка.&lt;/p&gt;&#10;&lt;p&gt;Основная задача этой библиотеки — это обновлять favicon через&#10;Javascript, но есть и более серьёзная задача — дать возможность&#10;разработчику возможность сообщать пользователю о каком-то событии в&#10;другой вкладке браузера. Например, если в другой вкладке начала играть&#10;музыка, вы можете сменить иконку этого таба, показывая, что началось&#10;воспроизведение музыки (или другое событие). Или, например, если вам&#10;надо действительно привлечь внимание пользователя, вы можете начать&#10;анимацию иконки.&lt;/p&gt;&#10;&lt;p&gt;Собственно примеры использования:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;favicon&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;change&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;/icon/active.ico&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;new title&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt; &lt;span style="color:#57606a"&gt;// Отменить или начать анимацию иконки + смена тайтла&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;favicon&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;change&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;/icon/active.ico&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt; &lt;span style="color:#57606a"&gt;// Оставить тайтл, менять только иконку&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;favicon&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;change&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#cf222e"&gt;null&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;new title&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt; &lt;span style="color:#57606a"&gt;// Оставить иконку, менять только тайтл&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;favicon&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;animate&lt;/span&gt;&lt;span style="color:#1f2328"&gt;([&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;icon1.ico&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;icon2.ico&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#f6f8fa;background-color:#82071e"&gt;…&lt;/span&gt;&lt;span style="color:#1f2328"&gt;]);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;favicon&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;animate&lt;/span&gt;&lt;span style="color:#1f2328"&gt;([&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;icon1.ico&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;icon2.ico&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#f6f8fa;background-color:#82071e"&gt;…&lt;/span&gt;&lt;span style="color:#1f2328"&gt;],&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#1f2328"&gt;delay&lt;/span&gt;&lt;span style="color:#0550ae"&gt;:&lt;/span&gt; &lt;span style="color:#0550ae"&gt;500&lt;/span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt; &lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;favicon&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;scrollTitle&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;new title&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;favicon&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;scrollTitle&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;new title&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt; &lt;span style="color:#1f2328"&gt;delay&lt;/span&gt;&lt;span style="color:#0550ae"&gt;:&lt;/span&gt; &lt;span style="color:#0550ae"&gt;200&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#1f2328"&gt;gap&lt;/span&gt;&lt;span style="color:#0550ae"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;——&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt; &lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;favicon&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;unscroll&lt;/span&gt;&lt;span style="color:#1f2328"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;favicon&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;unanimate&lt;/span&gt;&lt;span style="color:#1f2328"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.ajaxify.com/run/favicon/scroll/"&gt;Scrolling Favicon Demo&lt;/a&gt;&lt;br&gt;&#10;&lt;a href="http://www.ajaxify.com/run/favicon/scroll/favicon.js"&gt;Scrolling Favicon Library&lt;/a&gt;&lt;/p&gt;</description></item><item><title>speedtest</title><link>https://blog.rpsl.info/2008/04/speedtest/</link><pubDate>Fri, 25 Apr 2008 14:18:00 +0000</pubDate><guid>https://blog.rpsl.info/2008/04/speedtest/</guid><description>&lt;p&gt;Многие уже откровенно запарили своей слепой уверенностью в действенности speedtest.net, я говорю это потому, что данный ресурс является скорее развлекательным, нежели полезным. Проверим, так ли полезен speedtest? Для этого на потребуется простой набор команд, в первую очередь проверим время соединения с сервером где оно и раcположено:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;# time GET -dax speedtest.net&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24292e"&gt;LWP::UserAgent::&lt;/span&gt;&lt;span style="color:#cf222e"&gt;new&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#1f2328"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24292e"&gt;LWP::UserAgent::&lt;/span&gt;request: &lt;span style="color:#1f2328"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24292e"&gt;LWP::UserAgent::&lt;/span&gt;send_request: GET http:&lt;span style="color:#0a3069"&gt;//s&lt;/span&gt;peedtest&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;net&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24292e"&gt;LWP::UserAgent::&lt;/span&gt;_need_proxy: Not proxied&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24292e"&gt;LWP::Protocol::http::&lt;/span&gt;request: &lt;span style="color:#1f2328"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24292e"&gt;LWP::Protocol::&lt;/span&gt;collect: &lt;span style="color:#6639ba"&gt;read&lt;/span&gt; &lt;span style="color:#0550ae"&gt;524&lt;/span&gt; bytes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24292e"&gt;LWP::Protocol::&lt;/span&gt;collect: &lt;span style="color:#6639ba"&gt;read&lt;/span&gt; &lt;span style="color:#0550ae"&gt;1872&lt;/span&gt; bytes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24292e"&gt;LWP::Protocol::&lt;/span&gt;collect: &lt;span style="color:#6639ba"&gt;read&lt;/span&gt; &lt;span style="color:#0550ae"&gt;4096&lt;/span&gt; bytes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24292e"&gt;LWP::Protocol::&lt;/span&gt;collect: &lt;span style="color:#6639ba"&gt;read&lt;/span&gt; &lt;span style="color:#0550ae"&gt;248&lt;/span&gt; bytes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24292e"&gt;LWP::Protocol::&lt;/span&gt;collect: &lt;span style="color:#6639ba"&gt;read&lt;/span&gt; &lt;span style="color:#0550ae"&gt;4096&lt;/span&gt; bytes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24292e"&gt;LWP::Protocol::&lt;/span&gt;collect: &lt;span style="color:#6639ba"&gt;read&lt;/span&gt; &lt;span style="color:#0550ae"&gt;248&lt;/span&gt; bytes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24292e"&gt;LWP::Protocol::&lt;/span&gt;collect: &lt;span style="color:#6639ba"&gt;read&lt;/span&gt; &lt;span style="color:#0550ae"&gt;466&lt;/span&gt; bytes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24292e"&gt;LWP::UserAgent::&lt;/span&gt;request: Simple response: OK&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;real &lt;span style="color:#0550ae"&gt;0&lt;/span&gt;m2&lt;span style="color:#0550ae"&gt;.948&lt;/span&gt;s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user &lt;span style="color:#0550ae"&gt;0&lt;/span&gt;m0&lt;span style="color:#0550ae"&gt;.185&lt;/span&gt;s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sys &lt;span style="color:#0550ae"&gt;0&lt;/span&gt;m0&lt;span style="color:#0550ae"&gt;.051&lt;/span&gt;s&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Почти три секунды у нас занимает соединение, другими словами мы тратим три секунды впусту и имеем 3 секунды отклика от сервера, где считается якобы скорость in/out, на самом то деле считается время ответа на запрос и отклик по-http.&lt;/p&gt;</description></item><item><title>Легальная накрутка на torrents.ru</title><link>https://blog.rpsl.info/2008/04/legalnaya-nakrutka-na-torrentsru/</link><pubDate>Fri, 25 Apr 2008 00:22:00 +0000</pubDate><guid>https://blog.rpsl.info/2008/04/legalnaya-nakrutka-na-torrentsru/</guid><description>&lt;p&gt;Не так давно на форуме &lt;a href="http://forum.asechka.ru"&gt;асечки&lt;/a&gt;, поднимали тему как накрутить себе рейтинг? То есть скачивать много, отдавать мало, но при этом держать &amp;ldquo;ratio&amp;rdquo; на высоте. Из всех вариантов перечисленных там, я не увидел ни одного достойного. Жульничать много ума не надо, а вот суметь сделать так, что бы всегда помногу раздавать скачанные файлы это уже по нашему.&lt;/p&gt;</description></item><item><title>Архив</title><link>https://blog.rpsl.info/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.rpsl.info/archives/</guid><description/></item></channel></rss>