30 июля 2016 г.

MS SQL и PHP PDO: вставка с триггером

В общем история такая.
Существует таблица в БД MS SQL с которой связан триггер. Триггер отвечает за аудит — сохраняет всю информацию о пользователе и его действиях при вставке, обновлении или удалении записи в этой таблица.

Так вот, столкнулся с проблемой, что при вставке данных, используя PHP PDO (в основе Zend Framework), вставка происходила успешно, но Zend вываливался в exception и не было ясно, что с этим делать. Я попытался создать новую таблицу, с парой полей, привязать к ней аналогичный триггер и получил ту же самую ошибку.

Изучая вопрос, я где-то натыкался на совет, что нужно указать NOCOUNT ON;
Я предполагаю, что PDO ждет ответ о изменении одного поля в результате вставки (обновления, удаления), но получает еще и ответ о срабатывании триггера, который в свою очередь также затрагивает одно поле и в итоговом счете в результата информация о изменении двух полей — это не нравится PDO и мы получаем ошибку.

Повторно эту рекомендацию нагуглить не удалось, но это было первое что я делал — в начале триггера, либо перед выполнением операции вставки я добавлял запрос NOCOUNT ON;, но это не приводило к успеху. И далее, что я только не пробовал — все было безуспешно. Даже поставил довольно классную программу по детальному логгированию всей информации по взаимодействию с MS SQL.

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

Проблема решилась.

22 февраля 2016 г.

История первого ремонта. И вообще...

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

Выбор сделан. 1 комнатная квартира, площадью 54кв.м. Добавкой лоджия на 6 кв.м. Оформлена ипотека. В Газпромбанке — оказался самым демократичным по процентам из тройки популярных банков.

Бюрократия, как и везде, не сказал бы, что зашкаливает.

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

Т.к. ремонт по максимуму было решено делать своими силами, время ожидания было наполнено планированием и проектированием всего и вся. Это размышление над функциональным и красивым интерьером, уйма схем и чертежей, куча вариаций. И разведывательные походы по строительным/мебельным магазинам. Просмотренно 100500 тематических статей, видеороликов, форумов. Время проектирования-думания-изучения заняло как минимум 20% времени от всего времени потраченного на ремонт (это 9 месяцев). На самом деле очень важный этап, без которого ремонт своими силами нормальный не сделать.

Вот так выглядит квартира на плане от застройщика.


10 апреля 2014 г.

Перекодирование видео на Mac OS X

Для перекодирования любых видео-форматов на Mac OS X использую отличную утилиту MPEG Streamclip — она функциональна, имеет кучу настроек и работает, наверное, со всеми популярными форматами.

Был удивлен, когда она захотела MPEG 2 компоненту для перекодирования VOB файлов (с DVD диска).

Компонента оказалась платной. И даже если ее (QuickTimeMPEG2.dmg) найти на хороших ресурсах, стоит вопрос, как ее установить.

Так вот — оптимальный путь. Качаем MPEG_Streamclip_1.9.3b8.dmg, монтируем и запускаем Utility MPEG2 Cpmponent M. Lion, смонтировав QuickTimeMPEG2.dmg со всем соглашаемся, вводим пароль администратора и наслаждаемся результатом — теперь MPEG Streamclip работает с VOB файлами!

26 октября 2013 г.

Установка Oracle Instant Client на Linux, привязка к PHP. Без заморочек.


Клиент устанавливаем не самый свежий — 11.2 — используется для нормальной работы со старыми базами Oracle (версии 9). Последний на данный момент релиз 12.1 их уже не поддерживает, но данная инструкция позволяет установить и его.

Сразу ставим эту библиотеку:
aptitude install libaio1

Качаем Oracle Instant Client и прочие необходимые компоненты с сайта.

Копируем из zip архивов содержимое в
/opt/oracle/

В моем случае получилось
/opt/oracle/instantclient_11_2/

Далее по порядку:
TNS_ADMIN=/opt/oracle/network
LD_LIBRARY_PATH=/opt/oracle/
instantclient_11_2/
ORACLE_HOME=/opt/oracle
instantclient_11_2/
PATH=$PATH:$ORACLE_HOME/
export TNS_ADMIN ORACLE_HOME LD_LIBRARY_PATH PATH


Как показывает практика, команды показанные выше, необходимы для работы SQLPlus, но не обязательны для PHP. Еще нужно найти способ, чтобы система эти пути запомнила навсегда, иначе после перезагрузки вам придется прописывать пути заново.

Далее создаем папку network — дочернюю для ORACLE_HOME 

В моем случае:
/opt/oracle/instantclient_11_2/network/

В ней создаем файл

tnsnames.ora 

Содержимое файла в моем случае такое:
NAMEFORUSE =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.200)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = SERVICE_NAME)
    )
  )
В большинстве случаев вам нужно поменять только те значения, что выделены жирным: имя для подключения к базе (используется, например, в PHP), IP адрес сервера, где находится база данных и имя базы данных (сервисное имя).

Также требуется создать папку admin в /opt/oracle/instantclient_11_2/network/ и разместить в ней созданный файл tnsnames.ora 

Создадим файл
/etc/ld.so.conf.d/oracle.conf   
пропишем  путь
/opt/oracle/instantclient_11_2/

Выполним команду:
ldconfig

