О питании в разных странах

Жизнь прекрасна и удивительна. Бактерии есть практически во всех уголках земли, даже с температурами 113 по цельсию они выживают в горячих источниках.

Так и люди живут в разных регионах и не смотря на всю глобализацию любят питаться традиционной кухней. Почему? Во первых это значительно дешевле чем перевозить издалека, во-вторых здоровей чем срывать зелёные фрукты или замораживать на месяц мясо и в третьих - это организмы близких экосистем к которым постепенно приспособились народы и расы. Будь в Перу открытые залежи молибдена - вполне вероятно что местные жители привыкли бы и нуждались бы в молибдене как компоненту витаминов, так же как все живые организмы привыкли к ядовитому кислороду. Не удивительно что с расселением человечества в космосе там возникнут свои виды человека со своим энерго-эффективным питанием. Такова жизнь - она приспосабливается и самый главный закон - в эффективности.

А вот некоторые фотографии недельных рационов семей из разных уголков земли и их любимой едой.


Интеграция оплаты paypal

Деловые люди сталкивающиеся с интернетом хотят заработать денег, поэтому paypal позволяющий делать оплату кредитными картами по всему миру - ценнейшая услуга для интеграции на свой сайт. Примерные цены за услугу: 2-4% от суммы +  0,3$ за транзакцию зависит от типа оплаты.

У Paypal есть несколько возможностей оплаты товара, но к счастью они едины тем что это делается HTML-формой в которой просто разные входы обозначают разные процессы оплаты. Вот некоторые процессы которые можно сделать..

  •  Покупка в "один клик"
    • С передачей данных об оплате (Payment Data Transfer) - в обычном варианте процесс похож на pangalink. В качестве расширения можно включить авторедирект пользователя после оплаты.
    • Buy Now Hosted Button - упрощённая форма где все данные оплаты уже вбиты в paypal-админке. Хороший вариант для оплачиваемого хобби - например если вы продаёте например свой компакт-диск который один единственный для всего сайта.
    • C межсерверным оповещением (Instant Payment Notification)
  • Корзина
  • Подписка

Ниже я покажу процесс IPN. Для тестирования оплаты есть Sandbox-режим. Для более детального описания этого и других процессов почитайте старенькую но актуальную статью в phpclub

Процесс

В моём случае пользователь покупает "кредиты" (виртуальную валюту сайта) которую может потратить на разные внутренние услуги. Соответсвенно он может выбрать сколько денег он хочет потратить обычным radio-полем
  1. При открытии этой страницы в БД сразу регистрируется новый заказ со статусом "adding". Старые заказы с таким статусом удаляются.
  2. Пользователю показывается форма
  3. При её подтверждении пользователь переносится на сайт paypal где оплачивает услугу со всеми проверками
  4. При удачной оплате Paypal в фоновом режиме говорит серверу по notify_url о состоянии оплаты и именно в это время меняется статус заказа
  5. Пользователь перенаправляется на return URL где ему показывается состояние заказа

Обзор PHPStorm

PhpStorm splash screen.jpg Профессия обязывает каждый день писать на php и поэтому первый важнейший инструмент после головы для меня является среда разработки (IDE). До сих пор я сидел на Zend 5.5, но столкнувшись с PhpStorm 1.0 от чехов с JetBrains сразу перешёл на него.

Понятно что редактор - дело субъективное и многое зависит от проектов с которыми вы работаете. Zend 5.5 мне нравился удовлетворительной скоростью и простым доступом к ftp. Я знал что там ещё были всякие дебаги, интеграция с SVN и sql-серверами но практически их не смог применить. Я пробовал Netbeans, Aptana и PDT, Zend 6 но во все они медленные особенно при индексации файлов и монстроидальный интерфейс с кучами кнопочек. Поэтому и начну сразу с недостатков.

PhpStorm welcome screen.png PhpStorm settings plugins screen.png

Недостатки

  • Невозможно сразу начать работать при медленных (>5 сек) сетевых соединениях (VPN) и обращению к файловой системе
  • Синхронизация файлов при deployment'е удалённого проекта не совмещает различия, а просто перезаписывает удалённые файлы, что делает невозможным изменение файлов двумя пользователями. Есть возможность ручной проверки одиночного файла, но сверять каждый раз самому неудобно.
  • Подвисание процесса при долгой индексации дополнительных папок к проекту и отсутсвие полоски прогресса этого процесса. При обычной индексации всё-таки прогресс показывается и может уходить на задний план.
  • Редактирования по FTP нету. Можно файлы читать, но для полноценного редактирования надо делать локальную копию проекта с настройкой синхронизации и deployment'а, а при переходе с одного IDE на другой и большом количестве проектов ждать скачивание каждого - жуть
  • Автосохранение файлов сразу во время редактирования, хотя и компенсируется "локальной версией изменений файла", однако многим может быть непривычно при переходе из других IDE.
  • Глупое автодополнение тэгов в html режиме (вечно мне добавляет comment тэг!). В редактировании php кода методы не подсказываются автоматически а только с нажатием Ctrl+Space, видимо из-за погони за скоростью.
  • Импорт remote-проекта без возможности фильтра ненужных папок. Точней этот фильтр появляется в настройках после того как вы скачаете весь проект. Очень удручающая ситуация когда есть папка с кучей картинок которые не нужны. Конечно есть фильтр типов файлов с масками, но это не совсем то
  • Пугающие настройки. Их просто много. Разве что они понятней чем в Эклипсе - сразу разбиение на настройки проекта и настройки IDE.
  • Непривычность клавишных связок (hotkey binding) - например у меня несколько раз возникала ситуация когда я двигался назад по истории изменений (Undo), а потом хотел вернуться нажимая Ctrl+Y и вместо этого терял Redo-историю потому что Ctrl-Y на самом деле удаляет строку
  • Мало плагинов. Из серверов управления задачами только Jira и собственній youtrack. То же касается систем версионирования (Есть CVS, SVN, git, perforce). В основном они пишутся для общего редактора IntelliJ idea, а php-просто как частный случай

Как у всех..

Редактор визуально очень похож на все существующие IDE - динамические панели как у eclipse но с меньшим визуальным шумом иконок. Тут собственно меню, панель дерева файлов, панель структуры класса, внизу дополнительные панельки для todo, версионирования, иерархий и удалённого редактирования (появляются по мере необходимости).

Очевидно что редактор не компилятор и не настолько умён что-бы понимать переменные при использовании extract() или при переменных с динамическими именами через $$var — анализ этого на лету просто нереально ожидать и соответсвенно в проектах такие дела подсвечиваются как ошибки деклараций переменных. То же касается закриптованных частей через Ioncube или Zend guard.

Про автодополнение с Ctrl+Space я уже говорил, так же тут и Ctrl+click работает для перехода к собственно декларации метода или класса. И Ctrl+D дублирует строку. Тут есть и закладки строчек через Ctrl+Shift+цифра. Есть тут и поддержка PHPdoc и @todo синтаксиса.

Основные фишки

Главные прелести редактора - хорошая скорость в обычном редактировании текста - ничего не прыгает, не задумывается на три секунды покуда я печатаю.. Вобщем есть "основа" которая дополнена мелочами в которых и кроется секрет хорошего блюда:
  • Поиск классов Ctrl+N и файлов Ctrl+Shift+N в том числе и со звёздочками (wildcard). Очень полезно и быстро, потому что файлы как правило разбросаны в разных ветках дерева и консоль всегда оперативна
  • Скролл при поиске или при навигации по своим закладкам строк через Ctrl + цифра. Очень помогает не потеряться и интуитивно понимаешь в какую сторону файла ты прыгаешь.
  • Рефакторинг имён файлов, классов и методов во всём проекте и/или поиск их использования. Потому что часто просто боишься поменять старое название на более информативное потому что не помнишь где это используется, а искать как фразу через Ctrl+F запаришься
  • Подключение внешних папок. Скажем если у вас 10 проектов в которых используется повторяемый фреймворк (PEAR к примеру) или закриптованный код, то можно подключить внешнюю папку чтобы IDE понимала пространство имён
  • Версионирование. Как встроенная история изменений, так и отлично встраиваемый SVN со всякими диффами, определённо лучше TortoiseSVN.
