PHPStorm (PyCharm и др.) и XMonad

Категории: Jff

2016-02-28-23:48:47_708x493

После запуска PHPStorm вместо самое среды появляется лишь серое окно без ничего.
Работаю я в xmonad и произошло это после очередной правки конфига под себя.
В документации сказано, что для java-приложений нужен

startupHook = setWMName "LG3D"

Но этот хук перестал почему-то оказывать должный эффект (без него в ряде java-приложений тоже был пустой экран).
А все оказалось просто: я добавил хук ewmhDesktopsEventHook.

handleEventHook = do  
 ewmhDesktopsEventHook -- вот он  
 docksEventHook  
 fullscreenEventHook -- Full screen setup

Хук нужен для перехвата сообщений по активации окна, перемещению его на другой рабочий стол и переключении рабочих столов. Можно почитать документацию и код.

Но беда в том, что этот хук трет имя wm, которое устанавливается в конфиге (ставит “xmonad”). Этот wmname (который lg3d) служит решением для бага из awt.

Чтобы использовать ewmhDesktopsEventHook нужно указать java окольными путями, что она работает в “non reparenting” (не подобрал я нормального перевода :)) окружении.

Для этого служит переменная окружения _JAVA_AWT_WM_NONREPARENTING.

Пишем в ~/.bashrc или ~/.profile

export _JAVA_AWT_WM_NONREPARENTING=1

И теперь все хорошо.

2016-02-28-23:50:36_708x495

Raspbian - это не Debian

img_raspbian_logo

Raspbian - это не Debian. Хотя картинка нас убежлает в обратном.

В чем проблема? Проблема в обозначении архитектуры.

Давеча захотел я поставить на малинку пакет из репозитария собранного под Debian.

Прописал как положено в /etc/apt/sources.list.d/.list

deb <repourl> wheezy main

Установил и получил segmentation fault. Казалось бы - архитектура armhf (как на малинке), но почему-то не работает.

А дело все в том, что разработчики raspbian перекомпилировали дебиановский armhf (ARMv7) для совместимости с ARMv6, но название архитектуры не поменяли. В итоге попытки установить какой-нибудь пакет *.armhf из дебиана может закончится сегментейшнфаултом.

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

В итоге конфигурация репозитариев deb будет выглядеть так:

deb [arch=armel] <repourl> wheezy main

Ключевое здесь - добавить спецификацию архитектуры как [arch=armel] и таким образом можно успешно подключать даже репозитарии с какого-нибудь ланчпада.

Пруф

Redis: как скопировать базу без простоя проекта

Категории: Разработка HowTo

redisАга. У нас проблемы: нам нужно переехать сервер редиса без даунтайма проекта. Но нам надо не только переехать, но еще и данные сохранить.

Чаще всего предлагается решение в виде остановки проекта, копирования базы в новый инстанс, его запуск, переключение проекта и другие танцы.

Существует даже команда migrate, которая гарантирует атомарное копирование ключей и данных.

Но она работает в рамках одной бд (а по дефолту у редиса их целых 16), а так же обладает рядом негативных последствий ввиду своей атомарности. Поэтому подходит она совершенно для других целей.

Сразу на ум приходят репликации :) А данное решение их умеет.

Допустим у нас два сервера (у меня они на портах 6379 и 6479 соответственно). И нам нужно переключить проект с первого на второй сервер. Второй нулевой только что поднятый. А с первым ведется работа.

2016-02-24-20:28:27_805x48

Посмотрим, что в каждой из баз покажет команда

keys *

Основной редис

2016-02-24-20:29:30_482x426

Новый редис

2016-02-24-20:29:47_190x32

Как видим пока базы не синхронизированы.

Теперь нужно сделать новую базу репликой старой

> slaveof 127.0.0.1 6379  
OK  
> info  
...  
role:slave  
master_host:127.0.0.1  
master_port:6379  
master_link_status:up  
master_last_io_seconds_ago:1  
master_sync_in_progress:0

Дополнительно может потребоваться авторизоваться на мастере чтобы началась репликация

config set masterauth <password>

После этого можем опять посмотреть, что в базу скопировалось

keys *

2016-02-24-21:00:18_441x414

Как видим: все данные успешно засинхронизировались (вполне возможно это займет продолжительное время ввиду объема данных).

После того, как репликация завершена нам нужно сделать две вещи:

  • превратить слейва в мастер
  • настроить приложение на работу с новым мастером
slaveof no one

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

Да. Небольшой даунтайм все же был (секунд 10-15), но это гораздо лучше, чем предлагаемые решения.

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

