Сегодня 17 ноября 2024
18+
MWC 2018 2018 Computex IFA 2018
реклама
Программное обеспечение

Linux Navigator

⇣ Содержание

"Барышня, дайте срочно Смольный!"

Для начала настроим простую рабочую станцию. Имеется локальная сеть Ethernet с протоколом TCP/IP. Первоначально требуется скомпилировать ядро с соответствующими драйверами. Первоначально требуется поставить в соответствии IP?адресу имя компьютера (если у вашего компьютера оно есть), для в файле /etc/hosts требуется добавить строку
#IP		полное имя			псевдоним
127.0.0.1	localhost.localdomain	 	localhost
195.14.21.11	blade.hell.com			blade

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

ifconfig  [[-net -host] 
[parameters]]

Интерфейсы для Ethernet устройств называются как eth0, eth1, и т.д. Адрес сопоставляемый интерфейсу берется либо из файла /etc/hosts (ключ -host) или из /etc/network (ключ -network). Файл /etc/network является аналогом файла /etc/hosts и предназначен для сопоставления адреса и имени для сегмента сети. parameters может принимать следующие значения


upВключение интерфейса (ставится по умолчанию).
downВыключение, обратно параметру up.
netmask Присваивает маску подсети, по умолчанию ставится равной классу подсети, в данном случае 255.255.255.0.
pointopoint
Используется только для интерфейсов "точка-точка", например PLIP или SLIP.
broadcast
Для установки широковещательного адреса, отличного от стандартного.
metric
Предназначен для установлении ненулевой метрики, имеет смысл ставить только для роутера.
mtu Максимальная единица передачи данных. Для Ethernet по умолчанию равна 1500, хотя при плохой или загруженной линии ее можно уменьшить.
arpВключает ARP (Address Resolution Protocol) для обратного сопоставления имени по IP, обычно не нужен.
-arpВыключает ARP.
promiscРежим захвата ВСЕХ пакетов, мечта всякого хакера.
-promiscВыключает режим захвата.

После этого следует добавить маршрут в таблицу маршрутизации, для этого предназначена команда route. Ее синтаксис имеет вид

route [add del] [-net -host]  [parameters]

Параметр обозначает сеть (при ключе -net) и может браться из файла /etc/network. Если настраивать маршрутизацию на отдельный компьютер, то следует использовать ключ -host. А parameters может принимать значения аналогичные параметрам ifconfig, с дополнением параметра gw (gateway).

Следующим этапом настройки, является установка шлюза. Шлюз предназначен для соединения различных сетей. Если в вашей сети этим компьютером является компьютер с именем shield и адресом 195.14.21.13, то следует добавить в список hosts его характеристики, а затем использовать команду route с параметром gw. Например

route add -net 199.221.14.0 gw shield

После всего написанного стало простым настроить шлюз, для этого нужно только настроить два интерфейса по отдельности и присвоить им уникальные IP-адреса. Полезно так же добавить оба в /etc/hosts.

Если вы все это настроили один раз, то после перезагрузки все настройки потеряются. Для это чтобы избежать этого следует включать команды ifconfig и route в сценарий загрузки сети rc.inet1 точно также как вы только что их набирали. Однако способ, когда в каждом компьютере приходится создавать один и тот же файл, не является изящным. Более удобные средства предоставляют демон gated (это аналог демона Максвелла) и метод proxy ARP (Address Resolution Protocol). Демон gated занимается тем, что динамически создает таблицу маршрутов в системе. Он необходим для больших сетей и работы с линиями "точка-точка", которые меняются динамически.

Самым мощным по сей день средством обеспечения безопасности служит так называемый firewall. Это компьютер или просто программа, которая закрывает доступ к сетевым службам и протоколам тем кому не положено. Для этого имеется минимум 2 управляющих файла: /etc/hosts.deny и /etc/hosts.allow. Структура этих файлов очень проста, в каждом только 2 столбца: сервис и хост (если вы умеете программировать консоль, то можно добавить третий столбец, но ТОЛЬКО ЕСЛИ УМЕЕТЕ). Для любого компьютера, который не служит сервером в Интернете, файл /etc/hosts.deny имеет очень простой вид

ALL:ALL

