• Docker: создание и запуск контейнера

    Docker

    Containerization is the new virtualization

    The Docker Book

    Что такое Docker?

    В отличии от классических систем виртуализации, которые эмулируют работу компьютерного железа и ядра операционной системы поверх него, Docker использует виртуализацию на уровне ядра: все виртуализируемые им процессы делят ядро операционной системы хоста, что позволяет значительно сократить как требуемые ресурсы, так и время, необходимое на запуск/обслуживание таких систем. В идеале, каждый процесс изолируется в собственном контейнере (linux container, lxc), который содержит набор необходимых ему библиотек, что позволяет забыть о dependecy hell, а также легко переносить стек проекта между серверами. В статье ниже я проиллюстрирую, как можно использовать Docker для настройки среды разработчика, повторяющей среду продакшена: предположим, что там используется Ubuntu LTS, PHP 5.4, Nginx.
    Read more
  • «No space left on device» и inodes

    Честно говоря, я тоже не знаю. Это был всего лишь термин, который мы начали использовать. Из-за немного необычной структуры файловой системы, при которой информация о доступе к файлам хранится в виде плоского (двумерного) массива на диске, отдельно от всей информации об иерархии каталогов, лучшее, что я могу предположить (для «и») - это «индекс». Таким образом, и-номер являлся индексом в этом массиве, и-нод - выбираемым элементом массива. (Приставка «и-» использовалась в первой версии руководства; со временем дефис перестали употреблять).

    Деннис Ритчи

    Я был очень удивлен, когда получил ошибку следующего содержания при попытке открытия сессии:

    PHP Warning:  Unknown: open(/tmp/sess_e34ad6u6f51gum3htmqkd7ldn6, O_RDWR) failed: No space left on device (28)
    Read more
  • «Strangler Application» и SSI

    When Cindy and I went to Australia, we spent some time in the rain forests on the Queensland coast. One of the natural wonders of this area are the huge strangler vines. They seed in the upper branches of a fig tree and gradually work their way down the tree until they root in the soil. Over many years they grow into fantastic and beautiful shapes, meanwhile strangling and killing the tree that was their host.

    Martin Fowler, «Strangler application»

    strangler vines

    Однажды мне достался большой и запущенный веб-проект, обладающий, наверное, всеми ярко выраженными признаками и проблемами, что вообще свойственны наследуемым системам. Все компоненты системы были написаны таким образом, что дальнейшее их расширение, изменение и поддержка если и были вообще возможны, превращались в настоящий кошмар для разработчиков и тестировщиков. Даже основные модули, такие как ядро и маршрутизация, были тесно завязаны на серверное окружение, миллион магических цифр, динамически назначаемых констант, огромных ветвистых функций и неочевидных хаков. Цикломатическая сложность с тремя нулями не была чем-то удивительным.
    Read more
  • Удаление слешей из урла в nginx

    Иногда требуется удалить множественные слеши из адреса, например:

    http://mysite.com//page//1.htm/ —> http://mysite.com/page/1.htm

    В этом случае, можно использовать следующую конструкцию для удаления слешей из середины:

    set $test_uri $scheme://$host$request_uri;
    if ($test_uri != $scheme://$host$uri$is_args$args) {
        rewrite ^ $scheme://$host$uri$is_args$args? permanent;
    }

    И с конца:

    rewrite ^/(.*)/$ /$1 permanent;
  • Событийная архитектура веб-приложения

    5a64a4b8882d7events

    Одной из самых плохо расширяемых частей любого веб-приложения является его клиентский код, как правило, написанный на javascript. Во многих проектах он представляет собой джунгли из функций, принимающих коллбеки — и это в лучшем случае. Многие склонны винить в таком положении дел непосредственно сам язык, припоминая его «низкое» происхождение, странное поведение и отсутствие синтаксического сахара. Несомненно, в этом есть своя правда. Но я полагаю, что основная причина такой запутанности заключается в том, что построить для взаимодействия с интерфейсом стройную и расширяемую архитектуру, руководствуясь только принципами императивного программирования — невозможно. И хотя модель реализации событий в браузере сама подводит к идее организации кода декларативно, почему-то немногие на это отваживаются.
    Read more
  • Как научить Toggl находить трекеры по нестандартным адресам

    Есть такой замечательный сервис Toggl, позволяющий отслеживать затраты времени между разными трекерами задач, или вовсе без оных. К сожалению, расширение для Google Chrome, добавляющее автоматические кнопки к задачам в трекере, работает не везде, где хотелось бы. Например, оно будет работать, если вы покупаете Jira в облаке (.atlassian.net), но и усом не поведет, если у вас Jira на собственном сервере (jira..com). Ничего, выход есть — и довольно простой.

    git clone https://github.com/toggl/toggl-button
    cd toggl-button
    nano src/manifest.json

    Необходимо добавить строчки в permissions и content_scripts:

    ...
    "permissions": [
        "tabs",
        ...
        "*://myawesomeredmine.com/*",
        "*://jira.myawesomesite.com/*"
      ],
    ...
    "content_scripts": [
        {
          "matches": [
            ...
            "*://myawesomeredmine.com/*",
            "*://jira.myawesomesite.com/*"
          ],
          ...
          {
              "matches": ["*://myawesomeredmine.com/*"],
              "js": ["scripts/content/redmine.js"]
          },
          {
              "matches": ["*://jira.myawesomesite.com/*"],
              "js": ["scripts/content/jira.js"]
        }
      ]
    ...

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

  • Пакет для балансировки запросов к статическим файлам

    Url Balancer

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

    • Поддержка Composer (через packagist)
    • Поддержка Silex
    • Расширяемость стратегий балансировки

    Установка

    Рекомендуется установка через Composer:

    {
      "require": {
        "astartsky/url-balancer": "1.1.2"
      }
    }

    Пример использования

    $urlBalancer = new \Astartsky\UrlBalancer\UrlBalancer();
    $urlBalancer->setStrategy(new \Astartsky\UrlBalancer\Strategy\HashStrategy())
    $urlBalancer->addBucket(new \Astartsky\UrlBalancer\Domain("s1.myawesomesite.com"));
    $urlBalancer->addBucket(new \Astartsky\UrlBalancer\Domain("s2.myawesomesite.com"));
    $urlBalancer->addBucket(new \Astartsky\UrlBalancer\Domain("s3.myawesomesite.com"));
    
    $url = $urlBalancer->getUrl("/images/my_impressive_content.png");

    Ссылки

    На Packagist.org: пакет На Bitbucket.org: репозитарий

  • Minecraft

    5a64a38359b3dminecraft

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

  • А вот и я, всем привет

    Dragon
    Dragon

    Сразу же отвечу на вопрос о том, куда же я пропал на целый год: да никуда и не пропадал! Живу себе тихо своей жизнью, хоть она и немного поменялась за последнее время, а всякие мысли лытдыбрового характера все мельчают, и мельчают, пока не попадают прямиком в твиттер. Ну а для технических штук у меня отдельная площадка есть, чтобы вас не утомлять мало кому интересными темами. Хотя это вполне работает, я по вам все равно скучаю. Ведь сколько копий сломано в комментариях в моей ленте или, может, ваших, друзья. Напряженные холивары, разговоры за жизнь, просто болтовня — все это очень круто было, и мне этого не хватает. Но вспоминаю я о таком все реже.

    Что ж у меня нового?

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

    Я совсем перестал участвовать в холиварах в интернете. Да, это весело, да это забавно, но это требует такую уйму времени, которой у меня, к сожалению, уже нет. Помню как мы спорили с кем-то на очередную мировоззренческую тему года так три назад, я тогда только устроился работать на фултайм, приходил домой и… половину вечера убивал на составление внятного ответа. Меня хватило очень ненадолго. Есть много более интересных вещей, которыми можно заняться для развлечения: троллинг, например.

    Еще я переехал в Москву, в Крылатское: и очень тому рад. С трех сторон тут зелень, до метро рукой подать, панорамный вид на лесопарк. Можно забыть о пробках на Можайке, о переполненных душных электричках и всяких вокзалах, о соседях-алкашах и всем таком родном, но надоевшем. Свой дом, пусть и условно свой — это, все таки, уже крепость. На работу с апреля по конец ноября катался на своих двоих колесах, на велосипеде. В один конец около 15-20 километров, намотал тысячи километров за год. Ветер в лицо, хэви металл в уши: до этого никогда не радовался дороге так, как в этом году.

    В общем, я всегда где-то здесь. Может, еще что-то расскажу скоро.

  • Ветка git в командной строке

    Если активная работа над проектом идет над несколькими ветками сразу, всегда полезно знать, на какой ветке в текущий момент находится указатель HEAD репозитария. Чтобы не полагаться на память, можно добавить отображение названия ветки в приглашение командной строки. Для этого откроем на редактирование ~/.bashrc

    export PS1='\u@\h: \w\[\033[01;33m\]$(__git_ps1) \$\[\033[00m\] '

    Любуемся результатом:

    5a64a2a385b4dgit

    Но, по хорошему, лучше просто поставьте zsh — оно того стоит.

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

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

    Иногда важно помнить о том, что вместе с апдейтом кода появилась и новая миграция, которую нужно бы не забыть запустить. Первый вариант — 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.

  • Снятие кадров с вебкамеры на Windows

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

    "C:\Program Files (x86)\VideoLAN\VLC\vlc.exe" --dshow-vdev="iLook 310" --dshow-size=640x480 --video-filter=scene --no-audio --scene-path=C:\Users\Ast\Pictures\Snaps\ --scene-format=jpeg --scene-prefix=snap --run-time=1 --intf=dummy -V dummy --scene-replace --dummy-quiet "dshow://" vlc://quit
    
    set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
    copy "C:\Users\Ast\Pictures\Snaps\snap.jpeg" "C:\Users\Ast\Pictures\Snaps\%datetimef%.jpeg"

    В данном примере «iLook 310» — название источника, его можно посмотреть через GUI VLC.

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

    Алиасы

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

    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
  • Как привести в порядок репозитарий

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