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

Пример рекурсивно ищет файлы с расширением .php в выбранной директории, читает их и считает в них строки.
cd ~/projects/project
find . -type f -name *.php -exec cat {} \; | wc -l


Собственно ничего особенно сложного нет, описано все здесь. Мой пример в общем ничем не уникален, использует 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.


aghr