Arhn - архитектура программирования

Как найти неиспользуемые группы безопасности Amazon EC2

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

Будет работать либо через консоль, либо с помощью инструментов командной строки (запуск инструментов командной строки на компьютерах с Linux и OSX).


  • My Kingdom за ответ, который полностью отвечает на этот вопрос, без исключений для долгоживущих объектов, не являющихся экземплярами (RDS, ELB, ALB), которым могут быть назначены SG, и не требует «выбрать все, а затем удалить» страшные выходные - подход эсминца. :) 22.06.2018

Ответы:


1

Примечание. Здесь рассматривается использование безопасности только в EC2, а не в других службах, таких как RDS. Вам потребуется проделать дополнительную работу, чтобы включить группы безопасности, используемые за пределами EC2. Хорошо, что вы не можете легко (возможно, даже невозможно) удалить активные группы безопасности, если вы пропустите одну связанную с другой службой.

Используя более новый инструмент AWS CLI, я нашел простой способ получить то, что мне нужно:

Сначала получите список всех групп безопасности

aws ec2 describe-security-groups --query 'SecurityGroups[*].GroupId'  --output text | tr '\t' '\n'

Затем привяжите все группы безопасности к экземпляру, затем перенаправьте их к sort, а затем к uniq:

aws ec2 describe-instances --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' --output text | tr '\t' '\n' | sort | uniq

Затем соберите его вместе и сравните 2 списка и посмотрите, что не используется из основного списка:

