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

    Docker
    Docker

    Containerization is the new virtualization

    The Docker Book

    Что такое Docker?

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

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

    Деннис Ритчи

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

    PHP Warning:  Unknown: open(/tmp/sess_e34ad6u6f51gum3htmqkd7ldn6, O_RDWR) failed: No space left on device (28)
    Continue   
  • «Strangler Application» и SSI3 min read

    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
    strangler vines

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

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

    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;
    Continue   
  • Событийная архитектура веб-приложения4 min read

    5a64a4b8882d7events

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

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

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

    Url Balancer

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

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

    Continue   
  • Minecraft1 min read

    5a64a38359b3dminecraft

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

    Continue   
  • А вот и я, всем привет3 min read

    Dragon
    Dragon

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

    Continue   
  • Ветка git в командной строке1 min read

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

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

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

    5a64a2a385b4dgit

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

    Continue   
  • Добавление файла подкачки в Ubuntu2 min read

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

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

    Continue   
  • Снятие кадров с вебкамеры на Windows1 min read

    Для начала нам понадобится 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.

    Continue   
  • Первичная настройка git1 min read

    Алиасы

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

    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 "[email protected]"

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

    git config --global color.branch auto
    git config --global color.diff auto
    git config --global color.interactive auto
    git config --global color.status auto
    Continue   
  • Как привести в порядок репозитарий3 min read

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

    Continue