softroot.ru

/ linux, kde, archlinux, php, css, node.js, coffee script, electronics, java, libgdx/

Ctrl + ↑ Позднее

Adobe Color 2 Gimp Palette

Написал микро-расширение для chrome. Захватывает с сайта https://color.adobe.com цветовую палитру и показывает диалог сохранения файла в формат gimp palette (*.gpl) для дальнейшего использования в редакторе GIMP или Inkscape.
Захватывает со страниц темы, и с цветового круга Adobe Kuler.

Подробнее: http://ac2gp.softroot.ru/

Массовое обновление данных в бд на laravel/lumen (innoDB)

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

// Получаем данные, к примеру из базы
$data = DB::table('users')->get();
$counter = 0;
foreach($data as $value){
    // Если счётчик в 0, то стартуем транзакцию
    if($counter == 0)
        DB::beginTransaction();
    }
    $counter++;

    // Выполняем какие-то действия
    $type = $value->type === 2?5:1;

    // Обновляем данные
    DB::table('users')->where('id', $value->id)->update(array('type' => $type));

    // Счётчик достиг нужного порога - коммитим изменения в DB
    if($counter >= 999){
        DB::commit();
        $counter = 0;
    }
}

// Снова коммит для оставшихся
DB::commit();

Таким способом обновление данных займёт гораздо меньше времени.

Ставим tomcat, настраиваем apache + jk коннектор

Предупреждение

Данный текст написан новичком в настройке tomcat да и в целом Java.

Установка

Установка достаточно простая, заходим в консоль и ставим tomcat. Надеюсь у вас стоит Java и apache? ;)

sudo pacman -Suy tomcat8 tomcat-native

Включаем сервис

systemctl enable tomcat8.service

Стартуем ...

sudo systemctl start tomcat8.service

Коннектор JK я буду ставить из aur:

yaourt -S mod_jk

На этом собственно всё. Заходим на http://localhost:8080 проверять работает ли tomcat.
Если всё в порядке, то вы должны увидеть что-то вроде этого

Настройка

Тут я напишу о простой настройке, не вникая в подробности.

По умолчанию файлы конфигурации хранятся в /etc/tomcat8/.
Первым делом настроим пользователей. А то вы наверное уже потыкали кнопочки Server Status, Manager App, а там просят какой то пароль? =)

Открываем tomcat-users.xml

sudo nano /etc/tomcat8/tomcat-users.xml

И приводи его к такому виду:

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">

  <role rolename="manager-gui"/>
  <role rolename="admin-gui"/>
  <user username="tomcat" password="tomcatpswd" roles="manager-gui,admin-gui"/>
</tomcat-users>

И не забываем сменить username и password!

//Вот теперь можно пробежаться по кнопочкам Server Status, Manager App, Host Manager. Но перед этим лучше рестартонуть сервер.

sudo systemctl restart tomcat8.service

хотя пока рано. Но вдруг не терпится)//

Теперь некоторые настройки сервера. Лучше предварительно сделать бэкап файла server.xml

И заменить его содержимое следующими настройками:

sudo nano /etc/tomcat8/server.xml
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">

    <Connector port="8487" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost">

      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>

      <Host name="java.local" appBase="/mnt/raid/domains/java.local">
        <Context path="" docBase="html"/>
      </Host>

    </Engine>
  </Service>
</Server>

В этом файле я поменял порт коннектора HTTP с 8080 на 8487, т. к. 8080 достаточно популярный и часто бывает занят. Так же добавил ещё один тег Host, в котором указал путь до папки. Т. е. localhost остался, и до панели можно достучаться по адресу localhost:8487

Настроим коннектор jk.

Добавляем в файл /etc/httpd/conf/httpd.conf строчку

Include conf/extra/java-jk.conf

Теперь

LoadModule jk_module modules/mod_jk.so

к директиве LoadModule

Создадим и заполним java-jk.conf

sudo nano /etc/httpd/conf/extra/java-jk.conf

Приводим к такому виду

<IfModule jk_module>
  JkWorkersFile "/etc/httpd/conf/extra/workers.properties"
  JkLogFile "/var/log/tomcat8/mod_jk.log"
  JkLogLevel info
  JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
</IfModule>

А рядом положим worker.properties

sudo nano /etc/httpd/conf/extra/workers.properties
workers.tomcat_home=/usr/share/tomcat8
workers.java_home=/usr/lib/jvm/java-8-openjdk/

# unix stile
ps=/

worker.list=ajp13

# ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.ajp13.lbfactor=1

Пока не знаю по какой причине, но jk мне выдавал ошибку (спасибо логам), что не может найти директорию log
в /etc/httpd/. Я ещё не разбирался, и просто создал требуемую директорию.

Настроим vhost у apache.

