How to run rsync via non-standard ssh port

- Posted in Webdev by

Не знали, как запустить rsync через нестандартный порт (при работе через SSH, без ответного Rsync демона на сервере)?

Теперь знайте:

rsync -avz -e "ssh -p 12345" ./public_html/ username@yourserver.com:/var/www/html/

Здесь 12345 - номер порта, username - ваш логин и yourserver.com - доменное имя или IP вашего сервера.

Пришлось немного повозиться с чтением манов и поэкспериментировать. Надеюсь, кому-то сэкономит время.

Clipboard Catcher для линуксоидов (bash, xclip)

- Posted in Uncategorized by

Давно пользуюсь такой штукой, но поискал и оказалось, что мне не приходило в голову поделиться рецептом. Пользователи WikidPad поймут с полуслова, остальные... ну не знаю, поймут как-нибудь.

При запущенной утилитке всё, что копируется в клипборд, дублируется в текстовый файл. Очень удобно, когда предстоит много копи-паста: позволяет избавиться от Alt-Tab, Ctrl-V, Alt-Tab после каждого Ctrl-C.

Итак, `~/bin/cbc`:

#!/bin/bash
## Clipboard catcher
## first parameter (optional) -- log file name
##
## @author Ruslan Brest, mailto:r-b@mail.ru
## @date   05/07/2013
if [ -z "$1" ]; then
  FILE="00-clipboard-continous.txt"
else
  FILE="$1"
fi
if [ -z "$2" ]; then
  DELIMITER="\n"
else
  DELIMITER="\n-- -- -- --\n"
fi
echo "FILE: ${FILE}"
echo "DELIMITER: ${DELIMITER}"
# Prevent pasting previously existing clipboard content:
PREV_CB=`xclip -o -selection clipboard`
#PREV_CB=`xclip -o -selection primary`
CB=""
## Set log file name given by user
if [ "$1" != "" ]; then FILE=$1; fi
## capture clipboard content
while true
do
    ## Ctrl-C
    CB=`xclip -o -selection clipboard`
    ## Mouse selection
    # CB=`xclip -o -selection primary`
    if [ "$CB" != "$PREV_CB" ]
    then
        echo -e "$CB" >> $FILE
        echo -e $DELIMITER >> $FILE
        PREV_CB=$CB
    fi
    sleep 1s
done

Как пользоваться? Набираем в консоли `cbc`. Копируем, копируем, копируем, копируем (по Ctrl-C)... Переключаемся опять в консоль, где запущен `cbc`, и прерываем его по Ctrl-C. Ищем файл clipboard-continous.txt - там всё награбленное.

Если нет `xclip` - устанавливаем. Для убунту - sudo apt-get install xclip

Знакомим `phpcs` (PHP CodeSniffer) и Sublime Text со стандартом оформления кода FuelPHP

- Posted in Uncategorized by

UPD: При ближайшем рассмотрении оказалось, что отличий от PSR2 больше, чем табы вместо пробелов. Чтобы сделать автоматическую проверку, надо ещё многое переделать, а где-то и дописать. Так что я поспешил: с опубликованным вариантом проверять синтаксис PHP CodeSniffer'ом на соответствие правилам пока что неудобно.


Самый простой способ - поставить в редакторе/IDE правила автоформатирования PSR-2 и заменить использование пробелов в отступах на табуляцию (этим стандарты оформления кода, принятые в FuelPHP, отличаются от PSR-2). Заодно можно включить отображение пробелов и табуляций.

Это позволит писать новый код по правилам, но огрехи в старом могут оказаться незамеченными.

Для автоматизации проверки кода существуют разные инструменты: примеры (и важность с удобством применения этого непосредственно в редакторах/IDE) есть в статье http://philsturgeon.co.uk/blog/2013/08/php-static-analysis-in-sublime-text.

Обычно они дают возможность запустить проверку, либо настроить её и показ ошибки при сохранениях файла. Последнее очень удобно, т.к. помогает исправлять обнаруженные ошибки по ходу дела и без дополнительных усилий. Ниже - рецепт по автоматизации для ST3 (а может и ST2, если плагин совместим).

