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

test

Сниппет JQuery кода, который скролит страницу к нужному элементу, указанному в ссылке

Может кому пригодиться. Код найден где-то на stackoverflow. Если у ссылки путь начинается с hash(#), то при клике код скролит страницу к нужному элементу на странице.
$(function() {
    $("a[href*='#']:not([href='#'])").click(
        function()
        {
        if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname)
        {
            var target = $(this.hash);
            target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
            if (target.length)
            {
                $('html,body').animate({
                    scrollTop: target.offset().top
                }, 1000);
                return false;
            }
        }});
    });
test

Отзыв о книге: Объектно-ориентированное программирование в С++ Р. Лафоре

Объектно-ориентированное программирование в С++ Р. Лафоре Из двух книг, которые есть у меня по C++, именно эту я могу смело рекомендовать. Хотя изучал я по ней язык где-то более двух лет назад, сама книга не стареет и как сам C++. С тех пор я пока не встречал лучше книги по C++. Хотя мое мнение и субъективно, но все же мне есть на что опираться, на свой собственный опыт программирования. Считаю что для тех кто действительно хочет понять и изучить язык C++ эту книгу стоит взять на вооружение. Рассмотрены все фундаментальные темы и даже больше. Материал подан легко, так что очень быстро осваивается. Считаю эту книгу лучшей в данном классе.
test

Отзыв о книге: Биз Стоун "Решайся! Заряд на создание великого от основателя Twitter"

Биз Стоун "Решайся! Заряд на создание великого от основателя Twitter" Книга великолепна!
Об этом я могу сказать даже спустя месяц после ее прочтения. Когда ты видишь какой путь прошел автор книги в попытке найти свою цель и придти к тому что эта цель появилась на свет, взрастить ее из зачаточного состояния. Пройти весь этот путь не смотря на отсутствие денег и наличие проблем, и не согласных, но при том остаться все-равно человеком... От бедняка до богача. От простого человека до уважаемого многими. Книга - история жизни действительно великого человека. История бизнес-успеха которая Вас обязательно вдохновит. Рекомендовал эту книгу нескольким другим людям, своим знакомым, давал почитать и никто из них не остался равнодушным к книге, более того, все были просто в восторге после прочтения.
Рекомендую?
Однозначно да!
test

Отзыв о книге: Тео Компернолле "Мозг освобожденный. Как предотвратить перегрузки и использовать свой потенциал на полную мощь"

Тео Компернолле, Мозг освобожденный. Как предотвратить перегрузки и использовать свой потенциал на полную мощь Несколько дней назад я прочитал эту важную для себя книгу. Что могу сказать, так это то что книга однозначно полезная и важная. Периодами надоедала, так как часто повторялись одни и те же тезисы. Иногда хотелось закрыть книгу так как казалось что дальше будет тоже что и последние 20 страниц... но... через еще некоторое количество страниц всплывало что-то новое и очень важное. По этому чтение книги у меня несколько затянулось дольше чем я планировал, но книга однозначно стоит того чтобы быть прочитанной от начала и до конца. Жалею ли я что советую ее? Однозначно нет, ведь даже один-два факта меняющих жизнь уже стоят очень многого, а в этой книге мыслей, фактов и выводов однозначно на порядок больше. Она того стоит, однозначно. Не такая зажигательная как многие бизнес-книги, но не менее, а более полезная, ведь по сути это не просто бизнес-книга, это инструкция по работе с собственным мозгом. Нашим инструментом как для работы, так и для жизни. Нас учат управлять машиной, мы сдаем на получение прав экзамены, но вот более сложным и важным является наш собственный мозг. Но этому нас никто не учит. Учитесь сами, по вот таким книгам. Книгу рекомендую.
test

Майкл Фицджеральд: "Регулярные выражения: основы", небольшой обзор книги

За последнее время, стараясь оптимизировать свою работу и увеличить личную эффективность на работе я прочел несколько книг, о них я и хочу поделиться. Кратко, что дало и стоит ли тратить время. Регулярные выражения: основы Эту книгу я прочел несколько месяцев назад, когда мне понадобилось частое использование регулярных выражений. В основном я редко ими пользуюсь, так как достаточно часто при работе с текстом можно было бы обойтись и без них. Но не всегда, иначе бы их никто не использовал. Скажу что книга как для профи, где-то на 3/5, так как остается достаточно много белых пятен. Как для новичка 5/5 из-за хорошего объяснения базы и при этом используя разный инструментарий. В общих чертах книга понравилась, но в дополнение я обязательно возьму более сложную литературу, закрывающую оставленные белые пятна. Автор действительно объясняет все пошагово и очень основательно. Для моего проекта универсального парсера сайтов этих знаний хватило, но в нем регулярные выражения занимали очень небольшую часть, а если быть точнее, только в том случае если искомый элемент не находился другими механизмами, тогда в силу вступали регулярные выражения. Стоит брать если Вы хотите освоить базу в сжатые сроки. Вот такое сложилось у меня мнение об этой книге.
test

