?

Log in

No account? Create an account
Каждый раз при смене Убунты, сталкиваюсь с багой завершения работы виртуальных машин, которые были запущены Вагрантом.

Если виртуали подняты, то при завершении работы Убунта повиснет, время от времени отдавая в консоль сообщение:

unregistered_netdevice: waiting for vboxnet2 to become free. Usage count = 1


Лечение элементарное, но почти всегда забываемое :)

  • открыть /etc/default/virtualbox

  • заменить SHUTDOWN_USERS="" на SHUTDOWN_USERS="all"

или выполнить команду:

$ sudo sed -i -- 's/SHUTDOWN_USERS=""/SHUTDOWN_USERS="all"/g' /etc/default/virtualbox
Есть БД: "ID, данные1, данные2,..., дата создания, дата публикации"

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

Обычный юзер, заходя на страницу, видит список записей отсортированных по дате публикации порядке убывания (новые сверху).
Модератор же, перед этим списком должен видеть все новые записи (с датой публикации = NULL, отсортированные в по дате создания ).

Все это надо сделать в доктрине 2.4.х  Никаких native sql - только хардкор, только ORM.


$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('q')
   ->from(Question::getClass(), 'q');


Решение:

Заводим кастомную FunctionNode'у.

namespace MyApp\Doctrine\General;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;

/**
 * DateDiffFunction ::= "ISNULL" "(" ArithmeticPrimary ")"
 */
class IsNullFunctionNode extends FunctionNode
{
    private $isnull;

    public function parse(Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->isnull = $parser->ArithmeticPrimary();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }
    public function getSql(SqlWalker $sqlWalker)
    {
        return 'ISNULL('.$this->isnull->dispatch($sqlWalker).')';
    }
}


Подключаем её в конфиге или инициализаторе доктрины:

$config = new Configuration();
$config->addCustomNumericFunction('ISNULL', 'MyApp\Doctrine\General\IsNullFunctionNode');


В QueryBuilder добавляем HIDDEN селект:

$qb->addSelect('ISNULL(q.publishDate) AS HIDDEN ord');


И туда же сортировки:

$qb->orderBy('ord','DESC')
   ->addOrderBy('q.publishDate', 'DESC')
   ->addOrderBy('q.createdDate', 'DESC');


На финише получаем SQL'ку:

SELECT a0_.id AS id0, a0_.created_date AS created_date1, a0_.updated_date AS updated_date2, a0_.publish_date AS publish_date3, ISNULL(a0_.publish_date) AS sclr15
FROM question a0_
ORDER BY sclr15 DESC, a0_.publish_date DESC, a0_.created_date DESC


Конструкция такого вида, работать не будет:

->orderBy('ISNULL(q.createdDate)', 'DESC');


Весь трюк в HIDDEN селекте. HIDDEN - указывает на то, что бы данные собирались но не внедрялись в запрашиваемую сущность. Но это поле можно использовать для сортировки, что и сделано в примере.  Еще пример можно посмотреть тут и ограниченно вредный пример тут.

That's all folks!

Копирование:

exiftool.exe -o . '-Directory<CreateDate' -d /h/Canon/%Y/%m.%B/%Y-%m-%d -r .

Перенос:

exiftool.exe  '-Directory<CreateDate' -d /h/Canon/%Y/%m.%B/%Y-%m-%d -r .

Поскольку эту операцию мне придется повторить еще несколько раз, оставлю-ка её как заметку. Может кому пригодиться.
Условие - конфигурацию bare-репозитария трогать нельзя.

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

Наш метод - использовать ключ --mirror и потом работать с полной копией репозитария.


[SM@SM-HOME projects]$ git clone --mirror ssh://sm@my-ssh-git-server.net/home/sm/_GIT_/superproject.git superproject.mirror
... ... ... ... ...
[SM@SM-HOME superproject.mirror]$ cd superproject.mirror
[SM@SM-HOME superproject.mirror git:BARE:master]$ git branch
develop
feature/waypoints
feature/xc-filter-flights-by-pilot
hotfix/1.0.6

* master
v05
v10
xc-gearman
xc-waypoints

[SM@SM-HOME superproject.mirror git:BARE:master]$ git remote set-url origin git@gitlab.my-ssh-git-server.net:Sergey/superproject-ru.git
[SM@SM-HOME superproject.mirror git:BARE:master]$ git push
Counting objects: 13128, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5705/5705), done.
Writing objects: 100% (13128/13128), 20.74 MiB | 1.40 MiB/s, done.
Total 13128 (delta 6119), reused 13128 (delta 6119)
To git@gitlab.my-ssh-git-server.net:Sergey/superproject-ru.git
* [new branch] develop -> develop
* [new branch] feature/waypoints -> feature/waypoints
* [new branch] feature/xc-filter-flights-by-pilot -> feature/xc-filter-flights-by-pilot
* [new branch] hotfix/1.0.6 -> hotfix/1.0.6
* [new branch] master -> master
* [new branch] v05 -> v05
* [new branch] v10 -> v10
* [new branch] xc-gearman -> xc-gearman
* [new branch] xc-waypoints -> xc-waypoints



Зачепись! То, что доктор прописал.

ok

{#
Функция для подбора правильной формы склонения в зависимости от числа элементов
* Примеры использования
*
* {{ utils.declension( 1, ['комментарий','комментария','комментариев']) }}
* Вернет: 1 комментарий
*
* {{ utils.declension(52, ['комментарий','комментария','комментариев']) }}
* Вернет: 52 комментария
*
* {{ utils.declension(18, ['комментарий','комментария','комментариев']) }}
* Вернет: 18 комментариев
#}
{% macro declension(number, forms) %}

{% set cases = [2, 0, 1, 1, 1, 2] %}
{{ number }} {{ forms[ ( number%100>4 and number%100<20)? 2 : cases[min(number%10, 5)] ] }}

{% endmacro %}
Этим утром посетил пешеходную зону "Кунцевский бульвар", которую бурно обсуждали в публикации про "магазин со жратвой".

Протяженность пешеходной зоны - ~750 метров. В центре, напротив того места где когда то стоял Дом Пионеров, организован пешеходный островок, к которому можно "пришвартовать" свою машину. Островок условный - один из проездов закрыли.
Read more...Collapse )

На заметку...

Если ec2-describe-regions или другая команда AWS'а ругается страшной надписью "Client.InvalidSecurity: Request has expired" - пришла пора синхронизировать время.

А лучше сделать постоянную синхронизацию с тайм-сервером.
В Москву пришли морозы. Сразу два холодных фронта с интервалом менее недели прошли через московский регион. Первый пришел 28 июля с "загнивающего запада", наведя шороху в нерезиновой. А второй, с севера, нагрянул сегодня ночью. И какое совпадение - выходные и выезд на полеты попали как раз между этими событиями. А какая была погода - это просто сказка: Влажность 50%, ветер до 4 м/с. Никакого переразвития, ну разве чуток кое-где. Плюс к этому, тяжелая техника в полях активно провоцировавшая срыв пузырей.

Узнать больше...Collapse )

Бога нет!

 Лишний раз в это убеждаюсь. Ибо на выходные к нам пришли грозы и ветер, за то сегодня, завтра и послезавтра - ясно и слабый ветерок - идеальные условия для неспешных полетов в кайф.

В субботу удалось лишь осмотреть окрестности, потратив на пробивание ветра уйму времени. Хотя, по ветру за такое время, можно было и соточку навернуть :) Про воскресенье - промолчу (ну или напишу, если смогу вырезать забавный кусочек видео). Оба дня погода сильная - но слабокомфортная для фрифлая.

2011-07-09: Произвольный треугольник, 29 км. Дельтаплан: Aeros Combat L 12

Дочка

 Возможно для кого то будет шоком, но вот уже как почти месяц живу в статусе папы. :)


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