Знакомим phpcs и ST3 со стандатами оформления кода FuelPHP

  • sudo apt-get install php-codesniffer
    • phpcs -i - показать список установленных стандартов. Нужен psr2 (PSR-2)
    • Если его нет - обновляем полностью CodeSniffer (просто скопировать оттуда папку с PSR2/1 стандартом недостаточно)

    • Это, конечно, грубовато - обновлять напрямую, в обход apt-get , но он считает, что установлена самая свежая версия и более правильного способа я сейчас не знаю.

      cd ~/Downloads
      wget https://github.com/squizlabs/PHP_CodeSniffer/archive/master.zip
      unzip PHP_CodeSniffer-master.zip
      cd PHP_CodeSniffer-master
      sudo cp -r --parents -t /usr/share/php/PHP/ CodeSniffer CodeSniffer.php scripts
      cd scripts
      sudo mv /usr/bin/phpcs /usr/bin/phpcs.ORIGINAL
      sudo cp -t /usr/bin/ phpcs
    • в PSR-2 используются пробелы вместо табуляций и phpcs на них ругается. Сделаем свой стандарт "FuelPHP", основанный на PSR2. Рядом с папкой PSR2 создаём FuelPHP, в которой достаточно одного файла FuelPHP/ruleset.xml :

    • <?xml version="1.0"?>
      <ruleset name="FuelPHP">
       <description>The FuelPHP coding standard.</description>
       <!-- Include the whole PSR-2 standard -->
       <rule ref="PSR2">
       <!-- Redefine 2.4 Indenting -->
       <!-- Code MUST use an indent of tabs, and MUST NOT use 4 spaces for indenting. -->
       <exclude name="Generic.WhiteSpace.DisallowTabIndent"/>
       </rule>
       <rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/>
      </ruleset>

      Проверяем: phpcs -i

      The installed coding standards are Zend, FuelPHP, PHPCS, PSR2, PSR1, Squiz,
      MySource and PEAR
  • install ST3 plugin "Sublime Phpcs" http://www.soulbroken.co.uk/code/sublimephpcs/
  • check config, see HOWTO: http://philsturgeon.co.uk/blog/2013/08/php-static-analysis-in-sublime-text
    • только мы вместо "psr2" теперь напишем свой "FuelPHP" в юзеркониге:

    • Содержимое /home/rb/.config/sublime-text-3/Packages/User/phpcs.sublime-settings :

      {
          "show_debug": true,
          "phpcs_executable_path": "/usr/bin/phpcs",
          "phpcs_additional_args": {
              "--standard": "FuelPHP",
              "-n": ""
          },
      }

Автоматическая проверка в ST3 тепрь работает.

Также можно использовать отдельно: phpcs --standard=fuelphp home.php .

Набор стильных плоских иконок для LibreOffice

- Posted in Uncategorized by

via Try The New LibreOffice Flat Icon Set ~ Web Upd8: Ubuntu / Linux blog

Скриншоты: https://wiki.documentfoundation.org/Design/Whiteboards/Flat_icon_set#Snapshots

Github: https://github.com/libodesign/flat-icons

sudo apt-get install libreoffice-style-crystal
cd /tmp && wget https://github.com/hotice/myfiles/raw/master/images_flat.zip
sudo cp images_flat.zip /usr/share/libreoffice/share/config/images_crystal.zip

From the LibreOffice menu select Tools > Options , then under LibreOffice > View > Icon size and style , set the icon theme to "Crystal"

Lubuntu and touchpad: horisontal scrolling, disable touchpad when typing

- Posted in Uncategorized by

Наконец дошли руки починить пару давно мешающих проблем с тачпадом (Lubuntu @ Asus 1015BX).

Первая: почему-то отключен горизонтальный скроллинг. Включаем оба варианта (прокрутка по кромке тачпада и двумя пальцами):

synclient HorizEdgeScroll=1 HorizTwoFingerScroll=1

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

syndaemon -t -k -i 2 -d

Что означают параметры:

  • -i 2 -- устанавливает время задержки в 2 секунды (сколько ждать после последнего нажатия на клавиши перед тем, как снова включить тачпад);
  • -t -- не запрещать движения мыши при наборе текста, а только нажатия (клики) и скроллинг;
  • -k -- игнорировать клавиши-модификаторы при мониторинге активности клавиатуры (таким образом, разрешаем действия наподобие Ctrl+Click);
  • -d -- стартовать как служба (daemon), в фоне.

Вот и всё. Места, куда можно поместить эти команды для автостарта:

  • ~/.profile
  • Lubuntu: /etc/xdg/lxsession/Lubuntu/autostart