После этого можно добавить нужные адреса в файл /etc/hosts.allow.
Для проверки служит команда netstat. Она имеет следующие ключи


-rтаблица маршрутизации ядра
-nпри отображении заменяются имена IP-адресами
-iстатистические данные используемых интерфейсов
-aполные данные всех известных интерфейсов, включая ненастроенные
-t, -u, -w, -xактивные сокеты TCP, UDP, RAW или UNIX

Так же для проверки служат команды ping и traceroute. Они посылают пакеты на компьютер указанный вами в значении параметров, а затем отображают статистику.

Однако простой установкой сокета мало кто ограничивается. Нужно еще настроить сетевых демонов. Для помощи в продвижении демонологии служит файл /etc/inetd.conf, это управляющий файл суперсервера демонов Интернета. С точки зрения демонологии словом "Интернет" называют самое большое из известных скопление демонов, как диких, так и домашних. Все записи в этом файле имеют вид


#servicetypeprotocolwaituserservercmdline
#Внеш
loginstreamtcpnowaitroot/usr/sbin/rloginin.rlogin
telnetstreamtcpnowaitroot/usr/sbin/telnetdin.telnetd
ftpstreamtcpnowaitroot/usr/sbin/ftpdin.ftpd
#tftpdgramudpwaitnobody/usr/sbin/tftpdin.tfpd
#И т.д.
#Внут
daytimestreamtcpnowaitrootinternal
timestreamtcpnowaitrootinternal #И т.п.

Теперь пояснения.


serviceНазвание службы, все названия содержатся в файле /etc/services
typeТип сокета, однозначно связан с протоколом, stream для tcp, dgram для udp (User Datagram Protocol, для некоторых служб гораздо удобнее TCP).
protocolsНазвание протокола, требуется установленный драйвер в ядре и запись в файле /etc/protocols
waitРежим приема-передачи. Обычно ставится nowait для дуплексного режима приема-передачи дейтаграмм, но для некоторых сервисов требуется wait. Для сокетов типа stream следует всегда указывать nowait.
userПод этим именем будет запущен соответствующий сервис. Не следует запускать сетевую службу под более высокой, чем требуемая, привилегией. Например, службу tftp ВСЕГДА следует запускать как nobody.
serverПолное имя программы. Если сервис внутренний, то следует указать intelrnal. Внутренние сервисы служат для взаимодействия программ внутри компьютера. Кроме того, ОЧЕНЬ ПОЛЕЗНО для всех сервисов на протоколе TCP/IP использовать единый демон /usr/sbin/tcpd. Это несколько увеличит нагрузку на процессор, но значительно улучшит безопасность. (в примере не так)
cmdlineКомандная строка запуска, обычно просто ссылка на файл с этой строкой. Для внутренних сервисов строка не требуется.

Файл этот достаточно большой, и я не написал и четверти его строк. Но если вы откроете его, то увидите, что большинство строк закомментированы. Это связано с соображениями безопасности. Ни для кого (кроме разработчиков очередного "безопасного" продукта из Micro$oft) не секрет, что есть сетевые сервисы, которые содержат дыры и есть сервисы, которые даже без дыр не способны хоть что-то засекретить. Среди программистов и root'ов существует поверье, что известных дыр не содержит только самая последняя версия сервиса. Однако бывает что это не верно. Например, я специально привел строку с сервисом tftp (Trivial FTP), он предназначен для загрузки бездисковых рабочих станций, а на деле являет собой незатыкаемую дыру. Обычно, для того чтобы он корректно и относительно безопасно работал, сеть, в которой он устанавливается, делают полностью закрытой от внешнего мира файерволом. На самом загрузочном компьютере создают специальный дисковый раздел, в который только tftp и сможет адресоваться. Затем присваивают ему категорию nobody, а номера ethernet карточек фиксируют. Также опасным является сервис finger, поскольку он предоставляет информацию о работе компьютера всему миру. Нешифрованные авторизуемые службы ftp и telnet это вообще целая песнь хакера, их не ловит только ленивый.

