Блог пользователя Nelex

test

Laravel 5: собственная кастомная страница не найдена (404)

Задача:

Выводить собственную страницу 404

Решение:

Открываем файл app/Exceptions/Handler.php и немного меняем код функции render:
//...
public function render($request, Exception $e)
{
//customize 404 page
if ($this->isHttpException($e)) {

$statusCode = $e->getStatusCode();

switch ($statusCode) {
case '404':
//путь к файлу с HTML разметкой
return response()->view('front/notfound');
}
}
return parent::render($request, $e);
}
//...
Вот собственно и все. Нашел как-то на страницах интернета, ссылку на источник не помню.
test

Laravel 5: генерируем Sitemap.xml

Задача создавать Sitemap.xml по крону.

Как и говорит нам документация по Laravel 5. В нем уже есть готовый планировщик, достаточно добавить его один раз в крон, а все нужные задачи подключать уже в него. Создаем задачи для планировщика
#php artisan make:console XMLSitemap
Console command created successfully.
Новый файл будет создан по пути...
test

Laravel 5: Middleware удаляющий конечный слеш в пути url

Задача

Если в конце ссылки присутствует символ "/" делать редирект 301 на страницу без него самого.
Задача типичная, значит решение найти не сложно
Итак, создаем Middleware:
#php artisan make:middleware RedirectTrailingSlash
Middleware created successfully.
Заполняем наш файл (app/Middleware/RedirectTrailingSlash.php) соответствующим кодом:
<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Str;

