Как использовать sudo в цепочных командах

Standard

Есть такая команда: cat hosts.txt >> /etc/hosts (мы хотим добавить список хостов из файла в файл hosts). Допустим нам нужны права на то, чтобы прочитать первый файл и права на запись во второй. Как быть?
Решение, следующее:
sudo sh -c 'cat hosts.txt >> /etc/hosts'

Где стоит побывать. Часть 1.

Standard

Прочел в книге «100 мест в которых стоит побывать прежде, чем умереть», вычеркнул неинтересные мне места и места в которых уже побывал — осталось 92:

  1. Мачу — Пикчу
  2. Пирамиды
  3. Водопад Игуасу
  4. Тадж — Махал
  5. Гранд — Каньон
  6. Вел. китайская стена
  7. Петра
  8. Нац. парк  Серенгети
  9. Водопад Виктория
  10. Большой Барьерный Риф

Ozon Api краткая документация

Standard

Как то пришлось работать с OZON Api, выкладываю их доступные методы. Рассказывать особо нечего — из названия функций и переменных итак понятно, как все работает. <POST> — означает послать POST запрос на адрес их api сервера.

  1. ItemGet(article)
  2. ItemListGet(filterName, filterArticle, filterMinQty, filterMaxQty, filterMinPrice, filterMaxPrice, filterMinPictureCount, filterMaxPictureCount, filterStatus, filterItemTypeID, itemsOnPage, pageNumber, sortTag)
  3. <POST> ItemAdd(article, descript, itemAvailabilityId, itemTypeId, name, price, qty)
  4. <POST> ItemStatusModify(article, statusId)
  5. OrderGet(orderNumber)
  6. OrderListGet(orderNumber, stateId, minOrderSum, maxOrderSum, deliveryVariantId, paymentTypeId, minOrderDate, maxOrderDate, clientId, pageNumber, ordersOnPage, sortTag)
  7. RevokeTypesGet()
  8. <POST> ItemModify(article, descript, itemAvailabilityId, itemTypeId, name, price, qty)
  9. <POST> ItemPicturePackUrlAdd(url)
  10. <POST> ItemPictureRemove(pictureId)
  11. <POST> ItemPictureUrlAdd(article, url)
  12. <POST> OrderStatusModify(orderNumber, statusId)

Статусы:

  • 1733000
  • 1735000

Полезные jquery функции

Standard

Обычные:

  • $(‘selector’).load() //загрузит данные в селектор, можно даже так: $(‘selector’).load(‘somepage.html#someAnchor’) закачивает страницу ищет по анкору кусок документа и вставляет его в селектор