comm -23  <(aws ec2 describe-security-groups --query 'SecurityGroups[*].GroupId'  --output text | tr '\t' '\n'| sort) <(aws ec2 describe-instances --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' --output text | tr '\t' '\n' | sort | uniq)
11.07.2014
  • @Erik Да, у меня есть только один регион, а в сценариях AWS их домашний регион задается с помощью переменных среды. Мне было бы интересно увидеть мультирегиональную версию этого скрипта. 16.04.2015
  • вы можете добавить --filter для вашего vpc, чтобы вам не приходилось видеть другие по умолчанию vpc sg 30.06.2016
  • Чтобы уточнить примечание, опубликованное выше, например, если группа безопасности VPC назначена экземпляру RDS, который находится в VPC, он будет считаться неиспользуемой группой безопасности. Будьте осторожны с этим. 20.12.2016
  • Группа безопасности также может использоваться ELB. Эта команда выведет список уникальных идентификаторов групп безопасности, на которые ссылаются ELB в регионе по умолчанию: aws elb describe-load-balancers --query 'LoadBalancerDescriptions[*].SecurityGroups[*]' --output text | tr '\t' '\n' | sort | uniq 23.12.2016
  • Следует добавить --no-paginate к вышесказанному. 23.12.2016
  • Группа безопасности EC2 также может использоваться экземпляром RDS. Эта команда выведет список идентификаторов групп безопасности, используемых экземплярами RDS в регионе по умолчанию: aws rds describe-db-security-groups --query 'DBSecurityGroups[*].EC2SecurityGroups[*].EC2SecurityGroupId' --output text | tr '\t' '\n' | sort | uniq 30.03.2017
  • Вы также можете использовать aws ec2 describe-network-interfaces --query 'NetworkInterfaces[*].Groups[*].GroupId' --output text| tr '\t' '\n' | sort | uniq просто для описания сетевых интерфейсов. 17.11.2017
  • Мнение @Jonathan об описании сетевых интерфейсов важно, если вы используете Lambda в VPC. В этом случае Lambda выделит ENI, который не будет отображаться ни в одном из других списков, приведенных здесь. Конечно, они недолговечны, и если Lambda имеет низкий трафик, при просмотре может не быть ни одного, что может привести к ложному срабатыванию в вашем списке неиспользуемых SG. (т. е. в данный момент он не используется, но все еще необходим для будущих вызовов Lambda). 05.05.2018
  • Хороший ответ. Совет по запросу: поместите последний элемент в скобки, и вы получите одно значение в строке при использовании текстового вывода, что устраняет необходимость в команде tr. Например, --query 'SecurityGroups[].[GroupId]' vs '--query 'SecurityGroups[].GroupId'` 09.07.2018
  • Я не смог это проверить, но эта команда должна перечислить идентификаторы групп безопасности, используемые функциями Lambda в регионе по умолчанию: aws lambda list-functions --query 'Functions[*].VpcConfig[*].SecurityGroupIds[*]' --output text | tr '\t' '\n' | sort | uniq 02.07.2020

  • 2

    Если вы выберете все свои группы безопасности в консоли EC2, а затем нажмете действия -> Удалить группы безопасности, появится всплывающее окно с сообщением о том, что вы не можете удалить группы безопасности, прикрепленные к экземплярам, ​​другим группам безопасности или сетевым интерфейсам, и это перечислит группы безопасности, которые вы можете удалить; т.е. неиспользуемые группы безопасности :)

    21.09.2015
  • Хотя я должен согласиться, использование select all + delete обычно не очень хорошая привычка. 20.04.2016
  • Если вы не уверены, будет ли это работать, вы можете просто создать фиктивную группу безопасности и прикрепить к ней что-нибудь, попробовать удалить ее и увидеть, что она вам не позволит. 07.02.2017
  • Вам не нужно на самом деле подтверждать удаление, во всплывающем окне он покажет вам разбивку того, какие из них могут быть удалены (бесхозные), а какие нет. Затем вы можете нажать «Отмена», а затем удалить потерянные. 21.06.2018
  • Чего я не понимаю, так это того, что если консоль AWS может предоставить эту информацию, когда вы выполняете этот scary.maneuver, почему они не делятся тем, как сделать то же самое через API? Не похоже, что это не то, что, вероятно, необходимо в условиях заброшенного поля ... 04.11.2018
  • будь смелым :: сделай это 22.11.2018
  • Я еще не убедил себя, что этот подход, основанный на попытке просто удалить группы безопасности, сработает, если SG связана с Lambda, которая активно не работает. Например, если у вас есть лямбда cron, которая запускается 1 минуту каждый час, и вы пытаетесь удалить группу безопасности в одну из других 59 минут этого часа, это сработает? Если это сработает, то при следующем пробуждении Лямбда должна вырубиться, верно? 24.04.2020
  • @ThomasVaughan, вы тестировали его с фиктивной лямбдой? 24.04.2020

  • 3

    Это пример кода, написанный в boto (Python SDK для AWS), чтобы перечислить группу безопасности по количеству экземпляров, с которыми она связана.

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

    Код Бото

    import boto
    ec2 = boto.connect_ec2()
    sgs = ec2.get_all_security_groups()
    for sg in sgs:
        print sg.name, len(sg.instances())
    

    Вывод

    Security-Group-1 0
    Security-Group-2 1
    Security-Group-3 0
    Security-Group-4 3
    
    11.07.2014
  • Легко и приятно! Спасибо 20.10.2015
  • ну да, а что насчет эльбов? 17.05.2016
  • Также обратите внимание, что сюда входят только запущенные экземпляры. Вы также не можете удалить SG, связанную с остановленным экземпляром. 14.07.2016
  • При этом игнорируются интерфейсы таких служб, как RDS. RDS владеет экземпляром, но вы владеете ENI. Я думаю, что ElasticSearch и ELB работают одинаково и не будут отображаться с этим скриптом. 14.11.2017
  • Что делать, если группа безопасности используется какой-либо службой ecs? 11.03.2021

  • 4

    Примерно через год использования без аудита я счел необходимым провести аудит своих групп безопасности AWS EC2 и очистить устаревшие, неиспользуемые группы.

    Это была сложная задача для выполнения через веб-интерфейс, поэтому я обратился к интерфейсу командной строки AWS, чтобы упростить задачу. Я нашел начало того, как это сделать, на StackOverflow, но оно было далеко не полным. Поэтому я решил написать свой собственный сценарий. Я использовал интерфейс командной строки AWS, MySQL и немного «Bash-foo», чтобы выполнить следующее:

    1. Получите список всех групп безопасности EC2. Я храню идентификатор группы, имя группы и описание в таблице под названием «группы» в базе данных MySQL с именем aws_security_groups на локальном хосте. Общее количество найденных групп сообщается пользователю.

    2. Получите список всех групп безопасности, связанных с каждым из следующих сервисов, и исключите их из таблицы: EC2 Istances EC2 Elastic Load Balancers AWS RDS Instances AWS OpsWorks (не следует удалять для Amazon) Группы безопасности по умолчанию (нельзя удалить ) ЭластиКэш

    Для каждой службы я сообщаю количество групп, оставшихся в таблице после завершения исключения.

    1. Наконец, я показываю идентификатор группы, имя группы и описание оставшихся групп. Это «неиспользуемые» группы, которые необходимо проверить и/или удалить. Я обнаружил, что SG между инстансами и балансировщиками эластичной нагрузки (ELB) часто ссылаются друг на друга. Перед удалением перекрестных ссылок и удалением групп безопасности рекомендуется провести ручное расследование, чтобы убедиться, что они действительно не используются. Но мой скрипт, по крайней мере, сводит это к чему-то более управляемому.

    ПРИМЕЧАНИЯ: 1. Вам нужно создать файл для хранения хоста MySQL, имени пользователя и пароля и указать на него переменную $DBCONFIG. Он должен быть структурирован следующим образом:

    [mysql]
    host=your-mysql-server-host.com
    user=your-mysql-user
    password=your-mysql-user-password
    
    1. Вы можете изменить имя базы данных, если хотите — обязательно измените переменную $DB в скрипте.

    Дайте мне знать, если вы найдете это полезным или у вас есть какие-либо комментарии, исправления или улучшения.

    Вот сценарий.

    #!/bin/bash
    # Initialize Variables
    DBCONFIG="--defaults-file=mysql-defaults.cnf"
    DB="aws_security_groups"
    SGLOOP=0
    EC2LOOP=0
    ELBLOOP=0
    RDSLOOP=0
    DEFAULTLOOP=0
    OPSLOOP=0
    CACHELOOP=0
    DEL_GROUP=""
    
    # Function to report back # of rows
    function Rows {
        ROWS=`echo "select count(*) from groups" | mysql $DBCONFIG --skip-column-names $DB`
    #   echo -e "Excluding $1 Security Groups.\nGroups Left to audit: "$ROWS
        echo -e $ROWS" groups left after Excluding $1 Security Groups."
    }
    
    
    # Empty the table
    echo -e "delete from groups where groupid is not null" | mysql $DBCONFIG $DB
    
    # Get all Security Groups
    aws ec2 describe-security-groups --query "SecurityGroups[*].[GroupId,GroupName,Description]" --output text > /tmp/security_group_audit.txt
    while IFS=$'\t' read -r -a myArray
    do
        if [ $SGLOOP -eq 0 ];
        then
            VALUES="(\""${myArray[0]}"\",\""${myArray[1]}"\",\""${myArray[2]}"\")"
        else
            VALUES=$VALUES",(\""${myArray[0]}"\",\""${myArray[1]}"\",\""${myArray[2]}"\")"
        fi
        let SGLOOP="$SGLOOP + 1"
    done < /tmp/security_group_audit.txt
    echo -e "insert into groups (groupid, groupname, description) values $VALUES" | mysql $DBCONFIG $DB
    echo -e $SGLOOP" security groups total."
    
    
    # Exclude Security Groups assigned to Instances
    for groupId in `aws ec2 describe-instances --output json | jq -r ".Reservations[].Instances[].SecurityGroups[].GroupId" | sort | uniq`
    do
        if [ $EC2LOOP -eq 0 ];
        then
            DEL_GROUP="'$groupId'"
        else
            DEL_GROUP=$DEL_GROUP",'$groupId'"
        fi
        let EC2LOOP="$EC2LOOP + 1"
    done
    echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
    Rows "EC2 Instance"
    DEL_GROUP=""
    
    
    # Exclude groups assigned to Elastic Load Balancers
    for elbGroupId in `aws elb describe-load-balancers --output json | jq -c -r ".LoadBalancerDescriptions[].SecurityGroups" | tr -d "\"[]\"" | sort | uniq`
    do
        if [ $ELBLOOP -eq 0 ];
        then
            DEL_GROUP="'$elbGroupId'"
        else
            DEL_GROUP=$DEL_GROUP",'$elbGroupId'"
        fi
        let ELBLOOP="$ELBLOOP + 1"
    done
        echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
    Rows "Elastic Load Balancer"
    DEL_GROUP=""
    
    
    # Exclude groups assigned to RDS
    for RdsGroupId in `aws rds describe-db-instances --output json | jq -c -r ".DBInstances[].VpcSecurityGroups[].VpcSecurityGroupId" | sort | uniq`
    do
        if [ $RDSLOOP -eq 0 ];
        then
            DEL_GROUP="'$RdsGroupId'"
        else
            DEL_GROUP=$DEL_GROUP",'$RdsGroupId'"
        fi
        let RDSLOOP="$RDSLOOP + 1"
    done
        echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
    Rows "RDS Instances"
    DEL_GROUP=""
    
    # Exclude groups assigned to OpsWorks
    for OpsGroupId in `echo -e "select groupid from groups where groupname like \"AWS-OpsWorks%\"" | mysql $DBCONFIG $DB`
    do
        if [ $OPSLOOP -eq 0 ];
        then
            DEL_GROUP="'$OpsGroupId'"
        else
            DEL_GROUP=$DEL_GROUP",'$OpsGroupId'"
        fi
        let OPSLOOP="$OPSLOOP + 1"
    done
    echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
    Rows "OpsWorks"
    DEL_GROUP=""
    
    # Exclude default groups (can't be deleted)
    for DefaultGroupId in `echo -e "select groupid from groups where groupname like \"default%\"" | mysql $DBCONFIG $DB`
    do
        if [ $DEFAULTLOOP -eq 0 ];
        then
            DEL_GROUP="'$DefaultGroupId'"
        else
            DEL_GROUP=$DEL_GROUP",'$DefaultGroupId'"
        fi
        let DEFAULTLOOP="$DEFAULTLOOP + 1"
    done
    echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
    Rows "Default"
    DEL_GROUP=""
    
    # Exclude Elasticache groups
    for CacheGroupId in `aws elasticache describe-cache-clusters --output json | jq -r ".CacheClusters[].SecurityGroups[].SecurityGroupId" | sort | uniq`
    do
        if [ $CACHELOOP -eq 0 ];
        then
            DEL_GROUP="'$CacheGroupId'"
        else
            DEL_GROUP=$DEL_GROUP",'$CacheGroupId'"
        fi
        let CACHELOOP="$CACHELOOP + 1"
    done
    echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
    Rows "ElastiCache"
    
    # Display Security Groups left to audit / delete
    echo "select * from groups order by groupid" | mysql $DBCONFIG $DB | sed 's/groupid\t/groupid\t\t/'
    

    И вот sql для создания базы данных.

    -- MySQL dump 10.13  Distrib 5.5.41, for debian-linux-gnu (x86_64)
    --
    -- Host:  localhost   Database: aws_security_groups
    -- ------------------------------------------------------
    -- Server version   5.5.40-log
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
    /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
    /*!40103 SET TIME_ZONE='+00:00' */;
    /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
    /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
    
    --
    -- Table structure for table `groups`
    --
    
    DROP TABLE IF EXISTS `groups`;
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    /*!40101 SET character_set_client = utf8 */;
    CREATE TABLE `groups` (
      `groupid` varchar(12) DEFAULT NULL,
      `groupname` varchar(200) DEFAULT NULL,
      `description` varchar(200) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    /*!40101 SET character_set_client = @saved_cs_client */;
    
    --
    -- Dumping data for table `groups`
    --
    
    LOCK TABLES `groups` WRITE;
    /*!40000 ALTER TABLE `groups` DISABLE KEYS */;
    /*!40000 ALTER TABLE `groups` ENABLE KEYS */;
    UNLOCK TABLES;
    /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
    
    /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
    /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
    /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
    
    -- Dump completed on 2015-01-27 16:07:44
    
    28.01.2015

    5

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

    Он также показывает, как указать, какой регион вас интересует.

    import boto
    import boto.ec2
    EC2_REGION='ap-southeast-2'
    ec2region = boto.ec2.get_region(EC2_REGION)
    ec2 = boto.connect_ec2(region=ec2region)
    sgs = ec2.get_all_security_groups()
    for sg in sgs:
        if len(sg.instances()) == 0:
            print ("{0}\t{1}".format(sg.id, sg.name))
    

    Чтобы подтвердить, какие группы безопасности используются, вы должны отменить или удалить тест if len(sg.instances()) == 0 и распечатать значение len(sg.instances()).

    E.g.

    print ("{0}\t{1}\t{2} instances".format(sg.id, sg.name, len(sg.instances())))
    
    13.02.2015

    6

    Используя node.js AWS SDK, я могу подтвердить, что AWS не позволяет вам удалять используемые группы безопасности. Я написал скрипт, который просто пытается удалить все группы и изящно обрабатывает ошибки. Это работает как для классического, так и для современного VPC. Сообщение об ошибке можно увидеть ниже.

    Err { [DependencyViolation: resource sg-12345678 has a dependent object]
      message: 'resource sg-12345678 has a dependent object',
      code: 'DependencyViolation',
      time: Mon Dec 07 2015 12:12:43 GMT-0500 (EST),
      statusCode: 400,
      retryable: false,
      retryDelay: 30 }
    
    07.12.2015

    7

    Среди прочих функций, как ScoutSuite, так и Prowler сообщает о неиспользуемых группах безопасности EC2. Оба с открытым исходным кодом.

    26.03.2019

    8

    К SG, подключенным к сетевым интерфейсам:

    По имени:

    aws ec2 describe-network-interfaces --output text --query NetworkInterfaces[*].Groups[*].GroupName | tr -d '\r' | tr "\t" "\n" | sort | uniq
    

    By id:

    aws ec2 describe-network-interfaces --output text --query NetworkInterfaces[*].Groups[*].GroupId | tr -d '\r' | tr "\t" "\n" | sort | uniq
    
    03.06.2019

    9

    На рынке AWS есть инструмент, который значительно упрощает эту задачу. Он показывает, какие группы присоединены/отсоединены для легкого удаления, а также сравнивает ваши журналы потоков VPC с правилами группы безопасности и показывает, какие правила SG используются или не используются. AWS опубликовал для этого решение стека ELK, но оно было смехотворно сложным.

    Вот инструмент и отказ от ответственности, что я работал над ним. Но я надеюсь, что вы все сочтете это уместным: https://www.piasoftware.net/single-post/2018/04/24/VIDEO-Watch-as-we-clean-up-EC2-security-группывсегозанесколькоминут

    25.04.2018

    10

    К сожалению, выбранный ответ не так точен, как мне нужно (я пытался выяснить, почему, но предпочел реализовать его).
    Если я проверю ВСЕ NetworkInterfaces, ищу вложения к любому SecurityGroup, это меня доставит. частичные результаты. Если я проверю только EC2Instances, я также получу частичные результаты.

    Итак, мой подход к проблеме:

    1. Я получаю ВСЕ группы безопасности EC2 -> all_secgrp
    2. Я получаю ВСЕ экземпляры EC2 -> all_instances
    3. For each Instance, I get all SecurityGroups attached to it
      1. I remove from all_secgrp each of these SecurityGroup (because attached)
    4. For each SecurityGroup, I check an association with any NetworkInterfaces (using the filter function and filtering using that security-group-id)
      1. IF no association is found, I remove the security-group from all_secgrp

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

    all_secgrp = list(ec2_connector.security_groups.all())
    all_instances = ec2_connector.instances.all()
    
    for single_instance in all_instances:
        instance_secgrp = ec2_connector.Instance(single_instance.id).security_groups
        for single_sec_grp in instance_secgrp:
            if ec2.SecurityGroup(id=single_sec_grp['GroupId']) in all_secgrp:
                all_secgrp.remove(ec2.SecurityGroup(id=single_sec_grp['GroupId']))
    
    all_secgrp_detached_tmp = all_secgrp[:]
    for single_secgrp in all_secgrp_detached_tmp:
        try:
            print(single_secgrp.id)
            if len(list(ec2_connector.network_interfaces.filter(Filters=[{'Name': 'group-id', 'Values': [single_secgrp.id]}]))) > 0:
                all_secgrp.remove(single_secgrp)
        except Exception:
            all_secgrp.remove(single_secgrp)
    
    return all_secgrp_detached  
    
    21.05.2018

    11

    Это сложная проблема, если у вас есть группы безопасности, которые ссылаются на другие группы безопасности в правилах. Если это так, вам придется разрешить DependencyErrors, что не является тривиальным.

    Если вы используете только IP-адреса, это решение будет работать после создания клиента boto3:

    # pull all security groups from all vpcs in the given profile and region and save as a set
    all_sgs = {sg['GroupId'] for sg in client.describe_security_groups()['SecurityGroups']}
    
    # create a new set for all of the security groups that are currently in use
    in_use = set()
    
    # cycle through the ENIs and add all found security groups to the in_use set
    for eni in client.describe_network_interfaces()['NetworkInterfaces']:
        for group in eni['Groups']:
            in_use.add(group['GroupId'])
    
    unused_security_groups = all_sgs - in_use
    
    for security_group in unused_security_groups:
        try:
            response = client.delete_security_group(GroupId=security_group)
        except ClientError as e:
            if e.response['Error']['Code'] == 'DependencyViolation':
                print('EC2/Security Group Dependencies Exist')
        else:
            print('Unexpected error: {}'.format(e))
    
    19.10.2018
  • Это не распространяется на SG, используемые RDS. 10.02.2019
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..