Select2 и добавление нового элемента

Нужна была возможность добавлять новый элемент в список если такого элемента у нас еще не было, благо select2 предусматривает подобную возможность. Загвоздка заключалась только в том что мы использовали список с числовыми id как значение и брался из базы данных. Имеем классическую конструкцию из трех таблиц:
материал(id, ..., ..., ...); теги(id,...,...,...); материал_тег(id_material, id_tag);
Так вот, сам select2 мы используем так:
<select id="multiple" class="form-control select2-multiple" multiple name="tags[]"  >
                                {foreach $labels as $label}
                                    <option value="{$label->id}" {if !empty($exists.{$label->id})}selected{/if} >{$label->title}</option>
                                {/foreach}
                            </select>
<script>

    $(document).ready(function () {

        $("#multiple").select2({
            placeholder: "Select or add tags",
            tags: true,
            tokenSeparators: [",", " "],
            createSearchChoice:function(term, data) {
                if ( $(data).filter( function() {
                            return this.text.localeCompare(term)===0;
                        }).length===0)
                {
                    return { id: term, text:term };
                }
            }
        });
</script>
На стороне сервера я использую фреймворк Laravel 5 и в контроллере использую такую часть кода:
//...
//материал
$record = Linkedin_GroupLabel::find($id);
//...
//Сбрасываем связи с тегами
                        $record->tags()->detach();
                        $rtags  = array();
                        foreach ($request->input('tags') as $tag){
//если значение элемента селекта число, значит это id
                            if (is_numeric($tag)){
                                $rtags[] = $tag;
                            }
                            else //в противном случае это новое значение
                            {
                                $new = Linkedin_Label::where('title','=',trim($tag))->first();
                                if (empty($new->id)){
                                    $new = new Linkedin_Label();
                                }
                                $new->title = trim($tag);
                                $new->save();
                                $rtags[] = $new->id;
                            }
                        }
//аттачим айдишники между записями
                        $record->tags()->attach($rtags);

Единственное НО при таком, записи тегов не должны быть только числом, иначе is_numeric подумает что добавлен айдишник, а не новый тег. Очень вероятно что у кого-то есть вариант получше, но данный случай для меня работает.
test

Windows7+Apache2.4+PostgreSQL+Laravel 5= PDO Exception: driver not found

Пришлось все вот это чудо поднимать, так как нужно делать серверную и клиентскую часть под одну задачу. Искренне не понимаю тех веб-девелоперов которые работают веб-разработкой под Windows )) ну да ладно, это их личное дело.

Итак, проблема следующая:
Windows 7+Apache2.4+PostgreSQL+Laravel = PDO Exception: driver not found
При этом команда:
php -m
Показывает что как pgsql так и pdo_pgsql есть, но Laravel 5 уверенно доказывает обратное. При этом в php.ini:
extension=php_pdo_pgsql.dll
extension=php_pgsql.dll
раскомментированны.

Но вот команда:
php -a
Вызывающая интерактивную консоль php, так же сообщает:
Unable to load dynamic library `D:\WebServer\php\ext\php_pgsql.dll` - тут вместо сообщения какая-то каша, но явно что-то не в порядке.

Оказалось, не хватает dll для данных расширений.

Нужны библиотеки:


libpq.dll, libiconv-2.dll и libintl-8.dll Взять их можно в установленном PostgreSQL, в папке:
C:\Program Files\PostgreSQL\9.4\bin\
вместо 9.4 может быть ваша версия.
Копируем их в:
apache\bin\

Вместо libiconv-2.dll у меня лежала iconv.dll, на всякий случай скинул как есть, так и копию переименованную в libiconv-2.dll
Перезапускаем apache и видим что Laravel 5 на эту проблему больше не ругается.
test

DOMDocument проблемы с кодировкой

В один прекрасный момент заметил что до этого работающий парсер начал вместо нормального текста показывать крокодилов. Недолгие поиски привели к решению:
<?php
$url = file_get_contents('your-xml-file.xml');
//именно эти строчки и выравнивают всю кривость кодировки
$url = mb_convert_encoding($url, 'utf-8', mb_detect_encoding($string));
$url = mb_convert_encoding($url, 'html-entities', 'utf-8');
$dom = new DOMDocument();
$dom->loadHTML($url);
$page_content = $dom->saveHTML();
Все.
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
Это значит что указанные пакеты так же нужно скачать нужной версии и поставить до установки этого пакета.
На этом все.

Страницы

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