Сегодня мне пришлось решить рутиную задачу – изменить размер PNG картинок не теряя при этом прозрачность. Искать какой либо софт было лень, поэтому решил написать bash скрипт, который всё сделает за меня.
Недавно мне пришлось переместить данные MySQL в другую папку(а точнее на другой раздел) на Debian Linux 5.0.3.
Логично, что простым переносом файлов тут не отделаешься, надо что-то где-то прописать.
По-умолчанию данные MySQL лежат в /var/lib/mysql. Мне захотелось, чтобы они были в /home/mysql. Переносим папку mysql куда нам нужно, затем лезем в конфиг MySQL (/etc/mysql/my.cnf).
Там есть опция:
datadir = /var/lib/mysqlВот её мы заменяем на следующее:
datadir = /home/mysqlПробуем перезапустить наш MySQL сервер (/etc/init.d/mysql restart) и в итоге у нас ничего не запускается.
Смотрим tail /var/log/messages и видим приблизительно такое:
kernel: [ 2714.258037] audit(1227462526.718:13): type=1503 operation="inode_create" requested_mask="w::" denied_mask="w::" name="/home/mysql/yii.test" pid=19659 profile="/usr/sbin/mysqld" namespace="default" kernel: [ 2714.310572] audit(1227462526.770:14): type=1503 operation="inode_permission" requested_mask="rw::" denied_mask="rw::" name="/home/mysql/ibdata1" pid=19659 profile="/usr/sbin/mysqld" namespace="default"
Это нам говорит о том, что политика AppArmor запрещает всякие манипуляции мусклу в новой папке. И это естественно, ведь AppArmor думает, что базы лежат всё там же, в /var/lib/mysql.
Значит надо переписать конфиг AppArmor. Открываем и редактируем /etc/apparmor.d/usr.sbin.mysqld . В нём меняем всё, где упоминается /var/lib/mysql на /home/mysql. Затем перезапускаем AppArmor и MySQL:
sudo service apparmor restart sudo /etc/init.d/mysql restart
И у нас всё работает! Такая же схема для Ubuntu.
С недавнего времени доступны репозитории разрабатываемой версии Ubuntu Lucid Lynx.
Для обновления до Ubuntu 10.04 LTS введите в консоли следующую команду:
sudo do-release-upgrade -d -p
Ubuntu 10.04 (Lucid Lynx) является LTS релизом и выйдет в апреле 2010 года. Будет поддерживаться особенно долго и тщательно.
Друзья, теперь вы можете читать и комментировать мои записи и на Я.ру — Bethrezen!![]()
Wolfden в своём блоге написал о начале тестирования второй беты Sabayon 5.0.
Он надеется выпустить финальную версию Sabayon 5.0 через две недели, однако точной даты никто не знает. (далее…)
Хочу предложить Вашему вниманию концепт расширяемой структуры приложения на Yii Framework. Я уже писал как сделать свои Actions на Yii.
Сегодня же речь пойдёт о написании стандартных экшенов для контроллеров и их расширения.
Предположим, в приложении у нас все контроллеры наследуются от класса dotPlantFrontMainController.
Нам необходимо, чтобы у всех контроллеров было действие Breadcrumb.
Для этого, в базовом контроллере dotPlantFrontMainController переопределяем функцию actions() следующим образом:
public function actions() { return array( 'breadcrumb' => 'application.extensions.actionBreadcrumb', ); }
Если в унаследованном контроллере(скажем News) мы используем экшены из других файлов, то нам необходимо также переопределить функцию примерно вот так:
public function actions() { // return external action classes, e.g.: return array_merge( parent::actions(), array( 'admin'=>'application.controllers.News.ActionAdmin', ) ); }
Таким образом, в News будут экшены определенные в базовом классе dotPlantFrontMainController плюс ActionAdmin.
Переписать же actionBreadcrumb можно уже в теле самого News.
В итоге имеем легко расширяемую структуру. В самом же базовом классе массив actions можно автоматически генерировать в соответствии с установленными расширениями. Всё легко и просто ![]()
Поставил я как то себе на домашний компьютер Sabayon 4.2 Gnome x86_64. Конечно хотелось бы скачать Sabayon 5, но его ещё нигде нет – одни слухи только. Первое впечатление о системе было замечательное.
Ну Gentoo как Gentoo, только ставится быстрее, не надо с хэндбуком сидеть. Есть встроенный менеджер пакетов entropy с графическим фронтэндом Sulfur. Из консоли всё ставится через equo install. emerge также работает.
Недавно при разработке одного сайта, столкнулся с проблемой декодирования на PHP полученной через curl страницы, сжатой в gzip.
Допустим у нас есть код, который делает запрос через php-CURL с возвращением заголовков:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); //curl_setopt ($ch, CURLOPT_VERBOSE, 2); // Отображать детальную информацию о соединении curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0'); //Прописываем User Agent, чтобы приняли за своего curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // Возвращать результат curl_setopt ($ch, CURLOPT_HEADER, 1); // Наши заголовочки curl_setopt ($ch, CURLINFO_HEADER_OUT, 1); // Где то наткнулся на этот параметр, решил оставить curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 30); $result = curl_exec($ch);
В итоге получаем в $result нашу страницу с заголовками сервера. Проверим, закодированна ли она и дешифруем её, если нужно:
if (strstr($result,"Content-Encoding: gzip")) { $result = preg_replace("/(.*)Content\-Encoding: gzip\s+/isU","",$result); $result = gzinflate(substr($result, 13)); }
Вот и всё. Если Вам нужно просто gzip контент расшифровать, то можно в substr заменить 13 на 10. (+3 из-за \n после заголовков).
Вот мой блог и переехал с Blogger на Wordpress.
Дизайн пока временный. Скоро переделаю. Надеюсь, это не затянется ![]()
Сегодня столкнулся с одной особенностью INPUT элементов с атрибутом disabled. Как оказалось – они не передаются серверу при сабмите формы.
Вышел из положения вот таким изящным способом на jQuery:
$(function(){ $("form").submit(function(){ $("input").attr("disabled", ""); $("select").attr("disabled", ""); }); });
Таким образом, при действии submit у всех input и select элементов убирается атрибут disabled. Один минус – не работает при отключенных скриптах. Но в моём случае без JavaScript и jQuery не работает вообще всё приложение, так что это не так страшно.
Комменты