class RedirectTrailingSlash {

/**
* Handle an incoming request.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Closure  $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (preg_match('/.+\/$/', $request->getRequestUri()))
{
//в исходном коде использовалась другая функция редиректа, выбивало ошибку
return redirect(rtrim($request->getRequestUri(), '/'), 301);
}
return $next($request);
}
}

Регистрируем наш Middleware в Http/Kernel.php:
'front.trailingslash'=>'App\Http\Middleware\RedirectTrailingSlash',

Используем. Я использовал его в конструкторе базового контроллера, чтобы все наследующие контроллеры его выполняли:
//...
class BaseController extends Controller {

//...
public function __construct()
{
$this->middleware('front.trailingslash');
//...
}
//...
}

Все. Теперь при переходе на ссылку вида /our/url/ нас перешлет на /our/url
test

Повторение команды в Linux каждый n секунд

Маленькая заметка о полезной команде Watch

Когда-то мне понравилась команда multitail, которая позволяет отслеживать вывод команд и обновление логов в одном терминале разбивая его на несколько окон. Но есть вариант куда проще. Чтобы повторять команду постоянно каждых несколько секунд достаточно использовать команду watch, например статус gearman сервера:
watch -n 2 gearadmin --status

Или каждых 3 секунды просматривать последних 10 строк лога:
watch -n 3 tail -10 /var/log/php-cli.log
test

Laravel 5 + CKEditor = простой Fileuploader

CKEditor Нужно мне к очередному проекту прикрутить CKEditor + простой загрузчик файлов. Использовать внешний загрузчик не вижу смысла, а тот интерфейс который предоставляет нам CKEditor для загрузки файлов нам вполне годиться. Сам проект использует базовый фреймворк Laravel 5.
Создаем контроллер для загрузки файлов, выполнив команду из консоли:
test

Bash-скрипты бекапа баз данных MariaDB и Bash-скрипт массового восстановления из бекапа.

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

Скрипт создания бекапа

Создает папку с названием - текущей датой и все базы данных складывает в файл.
Изначально создадим файл mysqlbackup.sh с содержимым:
dbpass="pass"
DATE_DIR=$(date +%Y-%m-%d-%H)
mkdir /home/nelex/MySQL_BKP/${DATE_DIR}
for dbname in `echo show databases| mysql -u root -p$dbpass`; do
echo "Dump $dbname..."
mysqldump -u root -p$dbpass $dbname > "~/MySQL_BKP/${DATE_DIR}/$dbname.sql"
Создадим и папку в которую будет складываться бекап и делаем скрипт исполняемым::
mkdir ~/MySQL_BKP
chmod +x mysqlbackup.sh

Массовое создание баз данных из sql файлов и их импорт.

Понадобилось мне залить сразу несколько баз данных, и чтобы не делать это все руками я написал этот небольшой скрипт.
Скрипт берет указанную в первом параметре папку и из нее проходит по каждому SQL файлу, создает базу с названием файла без ".sql" и загоняет файл в нее. Все просто:
#!/bin/bash
indir=$1
dblogin="root"
dbpass="pass"
postfix=".sql"
prefix="./"
cd $indir
for file in `find ./ -type f -name "*$postfix"`
do
    table_tmp=${file%$postfix}
    table_tmp=${table_tmp#$prefix}
    table=${table_tmp,,}
    mysql -u$dblogin -p$dbpass -e "create database $table default charset utf8"
    mysql -u$dblogin -p$dbpass $table < $file
Делаем файл исполняемым:
chmod +x mysqlbackup.sh
Не забываем что наш скрипт бекапа создает и таблицы используемые самой СуБД, так что если вам они не нужны, удалите/переместите их.
Таким образом запускаем файл:
import_from_dir.sh ~/MySQL_BKP/2015-06-02-14

Вот и все.
test

Ошибки установки пакетов в Debian "missing final newline" и "bash: /usr/bin/apt-get: cannot execute binary file: Exec format error"

Жизнь на частично экспериментальной версии дистрибутива привносит свои приключения. И снова ошибка. На этот раз вида:
dpkg: unrecoverable fatal error, aborting:
files list file for package 'imagemagick-6.q16' is missing final newline

И таких ошибок было несколько, появлявшиеся одна за другой. Решение достаточно простое. Нужно найти файл с соответствующим названием и переместить в временную директорию. Не знаю стоит ли его возвращать на место, но переместить с места куда-нибудь уж точно стоит.
# mkdir /var/lib/dpkg/info/old
#mv /var/lib/dpkg/info/imagemagick-6.q16.* \  /var/lib/dpkg/info/old/
У меня таких файлов было несколько, перемещал их все, после этого dpkg заработал.
Следующая ошибка в у меня выглядела при запуске команд apt так:
bash: /usr/bin/apt-get: cannot execute binary file: Exec format error

Чтобы ее поправить нам и нужен был рабочий dpkg, печально было бы если бы тот в свою очередь тоже умер.
На этой странице выбираем нужный нам дистрибутив и ищем более свежую версию apt, в нашем случае в категории "Administration Utilities". Качаем и ставим командой:
dpkg -i apt.deb

Вероятно что выдаст сообщение о проблеме с зависимостями, точнее их версиями. В моем случае:
Unpacking libapt-pkg-dev:amd64 (1.0.9.10) over (1.0.9.7) ...
dpkg: dependency problems prevent configuration of libapt-pkg-dev:amd64:
libapt-pkg-dev:amd64 depends on libapt-pkg4.12 (= 1.0.9.10); however:
  Version of libapt-pkg4.12:amd64 on system is 1.0.9.7.
libapt-pkg-dev:amd64 depends on libapt-inst1.5 (= 1.0.9.10); however:
  Version of libapt-inst1.5:amd64 on system is 1.0.9.7.

dpkg: error processing package libapt-pkg-dev:amd64 (--install):
dependency problems - leaving unconfigured
Errors were encountered while processing:
libapt-pkg-dev:amd64
Это значит что указанные пакеты так же нужно скачать нужной версии и поставить до установки этого пакета.
На этом все.
test

Чиним поломаную табличку в MySQL\MariaDB: Table 'sources_template_fields_value' doesn't exist in engine.

Получил ошибку в MySQL/MariaDB:
Table 'sources_template_fields_value' doesn't exist in engine

До этого переносил базу файлами, просто скопировав /var/lib/mysql

Чтобы починить нужно для нужной таблицы выполнить следующие команды:
alter table sources_template_fields_value discard tablespace;
alter table sources_template_fields_value import tablespace;

После этого табличка снова в строю.
test

Рекурсивно задать права доступа для всех папок и для всех файлов

В очередной раз копируя шаблон админ-панели в новый проект, получил неправильные права доступа. Чтобы все махом поправить, нужно всем директориям дать доступ на чтение и открытие, а всем файлам права на чтение для всех.
Выполнить это можно всего-лишь двумя командами:
chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)


Найдено на superuser.com
test

AwesomeWM: виджет индикатор раскладки своими руками

Надоело без виджета раскладки клавиатуры, да и хотелось сделать свой виджет для Awesome WM. Версия Awesome WM 3.5.

Немного о самом виджете

Виджет использует только доступные в системе команды. Специально не делал завязку на другие программы типа kbdd и skb, так как их может не быть в системе по умолчанию. Весь код ниже идет с комментариями почти каждой строки, объясняющей что к чему и почему.

Создаем виджет

Качаем иконки
Распаковываем сами картинки(размером 48 пикселей), нужные для наших раскладок в ~/.config/awesome/keyboard/flags, предварительно создав нужные папки keyboard/flags.

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

MySQL: 985-NULL=NULL

Там где обычная логика не действует, действует какая-то сказочная. Вот так и в этом случае, неожиданно, в сложном запросе с подзапросом нужно выбрать сумму товаров всех, и отнять сумму товаров с определенной категории.
select (sum(total_price)-(select sum(z_sum) from user_orders where user_id=4  and zennobox=1 and status=2)) as sum from user_orders where user_id=4;


И тут так получилось что все время на тестовый запрос я получал NULL. Начал проверять и оказалось что число-NULL = NULL. Печально, когда даже не догадываешься о таком. Но решение тут простое, добавляем функцию ifnull(value,default):
select (sum(total_price)-ifnull((select sum(z_sum) from user_orders where user_id=4  and zennobox=1 and status=2),0)) as sum from user_orders where user_id=4;


Получаем то что нужно. Очередная мелочь, которая привносит небольшие приключения в нашу жизнь.
test

Установка PhantomJS и CasperJS на Debian GNU\Linux

Собственно для тех кто не знает что такое PhantomJS, вещает хабр:
PhantomJS это все плюшки WebKit из консоли с управлением на JS и поддержкой различных стандартов и технологий: DOM, CSS, JSON, Canvas и SVG.

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

CasperJS - это надстройка над PhantomJS позволяющая более удобно его использовать. Добавляется сохранение скриншота части страниц, более удобная работа со страницей и другие плюшки.

test

Ошибка при импорте дампа базы в MariaDB

При импорте дампа базы через консоль получил следующую ошибку:
# mysql -pmypass mydm < mydb.sql
ERROR 1064 (42000) at line 3597: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '*/' at line 1


Вся беда начиная со строки 3597 оказалась из-за комментариев разделенной символом новой строки на несколько строк.
К слову сказать, комментарии вида:
/*!50003 */
Представляют из себя инструкцию MySQL и MariaDB произвести некоторые действия. Но такой вот перенос разрывает по всей видимости такую инструкцию.
Так как файл достаточно большой, открыть его удобнее всего vim-ом. Можно конечно составить регулярку для sed, но у меня всего пару комментариев, по этому проще и удобнее удалить вручную
#vim mydb.sql

Переходим на нужную строку:
:3597

Совмещаем текущую строку со следующей зажав Shift+j Когда отредактировали переносы, сохраняем и выходим.
:wq

Ну и дальше у нас импорт проходит все достаточно просто
mysql -pmypass mydm < mydb.sql

P.S. Может есть варианты получше, поудобнее, если знаете напишите.
test

Ошибка при обновлении Debian GNU\Linux dpkg: error processing procps (--configure)

Возникла проблема при апгрейде, выглядит так:
dpkg: error processing procps (--configure):
subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
procps
E: Sub-process /usr/bin/dpkg returned an error code (1)


Моя версия Debian GNU\Linux:
# lsb_release -rd
Description: Debian GNU/Linux 8.0 (jessie)
Release: 8.0


Вся беда оказалась всего-лишь в измененном вручную /etc/sysctl.conf. Я добавлял туда две строчки для выгрузки драйвера который мешает другим драйверам.
Делаем бекап
cp /etc/sysctl.conf /etc/sysctl.conf_bkp


И удаляю те строки что сам добавлял. После чего апгрейд проходит успешно.
test

Перенос VK Комментариев на другой домен

Стала задача для сайта все-таки подключить свой домен и перенести комментарии на него. Решается все просто. В контакте, внизу страницы, переходим по ссылке "Разработчикам", переключаемся на "Мои приложения", напротив нужного нам нажимаем "Редактировать"->"Настройки".
Смотрим поле "Базовый домен" и добавляем новый.

Вот и вся проблема.

Страницы

Subscribe to RSS - Блог пользователя Nelex