Почитать про репликации.

MC (midnight commander): вы не умеете его готовить.

2016-02-06-14:38:03_337x97 Да-да. Вы все делаете неверно. MC - хоть и не заменяет консоль, но часто бывает полезен и для некоторых даже незаменим. Пусть он и является лишь оболочкой для ползанья по файловой системе, но очень функциональной оболочкой.
Обычно ведь как: f5 (скопировать), f6 (переместить), f3 (посмотреть), f4 (отредактировать), f8 (удалить), f7 (создать катало) и f10 (выйти).
Это тот набор команд, которым чаще всего пользователь и ограничивается.
Ах да - еще TAB чтобы переключиться из одной панели в другую.

Остаемся в текущей папке при выходе из mc.

Вы замечали, что при выходе из mc вы всегда возвращаетесь в ту папку, в которой были до его запуска. Одним это нравится, а другим нет.

В любом случае такое поведение можно поменять. А служит для этого опция -P, которой передается имя файла, в котором сейчас находится mc.

Зная имя файла по завершению процесса можно всегда вернуться в нужный катало. Для этого есть скрипт mc-wrapper.sh. Прописываем у себя в .bashrc.

alias mc='. /usr/libexec/mc/mc-wrapper.sh'

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

Выбор файлов

  • [insert] (или [ctrl-t]) - выбор текущего файла или снятие выбора с текущего файла (так же позволяет выбирать несколько файлов/папок)
  • [+] - выбор файлов и папок имена которых попадают под введенный паттерн
  • [/] - убирает выбор с файлов и папок име
  • [*] - реверсивное выделение файлов. Инвертирует состояние выбран\не выбран для всех файлов в текущем окне (именно файлов. не папок)

Доступ в шелл

  • вы можете вводить любую команду - просто начинаете печатать и она появляется внизу в маленьком приглашении ввода вашего шелла. Нажатие на [enter] запустит ее на исполнение.
  • не пытайтесь нажать [tab] в попытках вызвать автодополнение - вы просто смените текущую панель. Чтобы вызвать автодополнение надо нажать последовательность [esc tab]. Тут все как в обычном шелле - первый раз оно пытается дополнить максимально возможную часть команды, а повторное нажатие последовательности показывает ве возможные варианты (да еще и с выбором как в zsh). 2016-02-06-15:00:22_395x202
  • а если надо показать большой терминал? На надо выходить из mc - нажимаете [ctrl-o] и панели файловый менеджер скрывается оставляя вас наедине с консолью. Чтобы его вернуть заново нажимает [ctrl-o].
  • [alt-enter] - копирует имя текущего выбранного файла в строку терминала (удобно для передачи имени каким-нибудь командам)

Встроенный просмотрщик [f3] и редактор [f4]

  • Встроенный вьювер умеет показывать содержимое разных файлов не просто в сыром режиме (когда в pdf будут видны управляющие инструкции, а в гифке - байты), а в виде документа, который адаптирован для отображения в текстовом виде (конечно если у вас есть сопутствующий софт вроде pdf2text).
  • Чтобы увидеть сырые данные жмем [f8] в самом просмотрщике, либо [shift-f3] при открытии файла (а не [f3]).
  • Так же mc умеет использовать внешние редакторы и просмотрщики (задаются переменными PAGER и EDITOR в вашем .bashrc). Чтобы включить использование внешних редакторов выбираем соответствующую опцию в настройках 2016-02-06-15:15:53_664x389

Работа с панелями

  • [alt-,] - переключить режим разбиения с вертикального на горизонтальный
  • [alt-t] - циклическая смена режима отображения панели
  • [alt-i] - синхронизирует вторую панель с текущей (полезно если вам надо быстро открыть одну и ту же папку в двух панелях)
  • [ctrl-u] - поменять панели местами
  • [alt-o] - если текущий элемент директория, то откроет ее во второй панели и сместит выделение на один элемент вперед. Если же текущий элемент файл - откроет содержимое родительской директории в соседней панели и сместит выделение.
  • [ctrl-pgup] - перейти к родительской директории (если включена навигация в стиле lynx, то просто стрелка влево)
  • [alt-shift-h] - показать историю перемещения по папкам
  • [alt-y] - перейти в предыдущую папку из истории
  • [alt-u] - перейти в следующую папку из истории

Поиск

  • [alt-?] - открывает диалог поиска файлов
  • [alt-s] - быстрый поиск элемента в текущем каталоге по регулярному выражению
  • [ctrl-s] - бысрый поиск в текущем каталоге по совпадению

