Web-разработка с использованием nginx, php-fpm, node.js на Mac OS X.
Как известно, в комплекте с Mac OS X идет веб-сервер apache и php. Но как быть, если мы хотим использовать node.js, да не просто как отдельный сервер, висящий на отдельном порту, а иметь возможность проксировать http-запросы как к нему, так и к php. Небольшая инструкция по замене штатного httpd/php-module на связку nginx+php-fpm+node.js ниже.
Задвоенные приложения в меню «open with» в MacOS Finder
Всем привет!
Давно я что-то не писал в блог. Вот небольшая заметка для тех, у кого список приложений «Open with» в Finder содержит кучу хлама в виде кучи старых версий программ и/или вообще программы, которых на маке уже нет.
Лечится это одной магической командочкой в терминале. Вот она (обратные слеши в конце написаны просто для переноса строк, а так, командочка одна):
1 2 3 4 |
kostik@KOsTIK: ~> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/\ > LaunchServices.framework/Versions/A/Support/lsregister \ > -kill -r -domain local -domain system -domain user ThrottleProcessIO: throttling disk i/o |
Git sugar for ur bash
Решил написать небольшую заметку о том, как сделать работу с git’ом из консоли немного удобнее и приятнее.
Хочу осветить 3 небольших момента:
- Украшаем приглашение командной строки, чтобы сразу было видно в какой ветке находимся.
- Автодополнение веток и тэгов при работе в консоли.
- Настройка алиасов git.
Отображение текущей ветки в приглашении.
Не знаю, кому как, а я привык работать с git из консоли. Поэтому у меня всегда открыт шелл с директорией проекта. И порой забываешь, в какой ты сейчас ветке находишься, и надо писать git status, чтобы это увидеть. Крайне удобно было бы сразу видеть текущую ветку, да и вообще статус рабочей директории. Без проблем! Все что нужно, это немного подправить свой .bash_profile|.bashrc. Меняем приглашение шелла слендующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
[11:47] cmd#:5003 kostik@KOsTIK: ~> vim .bash_profile # Для начала определить некоторые цвета: red='\033[0;31m' RED='\033[1;31m' blue='\033[0;34m' BLUE='\033[1;34m' cyan='\033[0;36m' CYAN='\033[1;36m' green='\033[0;32m' GREEN='\033[1;32m' yellow='\033[0;33m' YELLOW='\033[1;33m' purple='\033[0;35m' PURPLE='\033[1;35m' NC='\033[0m' # No Color (нет цвета) ## Добавим неско полезных функций # Статус репозитория function git_dirty_flag() { fl=`git status 2>/dev/null | grep -c :` if [ $fl -gt 0 ]; then fl="\[${PURPLE}\]*" echo $fl fi } # Ветка function parse_git_branch() { br=`git branch --no-color 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'` if [ "$br" != "" ]; then br="\[${RED}\] {\[${CYAN}\]$br\[${RED}\]}" echo $br fi } # Настроим само приглашение. Поскольку в приглашении используются функции, нельзя просто написать # PS1="\[${GREEN}\][\[${CYAN}\]\A\[${GREEN}\]] cmd#:\[${PURPLE}\]\!\n\[${GREEN}\]\u\[${RED}\]@\[${green}\]\h\[${GREEN}\]: \[${PURPLE}\]\w$(parse_git_branch)$(git_dirty_flag)\[${GREEN}\]>\[${NC}\] " # Оно не будет работать. # Но это легко поправить если использовать в качестве приглашения функцию, которая автоматически будет вызываться каждый раз для отображения приглашения, а следовательно она же будет вычисляться и все будет хорошо. Поэтому делаем так: function powerprompt() { PS1="\[${GREEN}\][\[${CYAN}\]\A\[${GREEN}\]] cmd#:\[${PURPLE}\]\!\n\[${GREEN}\]\u\[${RED}\]@\[${green}\]\h\[${GREEN}\]: \[${PURPLE}\]\w$(parse_git_branch)$(git_dirty_flag)\[${GREEN}\]>\[${NC}\] " } # говорим, что наше приглашение - это то, что делает функция powerprompt PROMPT_COMMAND=powerprompt |
После этого надо или перезайти в консоль или просто применить новые изменения:
1 2 |
[11:47] cmd#:5003 kostik@KOsTIK: ~> . .bash_profile |
Теперь наша консоль будет выглядеть вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Это приглашение в обычном каталоге [11:57] cmd#:5004 kostik@KOsTIK: ~> # Это приглашение в папке с git репозиторием с чистым деревом [11:58] cmd#:5164 kostik@KOsTIK: ~/Projects/VISION_Admin {dev}> git status # On branch dev nothing to commit (working directory clean) # Это приглашение в папке с git репозиторием, где есть незакоммитенные данные [12:00] cmd#:5166 kostik@KOsTIK: ~/Projects/VISION_Admin {dev}*> git st # On branch dev # Untracked files: # (use "git add <file>..." to include in what will be committed) # # src/1.qwe nothing added to commit but untracked files present (use "git add" to track) |
Так как Syntax Highlighter все раскрасил по своему, то вот скриншотик как это выглядит на самом деле.
Таким образом один взгляд на приглашение шелла сразу дает нам возможность понять, в какой ветке мы сейчас находимся и есть ли там какие-то неучтеные изменения.
Автодополнение веток и тэгов.
Такс, текущую ветку в шелле мы уже видим. Но ведь довольно часто приходится переключаться на другие ветки или тэги. Было бы крайне удобно, если бы шелл подсказывал названия веток так же как и имена директорий и команд. В OS X токого по умолчанию нет. Бинарные пакеты с git’ом ставят только сам git. В Убунтах, кажется, автодополнение есть сразу. Но тем не менее, всем кому это актуально, вот как это легко сделать:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Качаем вот этот файлик с гитхаба [12:12] cmd#:5010 kostik@KOsTIK: ~> curl https://github.com/git/git/raw/master/contrib/completion/git-completion.bash -OL # Прописываем следующую строчку в своем bash_profile [12:13] cmd#:5011 kostik@KOsTIK: ~> vim .bash_profile source ~/git-completion.bash # Перезаходим в консоль или сразу применяем изменения [12:14] cmd#:5012 kostik@KOsTIK: ~> . .bash_profile |
Все. После этого по табу у вас будут дополнятся ветки и тэги, как локальные так и удаленные.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
[12:12] cmd#:5170 kostik@KOsTIK: ~/Projects/VISION_Admin {dev}> git br -a cam-group_hardware_setting * dev js-refac master position_camgroup processes remotes/origin/cam-group_hardware_setting remotes/origin/dev remotes/origin/ext_backup_upload remotes/origin/fix2032 remotes/origin/js-refac remotes/origin/master remotes/origin/position_camgroup remotes/origin/processes [12:17] cmd#:5171 kostik@KOsTIK: ~/Projects/VISION_Admin {dev}> git co 1.0.0a 1.1.1 cam-group_hardware_setting js-refac origin/ext_backup_upload origin/position_camgroup 1.0.10 FETCH_HEAD dev master origin/fix2032 origin/processes 1.0.7 HEAD ext_backup_upload origin/cam-group_hardware_setting origin/js-refac position_camgroup 1.1.0 ORIG_HEAD fix2032 origin/dev origin/master processes [12:17] cmd#:5171 kostik@KOsTIK: ~/Projects/VISION_Admin {dev}> git co p position_camgroup processes |
Настройка алиасов.
Ну и последний маленький кусочек оптимизации работы с git — настройка алиасов. Программисты — вообще народ ленивый, собственно именно по этому они пишут программы, а не делают все руками 🙂 И мне вот каждый раз набирать git checkout или git commit очень длинно и лень. Благо в git есть замечательные алиасы. Добавляем в свой gitconfig алиасы на свой вкус. У меня например забиты вот такие:
1 2 3 4 5 6 7 8 9 10 11 12 |
[12:16] cmd#:5012 kostik@KOsTIK: ~> vim .gitconfig [alias] ····logp = log --pretty=format:\"%h — %an: %s\" ····remotes = remote -v ····co = checkout ····st = status ····ci = commit ····br = branch ····logpg = log --pretty=format:\"%h — %an: %s\" --graph ····logg = log --graph hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short |
После этого достаточно написать в консоли git logpg и гит превратит это в git log —pretty=format:\»%h — %an: %s\» —graph
Ну вот и все. Если кому интересно, вот мой bash_profile на гитхабе.
Выполнение произвольного скрипта при старте системы Mac OS X
Всем привет! У меня на работе давно есть потребность в статических маршрутах, отличных от маршрута по умолчанию. Но писать каждый раз в консоли sudo route add 10.1.1.1/24 192.168.24.222 после входа как-то напрягает, да и просто банально лень делать это каждый раз. В данном случае, прописывание маршрута — это частная задача. В общем случае это сводится к выполнению произвольного скрипта. Однако есть решение, пусть и не очень простое, но все-таки!
Hint: Включение отладочного меню в Safari@MacOSX
Всем привет!
Наткнулся тут в одной презентации про веб-разработку в webkit-based браузерах на возможность включения дополнительного меню откладки в Safari. Включил. Там есть много интересного! Если вы не знали, то вот как это можно быстро сделать. Открываем консоль и меняем один параметр Safari
1 |
kostik@KOsTIK: ~> defaults write com.apple.Safari IncludeInternalDebugMenu 1 |
Вот как выглядит это меню.
Makefile – missing separator. Stop.
После очередного апдейта безопасности MacOS X у меня в очередной раз слетел пых с ораклом. Во время шаманств при сборке пыха из сырцов, дабы скомпилить его с поддержкой iconv & oci8 столкнулся с вот такой проблемой:
1 2 |
kostik@KOsTIK: ~/Sources/php-5.3.8> make Makefile:148: *** missing separator. Stop. |
Возникло это после ручной правки Makefile. Чего в обычной жизни делать не требуется. Но при сборке php под mac os x это неотъемлемый шаг. Если вы столкнулись с такой же проблемой, то знайте, что лечится она очень просто — надо использовать табы вместо пробелов там где требуются отступы. Так что просто внимательно следите за тем, что меняете. Меняйте только сами команды, а не отступы.
MySQL и регистро-зависимость имен в MacOS X
Всем привет.
Столкнулся тут на днях со следующей проблемкой. Я работаю на Mac OS X, и поэтому все необходимое для разработки ПО у меня стоит на моем компе, тот же Апач, Пых (они вообще идут из коробки) ну и Майскуль.
Так вот, решил я для одного нового проекта заюзать MySQL Workbench. Это такая утилита, в которой можно построить UML-схему базы данных, все красиво разрисовать и потом слить эту структуру в конечную БД, так же есть Reverse Engineering. В общем, первое сливание текущей структуры из БД прошло гладко, а вот первая же заливка изменений в БД уже не получилась. Не смотря на то, что Workbench честно показывал изменения, после накатывания аптейта, он все равно продолжал считать, что все структуры разные. Дело в том, что я люблю называть таблицы красивыми именами, отражающими действительность, с заглавными буквами, разве что в дополнение к CamelCase стилю еще разделяю слова символом подчеркивания. Так вот после долгих изучений и изысканий обнаружилось, что установки по умолчанию в MySQL Server на Mac OS, не очень подходят для моего случая.
Как известно, в MySQL, база данных соответствует определенной директории на сервере, и каждая таблица хранится в виде файла (или нескольких в зависимости от движка). Поэтому регистро-чувствительность ОС играет немаловажную роль в обработке регистро-чувствительности при разрешении имен в базе данных. Это означает, что если ваш сервер на винде, то ему пофиг на регистр, в *nix-подобных системах же наоборот, регистр имеет значение, за исключением Mac OS, которая вроде как юникс, а файловая система там HFS+, которая не очень чувствительна к регистру.
В MySQL сервере есть 2 системных переменные которые имеют отношение к регистру имен, это lower_case_file_system и lower_case_table_names. Первая переменная отражает регистрочувствительность файловой системы, где расположено хранилище, оно может принимать всего два значения: OFF — фс чувствительная к регистру и ON — не чувствительна.
Вторая переменная, lower_case_table_names, отражает механизм, как происходит сравнение имен и способ их хранения. 0 означает, что имена сохраняются в том виде, в котором были заданы и сравнение чувствительно к регистру. При значении 1, имена таблиц хранятся в нижнем регистре и сравнение не чувствительно к регистру. В случае 2, имена хранятся как есть, но сравнение происходит в нижнем регистре.
По умолчанию эти переменные принимают вот такие значения на Mac OS X:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
kostik@KOsTIK: ~> mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 Server version: 5.1.49 MySQL Community Server (GPL) mysql> select @@lower_case_table_names; +--------------------------+ | @@lower_case_table_names | +--------------------------+ | 2 | +--------------------------+ 1 row in set (0.00 sec) mysql> select @@lower_case_file_system; +--------------------------+ | @@lower_case_file_system | +--------------------------+ | 1 | +--------------------------+ 1 row in set (0.00 sec) |
И вот такие на *nix (проверил на Linux/FreeBSD)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
kostik@linux: ~> mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 49773 Server version: 5.1.51 MySQL Community Server (GPL) by Remi mysql> select @@lower_case_table_names; +--------------------------+ | @@lower_case_table_names | +--------------------------+ | 0 | +--------------------------+ 1 row in set (0.00 sec) mysql> select @@lower_case_file_system; +--------------------------+ | @@lower_case_file_system | +--------------------------+ | 0 | +--------------------------+ 1 row in set (0.00 sec) |
Если почитать описание этих переменных на сайте mysql (тут), то там написаны замечательные рекомендации по выставлению правильных параметров переменной lower_case_table_names. Если лень читать, то основная мысль: если вы используете InnoDB как основной движок, то поставьте везде этот параметр в 1.
Самый простой способ — это прописать эту переменную в файле конфигурации my.cnf в секцию [mysqld] и рестартануть Mysql сервер.
В общем-то я не открыл ничего нового, все это можно найти в офф. документации на сайте, статья: Identifier Case Sensitivity дает более развернутое описание этой ситуации. Рекомендую прочитать.
Вот и все!
Включаем GrowlMail после апдейта 10.6.4 -> 10.6.5
Всем салют!
Все маководы наверняка знают и используют такую замечательную вещь как Growl (это сервис нотификации обо всем и вся). У него есть замечательный плагин GrowlMail, который позволяет Mail.app отправлять в Growl уведомления о новых письмах. Я его использую, и мне нравится. НО. С этим плагином есть одна маленькая проблемка: каждый раз после апдейта Mail.app, которое происходит почти каждый раз при апдейте системы, Mail при запуске ругается на то, что этот плагин не совместим с этой версией Mail и отключает его. Собственно именно по этой причине разработчики Growl исключили этот плагин из поставки Growl и выделили его в отдельный проект. И вот, всем пользователям, каждый раз при апдейте системы, приходится ждать пока какой-нибудь хороший человек сделает новую сборку плагина. Но в этот раз, что-то никто не торопится обновлять плагин, а без него как-то грустно.
Но решение есть! И довольно-таки простое.
Подробнее
Автодополнение команд после sudo в bash
Возможно кому-то это конечно покажется очевидным и само собой разумеещимся, но вот я раньше этого не знал. Собственно о чем речь, спросите вы?
Постановка задачи:
Сделать автодополнение команд в баше после sudo, а так же возможность выполнения алиасов так же после sudo.
А в чем собственно проблема спросите вы? — Да ни в чем, если вам это не нужно, однако мне, живущему на Mac OS X, периодически приходится выполнять некоторые команды из под рута. А для этого как ни сложно догадаться, используется команда sudo. А поскольку Линуксоид я еще тот, то мне уже давным давно лень писать команды полностью, ведь есть TAB 🙂 Но по умолчанию автодополнение после написания sudo не работает.
Проблема номер два: это то что, после sudo так же не работают алиасы. Вот пример: у меня есть некоторое количество алиасов, среди них alias ll=’ls -l’. Вот что будет если вы попробуете выполнить:
> sudo ll