Помощь в создании скрипта автоматической конфигурации Windows 10 [закрыт]
Закрыт. Данный вопрос необходимо конкретизировать. Ответы на него в данный момент не принимаются.
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.
Закрыт 2 года назад .
Поскольку настройка, например 10 компов, на данный момент занимает от 6ти часов и выше(в зависимости от качества удалённого соединения) и даже последовательное прокликивание настроек на одновременно 4х машинах дело не ускоряет, было принято решение сваять скриптик во благо тайм-менеджмента С большего это всего лишь автоматизация дебильных копаний в настройках системы, фаервола, таск менеджера и прочих базовых потребностей. В идеале от меня хотят видеть «одну волшебную кнопку которая сама сделает всё за пару минут» Начал я исесно с гугления и поиска скриптов по каждому пункту Что должно быть включено в основной скрипт: Создать пользователя с фиксированным именем и паролем task scheduler 3am reboot (shutdown /r /f /t 0) Установка нашего фирменного «Агента» и добавление всех его компонентов в shell:startup и windows defender firewall отключение обновлений с помощью wu10man или каким-нибудь другим способом (wu10man во всяком случае делал именно то, что там надо) Настройка параметров windows: security at a glance — всё должно быть отключено (no actions needed) отключение bluetooth отключение уведомлений отключение впадения компьютера в спячку отключение cortana и мусора в Task Manager (Disable «microsoft OneDrive’) (Для всего этого я нашел Sophia Script. Думаю, что можно «повыдирать» только необходимое) Установка сплошного цвета Autologon «users must enter a user name . » must be disabled Установка дополнительного ПО (Remotix Agent, Log me in) Краткая суть вопроса такова: Объеденить несколько скриптов в один Поскольку я ничерта не понимаю в программировании, синтаксис для меня это тёмный лес, а задачу надо выполнить в достаточно сжатые сроки (дедлайн уже в пятницу), времени на детальное изучение вопроса просто нет Единственное, что в моих силах это копипастить команды по очереди(надеясь, что я нашёл именно то, что мне надо и оно будет работать). Однако такой подход никого не устраивает. Жирным выделил то, что удалось таки найти Остальное под вопросом Очень прошу — помогите хоть советом, хоть ссылкой решить данную проблему.
Облако OpenStack: мифы и реальность
Проект OpenStack возник по инициативе двух производителей и объединил их продукты – объектное хранилище Rackspace и систему управления гипервизорами NASA. «OpenStack призван помочь организациям предоставлять облачные вычислительные ресурсы, запущенные на стандартном оборудовании», – заявляют вендоры. В данном материале мы попробуем разобраться, так ли это на самом деле.
OpenStack сегодня
Первый релиз OpenStack вышел в октябре 2010 г. Так компания Rackspace стала одним из ближайших конкурентов другого облачного провайдера IaaS – Amazon Web Services (AWS), который в то время сильно терял свои позиции. По сути, OpenStack – копия AWS: многие сервисы и процессы в этих платформах одинаковы и даже совместимы между собой.
IaaS: OpenStack vs. Amazon Web Services