На Asus 1015BX также не работает Fn+F3 (выкл/вкл тачпад). Надо бы ещё сообразить, как на эту клавишу прицепить обработку пары простых команд synclient TouchpadOff=1 и synclient TouchpadOff=0. Хотя мне это уже и не надо -- прекрасно работает автоматическое отключение и включение тачпада.

Сравнение языковых файлов Opencart

- Posted in Uncategorized by

При поиске различий в языковых файлах Opencart огромную неприятность доставляет то, что утилиты наподобие DIFF оказываются почти бесполезны. Они сравнивают файлы построчно, а поскольку приходится сравнивать английский файл с русским, то 99% строк разные из-за перевода. И найти в этих условиях новые и удаленные переменные в файлах локализации оказывается очень сложно и муторно. Графические аналоги подобных программ тоже не очень-то помогают, даже если способны подсвечивать разницу внутри одной строки: в глазах рябит, строки длинные, и после проверки пары каталогов эта рутинная и фактически ручная визуальная проверка просто выматывает.

Но у линукс-пользователей есть способ существенно облегчить себе задачу поиска различий, сравнивая лишь часть строк из двух файлов!

В файлах локализации неизменной для русской и английской версии остается левая часть строк до знака '='. Их и будем сравнивать. На помощь утилите diff приходит утилита cut:

#!/bin/bash
diff -b <(cut -d'=' -f1 -s $1) <(cut -d'=' -f1 -s $2)

Указав этой утилитке имена двух файлов, получим краткий список отсутствующих и появившихся языковых переменных. Это то, чего мне долго не хватало!

Спасительная команда cut -d'=' -f1 -s setting.php выводит только первую часть строки (-f1), разделенной знаком '='. А diff сравнивает две этих "первых колонки" из обеих файлов, оставляя нам только разницу.

Как переименовать фото в соответствии с датой&#45;временем файла или съёмки

- Posted in Uncategorized by

Для фотографий (из EXIF или даты файла)

Фотографии отличаются от "просто файлов" тем, что у них может быть внутри дополнительная информация - EXIF. Для переименования всех фотографий в текущей папке из невразумительных имен IMAGE01234.jpg во что-то наподобие 2012-08-12-235516.jpg делаем так:

#!/bin/bash
jhead -n%Y-%m-%d-%H%M%S *.{jpg,jpeg,JPG,JPEG}

jhead -n ищет данные сначала в EXIF, и если этой информации там нет, то берет за основу дату-время файла.

Файлы любых других типов (по дате файла)

Для любых других файлов (логов и так далее) используем ls -l (приведенному скрипту надо указать имя файла):

#!/bin/bash
mv "$file" `ls -l "$1" | awk '{ print $6"_"$7 }' | tr ':' '-'`.jpg

Если файлов много, то то же самое в цикле

#!/bin/bash
for file in *.jpg *.jpeg *.JPG *.JPEG; do
    mv "$file" `ls -l "$file" | awk '{ print $6"_"$7 }' | tr ':' '-'`.jpg
done

Мой текущий ~/bin/dts полностью

#!/bin/bash
## Rename all known media files to their DTS (date/time stamp)
## ATTN: renames ALL files in current directory, no backups or ability to restore old filename
## <hr /><hr />-- JPEG <hr /><hr /><hr />--
jhead -n%Y-%m-%d-%H%M%S *.{jpg,jpeg,JPG,JPEG}
## <hr /><hr />-- PNG  <hr /><hr /><hr />--
for file in *.png *.PNG; do
    mv "$file" `ls -l --full-time "$file" | awk '{ print $6"_"$7 }' | tr ':' '-'`.png
done
## <hr /><hr />-- 3GP <hr /><hr /><hr />--
for file in *.3gp; do
    mv "$file" `ls -l --full-time "$file" | awk '{ print $6"_"$7 }' | tr ':' '-'`.3gp
done

Opencart module extract (Linux shell script)

- Posted in Uncategorized by

Mодули для Opencart обычно используют одно и то же имя для контроллеров, моделей, view и языковых файлов, поэтому этот скрипт может облегчить задачу по поиску и извлечению всех файлов модуля из рабочей копии магазина с сохранением всей структуры каталогов.

Навеяно модулем http://opencartforum.ru/topic/8272-module-extract-извлечение-модулей/, но мне показалось, что линуксоидам будет проще и удобней одной строкой в шелле это делать (локально или на сервере), без установки модуля в Opencart (установить, разрешить, зайти, найти, скопировать...)