Привязываем к PHP. Я всегда использую удобный пакет для развертывания Apache, PHP, MySQL — LAMPP.

После установки, вся конфигурация для работы с базами Orcale сводится к вводу команды:
/opt/lampp/lampp oci8
Система попросит указать путь к библиотекам Oracle, в моем случае я ввел:
/opt/oracle/instantclient_11_2/

Все готово для работы, теперь можно соединяться с базами данных, используя PHP.

18 марта 2013 г.

Получение списка IP сетевых устройств в LAN

Запускаем bat файл вида:
@echo off
setlocal enabledelayedexpansion
for /l %%a in (1,1,254) do (
ping -n 1 192.168.1.%%a | find "TTL" >nul
if !errorlevel!==0 ( echo IP 192.168.1.%%a - OK ) else ( echo IP 192.168.1.%%a is not responding )
)
и... получаем результат


25 января 2013 г.

Установка и настройка Pure-FTPD (Pure FTP)

Здесь я опишу подробный способ установки FTP-сервера Pure-FTPD и помогу вам избежать проблем, с которыми столкнулся сам: из-за не окрепшей дружбы с линуксом, или не очевидных и не описанных нюансов в установке и настройке.

Устанавливаем обычную версию (еще бывает mysql):
apt-get install pure-ftpd-common pure-ftpd

Здесь важно отметить, что после установки сервис запускается автоматически с параметрами по умолчанию. Остановка, старт или перезапуск:
/etc/init.d/pure-ftpd stop
/etc/init.d/pure-ftpd start
или
/etc/init.d/pure-ftpd restart

Далее мы должны создать группу пользователей FTP и пользователя, который будет находиться в этой группе, и под которым будут работать все пользователи FTP как виртуальные  (не нужно плодить реальных пользователей в системе — удобно)
groupadd ftpgroup
useradd -g ftpgroup -d /dev/null -s /etc ftpuser

Теперь можно добавить виртуального пользователя:
pure-pw useradd remote -u ftpuser -g ftpgroup -d /home/pubftp/remote -N 10

Где remote  имя пользователя для доступа к FTP, а /home/pubftp/remote — персональная директория, с которой он будет работать. -N 10 задает квоту в 10МБ (ограничение на использование дискового пространства). Эту директорию не нужно создавать вручную, т.к. она появится автоматически (параметр задается при конфигурировании, об этом чуть позже) при первом подключении и обмене данными с сервером.

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

Список существующих пользователей:
pure-pw list

Подробная информация о пользователе:
pure-pw show remote


Удаление пользователя — когда-нибудь может пригодиться, но не сейчас:
pure-pw userdel remote

Удаляем методы авторизации имеющиеся по умолчанию:
rm /etc/pure-ftpd/conf/PAMAuthentication /etc/pure-ftpd/auth/70pam

Включаем puredb — преимущества в скорости работы, наверное (:
ln -s ../conf/PureDB /etc/pure-ftpd/auth/45puredb


При первом запуске команда создает БД, а после любых операций с пользователями — обновляет (не забывайте ее запускать каждый раз):
pure-pw mkdb

24 января 2013 г.

Запись образа Debian на флешку

Все операции производились из под Mac OS X.

Скачиваем подходящий ISO образ установочного диска.

Сначала узнаем под каким именем флешка в системе (предварительно подключив ее):

diskutil list

В моем случае это была /dev/disk5

Далее просто побитно записываем образ на флешку, используя dd:

sudo dd if=/path/to/debian.iso of=/dev/disk5 bs=8192

Размер блока почти не влияет на скорость записи, некоторые рекомендуют использовать в Mac OS X 8192. В моем случае образ размером 200МБ записывался на флешку около 7 минут.

Метод наверняка будет работать и с другими дистрибутивами Linux. Да — записывать можно на USB HDD, USB FLASH DRIVE, FLASH CARD.

Файлы базы данных Paradox и работа с ними используя PHP

Появилась необходимость подружить древние и мало-кем используемые файлы формата Paradox (*.px + *.db) с веб-приложением.

Попытка установить расширение PECL для работы с этими файлами на виртуальный Debian провалилась, не смотря на следование разным инструкциям, опубликованных добрыми людьми. Убил я на это час или два.

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

Наткнулся на интересный инструмент под Linux-like системы — pxtools от некоего Jan Kneschke. С помощью него можно конвертировать вышеуказанные файлы в добрые SQL, CSV или XML, которые затем легко использовать, в том числе в разработке/работе веб-приложений.

Установка утилиты не вызвала никаких проблем:

wget http://jan.kneschke.de/assets/projects/pxtools/pxtools-0.0.20.tar.gz
tar xvfz pxtools-0.0.20.tar.gz
cd pxtools-0.0.20
./configure
make
make install

Чтобы убедиться в том, что наши файлы подходят для препарирования сим инструментом, можно выполнить команду:

pxinfo -f  /path/to/db/file.db

И достать данные, сохранив в формате MySQL:

pxsqldump -d mysql -f /path/to/db/file.db > /path/to/saving/file.sql

Или csv:

pxcsvdump -f /path/to/db/file.db > /path/to/saving/file.csv

Конечно-же все это дело можно теперь автоматизировать и обрабатывать как угодно много файлов  — работает быстро, в т.ч. используя PHP.