- средство управления гипервизорами (Nova)
- объектное хранилище (Swift)
- хранилище образов виртуальных машин (Glance)
- веб-интерфейс управления (Horizon)
- каталог пользователей и сервисов (Keychain)
- средство управления сетевой инфраструктурой (Neutron)
- блочное хранилище (Cinder)
- оркестратор облачных приложений (Heat)
- инструмент учета потраченных ресурсов (Ceilometer)
- средство предоставления БД как услуги.
О мифах
Является ли OpenStack технологией будущего, мейнстримом? Как знать. Возможно, это такой же неизведанный пока Клондайк, как Linux начала 90-х гг, когда мало кто о нем знал и совсем немногие видели. OpenStack обладает большим потенциалом, но на сегодня трудно назвать его готовым продуктом. И вот почему.
Функционал решения постоянно трансформируется, дополняется и документация не всегда успевает за этими изменениями. Зачастую в новом релизе появляются возможности, которые не отражены в инструкции к продукту.
Поиск неисправностей сильно затруднен, так как обычно в ответ на любые ошибки OpenStack выдает несколько килобайт стектрейсов. Приходится тратить немало времени и сил только для того, чтобы определить причину сбоя.
Внедрение OpenStack требует серьезной работы программистов. Если вы собираетесь продавать облачные услуги на основе данного продукта (пусть даже в рамках одной своей компании), имеющегося в нем функционала будет явно недостаточно. Например, вы не сможете ограничить сетевой трафик одной виртуальной машины так, чтобы она не мешала другим. Базовые возможности OpenStack не позволяют плавно регулировать потребляемые ресурсы и даже мигрировать виртуальную машину на другой хост. Средств мониторинга доступности тоже нет. Наконец, хороший пример готовности OpenStack как продукта – процедура добавления и удаления узлов с гипервизорами. Добавляются они определенной процедурой, а вот для удаления compute-ноды нет специальной команды. Приходится идти в специальную таблицу MySQL и делать это вручную:
mysql> delete from compute_nodes where hypervisor_hostname='nova4’; Query OK, 1 row affected (0.00 sec) mysql> delete from services where host='nova4’; Query OK, 1 row affected (0.00 sec) mysql>
Безвозмездно, то есть даром? Скачать OpenStack вы можете абсолютно бесплатно. Однако в силу неготовности продукта его «бесплатность» выливается в серьезные трудозатраты в части доработки.
Разрабатывается свободным сообществом? На сайте OpenStack можно посмотреть статистику: кто и в какой степени участвовал в разработке кода решения.
За всю историю существования OpenStack

Больше остальных отличилась компания Rackspace, зарабатывающая на предоставлении пользователям инфраструктуры как услуги. Далее идут Red Hat, которая занимается продажами, внедрением и поддержкой решений OpenStack; затем – HP и IBM, предоставляющие облачные услуги на базе OpenStack. Как видим, доля свободных программистов-энтузиастов (OpenStack Foundation) минимальна, а по количеству пользователей это всего 5–10 человек за все 4 года.
Релиз Juno (октябрь 2014)

Если смотреть на последнее полугодие 2014-го – картина несколько изменилась, но лидеры остались практически те же. Плюс появились новые игроки – Mirantis, продающая только OpenStack (инсталляции и поддержку), а также компания SUSE. Замыкают список производители, у каждого из которых собственные цели. NEC обеспечивает поддержку своего оборудования, работающего с OpenStack. VMware пытается защитить свою экосистему, «возглавив» реализацию совместимости OpenStack с ESXi.
С OpenStack у меня будет свой Amazon? Является ли данная технология ключевым фактором успеха для облачного провайдера? Нет, не является. Это хорошо видно по магическому квадранту Гартнера. Подавляющее число компаний используют VMware, чуть менее популярен KVM. А вот платформе Xen отдали предпочтение как IBM, Fujitsu и GoGrid, так и явный лидер Amazon. Понятно, что дело вовсе не в гипервизоре.