Ни я, ни тот модуль не занимаются анализом PHP-кода и действительно полным выковыриванием всех используемых модулем файлов. Так что результат, конечно, не гарантирует полное и точное извлечение. Но будет работать в подавляющем большинстве случаев.

#!/bin/bash
# Opencart module extract
#
# Ищет введенную подстроку с начала имени файла и копирует найденные файлы
# в отдельную папку с сохранением структуры каталогов. Mодули для Opencart
# обычно используют одно и то же имя для контроллеров, моделей, view и языковых
# файлов, поэтому этот скрипт может сильно облегчить задачу по извлечению
# всех файлов модуля из рабочей копии магазина.
#
# @author: Ruslan Brest, http://rb.labtodo.com/
# @date: 2012-03-31
#
# See also: http://opencartforum.ru/topic/8272-module-extract-извлечение-модулей/
mkdir ".$1"
find -iname "$1*" | while read ff; do cp --parents -t "./$1/" "$ff"; done

Пользователям Windows полноценные линукс-радости командной строки и других полезных интструментов тоже доступны, см. например проекты http://www.cygwin.com/ или http://win-bash.sourceforge.net/

Как облегчить процесс публикации изменений на сервер

- Posted in Uncategorized by

[Git, FTP] Для FTP и shared hosting (без SSH доступа и полноценной консоли)

Рекомендую готовый скрипт git-extract:

По команде, в которой указывается диапазон коммитов, создаёт папку .deployment с готовым деревом и изменившимися файлами. И список удаленных файлов, которые придётся удалить вручную (если пользуетесь FTP клиентом) или через SSH на сервере (если есть такая возможность).

У скрипта есть маленькая особенность: запускать его надо в корне репозитория (там, где расположена скрытая папка `.git`). Не в подпапках из любого места репо: там он просто отработает вхолостую.

[Git, SSH] При полноценном хостинге (с SSH доступом)

Судя по всему, у меня сделано один в один как в http://habrahabr.ru/blogs/Git/127213/, поэтому не вижу смысла описывать то же самое. У меня немного отличается структура папок проектов, но это несущественно. Суть проста - на сервере лежит как Git-репозиторий, так и обычная рабочая копия (на которую смотрит веб-сервер). Точнее, на одну из папок репозитория - public_html. Потому что в репозитории хранится ещё документация, служебные скрипты, тестовые и чистые SQL дампы.

И при новых коммитах от разработчиков (git push) репозиторий по хуку делает автоматически две операции - обновление локальной серверной копии (git pull origin dev) и копирование набора файлов из config_sets (здесь у меня хранятся файлы, специфические для разных конфигураций: для одного разработчика, для другого, для dev2-windows, dev2-linux, для production1, production-dev и так далее, если надо ещё больше). Понятна идея? Требуемый набор конфигов просто перезаписывается поверх того, что есть в репозитории (а туда могут попасть и локальные конфиги девелоперов, если они не исключены через .gitignore), и получается чистая и настроенная конфигурация. Быстро, без чек-листов, ручных проверок-исправлений и условий-ветвлений с множеством девелоперских конфигов (зачем они на сервере?).

Естественно, на сервере настроено использование SSH-ключей, чтобы избавиться от необходимоси ввода пароля после git pull.

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

См. также

[PHP, FTP] Web based FTP Sync Tool written in PHP. Есть возможность запрещать синхронизацию для отдельных файлов/папок.

[Windows, GUI] Сделать архив, содержащий только измененные файлы (сохранив при этом всю структуру папок) может также WinMerge: http://opencartforum.ru/topic/28606-решено-winmerge-как-сделать-изменения-в-движке-и-сохра/#entry223289

Оказывается, Ubuntu можно обновить до следующего релиза через CD

- Posted in Uncategorized by

Не знал, для меня это оказалось приятным сюрпризом. Апгрейд до следующего релиза через сеть происходит очень долго - несколько утомительных часов, насколько помню. С возможными вопросами и проблемами посреди процесса. И это слабо зависит от скорости сети. Я обновлялся ближе к вечеру и пришлось на ночь ноутбук оставить докачивать и устанавливать, запретив впадать в спячку.

Через CD тоже процесс небыстрый, но гораздо меньше времени занимает. Так что советую попробовать ISO образ скачать, записать на болванку, и с неё уже обновляться.

Page 1 of 2