Для работы с ajax:

  • $.post(url, data, callback) //data строка или {}
  • $.get()
  • encodeURIComponent() // не jQuery функция, позволяет кодировать символы в урле
  • $(‘#someForm’).serialize() // очень классная функция, берет все элементы в форме и формирует из них json объект
  • .error(callback) // если в аяксе ошибка — callback ее обработает
  • .getJSON() // сокращенная запись $.get(‘url’, data, callback, ‘json’)
Перемещение по DOM`у:
  • .find(‘selector’) // ищет по заданному селектору, иногда быстрее чем сама ф-ция $
  • .children() //возвращает детей
  • .parent() // возвращает верхнего родителя
  • .closest(‘selector’) // идет по дереву вверх, при нахождении селектора, останавливается и возвращает его
  • siblings() // соседи
  • next() // сосед справа
  • prev() // сосед слева

Работа с html:

  • end() // метод возвращает ориг. объект селектора, к примеру $(‘selector1′).doStuff().find(‘selector2′).end() в конце он вернет объект на к-ый ссылается селектор selector1, а не selector2
  • wrap(‘<sometag></sometag>’) // обрамляет элемент в заданный html
  • wrapInner()
  • unwrap()
  • empty()

$().delegate(‘selector’, ‘event’, f(){}) ~ .live()

Лично я придерживаюсь такого стиля: когда надо сохранить в переменную jQuery объект, я именуя его предваряя долларом, к примеру $someVar = $(‘#someId’). Кстати сохранять jQuery объекты в переменных очень полезно, тк данные будут сохранены в памяти и еще раз вам вызывать тот же самый селектор не понадобится.

Советы по селекторам:

  • исп ID где можно
  • исп ID как первое в род. селекторе
  • $(‘#main’).find(a) бывает быстрее иногда чем $(#main a)
  • Не исп много селекторов, лучше сделать так: find(‘selector’).find(‘selector’).find(‘selector’)

Работа с регулярками в JS:

  • /regexp/
  • str.search(//)
  • .replace(//, replace)
  • match()

Стоит ли делать flush в PHP

Standard

По мотивам этой статьи. В ней советуют использовать flush ф-цию из PHP чтобы отдать клиенту данные из output буффера, таким образом что клиент увидит страницу раньше, чем если бы мы flush не воспользовались. Но к этой технике есть пара замечаний:

  1. Время PHP скрипта между началом и концом выполнения мало по сравнению со временем передачи данных, это уменьшит время приблизительно на 0.5 секунд, в зависимости от кода. Убедитесь что это вам необходимо.
  2. Это техника не работает с gzip output buffering
  3. Если вы флашите очень часто вы будете отсылать почти пустые пакеты при флаше, что возможно вызовет увеличение времени загрузки (на медленных соединениях)
  4. После того как буфер сброшен, вы больше не сможете отослать доп. заголовки
  5. Ответ сервера будет в виде chunked encoding, что означает клиент не будет знать размер данных (из-за этого не отобразится «x% готово» при скачивании файла)

С другой стороны и у этой техники есть плюсы, если ваш скрипт долго работает — flush поможет клиенту увидеть данные как можно раньше.

Как ускорить IPBoard форум

Standard

Недавно чинил форум на движке IPBoard (версия не самая новая была), было необходимо ускорить сайт — он открывался секунд за 40, после моих стараний он открывается за 1 сек. Итак, как ускорить форум:

  1. Установить NGINX + всю статику отдавать от него. (У заказчика стояли хитрые правила в apache пришлось не статический трафик отправлять через него, как reverse proxy).
  2. Обновите PHP, MySQL если у вас не стоит свежая стабильная версия.
  3. Установите правильные настройки в MySQL (про это сделаю отдельную статью).
  4. Установите настройку «Обновление просмотров темы немедленно» (Update Topic Views Immediately) на нет (в админке -> настройки -> CPU)
  5. Можно сделать и такое с таблицой сессий (мне не помогло):   alter table ibf_sessions Engine = ‘heap’;
  6. Установите memcached, в файле conf_global.php установите следующие настройки:

    $INFO['use_memcache'] = 1;
    $INFO['memcache_server_1'] = "nameofserver";
    $INFO['memcache_port_1'] = "11211";

    На самом деле все вышеописанное придало не очень ощутимый прирост (порядка 1-5 сек.), пришлось использовать XHProf расширение для PHP чтобы профилировать код и выяснить, в чем же собственно проблема! Про XHProf сделаю отдельную статью.

Динамические свойства объекта в PHP и StdClass

Standard

PHP позволяет создавать необъявленные переменные на ходу:
$someClass->nonExistenVar = 'someValue';
в итоге создастся переменная класса nonExistenVar. Если логика класса не такая простая — можно использовать магические методы __get и __set, но они как правило медленнее раз в 30 обычного присваивания.

Разница между empty(), isset() и is_null() в PHP

Standard

Лично я путаюсь в ответе на вопрос «В чем между ними разница». Поэтому приклепляю табличку на память.
Примечания:

  • $undefined — необъявленная переменная
  • NULL — переменная объявленна, но ей не присвоено никакого значения (что она означает в пхп)
  • 0 — ноль
  • false — одноименная булевая переменная
  • 353 — любое цифровое значение (int, float)
  • «» — пустая строка
  • В столбце «Функция» == и === означают, что значение сравнивается с false те для столбца 353 выполняется следующая операция: false == 353
Функция $undefined NULL 0 false 353 «»
isset() false false true true true true
empty() true true true true false true
is_null() true true false false false false
== true true true true false true
=== false false false true false false

Лично мое мнение: в javascript с этим все логичней как-то, есть специальный тип undefined, есть тип null к-ые друг от друга все же отличаются. В php другая история, тут надо использовать isset чтобы проверить объявленна ли эта переменная в коде выше.