Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447

Парсинг файлов в цикле, обращение на каждом проходе к Awesomium

30.08.2016, 16:14. Показов 2925. Ответов 32

Студворк — интернет-сервис помощи студентам
Если обрабатываю один файл, то все успешно идет, то есть текст вставляю в браузер Awesomium. Вытаскиваю код и обрабатываю как мне нужно.
Когда идет цикл обработки файлов в Awesomium, работа с браузером должна быть также в каждом проходе.
Однако некоторые файлы не обрабатываются, т.к. цикл видимо не дожидается Awesomium, а идет своим ходом.

Думаю, нужно сделать ожидание в цикле для каждого прохода, пока закончится обработка в Awesomium.
В цикле паузы не помогают с разным значением брал: Threading.Thread.Sleep(5000)

Отлавливание события:
VB.NET
1
2
3
4
5
6
Private Sub WebControl1_LoadingFrameComplete(sender As Object, e As FrameEventArgs) Handles WebControl1.LoadingFrameComplete
        If e.IsMainFrame Then
            ' Обработка здесь .................
 
        End If
End Sub
В цикле прописано:
VB.NET
1
2
3
                While WebControl1.IsLoading
                    Application.DoEvents()
                End While
Обработку перемещал в цикл, тот же самый результат. Необходимо как-то циклу дождаться, когда загрузится вся страница и обработка выполнится полностью.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.08.2016, 16:14
Ответы с готовыми решениями:

При каждом проходе брекпойнта функция клика дублируется
Подскажите, почему у меня при каждом проходе брекпойнта <1070px событе клика дублируется, т.е. при клике на ".mp_head" у меня...

Реализовать сортировку выбором с выводом максимов на каждом проходе
{вырезано} решите пожалуйста, очень прошу, сейчас нужно до утра сдать, очень прошу, можно с массивом и с вектором. Постановка...

Модифицировать код сортировки так, чтобы на каждом следующем проходе количество сравнений декрементировалось
Помогите разобраться. Нужно модифицировать так, чтобы на втором проходе было 8 сравнений, на третьем 7 и т.д. #include <iostream> ...