Можно ли заменить традиционные виртуальные машины облачными? Особенности двух подходов к виртуализации отражены в сравнительной таблице (спасибо Red Hat за нее).
| Традиционные ВМ ( ESXi, RHEV) | Облачные ВМ (OpenStack, AWS) |
|---|---|
| Большие. Данные хранятся внутри ВМ | Маленькие. Данные хранятся снаружи ВМ |
| 1 приложение — 1 ВМ | 1 приложение — много ВМ |
| Цикл жизни ВМ – годы | Цикл жизни ВМ – от часов до месяцев (приложения находятся не внутри ВМ, а снаружи) |
| Увеличить ту или иную ВМ с приложением можно лишь до размеров ее хоста | При увеличении/уменьшении числа пользователей можно динамически создавать/удалять ВМ |
| Вертикальное масштабирование (наращивается производительность ВМ) | Горизонтальное масштабирование (увеличивается количество ВМ) |
| Приложение находится внутри и не переживет сбой ВМ, т.е. важно обеспечить отказоустойчивость | В случае сбоя ВМ облачное приложение создает ее с нуля, оставаясь в рабочем состоянии |
| SLA требует обеспечения доступности приложения через Live Migration, HA и другой подобный функционал | SLA требует возможности добавления/удаления экземпляров ВМ для поддержания доступности приложения |
Эксплуатация. В OpenStack нет средств обеспечения высокой доступности и конкретных планов по ее реализации. Системы резервного копирования для ВМ также нет. Если сервер виртуализации вышел из строя, то и виртуальные машины мы потеряли – придется создавать новые (и это нормально).
Рекламируется, что OpenStack работает во всех гипервизорах, однако это не так. Основная система управления, по которой ведется разработка и тестирование продукта, – KVM. Остальные либо тестируются не полностью (например, Microsoft Hyper-V, гипервизоры VMware, Citrix XenServer 6.2), либо не тестируются вовсе (Baremetal, Docker, LXC через libvirt, Xen через libvirt) и их работа в OpenStack не может быть гарантирована. В последнем случае при запуске вы увидите сообщение вроде: «The libvirt driver is not tested on xen/x86_64 by the OpenStack project and thus its quality can not be ensured».
При этом возможность живой миграции (Live Migration), т.е. переноса ВМ с одного физического сервера на другой без остановки сервисов, в OpenStack отключена по умолчанию. Несмотря на то, что данный функционал поддерживается основным гипервизором – KVM.
Применение OpenStack
Несмотря на обозначенные особенности и недостатки, платформу OpenStack вполне можно использовать для различных задач. Один из вариантов: у вас уже есть какая-то облачная среда (например, тот же Amazon или Rackspace), но вы хотите переехать, развернув облачные сервисы у себя.
Еще один сценарий: вы планируете стать облачным провайдером, у вас есть стартап, достаточно финансов, программисты, желание работать и самое главное – какие-то ноу-хау, которые вы развернете в этой облачной среде. Т.е. вы собираетесь сделать не второй Google или Facebook, а нечто абсолютно новое. В этом случае OpenStack – тот продукт, на основе которого можно далее развиваться.
Если есть регулярная потребность в тестировании или нужна облачная платформа для разработки нового приложения, также есть смысл обратить внимание на OpenStack. Как вариант, можно задействовать только какой-то отдельный модуль OpenStack. Например, используя труд нескольких программистов, написать и реализовать нечто вроде корпоративного Dropbox на основе Swift.
- инфосистемы джет
- openstack
- clouds
- iaas
- open source
- инфраструктурные решения
- Блог компании Инфосистемы Джет
- Open source
Берём Glance Widgets под контроль
В этой статье я хочу показать как создавать виджеты с состоянием для Android приложения с помощью Glance Compose, обновлять каждый экземпляр отдельно от остальных, настраивать их с помощью конфигурационной активити и закреплять экземпляры из приложения. Пример того, что должно получиться вы можете видеть на видео.
Glance — библиотека, входящая в семейство Jetpack, позволяющая через Jetpack Compose Runtime создавать виджеты для Android и Tiles для WearOS. Она пришла на смену RemoteViews в декабре 2021 года и призвана облегчить нам жизнь через упрощение создания дизайна виджетов и взаимодействие с ними. Библиотека поддерживает интероп с RemoteViews и на момент написания статьи находится в альфа версии.
Мы не будем тут повторять официальную документацию, изучать доступные настройки метадаты и рассматривать базовые сценарии, в которых надо просто бросить виджет в лаунчере. В конце этой статьи я хочу чтобы у вас было понимание как создать statefull виджет с конфигурацией и как добавлять их прямо из приложения.
Какие плюсы?
Помимо очевидного плюса отказа от RemoteViews, который даёт Compose, в копилку стоит добавить также GlanceStateDefinition, который создаётся свой на каждый экземпляр виджета. Что это и за что его нужно любить? StateDefinition — это хранилище на основе DataStore, которое по-сути просто файл. Когда мы добавляем новый виджет, то для него нам предоставляется только к нему прикреплённый стор, который будет единым источником правды для этого виджета. Он выступает в роли посредника между приложением и состоянием виджета и о нём можно думать как о некотором хранилище remember значений, если приводить аналогию с обычным миром Compose. Мы ещё вернёмся к этой сущности ниже.
Также, на мой взгляд, Google добавил довольно удобную систему обновления виджетов. Если раньше для синхронизации вьюшек виджета с состоянием данных нам нужно было где-то хранить его widgetId, бросать Intent, выдумывать свои менеджеры для этого, то сейчас у нас есть пара функций верхнего уровня, с помощью которых можно обновить все виджеты одного типа или выполнить обновление с некоторым предикатом, с помощью которого будут затронуты лишь те экземпляры, которые нам нужны. Это мы тоже посмотрим далее.
Какие ограничения?
Glance поддерживает набор собственных Composable функций и GlanceModifier и не поддерживает MaterialTheme. Смешивать Glance со стандартным Compose не следует, в лучшем случае это будет проигнорировано. На момент написания статьи поддерживаются Box, Row, Column, Text, Button, LazyColumn, Image и Spacer.. К сожалению пока-что нужно создавать xml файл с метадатой, в будущем обещают отказаться от него. Ну и самое неприятное — мы не увидим привычных нам remember, так как в Glance нет рекомпозиции и состояния в привычном нам понимании для Compose. Придётся немного изменить образ мышления, но как только это сделаете — то создавать и расширять виджеты становится легко и очень быстро. Ещё одно ограничение — отсутствие кастомных шрифтов.
Перед тем как приступить к написанию кода давайте ещё посмотрим на то, из каких компонентов состоит вся связка и кто за что отвечает.
GlanceAppWidgetManager — это менеджер наших Glance виджетов, с помощью которого будем получать идентификаторы имеющихся экземпляров виджетов и запрашивать у системы установку виджета напрямую из приложения.
GlanceAppWidgetReciever — класс, который обновляет виджеты когда это необходимо и пришёл на смену AppWidgetProvider. Но в отличие от своего предшественника вся работа спрятана под капот.
GlanceAppWidget — сам виджет. От него мы будем наследоваться и реализовывать свои экземпляры. В этом классе находится точка входа в Composable часть виджета через функцию Content.
GlanceStateDefinition — интерфейс с функциями доступа к контейнеру состояния Glance виджета. Мы будем использовать PreferencesGlanceStateDefinition, который для каждого нового экземпляра виджета будет создавать свой собственный файл для сохранения состояния.
Состояние виджета будет храниться в виде набора примитивов в сторе и для их сохранения мы будем использовать набор функций из androidx.datastore.preferences.core.
И последний интересный компонент — это класс ActionParameters, который позволяет пробрасывать параметры в обработчики нажатий на вьюшки виджета.
- добавлять для заметки индивидуальный виджет через лаунчер
- добавлять виджет из заметки напрямую
- обновлять виджет при редактировании заметки к которой он прикреплён
- открывать приложение с нужной заметкой при нажатии на виджет
Для создания виджета с состоянием нам нужно выполнить следующие шаги:
- Определяем набор значений, из которых будет складываться состояние виджета
- Создаём виджет, наследуясь от GlanceAppWidget
- Определяем действия, которые которые нужно обрабатывать при нажатии на элементы виджета
- Добавляем ресивер и регистрируем его в манифесте
- Добавляем метадату
- Добавляем конфигурационную активити и обработку сохранения привязки виджета к заметке.
Так как виджет у нас будет отражением состояния заметки, то я хочу хранить в нём такие значения как заголовок, текст заметки, дату последнего изменения и идентификатор заметки. Для простоты создам ключи для этих значений на верхнем уровне прямо в файле, где будет описываться виджет.
val noteId = longPreferencesKey("noteId") val noteTitle = stringPreferencesKey("noteTitle") val noteText = stringPreferencesKey("noteText") val noteUpdatedAt = stringPreferencesKey("noteUpdatedAt")
Ниже создаю виджет и ресивер
class NoteWidget : GlanceAppWidget() < override var stateDefinition: GlanceStateDefinition= PreferencesGlanceStateDefinition @Composable override fun Content() < NoteWidgetContent() >> class NoteWidgetReceiver : GlanceAppWidgetReceiver()
Так как ресивер является BroadcastReceiver, то его нужно зарегистрировать в манифесте.
Чтобы не захламлять NoteWidget я вынес вёрстку в отдельную функцию NoteWidgetContent. Для краткости я не привёл тут импорты, но стоит обратить внимание на то, что в вёрстке используются import androidx.glance и элементы из Glance вместо стандартных из Compose. Например androidx.glance.text.Text вместо androidx.compose.material.Text
@Composable fun NoteWidgetContent(prefs: Preferences) < val noteId = prefs[noteIdPK] ?: Long.MIN_VALUE val noteTitle = prefs[noteTitlePK].orEmpty() val noteText = prefs[noteTextPK].orEmpty() val updatedAt = prefs[noteLastUpdatePK].orEmpty() LazyColumn( modifier = GlanceModifier .background(imageProvider = ImageProvider(R.drawable.widget_background)) .appWidgetBackground() .padding(16.dp) ) < if (noteTitle.isNotEmpty()) item < WidgetText(noteTitle, noteId) >if (noteText.isNotEmpty()) item < WidgetText(noteText, noteId) >if (updatedAt.isNotEmpty()) item < WidgetText(updatedAt, noteId, 16.sp) >> > @Composable fun WidgetText(text: String, noteId: Long, fontSize: TextUnit = 20.sp)
Далее нужно добавить файл xml с настройками виджета и файлы с разметкой, которые в этой конфигурации указаны. Повторюсь, мы опустим рассмотрение этих базовых моментов, по ним информации достаточно. Нам важно разобраться с тем, как виджету работать с состоянием.
Теперь у нас есть необходимый минимум, чтобы можно было на лаунчере вызвать меню виджетов и выбрать наш. Для того, чтобы на этом шаге мы могли выбрать к какой заметке привязать экземпляр виджета, нам нужно добавить конфигурационную активити. Не забудьте добавить её в xml файле с настройками виджета
android:configure="com.example.note_glance_widget.widget.config.ConfigWidgetActivity"
Весь код активити находится тут, нам же интересна та его часть, которая касается выбора заметки и привязки её к виджету. Это происходит в методе saveWidgetState, в который передаётся идентификатор заметки.
private fun saveWidgetState(id: Long) = lifecycleScope.launch(Dispatchers.IO) < val glanceId = GlanceAppWidgetManager(applicationContext).getGlanceIdBy(widgetId) val note = repository.getNote(id)?.let < it.toEntity() >?: return@launch updateAppWidgetState(applicationContext, glanceId) < prefs ->prefs[noteIdPK] = id prefs[noteTitlePK] = note.title prefs[noteTextPK] = note.text prefs[noteLastUpdatePK] = note.formatUpdatedAt > NoteWidget().update(applicationContext, glanceId) >
widgetId тут у нас хранится как свойство активити и инициализируется с помощью интента, в котором лежит по ключу AppWidgetManager.EXTRA_APPWIDGET_ID
Для того, чтобы обновить виджет и сохранить в его сторе нужные нам данные, необходимо получить glanceId. GlanceAppWidgetManager умеет конвертировать идентификаторы виджетов в GlanceId с помощью метода getGlanceIdBy, это тут и используется. Далее я беру заметку, по которой был клик, и с помощью функции updateAppWidgetState сохраняю в стор виджета нужные значения по ключам, которые мы описывали ранее. На этом этапе данные в стор виджета сохранены, но его отображение ещё не обновлено. Для этого нужно явно вызвать NoteWidget().update(applicationContext, glanceId). После закрытия активити мы должны увидеть виджет с данными из его состояния. Если сейчас открыть песочницу приложения, то в ней можно найти сторы, которые создаются для каждого виджета индивидуально и удаляются вместе с ними.

