• Добавление файла подкачки в Ubuntu by Ast

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

    Создание файла

    sudo dd if=/dev/zero of=/swap bs=1G count=4
    

    Выглядит как достаточно непонятная команда. Рассмотрим параметры подробно:

    • if, Input File: Источник данных для файла: а нашем случае он будет полностью заполнен нулевыми байтами (ASCII NUL, 0x00). Не то чтобы нам это было важно, просто это просто и быстро; 
    • of, Output File: Вывод данных. Здесь это простой файл;
    • bs, Bytes: Количество байт для одной операции записи;
    • count: Количество блоков заданного размера;

    Есть альтернативный вариант, если вы торопитесь:

    sudo fallocate -l 4G /swap
    

    Итого, мы получим 4 гигабайта чистого счастья (1024 раза по 524288 килобайт).

    Разметка файла подкачки

    Время подготовить заготовку файла для высокой миссии.

    mkswap /swap
    

    Установка прав доступа

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

    chown root:root /swap
    chmod 0600 /swap
    

    Активация файла подкачки

    Пришло время потянуть за главный рычаг и включить файл подкачки.

    swapon /swap
    

    Почти всё. Осталось только сохранить достигнутые успехи на века: каждый раз после перезагрузки вводить какие-то команды совершенно непрактично.

    nano /etc/fstab
    
    /swap swap swap defaults 0 0
    

    Теперь при загрузке системы виртуальная память включится сама.

    free -m
    

    Если все прошло хорошо, мы увидим эффект подключения файла подкачки.

  • Как вежливо попросить git напомнить о миграциях by Ast

    Иногда важно помнить о том, что вместе с апдейтом кода появилась и новая миграция, которую нужно бы не забыть запустить. Первый вариант — git merge-base и еще несколько полезных команд. Задачу это решает, но требует множества действий — есть простор для фантазии и автоматизации. Пускай git сам напоминает нам о новых миграциях!

    #!/bin/bash
    
    HAS_NEW_MIGRATIONS=0
    git diff HEAD@{1} HEAD@{0} --name-only --diff-filter=A | grep 'migration' | while read FILENAME; do
      if [ "$HAS_NEW_MIGRATIONS" == 0 ] ; then
        echo -en "\033[32mМиграции добавлены: \033[0m \n"
        HAS_NEW_MIGRATIONS=1
      fi
    
      echo -en "\033[32m — " $FILENAME "\033[0m \n"
    done
    
    HAS_MODIFIED_MIGRATIONS=0
    git diff HEAD@{1} HEAD@{0} --name-only --diff-filter=M | grep 'migration' | while read FILENAME; do
      if [ "$HAS_MODIFIED_MIGRATIONS" == 0 ] ; then
        echo -en "\033[31mМиграции изменены: \033[0m \n"
        HAS_MODIFIED_MIGRATIONS=1
      fi
    
      echo -en "\033[31m — " $FILENAME "\033[0m \n"
    done
    
    exit 0
    
    ~/project/.git/hooks/post-checkout
    ~/project/.git/hooks/post-merge
    ~/project/.git/hooks/post-rewrite
    

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

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

  • Первичная настройка git by Ast

    Алиасы

    Получение статуса

    git config --global alias.st status
    git st
    

    Наглядный лог

    git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
    git lg
    git lg -p
    

    Настройка пользователя

    git config --global user.name "Username"
    git config --global user.email "foo@bar.com"
    

    Добавим цвета

    git config --global color.branch auto
    git config --global color.diff auto
    git config --global color.interactive auto
    git config --global color.status auto
    
  • Алиас для подключения по SSH by Ast

    Иногда бывает удобно прописать короткий адрес для подключения по ssh. Например, когда для подключения необходимы одни и те же параметры, либо когда предполагается возможность достаточно частой смены параметров, либо просто — порядка ради. В любом случае, если вам больше нравится возможность заменить первое на второе, добро пожаловать.

    ssh -p 22 -i ~/.ssh/git_id_rsa git@git.test.com
    
    ssh repository
    

    Все, что нам нужно, это описать параметры подключения в конфиге. Например, так.

    # ~/.ssh/config
    Host repository
        Hostname git.test.com
        Port 22
        User git
        IdentityFile ~/.ssh/git_id_rsa
    
  • Как привести в порядок репозитарий by Ast

    Всегда приятно начинать проект с нуля, самому создавать под него репозитарий, определять принятый в нём стиль кодирования, да и многое другое. Но иногда нам достаются «трудные дети» с тяжелым прошлым, включающим мешанину табуляции и пробелов, разных способов обрыва строки, кодировок. Понятное дело, что все это приводит систему контроля версий к истерике. Но не беда. Linux to the rescue!

    Форматирование

    Нам пригодится утилита expand.

    find ./ -type f -name "*.php" -exec sh -c 'expand -t 4 {} > _tmp_ && mv _tmp_ {}' \;
    

    Данная команда заменит в каждом *.php файле табуляцию на 4 пробела. В обратную сторону работает команда unexpand.

    Завершение строки

    Исторически так сложилось, что способов завершить строку в текстовом файле довольно много. Самые распространенные: версия Windows (CR+LF) и Unix (LF). В репозитарии же следует выбрать что-то одно. Нам придет на выручку другая замечательная утилита dos2unix (еще более замечательная тем, что нет необходимости париться с временными файлами!)

    find ./ -type f -name "*.php" -exec sh -c 'dos2unix {}' \;
    

    Еще одно решение: hook для git`а

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

    nano repository_path/.git/hooks/pre-commit
    
    ALLOWED_EXTENSIONS=('php' 'phtml' 'js' 'css' 'html' 'htm' )
    git diff --cached --name-only --diff-filter=ACM | while read FILENAME; do
      FILENAME_EXTENSION=${FILENAME#*.}
      for ALLOWED_EXTENSION in "${ALLOWED_EXTENSIONS[@]}"
      do
        if [ "$ALLOWED_EXTENSION" == "$FILENAME_EXTENSION" ] ; then
          # fixing line endings
          dos2unix --quiet $FILENAME
          # converting tabs into spaces
          expand -t 4 $FILENAME > _tmp_ && mv _tmp_ $FILENAME
          git add $FILENAME
        fi
      done
    done
    exit 0
    
  • Смена пароля пользователя MySQL by Ast

    1. Остановите сервер

    Вы должны остановить процесс сервера mysql (одним из указанных способов)

    /etc/init.d/mysql stop
    
    service mysql stop
    

    2. Запустите сервер без проверки привилегий

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

    mysqld_safe --skip-grant-tables
    

    3. Меняем пароль!

    Теперь ничего не мешает нам подключиться к серверу и вручную сменить пароль требуемому пользователю

    mysql -u root
    

    Дальнейшие команды вводятся в командном интерфейсе MySQL

    USE mysql;
    UPDATE user SET password = PASSWORD("SECRET-PASSWORD") WHERE user = "root";
    FLUSH PRIVILEGES;
    QUIT;
    

    4. Готово? Почти

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

    /etc/init.d/mysql stop
    /etc/init.d/mysql start
    
    service mysql stop
    service mysql start
    

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

  • Изменение src у изображения в Opera by Ast

    Казалось бы, ну что может быть проще чем сменить изображение на странице при помощи JavaScript? Вроде на дворе самый настоящий 2010 год, уже давно в ходу разные кроссбраузерные библиотеки вроде jQuery, предусматривающие малейший каприз любого движка. Ну какие проблемы вообще могут возникнуть? Оказалось, всякие. Очевидная попытка просто сменить src у img не дала ровным счетом ничего.

      $('#kcaptcha').attr('src', '../includes/captcha/run.php');
    

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

    $('#kcaptcha').attr('src', '../includes/captcha/run.php#' Math.random());
    

    На такой трюк купились все кроме Opera: честно загружали заново это несчастное изображение, как будто это совсем разные пути, а не добавленный якорь. Но норвежская красавица упорствовала в своем нежелании идти на компромиссы. И чтобы подружиться с ней, пришлось внести определенные коррективы, убрав из якоря случайное число и поместив его в GET:

    $('#kcaptcha').attr('src', '../includes/captcha/run.php?junk=' Math.random());
    

    Вот тут Opera подобрела и стала менять послушно менять изображение.

  • Путевые записки из страны пингвинов by Ast

    Удобные сокращения

    Есть такая полезная тема в никсах как сокращения команд «alias». Наверное, каждый хоть раз задумывался об этом, набивая очередной длинный путь до какой-нибудь команды. А все, на самом деле, проще некуда!

    Итак, чтобы создать алиас, нужно ввести такую команду:

    alias zf = 'sudo sh /home/ast/vhosts/ZendFramework/bin/zf.sh'
    

    Лучший вариант: ввести необходимые алиасы в настройки:

    gedit ~/.bashrc
    

    Готово! Теперь можно сравнить оригинальный вариант команды и новый, использующий алиасы:

    sh /home/ast/vhosts/ZendFramework/bin/zf.sh create project Sample
    zf create project Sample

    Польза очевидна.

    Консольное редактирование

    Используя ssh очень удобно удаленно управлять серверами: это требует минимум пропускной способности канала и обладает всей мощью консоли никсов. Однако, если команды запомнить несложно, иной раз возникает необходимость и какой-нибудь конфиг отредактировать. Ради этого подключать графический интерфейс — охотиться на муху с ракетной установкой. К счастью, есть vim.

    Использовать его очень просто, как обычный редактор:

    vim /etc/php5/apache2/php.ini
    

    Я расскажу о самом базовом функционале этой мощной штуковины, который позволит нам осуществить «программу-минимум» — редактирование конфигов.

    «/» — Позволяет ввести текст для простейшего поиска. Чтобы найти следующее вхождение искомой строки, нужно вызвать команду без параметра;

    «i» — Переключает программу в режим редактирования. Вернуться в режим просмотра можно в любой момент, нажав «ESC»;

    «:w!» — Сохранение файла со всеми изменениями;

    «:quit» — Выход из программы без сохранения изменений.

  • Решение проблемы с циклом перезагрузки Gigabyte by Ast

    Хьюстон, у нас проблема!

    Уже давно все компьютеры у меня настроены на уход в спящий режим вместо обычного выключения. Это очень удобно, так как значительно сокращает потерю времени впустую на загрузку. И когда утром начались традиционные проблемы с электроснабжением, техника была «выключена», а я был спокоен. Как оказалось, немного зря. Вечером, попробовав включить компьютер, обнаружил то, что в интернетах именуется «reboot loop», цикл перезагрузок и является известнейшей проблемой материнских плат от Gigabyte, а также некоторых других на платформе Sandy Bridge.

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

    Конфигурация системы

    • Процессор Intel Core i7-2600K (3.40ГГц, 4x256КБ 8МБ, EM64T, GPU) Socket1155
    • Материнская плата Gigabyte GA-P67A-UD3 (iP67, 4xDDR3, 2xPCI-E, SB, USB3.0, ATX) rev 1.0
    • Оперативная память 2x DDR3 SDRAM Kingston «HyperX» KHX1600C9D3K2/4GX (PC12800, 1600МГц, CL9)

    Проблемы нужно решать

    Поясню сразу: эта проблема может возникать по довольно разным причинам, от включенного PLL Overvoltage (используется для разгона, есть только в экспериментальных прошивках для этой платы), до неправильно выставленных параметров памяти. И совсем не факт, что решение, которое помогло мне, может помочь еще кому-то. Но вдруг? :)

    Собственно, у меня был как раз второй случай. Насколько я понял, после нарушенного спящего режима, система не может синхронизировать работу с памятью, а виноват в этом, скорее всего, микрокод Intel. Но не будем забегать вперед, нужно решать проблему поэтапно. Для начала, нужно сбросить CMOS, чтобы вообще добраться до настроек BIOS. Достаем батарейку и некоторое время ничего не трогаем. Идеальным вариантом будет также вытащить всю лишнюю память, оставить одну планку. По прошествии 10-20 минут, ставим обратно батарейку (но не память!) и запускаем машину. Reboot loop на этом этапе уже должен бы исчезнуть, но проблема еще не решена, так как установлена только одна планка оперативки. А стоит поставить обратно все четыре, вернется и reboot loop. Что делать!?

    Для начала, нужно прошить BIOS на более позднюю версию. Я отправился на сайт производителя и обнаружил, что моей версии прошивки F3 там вообще нет, а самая младшая F4 сопровождается комментарием о том, что там исправлен как раз таки наш злодей — микрокод. Аккуратно перепрошиваем, следуя руководству.