32
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
31.08.2016, 16:49  [ТС]
Добавил в цикл строку:
VB.NET
1
WebControl1.Source = New Uri("url_адрес-здесь")
Стало обрабатываться 50% файлов, то есть каждый нечетный файл в итерациях цикла:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
        For parStroka = 0 To DataGridView5.RowCount - 1
            '  Что-то делаем тут ...............
            WebControl1.Source = New Uri("url_адрес-здесь")
            '   Текст вставляем в поле Awesomium (WebControl1)
            WebControl1.ExecuteJavascriptWithResult("document.getElementById('jobtext').value = """ & TextBox5.Text & """")
            '   Нажать кнопку в браузере Awesomium "Проверить"
            WebControl1.ExecuteJavascriptWithResult("document.querySelector('#textspellcheck > a').click();")
            '    Ожидаем завершения загрузки
            While WebControl1.IsLoading
                Application.DoEvents()
            End While
            '  Что-то делаем тут ...............
        Next
Еще код:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Private Sub WebControl1_DocumentReady(sender As Object, e As DocumentReadyEventArgs) Handles WebControl1.DocumentReady
        '   Вытаскиваем код из Awesomium
        Try
            Dim html As String = WebControl1.ExecuteJavascriptWithResult("document.getElementsByTagName('html')[0].innerHTML")
            '   Что-то делаем тут ...............
            StatusLabel1.Text = "Обработалось ... "
        Catch ex As Exception
            StatusLabel1.Text = "Процедура DocumentReady"
        End Try
    End Sub
 
    Private Sub WebControl1_LoadingFrameComplete(sender As Object, e As FrameEventArgs) Handles WebControl1.LoadingFrameComplete
        If e.IsMainFrame Then
            StatusLabel1.Text = "Awesomium полность загружен"
        End If
    End Sub
Что дописать, чтоб все файлы обрабатывались, а не каждый второй?
0
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
02.09.2016, 13:31  [ТС]
Обнаружил в процедуре
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    Private Sub WebControl1_DocumentReady(sender As Object, e As DocumentReadyEventArgs) Handles WebControl1.DocumentReady
        Try
            Dim html As String = WebControl1.ExecuteJavascriptWithResult("document.getElementsByTagName('html')[0].innerHTML")
            Dim doc As New HtmlDocument
            doc.LoadHtml(html)
            Dim semadro As String = ""
 
            For Each table As HtmlNode In doc.DocumentNode.SelectNodes("//*[@id='textcheckresults']/div[1]/table//td[1]")
                Application.DoEvents()
                If table.InnerText <> "" Then
                    semadro = semadro + table.InnerText + ", "
                    keyfraz += 1
                    If keyfraz = 10 Then Exit For      ' Выходим из процедуры если набрали 10 фраз
                End If
            Next
если убрать цикл, то обработка происходит всех файлов, как мне нужно.
Видимо, вычисления идут долго, может быть можно как-то изменить этот последний код?

Добавлено через 18 часов 49 минут
Хоть кто-нибудь скажите свое предположение, почему не работает цикл:
VB.NET
1
For Each table As HtmlNode In doc.DocumentNode.SelectNodes........
в процедуре
VB.NET
1
Private Sub WebControl1_DocumentReady(sender As Object, e As DocumentReadyEventArgs) Handles WebControl1.DocumentReady
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
02.09.2016, 13:58
Цитата Сообщение от Egor2014 Посмотреть сообщение
Хоть кто-нибудь скажите свое предположение, почему не работает цикл:
А выражение точно соответствует непустому набору узлов? Я страницу не видел, поэтому не знаю. А так, если выражение возвращает коллекцию узлов, то можно и без цикла обойтись, правда результат будет таким же.
VB.NET
1
        Dim semadro = String.Join(", ", doc.DocumentNode.SelectNodes("//*[@id='textcheckresults']/div[1]/table//td[1]").Select(Function(td) td.InnerText))
1
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
02.09.2016, 14:12  [ТС]
Пустых узлов нет, там вытаскиваю ключевые фразы их немало на странице.
Поставил после этого кода:
VB.NET
1
TextBox9.Text = "=======================  Мы здесь ================"
В результате TextBox9.Text пустой. Получается процедура WebControl1_DocumentReady полностью игнорирует цикл и вашу строку(((

Вернее, в цикле захватывает каждый нечетный файл.
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
02.09.2016, 14:15
Цитата Сообщение от Egor2014 Посмотреть сообщение
Пустых узлов нет
Я не про пустые узлы спросил. А про то, возвращает ли выражение, переданное SelectNodes непустую коллекцию узлов. Иными словами: правильно ли составлено выражение XPath?
0
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
02.09.2016, 14:16  [ТС]
XPath верно т.к. обрабатывается в цикле каждый нечетный файл.
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
02.09.2016, 14:22
Цитата Сообщение от Egor2014 Посмотреть сообщение
XPath верно т.к. обрабатывается в цикле каждый нечетный файл.
Какой файл? О чем вообще речь идет? Вот приведу простой пример. У меня на страничке есть таблица вот такого содержания
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    <table>
        <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
        </tr>
        <tr>
            <td>4</td>
            <td>5</td>
            <td>6</td>
        </tr>
        <tr>
            <td>7</td>
            <td>8</td>
            <td>9</td>
        </tr>
    </table>
Выполняю следующий код
VB.NET
1
        MsgBox(String.Join(", ", doc.DocumentNode.SelectNodes("//table//td[1]").Select(Function(td) td.InnerText)))
Выводит 1, 4, 7. Если у тебя выражение правильное, то тоже должно все выводиться.
Попробуй выполнить такой код
VB.NET
1
MsgBox(doc.DocumentNode.SelectNodes("//*[@id='textcheckresults']/div[1]/table//td[1]").Count.ToString())
0
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
02.09.2016, 14:27  [ТС]
Пардон, я поторопился (ошибку свою исправил) ваш код тоже рабочий, но он также как мой цикл, делает обработку в процедуре WebControl1_DocumentReady лишь на нечетной итерации цикла. Видимо дело в Awesomium (WebControl1) что-то не успевает обновится...
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
02.09.2016, 14:33
Egor2014, я пытался разобраться в первых постах, но поскольку картинка вырисовывается неполная, посоветовать что-то не могу. Можешь подробнее описать что ты пытаешься сделать?
0
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
02.09.2016, 14:40  [ТС]
Все просто: на компе есть страницы html из них нужно вытащить первые 5 ключевых фраз (семантическое ядро).
Подключаю браузер в форме Awesomium с URL: http://advego.ru/text/seo/
и поочередно файлы прогоняю. Если что-то еще подробнее, пожалуйста, скажите, дополню?
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
02.09.2016, 15:12
Egor2014, обработка через один файл происходит из-за того, что у тебя фактически две разные страницы загружаются: одна с пустыми полями для ввода, другая - со статистикой. Когда в обработчике DocumentReady ты пытаешься извлекать статистические данные, то получается это у тебя ровно через раз, в силу того, что на каждой второй странице отсутствуют поля со статистикой. Тебе при обработке надо учесть это обстоятельство.
0
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
02.09.2016, 17:52  [ТС]
Ух ты, вы меня еще больше озадачили, не понимаю как так получается... я же ей по циклу в каждой итерации даю нормальные страницы с текстом. Мне казалось Awesomium где-то не успевает обновится... и ему нужно паузу в коде подсунуть или командой какой-то его обновлять в каждом проходе.

Добавлено через 43 минуты
А еще вставил этот код:
VB.NET
1
MsgBox(doc.DocumentNode.SelectNodes("//*[@id='textcheckresults']/div[1]/table//td[1]").Count.ToString())
То процедура WebControl1_DocumentReady мне показывает количество 3 раза в каждом проходе.
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
02.09.2016, 20:43
Цитата Сообщение от Egor2014 Посмотреть сообщение
я же ей по циклу в каждой итерации даю нормальные страницы с текстом.
Да так-то оно так, только ты забываешь о том, что событие DocumentReady при загрузке этой страницы тоже происходит, а стало быть выполняется код, написанный в его обработчике. А обработчик написан так, как будто в браузере может быть только страница со статистикой.
Таким образом общая канва решения примерно следующая:
  1. Создай очередь с текстами для обработки(или с путями к файлам с этими текстами).
  2. Создай метод, который будет определять, какая из страниц загружена.
  3. В обработчике события DocumentReady проверяешь страницу с помощью метода из пункта 1.
  4. Для страницы с полями для ввода, изымаешь из очереди текст, вводишь его в поле, нажимаешь кнопку.
  5. Для страницы со статистикой, вытаскиваешь нужные данные, сохраняешь, нажимаешь кнопку для ввода нового текста.

Для запуска такого кода тебе понадобится заполнить очередь, и один раз выполнить переход браузера на ту страницу.
1
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
04.09.2016, 09:24  [ТС]
diadiavova, как вам отправить личное сообщение?

Добавлено через 21 час 31 минуту
Поставил в очередь файлы с путями:

VB.NET
1
Private qMyQueue As New Queue
VB.NET
1
2
3
4
 '   Ставим в ОЧЕРЕДЬ файлы
            For parStroka = 0 To DataGridView5.RowCount - 1
                qMyQueue.Enqueue(DataGridView5.Item(0, parStroka).Value)
            Next
Текущую страницу обрабатываю: qMyQueue.Peek()
Прописал в WebControl1_DocumentReady:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
 Private Sub WebControl1_DocumentReady(sender As Object, e As DocumentReadyEventArgs) Handles WebControl1.DocumentReady
        Try
            '   Ищем слова: Проанализировать другой текст
            Dim htmld As String = WebControl1.ExecuteJavascriptWithResult("document.getElementsByTagName('html')[0].innerHTML")
            If InStr(1, htmld, "Проанализировать другой текст") <> 0 Then
    Button1_Click(sender, e)  ' Обработка статистики
                Exit Sub
            End If
        Catch ex As Exception
 
        End Try
Но это оказалось неверно, т.к. эта процедура прочитывается несколько раз и столько же раз сохраняет в Button1_Click(sender, e).

Для страницы со статистикой Button1_Click(sender, e), обрабатываю, сохраняю:
В конце меняю текущую:
VB.NET
1
2
'   Удаления элемента из очереди
    qMyQueue.Dequeue()
И в конце снова жму кнопку Анализа с новой страницей. Из всего сделанного проходит только 1 итерация.

Главный вопрос, что проверять в WebControl1_DocumentReady?
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
04.09.2016, 10:19
Цитата Сообщение от Egor2014 Посмотреть сообщение
VB.NET
1
Private qMyQueue As New Queue
Лучше использовать System.Collections.Generic.Queue(Of String).
Цитата Сообщение от Egor2014 Посмотреть сообщение
Но это оказалось неверно, т.к. эта процедура прочитывается несколько раз и столько же раз сохраняет в Button1_Click(sender, e).
Скорей всего на странице есть фреймы, так что проверяй для какой страницы сработало событие.
Цитата Сообщение от Egor2014 Посмотреть сообщение
В конце меняю текущую:
Этот метод не только извлекает строку, но и возвращает ее.
Цитата Сообщение от Egor2014 Посмотреть сообщение
Главный вопрос, что проверять в WebControl1_DocumentReady?
Страницы отличаются, проверяй любое различие. Например крупные заголовки на странице со статистикой размещены в элементе h3, а на странице ввода текста таких элементов вообще нет. Ну вот и воспользуйся этим. Как-то так.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Private Sub WebControl1_DocumentReady(sender As Object, e As DocumentReadyEventArgs) Handles WebControl1.DocumentReady
        ' Чтобы избежать обработки фреймов, проверяем, сработало ли это для страницы верхнего уровня
    ' Сначала проверь, в каком виде здесь представлена оригинальная строка, например: присутствует ли в адресе слеш в конце.
        If e.OriginalString = "http://advego.ru/text/seo/" Then
            If Boolean.Parse(WebControl1.ExecuteJavascriptWithResult("!documrnt.querySelector('h3')")) Then
                ' Извлекаем текст из очереди
                ' Вставляем в текстовое поле
                ' Жмем на обработку
            Else
                ' Извлекаем статистику
                ' Проверяем наличие текста в очереди
                ' Если очередь не пуста - жмем в браузере кнопку обработки нового текста
            End If
        End If
 
    End Sub
1
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
04.09.2016, 10:35  [ТС]
Если работа идет с очередью, то как ранее у меня был цикл, он уже не нужен?
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
04.09.2016, 10:36
Цитата Сообщение от Egor2014 Посмотреть сообщение
Если работа идет с очередью, то как ранее у меня был цикл, он уже не нужен?
Естественно не нужен и я об этом уже писал.
Цитата Сообщение от diadiavova Посмотреть сообщение
Для запуска такого кода тебе понадобится заполнить очередь, и один раз выполнить переход браузера на ту страницу.
0
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
04.09.2016, 22:14  [ТС]
Цитата Сообщение от diadiavova Посмотреть сообщение
Скорей всего на странице есть фреймы, так что проверяй для какой страницы сработало событие.
Фреймов нет, каждый раз WebControl1_DocumentReady прочитывает 2 или 3 раза.
Неудобно отловить окончание работы Private Sub WebControl1_DocumentReady на этом участке:
VB.NET
1
2
3
4
5
6
7
8
                Else
                    '---------------------------------------------------------
                    ' Извлекаем статистику
                    ' Проверяем наличие текста в очереди
                    ' Если очередь не пуста - жмем в браузере кнопку обработки нового текста
                    '---------------------------------------------------------
                    '   здесь я вытаскиваю статистику ........................               
                End If
Ставлю счетчик прочитывания Stat:
VB.NET
1
2
3
4
5
If Stat >= 2 Then
                        '   Удаления элемента из очереди
                        qMyQueue.Dequeue()
                        АнализИзОчередиToolStripMenuItem_Click(sender, e)
                    End If
Анализ страниц идет нормально, до поры до времени, но на некоторой странице вылетает в браузере с ошибкой: 503 Service Temporarily Unavailable. Это видимо когда раньше времени нажалась кнопка, то есть WebControl1_DocumentReady в это время должен 3 раза был прочитать. Как-то по другому нужно отловить полное окончание WebControl1_DocumentReady.

Кнопку в конце жмем эту же как перед 1 итерацией:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 Private Sub АнализИзОчередиToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles АнализИзОчередиToolStripMenuItem.Click
 '   На текущий элемент в DataGridView5
        For parStroka = 0 To DataGridView5.RowCount - 1
            If qMyQueue.Peek() = DataGridView5.Item(0, parStroka).Value Then
                DataGridView5.CurrentCell = DataGridView5.Rows(parStroka).Cells(0)
                Exit For
            End If
        Next
        '   Обнуляем - Счетчик заходов WebControl1_DocumentReady
        Stat = 0
        '   Код страницы в TextBox2
        TextBox2.Text = IO.File.ReadAllText(TextBox1.Text + "" + qMyQueue.Peek(), Encoding.UTF8)
        ' ..................
        WebControl1.Source = New Uri("OLD_URL")
  End Sub
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
05.09.2016, 10:34
Лучший ответ Сообщение было отмечено Egor2014 как решение

Решение

Цитата Сообщение от Egor2014 Посмотреть сообщение
Фреймов нет, каждый раз WebControl1_DocumentReady прочитывает 2 или 3 раза.
Тогда сделай так
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    Private Sub WebControl1_DocumentReady(sender As Object, e As DocumentReadyEventArgs) Handles WebControl1.DocumentReady
        If e.ReadyState = DocumentReadyState.Loaded Then
            If Boolean.Parse(WebControl1.ExecuteJavascriptWithResult("!documrnt.querySelector('h3')")) Then
                ' Извлекаем текст из очереди
                ' Вставляем в текстовое поле
                ' Жмем на обработку
            Else
                ' Извлекаем статистику
                ' Проверяем наличие текста в очереди
                ' Если очередь не пуста - жмем в браузере кнопку обработки нового текста
            End If
        End If
 
    End Sub
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.09.2016, 10:34
Помогаю со студенческими работами здесь

Работа Awesomium в цикле, передача данных и нажатие кнопки в браузере
Необходимо парсить в цикле браузером Awesomium. Передаю данные в цикле For в WebControl1: ...

Обращение к TextBox-ам в цикле
Есть 10 TextBox-oв. Можно ли не прописывать все 10 боксов, а к примеру так, я знаю это не правильно но не могу описать словами: ...

Обращение к объектам в цикле
Помогите с данным кодом - цель чтобы при наведении курсора на объект выдавала true, а кол-во объектов к примеру 10. Кнопки имеют имя btn1,...

обращение к RecordSet в цикле for
здраствуйте. у меня вопрос... пытаюсь обратится к RecordSet следующим образом: for i=1 to 6 Responce.Write rs(&quot;abc&quot;+i)...

Обращение к Label в цикле
Как присвоить значения в цикле разным Labal в цикле? То есть у меня есть 5 Label и массив из 5 элементов, и в каждый по номеру i+1 я должен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru