PostgreSQL coub express.js freeware git jquery laravel links linux macos mysql node.js php powershell python ubuntu vim virtualbox анекдот блог игры интересно стихи цитаты

Собственно ничего особенно сложного нет, описано все здесь. Мой пример в общем ничем не уникален, использует Null адаптер, который позволяет передавать в конструктор пагинатора готовое количество записей для расчета массива данных для пагинации.
use Zend\Paginator\Paginator;

// $itemsQuant - общее кол-во элементов для просмотра
$paginator = new Paginator(new \Zend\Paginator\Adapter\Null($itemsQuant));
$paginator->setCurrentPageNumber($currentPage);
$paginator->setItemCountPerPage($pageSize);
$pages = $paginator->getPages();

$pagination = array(
    'previous' => $pages->previous,
    'next' => $pages->next,
);

var_dump($pages);
Конструкция на мой взгляд перегруженная, но уж как есть. Я только начал работать с ZF2, постараюсь не лениться и собирать здесь интересные и ценные по возможности заметки.
php


Задача тривиальная, но как-то сумбурно пока гуглится. Много разных решений наковырял. Суть в том что нам нужно не перезагружая страницу отправить на сервер файл (и любые другие параметры в комплекте), почитать что нам напишут в ответ и какую-то реакцию показать пользователю. Пример ниже для одного файла, очевидно если у инпута выставлено multuple="multiple" то по массиву файлов можно будет пробежаться и так же все их добавить в запрос.

В html
<input type="file" id="imgFile" />
В скрипте
var fd = new FormData();
fd.append('id', '123');
fd.append('type', 'one');
fd.append('img', $('#imgFile')[0].files[0]);

$.ajax({
  type: 'POST',
  url: '/url/to/action',
  data: fd,
  processData: false,
  contentType: false,
  dataType: "json",
  success: function(data) {
    console.log(data);
  },
  error: function(data) {
    console.log(data);
  }
});


Маленькие "хитрости" bash. На примере перезапуска приложения node.js
#!/bin/bash
# чтобы было легче жить, добавим все нужные пути в переменные
DAEMON="/usr/local/bin/node"
ROOT_DIR="/home/user/project-copy-folder"
# тут на основании базовых путей выставляем пути к файлам PID, 
# логов и скрипта, запускающего само приложение
PIDFILE="$ROOT_DIR/pidfile"
SERVER="$ROOT_DIR/app.js"
LOG_FILE="$ROOT_DIR/app.js.log"

# останавливаемся, обратите внимание на то, как получается и обрабатывается PID
echo -n "Stopping $SERVER: "
kill -9 $(cat $PIDFILE) && echo 'ok stoped' || echo 'error on stop my-funny app'

# чистим логи и убираем старый PID (это опционально)
>$LOG_FILE
>$PIDFILE

# стартуем. тут самое как мне кажется, непонятное — это конструкция echo $! > $PIDFILE
# здесь $! это PID последнего запущенного приложения (читаем ман по bash), с пониманием
# этого нюанса становится понятно все остальное
echo -n "Starting $SERVER: "
`$DAEMON $SERVER > $LOG_FILE & echo $! > $PIDFILE &` && echo 'ok, started' || echo 'error on start my-funny app'
Интересная особенность как мне показалось состоит в том, что если мы выполним например вот такой код
/usr/local/bin/node /home/user_name/project/app.js &
echo $!
То увидим напечатанный PID. А вот если исполнить тоже самое, но через eval
NODE='/usr/local/bin/node'
APP='/home/user_name/project/app.js'
`$NODE $APP &`
echo $!
То не увидим ничего. То есть eval где-то у себя это значение закусывает и нам оно нормально не доезжает. Соответственно решением (скорее всего одним из решений, так как я никакой не специалист по bash), будет получение PID-а прямо внутри этого самого eval-a как показано в первом примере.

Из переменной (правильно называть это переменными??) $$ - можно получить PID текущего скрипта, то есть если вы планируете в нем зависнуть то имеет смысл положить куда-то PID-файл чтобы потом что-то с этим процессом делать. Баш вообще интересная штука, жаль почти не остается времени на глубокие раскопки в этих шаманствах.


Мне это понадобилось для автоматического подъема сервиса после внештатной перезагрузки сервера.
Как всегда, все просто:
su USER -c '/home/USER/folder/script.sh'
Собственно man su рассказывает всё в примерах.
su man -c catman
# Runs the command catman as user man.  You will be asked for man's password unless your real UID is 0.

su man -c 'catman /usr/share/man /usr/local/man'
# Same as above, but the target command consists of more than a single word and hence is quoted for use 
# with the -c option being passed to the shell.  (Most shells expect the argument to -c to be a single word).

su -l foo
# Simulate a login for user foo.

su - foo
# Same as above.


Наверное яростные адепты macos забросают меня камнями, но я так и не понял в чем кайф вот такого пользования Home\End (дефолтное назначение в macos) и решил вернуться к PC-шному варианту.

Создаем файл ~/Library/KeyBindings/DefaultKeyBinding.dict с содержимым приведенным ниже
{
    /* home */
    "\UF729"  = "moveToBeginningOfLine:";
    "$\UF729" = "moveToBeginningOfLineAndModifySelection:";

    /* end */
    "\UF72B"  = "moveToEndOfLine:";
    "$\UF72B" = "moveToEndOfLineAndModifySelection:";
}
Для того чтобы новые бинды заработали мне пришлось завершить сеанс и зайти снова. Перезагрузка не потребовалась. Найдено гуглением, тестировано на 10.8.3


aghr