Работа сетевого демона несколько отличается от работы обычного демона. Обычный домашний демон большую часть своей жизни спит и просыпается только для совершения необходимой работы при получении сигнала от ядра. Демон же сетевой спит редко и мониторит подотчетный ему сетевой интерфейс. При поступлении на этот интерфейс требования о соединении, демон немедленно раздваивается. Одна его локальная копия продолжает мониторить интерфейс, а другая обрабатывает соединение. После закрытия соединения локальная копия уничтожается. Исходя из этого следует строить политику запуска сетевых демонов. Службы, запуск которых обрабатывается редко, следует поручить демону tcpd, а специфическим демонам - часто используемые службы. Например, служба telnet даже в самом активно посещаемом MUD'е запускается не чаще одного - двух раз в минуту, а служба http на www-сервере средней нагрузке обрабатывает несколько десятков, а то и сотен, запросов в минуту.

Записывать все известные компьютеры в файл /etc/hosts занятие неблагодарное, а потому его полезно перепоручить компьютеру. Обычно этим занимается демон named. На самом деле это не самостоятельный демон, а часть большой библиотеки, называемой библиотекой резолвера. Задачей этой библиотеки является выполнение двух функций языка C - gethostbyname() и getnamebyhost(). Очень полезно иметь этого демона не только на сервере имен всей сети, но и на каждом компьютере, поскольку локальный демон named позволяет кешировать работу общего и разгружает сеть. Местный резолвер управляется несколькими файла, самый простой и самый важный из них - /etc/host.conf. Число его параметров очень ограничено


orderПорядок опроса служб разрешения имен. Может иметь только 3 значения bind (запросить сервер DNS), hosts (искать в файле /etc/hosts) и nis (поиск в базе NIS). Может принимать все три значения одновременно.
multiИмеет значения on или off. Если стоит on, то хосты из списка /etc/hosts могут иметь несколько IP-адресов.
nospoofТоже имеет два значения on и off, позволяет бороться с подложными именами хостов.
alertУпотребляется после включения антиспуфинга в предыдущем пункте.
trimНеобязательный параметр, значение которого имя домена. Полезен, если хост является членом нескольких доменов.

Для того чтобы использовать удаленный сервер имен DNS (параметр order имеет значение bind), необходимо указать, где этот сервер находится. Для этого служит файл /etc/resolv.conf, в котором только 2 параметра domain и nameserver. Значением domain является домен, в котором работает хост. А значением nameserver является IP-адрес сервера имен. Можно указывать не более трех серверов имен, причем порядок их просмотра определяется их положением в списке. Если этот файл отсутствует, то предполагается что сервер имен работает локально.

Локальный демон named управляется несколько нестандартным файлом /etc/named.boot (в нем коментарии обозначаются ;). Для примера

;/etc/named.boot для blade.hell.net
directory	/tmp/named
;порядок	домен				файл
cache		.				named.ca
primary	hell.net.			named.hosts
primary	0.0.127.in-addr.arpa.		named.local
primary	14.195.in-addr.arpa.		named.rev
;и т.д.

Перед описанием параметров обратите внимание как здесь пишутся имена, задом наперед, вместо неизвестной части ставится .in-addr.arpa., причем ОБЯЗАТЕЛЬНО заканчивается на точку. В этом файле ВСЕГДА должна присутствовать строка о loopback интерфейсе 127.0.0.1, как о primary, иначе многие ваши внутренние программы полезут наружу и никогда не вернутся. Теперь остальные параметры


directoryОпределяет каталог в который будут складываться данные, можно указать несколько.
primaryИнформация о зоне этого домена загружается из указанного файла.
secondaryПараметров всегда три, имя домена, имя файла и имя первичного (primary) сервера. Сначала просматривается файл, затем идет обращение к первичному серверу. После получения информации, она заносится в указанный файл. Первичных серверов можно указать несколько, порядок их опроса определяется порядком записи.
cacheОбязательно должен присутствовать, в качестве параметров идут имя домена и имя файла. Причем в качестве одного из доменов всегда должна быть указана точка (.).
forwardersСписок серверов, к которым можно перенаправить запрос.
slaveЕсли указан этот параметр, то named только перенаправляет запросы.