<VirtualHost java.local:80>
  ServerAdmin admin@java.local
  ServerName java.local
  DocumentRoot /mnt/raid/domains/java.local/html
  ErrorLog /mnt/raid/domains/java.local/logs/error.log
  CustomLog /mnt/raid/domains/java.local/logs/access.log common
  JkMount /* ajp13
</VirtualHost>

Пропишем имя в hosts

sudo nano /etc/hosts
127.0.0.1 java.local

И перезапускаем apache и tomcat

sudo systemctl restart httpd.service
sudo systemctl restart tomcat8.service

Размещаем в нашей директории (в моём случае /mnt/raid/domains/java.local/html) тестовый html файл с именем index.html. К примеру такой:

<html>
<head>
  <title>example static</title>
</head>
<body>
  <h2>Hello, Java!</h2>
</body>
</html>

Теперь пробуем перейти на java.local

И если всё правильно, то увидим нашу надпись.

Видим? Значит статика работает. На этом пока всё. Кстати, не стоит забывать менять пути на свои ;)

Запрет контекстного меню на блоке

Запретить контекстное меню на на любом элементе легко, достаточно добавить соответствующее событие и обработать его.

Для этого мы воспользуемся методом addEventListener.
Он принимает 2 обязательных аргумента. Первый:

type - Это тип события

Кстати, список всех событий можно найти к примеру тут

И второй обязательный аргумент:

listener - это объект, который получает уведомление о произошедшем событии указанного типа.

Это может быть обычная JavaScript функция, замыкание.

Видимо какая то ошибка у jsfiddle.net, может меню мешает, но если подводить курсор сверху, то срабатывает событие mouseout. Если сбоку, то всё нормально


Ну а что бы прекратить дальнейшее распространение события мы вызываем метод preventDefault

Пример:

jsfiddle

2015   events   JavaScript

Как подружить monolog с redis в lumen

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

Итак, понадобилось нам писать логи в redis, с чего начать? А начнём мы с того, что заглянем в папочку /vendor/laravel/lumen-framework/src/ в файл Application.php.

/**
* Register container bindings for the application.
*
* @return void
*/
protected function registerLogBindings()
{
    $this->singleton('Psr\Log\LoggerInterface', function () {
        return new Logger('lumen', [$this->getMonologHandler()]);
    });
}

/**
* Get the Monolog handler for the application.
*
* @return \Monolog\Handler\AbstractHandler
*/
protected function getMonologHandler()
{
    return (new StreamHandler(storage_path('logs/lumen.log'), Logger::DEBUG))
                        ->setFormatter(new LineFormatter(null, null, true, true));
}

В файле видим метод registerLogBindings который в свою очередь вызывает getMonologHandler, он то нам и нужен.

Что ж, для начала наследуем класс Application. Я обычно размещаю такие классы в директории /app/Classes/

<?php

/**
 * Файл Application.php
 */

namespace app\Classes;

// Наследовать будем конечно же от \Laravel\Lumen\Application
class Application extends \Laravel\Lumen\Application {

    }

}

Теперь переопределим метод getMonologHandler

<?php

namespace app\Classes;

// Импортируем необходимые пространства имён
use Monolog\Logger;
use Monolog\Handler\RedisHandler;
use Monolog\Formatter\JsonFormatter;

// Наследовать будем конечно же от \Laravel\Lumen\Application
class Application extends \Laravel\Lumen\Application {

    /**
     * Get the Monolog handler for the application.
     *
     * @return \Monolog\Handler\AbstractHandler
     */
    protected function getMonologHandler() {

        // Создадим экземпляр класса Predis
        $redis = new \Predis\Client("tcp://localhost:6379");
        
        // Добавим дефолтное имя ключа, по которому будут писаться наши логи
        // Для удобства, дадим возможность изменять это значение в файле .env
        $key = env('MONOLOG_REDIS_KEY', 'logs');

        return (new RedisHandler($redis, $key, Logger::DEBUG));

    }

}

Осталось только подменить наш класс в файле /bootstrap/app.php

<?php
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| Here we will load the environment and create the application instance
| that serves as the central piece of this framework. We'll use this
| application as an "IoC" container and router for this 
|
*/

// Закомментируем либо удалим
//$app = new Laravel\Lumen\Application(
//	realpath(__DIR__.'/../')
//);

$app = new App\Classes\Application(
	realpath(__DIR__.'/../')
);

Если оставить сейчас всё как есть, то в redis будут писаться строковые значения. Но нам не составит труда писать это к примеру в формате json.

return (new RedisHandler($redis, $key, Logger::DEBUG))->setFormatter(new JsonFormatter());

Что почитать?

Классы и Объекты. Основы.
Пространства имён
Так же смотрите и разбирайте исходники lumen

2015   framework   laravel   lumen   PHP   Redis
Ctrl + ↓ Ранее