программыный код

Обновлен список спецсимволов на нашем сайте

vihv.org – коды спецсимволов XSLT, CSS и HTML

Теперь это полный список,  содержащий 251 символ. Дополнительно теперь указан код для использования в CSS.

Расскажу немного подробнее, поскольку раньше этого у нас не было.

Итак, задача для примера:

Дано: кнопка вида

<span class='form__button'>Read more</span>

Нужно превратить её в следующее

Read more

Для этого нам потребуется добавить к тексту кнопки что-то свое. Делаеться это с помощью селекторов :before и :after с использованием инструкции content.

.form__button:after {
content: ' \bb';
}

Здесь \bb – тот самый код спецсимвола для CSS.

Разработка десктопных приложений на PHP

Я просто оставлю это здесь
http://j-php.net/wiki/Getting-started

Что такое JPHP? это компилятор php для виртуальной машины Java (JVM).
Соответственно:

  1. Итоговый байткод работает везде, где работает JVM.. то есть везде :) на телефонах, на raspberrytPi, под видой, под linux – везде. Ну разве что микроконтроллеры можно исключить.
  2. Можно использовать Java библиотеки, например Swing. Или,например, Gdx.
  3. Для разработки десктопных приложений можно использовать тех же специалистов, что и для разработки web-приложений.
  4. Поскольку есть возможность создания локального веб-сервера, можно использовать его + браузер для создания декстопных приложений на базе web-приложений.

С другой стороны – надо пробовать.

Наши бесплатные плагины для WordPress

http://wordpress.org/extend/plugins/search.php?q=vihv

plugins_wp

Уже более двух тысяч скачиваний

Некорректная работа var_dump

Столкнулся вот с таким – функция var_dump выдает неполную информацию о переменной, пестрящую многоточиями. В итоге мы видим на экране примерно следующее:

class stdClass#185 (1) {
      public $ItemLink =>
      array(7) {
        ...
      }

Что совершенно неприемлемо. Как выяснилось очередные умники придумали “полезную” функцию, а мантейнеры не придумали ничего умнее чем врубить её по умолчанию. Для того чтоб увидеть данные нужно просто вырубить это расширение.

Называется оно xdebug.

Как отключить – ищем /etc/php.d файл xdebug.ini и комментим единстренную строку

zend_extension=/usr/lib/php/modules/xdebug.so

либо ищем аналогичную строку в php.ini

перегружаем апачь.

Счастье!

Прямые ссылки на документацию API социальных сетей

Утомился я по малозаметным ссылкам в десять кликов добираться до них.

http://developers.facebook.com/docs/

http://vk.com/developers.php#devstep2

https://developers.google.com/+/ https://developers.google.com/accounts/docs/OAuth2

https://dev.twitter.com/docs

http://api.mail.ru/docs/guides/sites/

http://dev.odnoklassniki.ru/wiki/display/ok/API+Documentation

Паттерн Объект-Список

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

Цель: нам нужно получить список неких сущностей, например, из БД или иным способом и далее с ними работать. Например, список постов на текущей странице блога.

Как я это делал раньше: создавал два класса, один для списка, другой для элемента списка.  Примерно так:

  1. class TMyPost extends TItem  {
  2.  function setProperty() { … }
  3.  function getProperty() { … }
  4. }
  5. class TMyPostList extends TList  {
  6.  function getList() {
  7.   $list = requestDatabase();
  8.   foreach($list as $item) {
  9.    $result[]=new TMyPost($item);
  10.   }
  11.   return $result;
  12.  }
  13. }

В коде это вызывалось так:

  1. $list = new TMyPostList();
  2. $posts = $list->getList();

То есть, суть такова: получаем список того, что возвращает CMS или ORM или как-то иначе, и оборачиваем в свой класс, который строим так, как нам удобно. Решение, на самом деле, достаточно громоздкое. Самая большая проблема – это проведение границы ответственности. Она вроде как логична, когда речь идет только о получении данных, но как только туда начинают добавляться методы, которые делают что-то еще, – начинается путаница.

Например: получить список объектов – задача класса – TMyPostList,  получить отдельный объект – задача класса TMyPost. А получить список объектов из одного элемента – обратно TMyPostList. В итоге – или дублирование или излишние запросы к бд.

В какой-то мере это решается отказом от класса TMyPost, но, как показывает практика, объект, репрезентующий единичную сущность, все равно нужен.

Решение, или как я это делаю теперь:

Объединяем классы в один таким способом:

  • Основным будет класс, репрезентующий единичный объект (например, TMyPost).
  • Класс для списка убираем вообще (заменяем массивом) или делаем его глубоко приватным – все остальные классы будут вызывать только методы TMyPost и не должны ничего знать о TMyPostList.
  • Методы класса списка превращаем в фабричные методы внутри единичного объекта.

Примерно так:

  1. class TMyPost extends TItem {
  2.   function __construct($data) {}
  3.   static funcion createList() {
  4.     $list = getDataSomehow();
  5.     foreach($list as $item) {
  6.       $result[] = new TMyPost($item);
  7.     }
  8.     return $result;
  9.   }
  10. }

 

А в коде вызываем так:

  1. $posts = TMyPost::createList();

Получается более короткая и непротиворечивая конструкция.

Перенос опыта программирования на управление производством

Мартин Фаулер в “Архитектуре корпоративных приложений“. Описывает следующие критерии производительности:

  1. Время отклика ( время, за которое система обрабатывает запрос и посылает ответ )
  2. Быстрота реагирования ( время подтверждения принятия запроса )
  3. Время задержки ( минимальный интервал до получения отклика )
  4. Пропускная способность ( количество операций в единицу времени )
  5. Загрузка ( определяет “давление” на систему, обычно пропорциональна количеству пользователей или интенсивности их работы )
  6. Чувствительность к загрузке ( зависимость времени отклика от загрузки )
  7. Эффективность ( удельная производительность в пересчете на одну единицу ресурса )
  8. Мощность ( наибольшее значение пропускной способности или загрузки )
  9. Способность к масштабированию ( свойство, характеризующее поведение системы при добавлении ресурсов )

Знаете, что я вам скажу? Все это прекрасно переносится на управление бизнесом.

Права доступа

Чет я затупил, я же могу сделать два разных события OnEdit и OnEditMine для редактирования всех вообще и для редактирования только своих. А обработчик на них поставить один и тот-же. Мне нужно будет только определить какое событие наступает, а это вполне осуществимо.

PHP устраниение конфликта классов

Удобняшка

if(!class_exists(‘TSomeClass’)) {

class TSomeClass {

}

}

функция class_exists(Имя класса [какие-то не особо важные доп параметры]) проверяет объявлен ли уже данный класс. Это круто помогает когда у нас в большом проекте где-то затесался include вместо require_once или когда класс присутствует в двух разных файлах, а править инклюды по всему коду времени нет. Хотя конечно правильней и лучше устранить источник проблемы. Наличие такой конструкции в коде можно смело считать запахом.