Идём дальше. Теперь если мы будем редактировать наши заметки, то увидим, что в виджетах информация не обновляется. Не порядок, давайте исправлять.
Я добавлю функцию, которая будет принимать заметку и сохранять её значения в тот стор, в котором лежит идентификатор этой заметки. Для того, чтобы понять в какой стор сохранить данные, я получаю от GlanceAppWidgetManager все glanceId, пробегаюсь по их сторам в методе updateAppWidgetState и, если идентификатор заметки в сторе совпадает с идентификатором обновляемой заметки, обновляю данные. У виджетов есть метод updateIf, который принимает лямбду — предикат, в которой мы определяем наше условие. Он поможет нам обновить отображение только того виджета, который относится к обновляемой заметке и не дёргать лишний раз другие экземпляры.
suspend fun GlanceAppWidgetManager.mapNoteToWidget(context: Context, note: Note) = getGlanceIds(NoteWidget::class.java) .forEach < glanceId ->updateAppWidgetState(context, glanceId) < prefs ->if(prefs[noteIdPK] == note.id) < prefs[noteTitlePK] = note.title prefs[noteTextPK] = note.text prefs[noteLastUpdatePK] = note.formatUpdatedAt >> NoteWidget().updateIf(context) < it[noteIdPK] == note.id >>
Осталось 2 задачи — разобраться как открывать нужную заметку по нажатию на виджет и как закреплять виджеты напрямую из приложения.
Клики по элементам виджета Glance реализуются с помощью набора нескольких колбеков
actionRunCallback
actionStartActivity
actionStartService
actionStartBroadcastReceiver
Тут есть довольно хорошее их описание и базовых вещей, которые мы упустили.
Для открытия активити я буду использовать actionStartActivity и передавать аргументом идентификатор заметки, который возьму из стора виджета.
Опишем ключ для параметра, который будет передаваться обработчику клика на элементы виджета.
val noteIdParam = longPreferencesKey(«noteIdParam»)
Теперь добавим текстовым элементам в виджете обработчик кликов по ним:
@Composable fun WidgetText(text: String, noteId: Long, fontSize: TextUnit = 20.sp) < Text( text = text, style = TextStyle( fontWeight = FontWeight.Normal, fontSize = fontSize, textAlign = TextAlign.Start, color = ColorProvider( day = Color.White, night = Color.White ) ), modifier = GlanceModifier.clickable( actionStartActivity( parameters = actionParametersOf( noteIdParam to noteId ) ) ) ) >
Далее в RootActivity получаем идентификатор из интента и открываем нужную заметку. Тут есть место оптимизации логики навигации, но статья не об этом. По виджету кликнули, данные в активити переданы, заметка открылась.
Берёмся за последнюю задачу — закрепление виджета из приложения. Это мы будем делать на экране заметки с помощью метода handlePinWidget
private fun handlePinWidget(noteId: Long)
У GlanceAppWidgetManager есть метод requestPinGlanceAppWidget. Он принимает на вход класс ресивера нашего виджета и PendingIntent, который будет являться колбеком и вызовется системой после того, как отработает закрепление виджета. Тот компонент, который будет добавлен в этот PendingIntent, будет ответственен за настойку этого экземпляра виджета. Я для этой цели создам BroadcastReciever и положу в Intent с ним идентификатор заметки, которая должна быть закреплена.
class PinWidgetReceiver : BroadcastReceiver() < @Inject lateinit var repository: NotesRepository override fun onReceive(context: Context, intent: Intent) < val noteId = intent.getLongExtra(NOTE_ID, Long.MIN_VALUE) CoroutineScope(EmptyCoroutineContext).launch < delay(3000) val note = repository.getNote(noteId)?.let < it.toEntity() >?: return@launch val glanceManager = GlanceAppWidgetManager(context) val lastAddedGlanceId = glanceManager.getGlanceIds(NoteWidget::class.java).last() mapNoteToWidget(context, lastAddedGlanceId, note) > > private suspend fun mapNoteToWidget(context: Context, lastAddedGlanceId: GlanceId, note: Note) < updateAppWidgetState(context, lastAddedGlanceId) < prefs ->prefs[noteIdPK] = note.id prefs[noteTitlePK] = note.title prefs[noteTextPK] = note.text prefs[noteLastUpdatePK] = note.formatUpdatedAt > NoteWidget().update(context, lastAddedGlanceId) > >
Тут есть магическое место с ожиданием трёх секунд. Дело в том, что если это не сделать, то почему-то нам не доступен сразу стор нового виджета. Скорее всего дело в асинхронном процессе его создания. 3 секунды у меня хватает для того, чтобы стор был корректно предоставлен. Возможно я тут не прав и буду рад, если поправите меня и укажете корректный способ получения синхронного доступа к стору.
В этом случае обновление виджета будет выполняться через получение последнего добавленного идентификатора GlanceId с помощью метода GlanceAppWidgetManager.getGlanceIds.
Это всё, что я хотел показать, надеюсь материал был полезным и поможет вам разобраться с тем, как добавить состояние в Glance виджет.
Вы отправили слишком много запросов, поэтому ваш компьютер был заблокирован.
Для того, чтобы предотвратить автоматическое считывание информации с нашего сервиса, на Linguee допустимо лишь ограниченное количество запросов на каждого пользователя.
Пользователям, браузер которых поддерживает Javascript, доступно большее количество запросов, в отличие от пользователей, чей браузер не поддерживает Javascript. Попробуйте активировать Javascript в настройках вашего браузера, подождать несколько часов и снова воспользоваться нашим сервером.
Если же ваш компьютер является частью сети компьютеров, в которой большое количество пользователей одновременно пользуется Linguee,сообщитеоб этом нам.