morontt.info

РаботаZfort Group

Zfort Group

Три месяца уже работаю работником на новой работе, в Zfort Group. В общем и целом всё норм. Есть плюсы и минусы, конечно.

Из плюсов - процессы более организованные, за различные аспекты рабочего процесса отвечают разные люди, но так оно и должно быть, потому что людей в сумме уже не десяток, а пару сотен. Основная цель, которую я преследовал при смене работы - это лучшие бытовые условия и, собственно, условия труда, и цель эта была достигнута. Правда, не обошлось и без ложки дёгтя, а возможно, и не ложки, а целого ведра. И таким ведром оказался мой проект :)

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

Вот, собственно, и всё.

GitСинхронизация форкнутого репозитория с оригинальным

Очередная заметка для самого себя, чтобы не искать. Вроде бы всё до ужаса элементарно, но не запомню, пока не напишу об этом :)

Первым делом добавляем remote-репозиторий, ссылающийся на оригинальный, назовём его, к примеру upstream1. Список удалённых репозиториев можно посмотреть командой git remote -v, чтобы убедиться, что всё верно.

После вытягиваем все изменения, произошедшие в репозитории upstream2 и сливаем их со своим репозиторием3.

# шаг 1

git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git

# шаг 2

git fetch upstream

# шаг 3

git checkout master
git merge upstream/master

UbuntuUbunutu 16.04 и F2FS

Установил на ноутбук последнюю LTS версию Убунты в экспериментальных целях и был слегка разочарован тем, что не обнаружил в инсталляторе возможность выбора файловой системы F2FS, которая изначально разрабатывалась для flash-памяти и просто доктор прописал использовать её с SSD-накопителями. Однако немного поразмыслил и решил поместить домашнюю директорию на отдельный раздел с F2FS, ведь почти все мои файлы и манипуляции с ними происходят именно в этой папке.

Для начала нужно загрузиться с LiveCD, или, скорее, с LiveUSB, и отбить свободное место от основного корневого раздела, если это не было сделано при инсталляции. Делается довольно просто с использованием того же GParted. Сразу отформатировать в F2FS, скорее всего, не получится. Я оставил раздел неотформатированным. После перезагружаемся обратно в установленную Ubuntu.

Теги: linux ubuntu f2fs

PHPmail(), msmtp и Яндекс.Почта для домена

Переносил к себе на сервер один сайт и наткнулся на такую задачку, как отправка писем. Письма в движке этого сайта отправляются обычной функцией mail, а желания (да, в общем-то, и потребности) переписывать хоть одну строчку кода не было. Для отправки сообщений я давно уже использую сервис Яндекс.Почта для домена. Есть, конечно, куча других вариантов, но и этот отлично работает. Можно отправлять почту и своими силами, но имеется большая вероятность попасть в папку "спам" у получателей, необходимо настраивать разные штуки, вроде SPF и DKIM. В общем, было принято решение подружить mail и Яндекс.Почту

Для отправки задействуем транспорт SMTP, а отправлять будем простым клиентом msmtp. Устанавливается он двумя движениями пальцев, даже писать неохота, но напишу (для Debian или Ubuntu).

sudo apt-get install msmtp
Теги: php mail smtp msmtp

ЛитератураРегулярные выражения. Основы

Майкл Фицджеральд - Регулярные выражения. Основы

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

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

В общем, изучайте и пользуйтесь :) Вреда от них точно не будет, а загадочный частокол скобочек и палочек в коде, вроде такого, станет более понятным.

NewsНовая админка

Спустя кучу лет привёл до работоспособного состояния и запустил третью версию движка этого бложика. Вернее, это только его часть, админка. Предыдущая торжественная заливка была почти 4 года назад :) Собственно, эту запись из неё первую и пишу.

Технически залитая часть сайта представляет из себя SPA (single page application) на Ember.js и REST API на PHP фреймворке Symfony2. Исходники доступны на гитхабе, так что можете изучать и ломать это приложение полностью.

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

PHPАутентификация через системных пользователей линукс

Предположим, что возникла потребность аутентифицировать пользователей PHP-приложения посредством уже существующих в системе пользователей. Тогда для решения этой задачи можно заюзать PAM (Pluggable Authentication Modules). Если в двух словах, то через эту систему производятся манипуляции с пользователями и их паролями такими программами, как login, passwd или su. Если нужно больше информации, тогда вам сюда, например.

Описываемые ниже действия происходят в Ubuntu 14.04. В той же убунте 12.04 имелся готовый пакет php5-pam-auth, но позже его не стало.

Ставить расширение будем из PECL, вот оно. Предварительно доустановим пару пакетов, если они ещё не установлены. Приступим:

sudo apt-get install php5-dev libpam0g-dev
sudo pecl install PAM

Без php5-dev будет ругаться, что нету phpize, а без libpam0g-dev будет появляться гадостная ошибка install the the PAM library or use --with-pam=DIR to specify the location.

После успешной компиляции добавляем пару строк в php.ini

extension=pam.so
pam.servicename="php"

И добавляем соответствующий сервис для PAM

sudo su

cd /etc/pam.d
ln -s login php

Готово :)

PHP + PAM

P.S. Возможен ещё такой момент. При работе, например, через Apache или другой веб-сервер, функция pam_auth будет возвращать ложный результат независимо от правильности логина/пароля. Связано это с тем, что пользователь, от которого работает веб-сервер, не имеет доступ к файлу /etc/shadow. Возможно, что можно каким-то образом донастроить сервис php для PAM, с этим я разбираться не стал, а применил более простое решение - добавил пользователя апача в группу shadow, хоть и понимаю, что почти наверняка этим действием проделал ещё одну дыру в безопасности :)

sudo usermod -aG shadow www-data
Теги: php linux ubuntu auth

UbuntuNode.js версии 0.12 и убунта

Как-то раньше я уже описывал установку последней версии Node.js на Ubuntu, но приключилась печалька. Беда, собственно, заключается в том, что в описанном репозитории последняя версия ноды 0.10.37, а проект требует минимум 0.12.

Но выход есть всегда :) Node.js уже установлен, нужные переменные окружения прописаны, поэтому чтобы исключить возню с поисками других репзиториев, просто скачаем одну папочку и поправим пару симлинков:

wget http://nodejs.org/dist/v0.12.7/node-v0.12.7-linux-x64.tar.gz 
tar xvzf node-v0.12.7-linux-x64.tar.gz

sudo su
cd /usr/bin

mv npm npm_old
mv nodejs nodejs_old
ln -s /path/to/node-v0.12.7-linux-x64/bin/node nodejs
ln -s /path/to/node-v0.12.7-linux-x64/lib/node_modules/npm/bin/npm-cli.js npm

На этом пока всё.

Теги: linux ubuntu nodejs

MySQLПакетное обновление или batch update

Иногда возникает потребность обновить много записей в базе данных, например 3000, 7000 или 25000 штук. Видел даже веб-формы с таким количеством полей, хоть это и полное безумие :) Можно, конечно, обновить эти записи поштучно, но бомбардировать сервер базы данных запросами - плохая идея. Желательно сделать это за раз. И сделать это возможно следующим образом:

INSERT INTO table (`id`, `x`, `y`) VALUES
  (1, 2, 3), (4, 5, 6), (7, 8, 9)
  ON DUPLICATE KEY UPDATE `x` = VALUES(`x`), `y` = VALUES(`y`);
Теги: mysql database sql
1 2 3 4 5 6 7 8