Получить информацию с другого компьютера в сети можно только с помощью обычных сетевых протоколов. Для этого служит еще и RPC (Remote Procedure Call). Основных применения для RPC два - это NIS (Network Information Service) и NFS (Network File System). Есть еще два побочных, понятно последствия творчества Microsoft, IIS (Internet Information Service) и SMB (сервер NetBIOS для сетей UNIX). NIS (и IIS) служит для получения информации по сети, например, с его помощью можно организовать общие пароли для всех компьютеров в локальной сети. А NFS (и SMB) служит для получения доступа к удаленным каталогам, как к локальным. Локальная сеть, организованная на NIS и NFS, очень легка для администрирования и работы, пользователь даже не должен знать, где расположен компьютер с его личным каталогом, а где с необходимой программой, он просто садится за ближайший. К сожалению, та версия NIS, с которой имел дело я, была сильно устаревшей, не обеспечивала режима теневых паролей, шифрованных соединений и надежной авторизации. Потому я напишу только об NFS.

Для того чтобы можно было начинать работу с томами (здесь это слово аналогично "удаленная файловая система") NFS, следует запустить демона NFS и установить поддержку NFS в ядре. Демоны NFS запускаются не через суперсервер демонов Интернета, а самостоятельно, через сценарий загрузки. Для этого в файле /etc/rc.d/rc.inet2 должна быть запись

if [ -x /usr/sbin/rpc.mountd ]; then
	/usr/sbin/rpc.mountd; echo -n " mountd"
fi
if [ -x /usr/sbin/rpc.nfs ]; then
	/usr/sbin/rpc.nfsd; echo -n " nfsd"
fi
if[ -x /usr/sbin/rpc.ugidd ]; then
	/usr/sbin/rpc.mountd; echo -n " ugidd"
fi

Первый блок запускает монтировщика (он обычно включен по умолчанию), второй - NFS (он обычно закомментирован), третий - демона имен и групп ugidd.

Для управления подключением клиентов, на сервере создается управляющий файл /etc/exports. Только прописанные в этом файле клиенты имеют доступ к тому NFS на сервере. Обычно он имеет следующий вид

#/etc/exports на сервере blade
/home/users	bow(rw, kerberos), arrow(rw, kerberos), riposte(rw, kerberos)
/usr/games	bow(ro), arrow(ro), riposte(ro), blaze(ro)

Структура этого файла понятна (не путать с понятием "интуитивно понятно"), первый столбец - каталог на сервере, второй - список клиентов с параметрами. В названиях можно употреблять символы * и ? если строка клиентов пуста, то доступ открыт всем. Параметры могут иметь следующие значения


rwДоступ для чтения и записи.
roДоступ только для чтения. По умолчанию установлен.
kerberosТребования авторизации протоколом kerberos.
insecureНе требуется авторизации.
rpc-secureИспользование стандарта закрытого RPC.
root_squashОтменяет права root'а, очень полезный флажок.
no_root_squashОбратный к предыдущему. Обратите внимание, что на большинстве систем стоит по умолчанию, представляя собой колоссальную дыру в безопасности.
unix-rpcТребование авторизации в рамках домена.
map_identifyЭтот режим оставляет без изменения цифровые gid и uid. Обычно включен по умолчанию.
map_deamonОбратный к предыдущему. Позволяет иметь различные gid и uid на клиенте и сервере, требует запущенного демона ugidd.
Следующие 2 параметра управляют линками на смонтированном удаленном томе. Какой из них у вас включен по умолчанию, обычно заранее сказать нельзя, просто проверьте.
link_relativeКонвертирует линки из абсолютных в относительные, например линк /usr/games/q3a/quake.x86, находящийся в каталоге /usr/games/links/, превратится в ../q3a/quake.x86, если монтируется /usr/games/. После этого измененный линк будет работать в подмонтированном каталоге.
link_absoluteЛинки остаются без изменений, на деле требуется достаточно редко.

Теперь можно приступить к монтированию тома NFS клиентом. Для этого используется уже знакомый файл /etc/fstab. В него следует внести строки вида


#томточка монтированиятиппараметры
blade:/home/users/home/usersnfshard, timeo=20
blade:/usr/games/gamesnfsintr, timeo=12

Где параметры могут быть следующими


rsize=n, wsize=nРазмер пакетов клиента NFS, по умолчанию равен 1024. Менять не рекомендуется.
timeo=nВремя ожидания запроса клиентом в долях секунды. По умолчанию равно 7.
hardТом монтируется жестко. Если на таком томе превышено время ожидания, то на консоль выдается предупреждение, а монтировщик будет по-прежнему пытаться установить связь.
softПротивоположен предыдущему, после достижения предельного времени том размонтируется.
intrПрерывает вызовы клиента, если сервер долгое время не доступен. Используется с параметром hard.

После этого можно монтировать том вручную или посредством автомонтировщика autofs.

Я описал лишь малую часть работы демонов Интернета и демонов RPC. Например, в последнее время стали повсеместно использоваться алгоритмы шифрования и надежной авторизации, устойчивые к перехвату пакетов хакером. Это демоны sshd (Secured SHell), slogind (Secured LOGIN) и другие. Так же я не коснулся такого вопроса как организация Интернет-сервера с демоном httpd, сервером Apache и других Интернет-служб. Не ограничиваются описанными и применения RPC, это очень мощная система, которая позволяет легко (например, одной командой export DISPLAY=blade) устанавливать достаточно сложные соединения, вроде Remote Desktop Connection из арсенала Windows2000. При этом не требуется передавать все содержимое рабочего стола, если вам требуется лишь запустить одну программу. В общем, это самостоятельное творчество, которому могут помочь только собственные усилия.

Однако еще сохранились люди, которые для соединения с Интернетом используют модем. Вы уже установили драйвера, перекомпилировали ядро и теперь хотите дозвониться провайдеру. Если вы простой пользователь, то для этого достаточно просто создать соответствующее PPP-соединение в одной из программок, и дальше не ваша забота. Если же вы root, то для того чтобы юзеры смогли так просто существовать придется потрудиться именно вам (особенно если единственный юзер - это вы).

Если соединение осуществляется с помощью протокола PPP (а сегодня это почти всегда так), то этим соединением управляет демон pppd. Это необычный демон, он отличается от всех предыдущих тем, что ЛЮБОЙ пользователь может им управлять (даже guest). Осуществляется управление с помощью аргументов командной строки и управляющих файлов. Этих файлов может быть много, один основной, и по одному на каждого юзера. Основной файл называется /etc/ppp/options, а пользовательские файлы .rcppp, и содержатся они в домашних каталогах. Правило здесь следующее: параметры для всех файлов одинаковые, но в первую очередь просматриваются параметры из основного файла, затем из пользовательских. Параметры основного файла общедоступны и общеприняты, т.е. каждый пользователь их употребляет, но не может изменить. Параметры же пользовательских файлов личные, т.е. только владелец их знает и может изменять. Таким образом, пароли следует хранить в пользовательских файлах, а настройки модема - в общем.


/dev/ttyS0Имя модема, если модем единственный, то следует писать в основной файл, если модемов несколько, то можно оставить на усмотрение пользователей.
crtsctsВключает аппаратное разрешение передачи, без этого режима скорость будет ограничена до 9600. Пишите в основной.
defaultrouteВключает маршрут PPP в качестве маршрута по умолчанию. Можно оставить на произвол пользователей, только если вы уверены в их знаниях.
authТребует авторизации при подключении к вашему компьютеру. Обязательно следует указывать в основном файле.
lockБлокирует используемый канал. Тоже обязательно следует указывать в основном файле.
domainИмя домена. Необходим для авторизации по протоколу CHAP, который для простого соединения с Интернетом через провайдера не используется.
modemУказывает демону на работу именно с модемом, пользователи ВСЕГДА забывают это слово.
-detachДемон после соединения переходит в фоновый режим, указывайте в основном файле.
noipdefaultДемон pppd в присутствии этого параметра обязан назначить для соединения тот IP, который ему предложит удаленный компьютер. Оставьте на усмотрение пользователям, только если уверены, что они не забудут его указать.
silentПосле указания этого параметра демон pppd будет работать в режиме сервера, т.е. после установления физического соединения будет ждать, когда с клиента поступит первый пакет. connect "сценарий" Параметр, который обязан принимать какое-либо значение. Каждый сценарий содержит номер телефона, имя и пароль пользователя. Эту строку ОБЯЗАН задавать пользователь.

Так же в качестве параметров при желании можно указать требуемую скорость соединения, IP-адрес своего хоста и IP-адрес удаленного. Последние параметры частично противоречат параметру noipdefault, и записываются как local_addr:remote_addr. Кроме того для работы в режиме сервера требуется настроить последовательный порт таким образом, что бы он не отсылал полученные команды назад, как эхо. Для этого следует отдать следующие команды для порта

