Category: it

Category was added automatically. Read all entries about "it".

megamind

Total Commander, Notepad2, Notepad++ & regular expression negative lookahead (lookarounds)

Этот пост я на самом деле написал для себя, чтобы в следующий раз не тратить время. Периодически возникает необходимость сделать поиск с помощью регулярного выражения и, например, negative lookahead. Допустим, нужно найти строку в которой сразу после "ID " не должно быть "777" или "888". Регулярное выражение с использованием negative lookahead будет выглядеть так: "ID (?!777|888)" (без кавычек). Однако ни библиотека TRegExpr, используемая автором Total Commander, ни Notepad2, используемый у меня по умолчанию в качестве простого редактора текста, не поддерживают lookarounds. В такие моменты выручает Notepad++, который это поддерживает.
megamind

PHP Warning: mysqli_real_connect() : MySQL server has gone away

PHP Warning: mysqli_real_connect() : MySQL server has gone away
Вот такую вот ошибку я начал видеть несколько раз в день после перехода на PHP 5.3 под Windows.
Длительные поиски в гугле ни к чему не привели, но вот в чем оказалось дело в нашем случае:
PHP использует одну из двух библиотек для работы с mysql: MySql Client Library (libmysql) или MySql Native Driver (mysqlnd). Под windows до версии php 5.3 (не включая) использовалась библиотека libmysql. В версии php 5.3 по умолчанию используется mysqlnd и нет версии php 5.3 скомпилированной с использованием libmysql.
Вышеописанная ошибка появилась именно в php 5.3 с использованием mysqlnd. В php 5.2 где использовалась libmysql этой проблемы не было, но она появилась сразу же после апгрейда. При установке сайта на linux хостингах с php 5.3 такой проблемы не наблюдалось.
Так что если у кого вылазиет такая ошибка - вполне возможно, что это не баг в вашем коде, а просто вы используете php 5.3 под Windows.
megamind 3

Кратко про репозитории и бэкапы

На заметку:

Если сначала скопировать куда-нибудь полностью working copy, после чего удалить каталог с working copy и сделать свежий check out, то могут всплыть некоторые проблемки. Например, может оказаться что в репозитории не хватает какой-то 3rd party dll из-за чего проект не билдится, или что какой-нибудь автотест не проходит, т.к. использует в работе каталог, который по умолчанию после check out'а не создается.

Похожая ситуация с бэкапами. Если предварительно скопировать содержимое системного раздела на другой диск, после чего отформатировать системный раздел и поставить заново систему и софт, то может оказаться, что не вся важная информация бэкапилась.

В общем-то ничего сложного и сверхъестественного, но иногда полезно устроить такую проверку для выявления скрытых проблем.
megamind 5

Про выбор типа исключения при неверном значении перечисления

Представим следующий код:

SomeMethod(xxx someArgument)
{
  ...
  switch(someArgument.SomeEnumProperty)
  {
    case xxx:
      ...
    case yyy:
      ...
    default:
      throw new ???????????????? // какой тип?
  }
  ...
}

Т.е. в метод передается некоторый объект, свойство которого (типа Enum) имеет недопустимое для данного метода значение. Такая ситуация может быть, когда метод сознательно допускает только определенные значения перечисления (и не может быть выполнен/не должен вызываться при других значениях); либо когда делается "перестраховка на будущее", т.е. если в будущем добавится новый элемент перечисления, не поддерживаемый данным методом, то метод сразу об этом сообщит с помощью исключения, после чего разработчик сможет либо исправить вызывающий код, либо этот метод, так чтобы он стал поддерживать новое значение перечисления.

Ситуация должна быть понятна, так что вернемся к главному вопросу: какой тип исключения выбрать в такой или в аналогичной ситуации?
Collapse )
megamind 2

Установка RedMine на Windows

Решил сегодня установить RedMine. Кто не знает - это web система управления проектами. Т.е. в систему добавляются проекты, по каждому проекту ведется учет задач (запросов на новые фичи, исправление багов), есть форум, wiki, план разработки, можно прилагать различную документацию и файлы.
Поставить и заставить все работать у меня получилось с 3-го или 4-го раза. Позже, поискав в интернете, я увидел, что я не один такой, что некоторые мучаются аж по неделе :), другие просто забивают, так и не добившись работоспособности. Я также пробовал пакетный инсталлятор от Bitnami, который по задумке должен был сделать все за меня, но на деле не получилось (сначала он вис, потом, когда я разобрался с зависанием, то были ошибки при установке mysql и т.д.).
Потратив 3 часа, я решил поделиться опытом и написать пошаговую инструкцию по установке Redmine на Windows.
Collapse )
megamind 3

