Простой XML-RPC клиент на PHP

Однажды мне потребовалось выполнить несколько XML-RPC запросов, и я столкнулся с недостатком клиентов с простой и работающей реализацией данного механизма.

Я перепробовал различные библиотеки, но они оказались слишком сложными. Например, реализация XML-RPC из репозитория PEAR довольно сложна в установке на Windows, а на линуксовом шаред-хостинге ее не всегда возможно установить. XML-RPC на sourceforge имеет некоторые проблемы с кодировкой UTF-8. Так что я быстро создал свою простейшую реализацию XML-RPC клиента.

Локализация в javascript в Ruby on Rails

При разработке многоязычного приложения мы рано или поздно столкнемся с необходимостью локализации строк используемых в javascript. В Ruby on Rails для этих целей есть замечательный гем i18n-js. Мне понадобилось некоторое время, чтобы разобраться как он работает, не смотря на наличие документации. В какой-то момент я даже было подумал, что это безнадежный вариант и чуть было не бросил эту затею, хотя на самом деле все оказалось просто.

Локализуем надписи select2 из примера одной из предыдущих статей.

Хитрые роуты с локалями в Ruby on Rails

  scope "/:locale", locale: /#{I18n.available_locales.join("|")}/ do
    resources :posts
    root to: redirect("/%{locale}/posts", status: 302)
  end
  root to: redirect("/#{I18n.default_locale}", status: 302), as: :redirected_root
  get "/*path", to: redirect("/#{I18n.default_locale}/%{path}", status: 302), constraints: {path: /(?!(#{I18n.available_locales.join("|")})\/).*/}, format: false

Рассмотрим вышеуказанный кусок кода из файла config/routes.rb и построчно изучим что же он делает.

Передача данных в javascript при помощи gon и jbuilder в Rails

Порой возникают задачи в которых нужно передать данные из сервеного кода в javascript.

Я уже писал о варианте решения данной задачи на PHP для фреймворка Yii, а сейчас пришла очередь Ruby on Rails. Для этих целей уже существует вполне удобный гем gon и у него даже есть неплохая документация. Тем не менее при использовании данного гема возникают некоторые вопросы, на которые нет подробных ответов и инструкций, поэтому я решил поделиться своим опытом на примере простого приложения.

Генерация (скаффолдинг) админки в Ruby on Rails

Как правило каждое приложение на Ruby on Rails имеет какой-то свой административный интерфейс, если только это не совсем простенький полу-статичный сайт визитка (наверное в таком случае больше подойдут Sinatra или Padrino?). Известный человек в мире Rails — Райан Бейтс в одном из своих первых рейлскастов предлагает объединять в коде административный и публичный раздел. Думаю имеет место и другой подход. Вот почему:

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

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

Хочу рассказать вам о том, как же максимально просто провести такое разделение на примере тестового приложения.

Управление жизнью

Кажется я решил отступить от темы программирования и «поговорить немного о жизни».

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

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

Если хотите сухую выжимку сути, то можете найти её в англоязычной версии данного сайта.

Вступление.

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

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

Creativity

Будь креативным.

Начинай делать сразу же, как только зажегся идеей.

Трать на реализацию идеи все свободное время, энергию и ресурсы.

Сосредоточься на результате, всё остальное — минорно, не важно.

Переоценивай, давай оценку с запасом или реалистично.

Ставить четкие сроки достижения результата.

Создавай быстро.

Создавай свою идею за 1 день, за неделю, за месяц, но не дольше!

Если ты не можешь создать хотя бы ее прототип за столь большой срок, ты не создашь ее никогда!

Получи конкретный результат, который можно показать другим.

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

Умей донести до людей «фишку», полезность твоей идеи.

У тебя еще будет время улучшить полученный результат.

Привлекай других людей к реализации своих идей.

Делись своими идеями!

Узнавай больше!

Динамическая инициализация новых виджетов твиттера

В сентябре 2012 года Twitter анонсировал новые захватывающие «инструменты реального времени для разработчиков веб-сайтов» ©, то есть новые виджеты. Причем старые виджеты кажется должны были перестать поддерживаться как раз в мае 2013, но видимо отключат их таки в июне. Так что самое время подумать о переезде на новую версию APi и новые виджеты.

Настройки виджета Embedded Timeline можно найти на сайте для разработчиков. Интересно то, что о динамической подгрузке виджета практически нигде не сказано. А порой это бывает нужно, например, когда часть контента страницы или даже вся страница подгружается аяксом. Как же это сделать? Есть ответ!

Редирект с www средствами роутинга в Ruby on Rails

В большинстве случаев редирект с поддомена www на домен второго уровня (или обратно) реализуется на уровне web-сервера (например, apache или nginx). Вот пример редиректа, настраиваемого в конфиге nginx:

        if ($host = 'www.dhampik.ru') {
                rewrite  ^/(.*)$  http://dhampik.ru/$1  permanent;
        }

Однако такая возможность имеется не всегда - иногда просто нет доступа к настройкам web-сервера, например, если вы используете хостинг heroku. В этом случае может помочь настройка редиректа средствами роутинга в Ruby on Rails.

Проблемы использования twitter bootstrap в Ruby on Rails на Windows

Пишем сайт. На Ruby on Rails. Хотим простого и красивого интерфейса из коробки и решаем использовать Twitter Bootstrap. И случилось такое дело, что разрабатываем мы в Windows. Конечно разрабатывать ruby-приложения на Windows - не лучшая идея, однако порой — вынужденная мера (например, под рукой у вас есть только виндовый компьютер или вы попали в команду "специфических" разработчиков).

Для подключения twitter bootstrap eсть 2 наиболее популярных гема - twitter-bootstrap-rails и bootsrap-sass. Разберем сложности, которые мы можем встретить при их использовании.

Реализация фильтрации по тегам в Yii и не только

Теггирование различных элементов очень часто встречается в разработке сайтов. Сами теги реализуются просто — это отдельная таблица с названиями тегов и таблица связки многие-ко-многим между тегами и какими-то сущностями. Однако реализация фильтрации по тегам — не такая уж простая задача. Фильтровать сущности по тегам как правило приходится одним из следующих вариантов:

  • выбрать все элементы без тегов
  • выбрать элементы, имеющие все указанные теги (и возможно, другие теги)
  • выбрать элементы, имеющие один или несколько из указанных тегов (и возможно, другие теги)

Рассмотрим каждый из этих случаев и приведем пример конкретной реализации фильтрации на Yii.

Передача параметров из контроллера в javascript-файлы

Javascript во вьюхах — часто ли вы встречаете такое?
Зачастую во вьюху из 3-5 строчек html-кода вставляются портянки яваскрипта на сотни строк.
На просьбу вынести этот код в отдельный js файл — можно услышать ответ, что в коде используются php-переменные из контроллера и, поэтому, вынести этот код из в отдельный js-файл не представляется возможным.

А в общем-то это довольно просто сделать. Просто и удобно.

Далее речь пойдет о реализации для фреймворка Yii, однако аналогичный подход легко реализуем и в других фреймворках.

Качественный импорт дампа базы mysql

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

SET NAMES utf8;
DROP DATABASE `mydb`;
CREATE DATABASE `mydb` DEFAULT CHARACTER SET utf8;
USE `mydb`;
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 
SET autocommit=0;
SET foreign_key_checks=0;
SET unique_checks=0;
SOURCE /path/to/db_dump.sql;
COMMIT;
SET autocommit=1;
SET foreign_key_checks=1;
SET unique_checks=1;

Эти команды позволят вам быстро импортировать дамп базы данных и избежать проблем. Причем некоторые из этих проблем не решают даже распространенные mysql-клиенты, такие как phpMyAdmin и другие.

Magento: проблемы с var_dump и print_r

Сталкивались ли вы когда-нибудь с тем, что при выводе объекта на экран при помощи var_dump или print_r вы получали пустую страницу?

При выводе некоторых объектов PHP просто не хватает памяти (потому что объекты рекурсивны).

В таком случае в Magento у всех объектов, наследуемых от Varien_Object (а это практически все объекты), существует специальный метод debug(). Он позволяет избавиться от рекурсии.

Чтобы вывести дамп объекта в magento используйте следующую конструкцию: var_dump($product->debug());

Вывод результата запроса консоли mysql в вертикальном формате

Случалось ли такое, что при выборке из таблицы с множеством столбцов вы получали совершенно нечитаемый вывод на экран (из-за того, что столбцы расползались по нескольким строкам)?

Оказывается, можно вывести каждую строчку по-отдельности в виде пар «ключ: значение». Для этого всего лишь нужно в конце запроса вместо ; поставить \G

Старт!

Добрый день!

Меня зовут Кирилл Калачёв.

Сим постом даю старт своему сайту и блогу!

Если вы его посетили и читаете, то вы вероятно очень любознательны!