mesg n
stty -echo

Таким образом для дозвона до провайдера можно использовать следующий сценарий (если все необходимые параметры находятся в /etc/ppp/options)

pppd connect "my_scenario"

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


demandПараметр "дозвона по требованию", соединение ppp0 будет создано, но connect запустится лишь после того как он потребуется.
active_filterЗначение этого параметра управляет настройками трафика, без него демон будет реагировать на каждый исходящий бит.
holdoff Время в секундах между дозвонами.
idle Время через которое демон повесит трубку при отсутствии трафика.

Есть еще 2 файла, которые управляют демоном pppd, они называются /etc/ppp/ip-up и /etc/ppp/ip-down. Их назначение это маршрутизация в удаленную сеть при помощи протокола PPP. Они используют те же параметры, что и описанные файлы, и если вы используете PPP только для связи с Интернетом, то их можно оставить как есть.

Тогда для пользователя основным станет создание и запуск сценария его соединения. Этот процесс давно автоматизирован с помощью специальных программ, которые разные в разных дистрибутивах Linux. Но иногда может возникнуть необходимость создания или запуска сценария вручную. Для следует создать файл с названием вроде my_scenario. А для параметра connect указать значение "chat -f my_scenario". chat это программа общения с модемом по принципу диалога, ключ -f означает, что этот диалог берется из файла. Пример части такого файла

ATZ
OK	ATDT3208080
CONNECT	' '
ogin: ghoort
word: forget
При его запуске на модем посылается команда ATZ (инициализация), затем он ожидает ответа OK. После его получения, программа chat высылает телефонный номер ATDT3208080 в импульсном наборе, и ждет ответа CONNECT. После получения ответа, она не делает ничего, на что указывает пустая строка. Получение приглашения ogin: приводит к ответу ghoort, причем такой вид не ошибка, это требуется, поскольку буквы L и l здесь различаются. Затем вводится пароль.

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


И жили они долго и счастливо...

Развитие индустрии сказалось и на Linux. Хотя и есть люди, которые ругают Linux (кстати, обоснованно) за шатание из стороны в сторону, постоянное переписывание уже готовых частей ядра, не достаточно быстрое добавление новых и необходимых, да мало ли за что... Юниксовая братия уже разделилась на 2 направления - BSD и SysV, которые различаются структурой ядра и методами межпроцессовых коммуникаций. Начинает оформляться течение, которое требует интеграции графической среды на уровень ядра, хотя бы на уровне модуля (к этим отщепенцам отношусь и я). И многое другое. Но последние годы появилось новое идеологическое требование, которое просто хорошо забытое старое.

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

А все-таки интересно, будет ли версия Microsoft Office для Linux?

 
← Предыдущая страница
⇣ Содержание
Если Вы заметили ошибку — выделите ее мышью и нажмите CTRL+ENTER.
Вечерний 3DNews
Каждый будний вечер мы рассылаем сводку новостей без белиберды и рекламы. Две минуты на чтение — и вы в курсе главных событий.

window-new
Soft
Hard
Тренды 🔥
Российское правительство определило налоги для майнеров 9 ч.
ByteDance при капитализации $300 млрд претендует на звание самой дорогой китайской компании технологического сектора 16 ч.
Новая статья: Slitterhead — странная японщина, как в старые добрые. Рецензия 23 ч.
Новая статья: Gamesblender № 700: угроза запрета S.T.A.L.K.E.R. 2, дух классики в Indiana Jones и белый Steam Deck 23 ч.
Иск с обвинениями Илона Маска в мошенничестве с Dogecoin отозван 16-11 16:00
Китайских хакеров обвинили в крупномасштабной атаке на телекоммуникационные сети США 16-11 14:38
Google предложила помощь ИИ в создании клипартов для документов 16-11 12:22
Снежный человек, огрызок и другие: Unicode Consortium добавил девять новых смайликов 16-11 11:59
Half-Life 2 исполнилось 20 лет: Valve устроила раздачу в Steam, выпустила огромное обновление и документальный фильм о разработке игры 16-11 11:40
Британский оператор натравил ИИ-бабушку на телефонных мошенников 16-11 11:36