• Как есть "визуальная" среда разработки под Android?

    Beshere
    @Beshere
    Разработчик
    Android Studio
    Ответ написан
    Комментировать
  • Как отменить pull?

    v_decadence
    @v_decadence
    git reset --hard <хеш локального коммита, в который вливался task1234>
    Ответ написан
    Комментировать
  • Как получить комментарии оставленные к задаче в Битрикс24?

    Комменты не хранятся в задаче. Они хранятся в форуме. Это по сути ветка обсуждения такая же как для обсуждения товаров например.
    Смотрите как реализован вывод в штатном шаблоне tasks.task.detail с помощью bitrix:forum.comments и копайте в эту сторону.
    Ответ написан
    1 комментарий
  • Для чего нужен Docker?

    un1t
    @un1t
    Я тоже долго не мог понять.
    Подобрал такую аналогию - это как git для сервисов.
    Например чтобы развернуть Elasticsearch надо установить яву - это отдельная эпопея, затем прописать репу эластика, сделать apt-get update, apt-get install, прописать в автостарт, установить плагин с русской морфологией, рестартануть эластик.
    А можно один раз напистаь докер файл из двух строчек и потом одной командой "docker run yourlogin/elasticsearch" все это запускать на любой машине.
    Ответ написан
    8 комментариев
  • Для чего нужен Docker?

    @spotifi
    Внутри Docker только Linux, и, экспериментально, FreeBSD. Запускается нативно под Linux и, экспериментально, под FreeBSD. Под MacOSX, Windows - через виртуальную машину.

    Докер - это двойная изоляция. Изоляция того, что лежит внутри контейнера Докера от операционной системы и изоляция операционной системы от того, что лежит внутри Докер. Изоляция подразумевает изоляцию всех файлов, портов, приоритетов.

    Это почти виртуальная машина. Почти, да не совсем.


    Есть такое понятие "ад зависимостей". Любое ПО устанавливаемое на компьютер, тянет за собой зависимости (конфигурационные файлы, статические файлы называемые обычно asset, вспомогательные утилиты/сервисы, библиотеки и пр.). Ряд из этих библиотек/утилит/сервисов несовместим друг с другом. А с учетом того, что каждая из этих библиотек/утилит/сервисов имеет и свои зависимости - ситуация еще хуже.

    Например, мы используем Yandex.Cocaine, которая нормально компилируется только на Ubuntu 14.04 (и, вроде, на Debian 7). Но не под CentOS 6, 7, Debian 8, FreeBSD 9, 10, Ubuntu 15, 16 и пр. - скомпилировать его невозможно. Запускаем в этих операционных системах в Докере.

    С другой стороны, и одновременно с этим, вам необходимо установить другое, более современное ПО. И одновременно более старое. Причем речь даже не идет об серьезно отличающихся версиях Linux. Например, одно ПО требует не менее Ubuntu 14.10, а другое не более Linux 14.04.

    Docker - это одна программа внутри индивидуального окружения с индивидуальной версией операционной системы. За счет слоеных контейнеров, если вы используете один корень для всех образом, то размер Docker контейнера всего-то на несколько килобайтов больше размера бинарного файла, запускаемого под Docker.

    Таким образом, мы имеем бинарный файл запускаемый как бы в своей операционной системе.

    Вы можете сказать - ба, да это же давно известная виртуальная машина. Но нет, это не так. Это так называемые контейнера. Никакой виртуальной машиной там и не пахнет. За исключением Windows и MacOSX, где работа без виртуальном машины пока экспериментально возможно только, а нормой в этих ОС является использование Докера внутри полноценной виртуальной машины.

    Но виртуальные машины с Докером используются только для разработки. Для запуска в production виртуальные машины с Докер не используются.

    Докер использует контейнеры операционной системы. LXC в Linux, Jails в FreeBSD. Контейнер - это область операционной системы, изолированная от основной части операционной системы. В контейнере свое дерево каталогов (включая системные /dev, /bin, /sbin и пр.), свои сетевые порты и пр. и пр.

    Но при этом не используется полная виртуализация. Что существенно экономит ресурсы. Запустить 100 полноценных виртуальных машин вряд ли получится даже на мощном сервере. А вот запустить 100 контейнеров Docker даже на слабом домашнем компьютере - возможно.

    Правда использование не полной виртуализации ограничивает использование операционных систем внутри контейнеров. Как правило, это специально подготовленные версии Linux или FreeBSD. Именно специально подготовленные. Windows - в принципе в контейнере запустить невозможно.

    Контейнеры существовали и до Docker. Докер, строго говоря, это всего лишь очень удобный набор инструментов, собранных воедино, для управления контейнерной виртуализацией. Но очень удобный.

    Зачем это используется?

    Ребята из всяческих Dropbox, Facebook и и пр. гигантах, запускающие по 1 млн. различных программ в своих сервисах, столкнулись, что невозможно везде гарантировать идентичные настройки операционной системы. А это критично.

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

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

    Более того - изначально разработчик программного обеспечения тестирует программу в контейнере Докер, с определенными настроками. И в этом же (или с такими же настройками) контейнере Докера программа уезжает на сервер.

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

    До этого люди мучались, придумывали хитрые инсталяторы...

    Потом плюнули на попытки упорядочить окружение в ОС - и сейчас концепция такова - устанавливать программы на сервера вместе со своими индивидуально настроенными под них операционными системами - то есть внутри контейнеров. 1 контейнер = 1 настройка ОС = 1 программа внутри.

    Другими словами:
    • Докер-контейнер нужно использовать для отладки.
    • Тот же Докер-контейнер нужно использовать и на сервере.


    Это позволяет не трудиться с настройками "под сервер" локально на машине разработчика. Это позволяет разрабатывать на машине разработчика совершенно разные программы одновременно, которые требует несовместимых настроек операционной системы. Это позволяет давать гораздо больше гарантий, что программа на сервере будет вести себя также как и на машине разработчика. Это позволяет разрабатывать под Windows/MacOSX с удобным "прозрачным" тестированием под Linux.

    Докер применим к созданию/настройке только серверного программного обеспечения под Linux (экспериментально под FreeBSD). Не для смартфонов. А если десктопов - то только программное обеспечение без GUI.

    Посколько Докер позволил одним махом упростить работу разработчикам и админам и повысить качество результата - сейчас бум на Докер. Придумано огромная гора инструментов для управления развертыванием приложений созданных с Докером. Если раньше чтобы запустить 10 000 программ на 1000 серверах нужно было как минимум 3 высококвалифицированнейших девопса, которые писали кучу описаний как это сделать на Puppet, Salt, Chef, Ansible, да и то не было гарантий, это все тестилось месяцами. То сейчас с Докер даже один квалифицированных девопс может рулить миллионами программ на десятках тысяч серверов. С куда как большей гарантией, что все это заведется нормально.

    UPD:

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

    Разработчик отдает весь свой результат в систему CI (обычно через git)
    CI на каждый новый коммит делает с помощью Docker образ для тестирования.
    Если тесты проходят успешно, то этот же самый Docker образ, отправляется на развертывание в production.
    Или, чуть иначе в компилируемых системах, где исходники не нужны в production: в Docker производится развертывание среды для компиляции, а для тестирования разворачивается второй образ с уже откомпилированным добром, который уже отправляется в production.

    То есть при правильной огранизации дела разработчик не может/не должен влиять на то, какой будет образ.
    А вот в тестовой среде (запускаемом на сервер, недоступном разработчику в больших командах) и в production как раз используется один и тот же образ.

    Основная идея - что тестировали, ровно то и запускаем на боевом сервере. Один-в-один, включая те же самые файлы (не такие же, а именно те же самые).
    Ответ написан
    18 комментариев
  • Для чего нужен Docker?

    @viiy
    Linux сисадмин \ DevOps
    Представьте что нет никакой ложки докера.

    1) Есть одна физическая машина. Вы устанвливаете софт, разные приложухи, базы, web сервера, заходят тестовые юзеры, что-то запускают. Первая проблема - вы не понимаете кому что надо, кто владелец файлов, приложух, зачем висят демоны и кто за это ответственнен. Как выход, вы решаете это разделить на виртуалки.

    2) У вас есть физическая машина + на ней виртуалки. Вы выделяете под каждую задачу свою виртуалку, там сидят отдельные пользователи, вы навели какой то порядок. Появляется задача - пользователи хотят php 6, а его нет, хотят python3, а его нет, хотят Mongo, а она старой версии. Вы обновляете репозитарии, качаете новые пакеты, ставите, часть пользователей довольны, часть нет - им нужна старая версия какая была. Упс!

    3) Одна физическая машина + еще больше виртуальных машин. Вы разделили всех пользователей так, чтобы никто не дрался за версии софта, если нужен php6 - иди на эту машину, нужен php5 - вот на эту. Все счастливы, но появляются разработчики, которые говорят буквально так - "а у меня на рабочей машине все работает, я перенес все как было на виртуалку, а у меня появляется ошибка missing library libXXX.so.X". И вы понимаете что вам остается только создать полную копию машины разработчика, чтобы софт поехал на этой виртуалке без ошибок... И тут появляется Docker! :)

    4) Docker решает именно эту проблему. Вам не нужно заботится о софте который установлен на сервере/виртуалке. Вы просто берете и переносите софт со всеми "кишками" на другой сервер и он просто работает. Работает за счет того, что все "кишки" это слои файловой системы нанизанные как бисер друг на друга. Дополнительно решается проблема свободного места, т.к слои многократно переиспользуются контейнерами, если вам нужен php + одна библиотека, а другому php + другая библиотека, вы используете (грубо говоря) слой php, а для дополнительной библиотеки делаете отдельный слой, одновременно другой человек делает над php другой слой и вы не деретесь между собой и не видите чужих библиотек. Это грубо и скорее всего ради одной библиотеки никто новый слой не делает, делают слой пожирнее.

    Все запущенные процессы Docker помещает в изолированную среду процессов, файловой системы и сетевого стека. Есть много особенностей по работе с Docker, т.к он предполагает, что в одном контейнере вы запускаете один процесс. Если вам нужно запустить целый набор демоном, тут появляются проблемы, нужно писать шелл-скрипт, который все это поднимет в контейнере. Так же есть особенности по сети, файловой системе. Для кого то Docker спасение и решение всех проблем, но я как сисадмин от этого всего не в восторге.
    Ответ написан
    15 комментариев
  • Какие существуют способы защиты стилей CSS?

    opium
    @opium
    Просто люблю качественно работать
    мне кажется мания величия затмила ваш мозг глупейшими проблемами, вместо того чтобы код красиво оформить и выкладывать на гитхаб и делиться им, вы решили его зачем то прятать, просто задумайтесь, что хорошего вы сделали в жизни и почему не выкладываете его на гитхаб?
    Ответ написан
    11 комментариев
  • Как настроить ntlm авторизацию в bitrix24?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для начала нужно убедиться в следующем:
    1) Пользователь от которого Вы пытаетесь зайти на портал существует в системе.
    2) Стоит галочка "Проверять авторизацию на всех доменах" (часто забывают - а без нее бардак)

    Затем необходмо настроить браузер (причем лучше IE, так как хром подтянет настройки с него):
    1) У кого-то сайт нужно добавить в доверенные, а у кого-то в местные сайты (работает по-разному, слишком тонкая настройка)
    2) Убедитесь что адрес сайта вписан верно (!)

    Для диагностики можете добавить вывод $_SERVER на страницу login чтобы при вводе правильных данных с 8891 (в окошке), Вы могли посмотреть - что отдал браузер (может он логин иначе отдает).
    Ответ написан
    1 комментарий
  • Как в git обновить сабмодуль?

    Dmitry404
    @Dmitry404
    Советую почитать Pro Git progit.org

    Конкретно глава о сабмодулях — progit.org/book/ru/ch5-8.html
    Ответ написан
    Комментировать
  • Как проверить, входит ли текущее время в заданный диапазон?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Алгоритм тут достаточно простой - вам нужно диапазон преобразовать в две даты - начало и конец диапазона.
    А потом просто сравнить текущее время с ними.
    Разбивка диапазона - операция достаточно простая, попробуйте справиться самостоятельно и если что-то не получится, приходите снова с конкретными вопросами.

    Накидал примерное решение из интереса. Рекомендую всё-таки решить задачу самостоятельно и потом сравнить.
    Spoiler alert!
    $periodString = '12:00-02:00';
    $weekDay = 'Friday';
    
    $period = [
    	'start' => new DateTime(),
    	'end' => new DateTime(),
    ];
    
    $day = (int)date('d', strtotime('this '.$weekDay));
    $month = (int)date('m', strtotime('this '.$weekDay));
    $year = (int)date('Y', strtotime('this '.$weekDay));
    
    foreach (array_combine(['start', 'end'], explode('-', $periodString)) as $type => $part)
    {
    	list($hour, $minute) = explode(':', $part);
    	$hour = (int)$hour;
    	$minute = (int)$minute;
    
    	$date = $period[$type];
    
    	$date->setDate($year, $month, $day);
    	$date->setTime($hour, $minute);
    }
    
    if ($period['start'] > $period['end'])
    {
    	$period['end']->add(new DateInterval('P1D'));
    }
    
    $now = new DateTime();
    
    $isInInterval = $now >= $period['start'] && $now <= $period['end'];
    
    var_dump($isInInterval);



    А можно пойти немного дальше:
    Бугага :)
    class Interval
    {
    	private $data;
    	private $timezone;
    	private $start;
    	private $end;
    
    	public function __construct($serialized, $timezoneName = 'UTC')
    	{
    		$this->parse($serialized);
    		$this->timezone = new DateTimeZone($timezoneName);
    		$this->makeStart();
    		$this->makeEnd();
    	}
    
    	public function contains(DateTimeInterface $date)
    	{
    		return $date >= $this->start && $date <= $this->end;
    	}
    
    	public function isNow()
    	{
    		$now = new DateTimeImmutable('now', $this->timezone);
    		return $this->contains($now);
    	}
    
    	private function parse($serialized)
    	{
    		$parts = explode('-', $serialized);
    
    		$this->data = [
    			'start' => $this->parsePart($parts[0]),
    			'end' => $this->parsePart($parts[1]),
    		];
    	}
    
    	private function makeStart()
    	{
    		$this->start = $this->makeDate($this->data['start']['hour'], $this->data['start']['minute']);
    	}
    
    	private function makeEnd()
    	{
    		$this->end = $this->makeDate($this->data['end']['hour'], $this->data['end']['minute']);
    		$this->ensureEndIsAfterStart();
    	}
    
    	private function parsePart($part)
    	{
    		list($hour, $minute) = explode(':', $part);
    
    		return [
    			'hour' => $hour,
    			'minute' => $minute,
    		];
    	}
    
    	private function makeDate($hour, $minute)
    	{
    		list($day, $month, $year) = explode('.', date('d.m.Y'));
    
    		$date = new DateTime('now', $this->timezone);
    
    		$date->setDate($year, $month, $day);
    		$date->setTime($hour, $minute);
    
    		return $date;
    	}
    
    	private function ensureEndIsAfterStart()
    	{
    		if ($this->start > $this->end)
    		{
    			$this->end->add(new DateInterval('P1D'));
    		}
    	}
    }
    
    
    
    // Примеры использования:
    $interval = new Interval('11:59-02:00', 'Europe/Moscow');
    var_dump($interval->isNow());
    
    $date = new DateTime('now', new DateTimeZone('Europe/Moscow'));
    $date->add(new DateInterval('PT8H'));
    var_dump($interval->contains($date));

    Ответ написан
    23 комментария
  • Актуальна ли ниша PHP на Upwork?

    opium
    @opium
    Просто люблю качественно работать
    Что вам мешает просто зайти и посмотреть, там же все открыто
    Ответ написан
    Комментировать
  • Как удалить смерженную ветку?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как видите, ответвление 91d2463, 3e391bf по-прежнему существует. Помогите пожалуйста от него избавиться.

    От него нельзя избавиться не переписывая истории master. Удаление ветки -- это удаление линии истории, которая заканчивается коммитом 91d2463. Но этот коммит уже замёржен в master, удаление ветки на вид master никак не повлияет.

    Я хотел бы избавиться от ответвления: 91d2463, 3e391bf чтобы история выглядела как одна линия.

    Если хочется переписать master и получить линейную историю можно сделать git rebase 3a0067f.
    Ответ написан
    Комментировать
  • Как вывести список подразделов из определенного инфоблока?

    babarun
    @babarun Куратор тега 1С-Битрикс
    Безумный план моих идей в руках больных людей
    Вам нужен компонент catalog.section.list с шаблоном tree
    Ответ написан
    8 комментариев
  • Не выполняются агенты на событиях в битрикс 1С?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для начала:
    1) Выполнялись ли агенты на хитах или на кроне? Может быть кто-то начал перенос агентов на крон и не закончил перенос.
    2) Определены ли константы: BX_CRONTAB_SUPPORT и BX_CRONTAB ? Может быть агенты были на хитах и кто-то определил константы и не перенес на крон. Или наоборот определил константы, без параметров ниже.
    3) Какие значения заданы у agents_use_crontab и check_agents ?
    Ответ написан
    Комментировать
  • Почему github, а не gitlab?

    slimus
    @slimus
    Symfony, Golang
    gitlab появился много позже чем github
    Ответ написан
    Комментировать
  • Как правильно в Ubuntu подключить ssh ключ для GitLab?

    @exenza
    Вам нужно изменить параметр url в .git/config проекта, на тот url, который в гитлабе для ssh, вида git@gitlab.com:username/projectname.git;
    или склонировать проект целиком из репозитория еще раз используя ssh: git clone git@gitlab.com..
    Ответ написан
    Комментировать
  • Как в PHPStorm отключить или указать другой каталог для временных файлов?

    Перенесите папку в нужное вам место. Откройте командную строку и сделайте
    mklink /D Ссылка Назначение где - Ссылка - имя новой символической ссылки.
    Назначение - путь (относительный или абсолютный), на который ссылается новая ссылка.

    mklink /D C:\Users\{UserName}\.WebIde70 {путь к папке, куда перенесли}
    Ответ написан
    Комментировать
  • Как в PHPStorm отключить или указать другой каталог для временных файлов?

    MegaDiablo
    @MegaDiablo
    Сам ни разу не пробовал(не было необходимости), но вы можете изменить
    idea.config.path, которая находится в PHPStorm_HOME\bin\idea.properties. Это должно помочь переместить всю папку с пользовательскими настройками в другое место.

    Источник
    Ответ написан
    1 комментарий