Основные сочетания

  • [ctrl-space] - посчитать объем каталога под выделением
  • [ctrl-x s] - создать символическую ссылку
  • [ctrl-x h] - создать жесткую ссылку
  • [ctrl-x o] - открыть редактор сhown на элемент
  • [ctrl-x c] - открыть редактор chmod на элемент
  • [alt-.] - скрыть\отобразить dot-файлы

Виртуальные файловые системы (vfs)

Эта концепция относительно mc позволяет нам путешествовать по архивам, sftp-серверам, rpm-файлам так, словно мы работаем с локальной файловой системой.

Попробуйте в mc набрать команду

cd ftp://mirror.yandex.ru/

2016-02-06-15:42:03_506x328

Вы не сможете отличить vfs от локальной системы только по скорости работы. Если у вас есть соответствующий доступ, то даже редактировать файлы на vfs возможно.

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

Введите cd без параметров и вы попадете в домашнюю директорию.

Полезные команды

  • [ctrl-x d] - сраврение директорий
  • [ctrl-] - переход в директорию быстрого доступа (и управление этим списком)

Полезные настройки

2016-02-06-15:56:46_435x242

  • левая\правая панель - формат списка. позволяет задать пользовательский формат вывода информации (чтобы посмотреть доступные поля нажмите [f1]

2016-02-06-15:47:26_301x229

  • Конфигурация
    • детали операции/подсчитывать размер - в совокупности эти две опции дадут более информативное окно копирования файлов (а если убрать, то копирование будет работать гораздо быстрее)
    • Автоматически сохранять настройки - полезно чтобы постоянно не нажимать “сохранить настройки”
  • Внешний вид
    • строка подсказки - дасть немного больше места на экране если убрать (скроется совет дня)
    • равный размер панелей - если мы включим разный режим отображения в каждой из панелей (древовидный и подробный), то получим проводник :)
  • Настройка панелей
    • автосохранение настроек панелей - будут удобно чтобы каждый раз не выбирать режим отображения панели заново
    • навигация в тиле lynx - быстрая навигация стрелками

AngularJS: сервисы, фабрики, провайдеры

Категории: Разработка

Чтоже это за странные service, factory и provider. Казалось бы - выполняют почти одну и туже функцию, подключаются через DI. Зачем их так много?

На абстрактный пример можно глянуть тут (к слову, автор привел очень хороший пример).

Но никто не рассказывает, зачем оно в реальной практике нужно.

Сервис

Он чаще всего используется для создания разделяемого ресурса.

var constructor = function constructor() {  
 this.foo = 'foo'  
 this.bar = function bar() {

}  
}

.service('someService', constructor)

Когда сервис создается первый раз, то выполняется

var someServiceImpl = new constructor()

И в дальнейшем при подключении зависимостей через DI в объекты будет всегда передаваться someServiceImpl.

Фабрика
это более продвинутая конструкция. Она не является разделяемым ресурсом сама по себе. При каждом использовании фабрики через DI ее значение - это результат вызова фабричной функции.

var factoryFn = function () {  
 var someClass = function() {}

return someClass;  
}

.factory('someFactory', factoryFn)

При первом инстанцировании фабрики будет вызвана функция factoryFn и ее результат - это уже и есть разделяемое между всеми участниками системы значение.

Свое применения фабрика находит в первую очередь для реализации моделей. Как в примере выше. Создается и описывается класс модели someClass и фабрика при инстанцировании возвращает ссылку на него. В последующем можно использовать этот класс как конструктор объектов.

.controller('someController', ['someFactory', function(someFactory) {  
 // Тут мы успешно инстанцируем новый объект someClass  
 var someClassImpl = new someFactory();  
}])

Провайдер
Это тоже фабрика. Но более продвинутаця. Так же точно при первом инстанцировании провайдера выполняется некая функция и ее результат становится разделяемым значением.

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

Как пример - библиотека для oauth-авторизации. на этапе конфигурирования в нее передаются токены.

var providerFn = function() {  
 var someModel = function() {  
 // это модель  
 }

this.configure = function() {  
 // делаем какую-то конфигурацию  
 }

this.$get = function() {  
 return new someModel()  
 }  
}

.provider('someProvider', providerFn)

И теперь самое интересное: при подключении провайдера через DI в качестве разделяемого объекта будет выступать то, что вернула функция $get.

В то же время на этапе конфигурирования нам доступен сам инстанс providerFn и мы можем использовать его функционал по конфигурированияю

.config(['someProvider', function(someProvider) {  
 //...  
 someProvider.configure(options)  
}])