Как известно, в комплекте с Mac OS X идет веб-сервер apache и php. Но как быть, если мы хотим использовать node.js, да не просто как отдельный сервер, висящий на отдельном порту, а иметь возможность проксировать http-запросы как к нему, так и к php. Небольшая инструкция по замене штатного httpd/php-module на связку nginx+php-fpm+node.js ниже.
Метка: macosx
Всем привет!
Давно я что-то не писал в блог. Вот небольшая заметка для тех, у кого список приложений «Open with» в Finder содержит кучу хлама в виде кучи старых версий программ и/или вообще программы, которых на маке уже нет.
Лечится это одной магической командочкой в терминале. Вот она (обратные слеши в конце написаны просто для переноса строк, а так, командочка одна):
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. Меняем приглашение шелла слендующим образом:
[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
После этого надо или перезайти в консоль или просто применить новые изменения:
[11:47] cmd#:5003 kostik@KOsTIK: ~> . .bash_profile
Теперь наша консоль будет выглядеть вот так:
# Это приглашение в обычном каталоге [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..." 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. В Убунтах, кажется, автодополнение есть сразу. Но тем не менее, всем кому это актуально, вот как это легко сделать:
# Качаем вот этот файлик с гитхаба [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
Все. После этого по табу у вас будут дополнятся ветки и тэги, как локальные так и удаленные.
[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 алиасы на свой вкус. У меня например забиты вот такие:
[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 на гитхабе.
Всем привет! У меня на работе давно есть потребность в статических маршрутах, отличных от маршрута по умолчанию. Но писать каждый раз в консоли sudo route add 10.1.1.1/24 192.168.24.222 после входа как-то напрягает, да и просто банально лень делать это каждый раз. В данном случае, прописывание маршрута — это частная задача. В общем случае это сводится к выполнению произвольного скрипта. Однако есть решение, пусть и не очень простое, но все-таки!
Всем привет!
Наткнулся тут в одной презентации про веб-разработку в webkit-based браузерах на возможность включения дополнительного меню откладки в Safari. Включил. Там есть много интересного! Если вы не знали, то вот как это можно быстро сделать. Открываем консоль и меняем один параметр Safari
kostik@KOsTIK: ~> defaults write com.apple.Safari IncludeInternalDebugMenu 1
Вот как выглядит это меню.
Тот, кто заходил/читал мой блог раньше, скажет: «Кажется, я уже это видел». И будет прав. Давным давно я уже писал пост о том, как скомпилить php на MacOS X с поддержкой oracle, iconv и прочих библиотек. Но время идет, уже давно вышли новые версии и php и macosx, а проблема все остается нерешенной, правда пути ее решения несколько изменились.
Не буду рассказывать как включить поддержку Oracle в php, про это вы можете прочитать в моем старом посте:
Настройка Apache+PHP+MsSQL+Oracle на Mac OS X Leopard, лучше расскажу как решить эту надоевшую уже проблему сборки php 5.3.[5678] с поддержкой iconv.
После очередного апдейта безопасности MacOS X у меня в очередной раз слетел пых с ораклом. Во время шаманств при сборке пыха из сырцов, дабы скомпилить его с поддержкой iconv & oci8 столкнулся с вот такой проблемой:
kostik@KOsTIK: ~/Sources/php-5.3.8> make Makefile:148: *** missing separator. Stop.
Возникло это после ручной правки Makefile. Чего в обычной жизни делать не требуется. Но при сборке php под mac os 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:
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)
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 дает более развернутое описание этой ситуации. Рекомендую прочитать.
Вот и все!
Всем салют!
Все маководы наверняка знают и используют такую замечательную вещь как Growl (это сервис нотификации обо всем и вся). У него есть замечательный плагин GrowlMail, который позволяет Mail.app отправлять в Growl уведомления о новых письмах. Я его использую, и мне нравится. НО. С этим плагином есть одна маленькая проблемка: каждый раз после апдейта Mail.app, которое происходит почти каждый раз при апдейте системы, Mail при запуске ругается на то, что этот плагин не совместим с этой версией Mail и отключает его. Собственно именно по этой причине разработчики Growl исключили этот плагин из поставки Growl и выделили его в отдельный проект. И вот, всем пользователям, каждый раз при апдейте системы, приходится ждать пока какой-нибудь хороший человек сделает новую сборку плагина. Но в этот раз, что-то никто не торопится обновлять плагин, а без него как-то грустно.
Но решение есть! И довольно-таки простое.
Возможно кому-то это конечно покажется очевидным и само собой разумеещимся, но вот я раньше этого не знал. Собственно о чем речь, спросите вы?
Постановка задачи:
Сделать автодополнение команд в баше после sudo, а так же возможность выполнения алиасов так же после sudo.
А в чем собственно проблема спросите вы? — Да ни в чем, если вам это не нужно, однако мне, живущему на Mac OS X, периодически приходится выполнять некоторые команды из под рута. А для этого как ни сложно догадаться, используется команда sudo. А поскольку Линуксоид я еще тот, то мне уже давным давно лень писать команды полностью, ведь есть TAB 🙂 Но по умолчанию автодополнение после написания sudo не работает.
Проблема номер два: это то что, после sudo так же не работают алиасы. Вот пример: у меня есть некоторое количество алиасов, среди них alias ll=’ls -l’. Вот что будет если вы попробуете выполнить:
> sudo ll