По поводу кеширования css & javascript

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

Проверял на реальном сайте на удаленном хостинге. Сайт на PHP, веб-сервер - Apache.

Итак, 2 режима:

а) Режим по умолчанию, т.е. в ответе заголовок:
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Т.е. ответ с сервера сообщает браузеру о том, что кешировать не нужно. Правда браузер дальше уже сам будет решать, как ему себя вести.

б) Режим с включенным кешированием, когда из PHP вызываю session_cache_limiter("private_no_expire"), что приводит к получению такого заголовка в ответе:
Cache-Control: private, max-age=10800, pre-check=10800
Т.е. ответ с сервера говорит, что прокси-сервер (если таковой имеется) кешировать не должен, а браузер - может. И что время жизни кеша должно быть ограничено 10800 секундами, т.е. 3 часами.

Поведение браузеров такое:
Collapse )
megamind 4

Выполнение периодических фоновых задач на сервере

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

Какие основные варианты у нас имеются?
1) Написать простое GUI-приложение которое будет запущено на сервере и будет выполнять наши задачи.
2) Написать службу Windows (windows service), которая будет запускаться вместе с загрузкой Windows и так же выполнять наши задания.
3) Использовать Планировщик заданий windows (scheduled tasks) для запуска написанных нами приложений, которые будут выполнять что нужно.

Давайте разберем основные плюсы и минусы (на мой скромный субъективный взгляд) каждого подхода:
Collapse )
megamind 5

Цена индексов в MySQL

Меня всегда мучал вопрос - насколько плохо добавлять очередной индекс в таблицу? Ведь все знают, что индексы помогают ускорить выборку, но замедляют изменение данных в таблице (потому что происходит перестройка индексов). При большом количестве индексов время, которое тратится на их перестройку при изменении таблицы может быть заметным. Или нет? Надоело мне гадать и я решил проверить сам.

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

Итак, что имеем:
MySql. Таблица из ~40 колонок и ~700K строк. Колонок так много во-первых потому что нужны, во-вторых потому что таблица уже старая и была изначально плохо нормализована, а сейчас уже сложно переделывать. Реальный проект. Функция добавления заказа в базу данных. В заказе 1000 позиций, все они будут добавлены в таблицу. Так как я не знал как будут перестраиваться индексы (синхронно или асинхронно), то я решил добавить в тест замеры времени выполнения последующих нетривиальных селектов (если индексы перестраиваются асинхронно то возможно это будет заметно по времени выполнения селектов). В таблице уже было около 20 индексов.

Перед каждым запуском теста я импортировал талицу с нуля и перезапускал MySql сервер, чтобы очистить кеш. После этого проводил тест (т.е. когда в кеше БД еще ничего нет), а потом проводил тест второй раз (когда часть БД уже закеширована).
Процедуру повторял 5 раз для усреднения результатов и уменьшения погрешности измерений.

Итак результаты до добавления дополнительных индексов:
Collapse )
megamind 10

MySql и поиск по индексированным boolean полям

Может это я такой ламер в базах данных, что не знал, но только сегодня первый раз заметил и офигел.
Представим такой запрос:

SELECT * FROM mytable WHERE BooleanColumn1 AND NOT BooleanColumn2;

И допустим что у нас индекс по полям BooleanColumn1 и BooleanColumn2. Запросу удовлетворяет только малый процент записей в таблице, и мы ожидаем, что будет использован индекс и запрос выполнится быстро.
Однако не тут то было!
При использовании такого вида фильтра в выражении WHERE, MySql не использует индекс для булевых полей!
Чтобы индекс использовался, нужно написать запрос так:

SELECT * FROM mytable WHERE BooleanColumn1 = true AND BooleanColumn2 = false;

Вот такие вот дела. Я к сожалению не встречал, где документировано такое поведение, может быть просмотрел. Если кто укажет ссылку на официальный материал, где это документировано, буду благодарен. Может я вообще чего-то не понимаю и это абсолютно логичное поведение?
Кстати, как в других СУБД?