Приятно удивили и некоторые мелочи
  • Поддержка smarty шаблонизатора. С одной стороны для меня это позитив - я его использую. С другой стороны так же обойдены стороной остальные фреймворки для которых тоже неплохо бы иметь плагины что-ли для быстрого запуска комманд генерации кода и тп.
  • Иерархия вызовов метода и вызываемых методов в hierarchy блоке
  • Статус и ручная чистка памяти в статус-баре - сразу говорит о заботе
  • Локальная история изменений файла
  • Перетаскивание строки или целого выделенного блока с сохранением табуляции через Ctrl+Shift+Up/Down вместо того что-бы делать Copy-Delete-Paste с ручным форматированием
  • Вернуться к последнему месту редактирования Сtrl+Shift+Backspace

Кроме этого в редакторе есть простор для изучения до которого я ещё не дорос:

  1. XDebug для профилирования скриптов.. Для удалённого проекта надо что-бы расширение на сервере было установлено, поэтому всюду использовать нельзя.
  2. PHPUnit для автоматического тестирования кода
  3. SASS для более гибкого написания css

Twitter/Facebook-подобная постраничная навигация

Я вот уже больше месяца как делаю социальную сеть pling.ee, которая акцентируется на связи посредством мобильных телефонов (SMS/MMS) и позиционировании людей с их помощью. Достаточно перспективный проект (как твиттер на дрожжах) и популярный среди местной молодёжи тем что можно почти нахаляву общаться.

Но технически возникла небольшая получасовая техническая задачка с навигацией, и раз уж я давно не писал, то может вам тоже будет полезно. Дело в том что в поток сообщений показывается ajax-ом, подгружаясь по X-сообщений  за раз чистым html (для json просто пришлось бы больше писать). Задача - прятать кнопку "ещё" если сообщений больше нет. Очень просто, но как оказывается не всё так очевидно.

Twitter pagination.png Facebook pagination.png

Вот возможные решения (от худшего к лучшему)

  1. При первой загрузке страницы делать второй запрос и узнавать какой ID у последнего сообщения и потом детектить его показ с помощью js. Проблема в том что как правило SQL для запроса и так сложный, а тут надо его продублировать с изменением сортировки. Уже пахнет говнокодом.
  2. Если число подгружаемых результатов меньше ожидаемых X элементов на странице то сразу прятать кнопку. Конечно с вероятностью 1/X она всё-таки будет показываться, зато
  3. Сделать что-бы нажатие кнопки сразу показывало спрятанные закешированные результаты (и если их нет - то не показывать кнопку) + делать ajax-запрос и результаты прятать (а если их нет то тоже прятать кнопку). Тут много игры с js и к тому же подгружаются лишние данные (не факт что пользователь всегда нажимает на продолжение)
  4. Использовать SQL_CALC_FOUND_ROWS что-бы расчитать число всех элементов и если их меньше чем offset + число на странице, то просто отметить последний элемент css-классом и через javascript проверить и спрятать кнопку если класс присутсвует

The Office

Неделю как заболел и начал смотреть «The Office» — сериал об обычных работниках обычной американской компании «Dunder Mifflin» из немного захолустного департамента города Скрэнтон (в паре часов езды от Нью Йорка). Во многом саркастический юмор, пародирующий жизнь белых воротничков. По сути это ситком - персонажи очень мало меняются на протяжении всех сезонов, историю и мораль из эпизода понять трудно но что мне нравится так это игра актёров.

Поражаюсь порой как можно так сыграть что человек реально краснеет от смущения или как наворачиваются слёзы (3 сезон 24 серия). Вторая особенность - камера не невидимая. С ней беседуют как на интервью, она подсматривает как будто перенося зрителя в этот офис без открывающихся окон. Много постановок на реальной улице - такого давно не видел.

Этот сериал о разнообразии и реализме. Помните «Friends»? Так вот там все относительно идеальны (кроме Фиби разве что), а тут такой же склепок самоопределения американской жизни, но на работе. Совершенно разные люди, характеры и возрасты в уже устаревающей компании каким-то чудом работают и не сходят с ума друг от друга, хотя очевидно должны — одна из серий посвящена как раз теме что эта жизнь хуже чем в тюрьме.