iABLo

                      Жизнь Ады Лавлейс была сопряжена с
                      трудностями, которые она сама себе
                      создавала.

                      https://www.syl.ru/article/425465
                      /ada-lavleys-biografiya-lichnaya-
                      jizn-dostijeniya-foto


## Удаленный доступ по SSH

3. Подключимся к виртуальной машине mini-Pi (Raspbian Desktop x86-64/Debian Stretch x86-64) по SSH протоколу (PuTTY):

  Session

                                Bridged                NAT*
    Host Name (or IP address):  IP for VM (ifconfig)   127.0.0.1
    Connection type:            SSH
    Saved Sessions:             IT18-Pi

  Window

    Appearance -> Font:         Lucide Console, 14
    Translation -> Char. set..: UTF-8

  Connection

    SSH -> X11:                 [v] Enable X11 forwarding

  Session

    Нажать [ Save ]
    Нажать [ Open ]

*) в случае NAT использовать правило

  VirtualBox -> Networking -> Advanced -> Port Forwarding

  Host-IP    Host-Port  Guest-IP   Guest-Port
  127.0.0.1  22         10.0.2.15  22

Теперь ("Now and Forever") будем использовать для связи с виртуальной (или реальной) машиной консоль удаленного доступа.

Решать конкретную задачу всегда интереснее, чем возиться с необъятной абстрактной темой. Займемся решением кроссворда на сайте:

  https://mariolurig.com/crossword/

1. Настроим notepad++ на стиль Unix для новых документов:

  Settings -> Preferences -> New Document

    Format (Line ending): Unix (LF)
    Encoding: UTF-8 with BOM

2. Создадим новый документ 639.txt и скопируем туда таблицу кодов со страницы:

  https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes

3. Подправим неудачно скопировашиеся арабские строчки:

  Replace (ctrl-h):

    Find What   : \t\n^([^\t]+)\n\t
    Replace With: \t\1\t

    Search Mode : Regular Expressions

    Нажать [ Replace All ]

4. На прошлом уроке мы копировали файл с хоста в виртуальную машину, пользуясь свойством VirtualBox Shared Folders, для чего в гостевую систему нужно было:

  a. установить Virtual Box Guest Additions

  b. Cоздать соединение через зашаренную{*} папку
------
{*} хотелось иметь в файле документа слово, незнакомое тезаурусам, но понятное вам.
------

    Devices -> Shared Folders -> Shared Folders Settings

    Machine Folders
      Name    Path
      Desktop C:\Users\opilane\Desktop

    [ ] Read only
    [v] Auto-mount
    [v] Make Permanent

  c. В виртуальной машине Linux (Terminal)

    $ sudo -s
    # mkdir -p /mnt/vbox
    # mount -t vboxsf Desktop /mnt/vbox
    ..
    $ cp myfilefromvmtohost /mnt/vbox
    $ cp myfilefromhosttovm .

Сегодня решим такую-же задачу, но уже с помощью SSH:

1. Копируем с помощью pscp: Windows должна знать путь к PuTTY, а к виртуальной машине есть доступ по

  user:   virtu
  passwd: virtu

  PS> pscp myfilefromhosttovm virtu@ip:/home/virtu
  PS> pscp virtu@ip:/home/virtu/myfilefromvmtohost .

2. Выбираем текстовый редактор для копирования:

  vim  - файл mysource.c .. ой
  nano - вставить mysource.c в середину другого файла .. ой
  ed   - все хорошо, команды ed нам пригодятся для использования sed (думаю, каждый день раз этак помногу..)

  a  append
  i  insert
  .  exit insert mode
  d  delete
  p  print
  n  display line with number
  w  save (write)
  q  quit

Еще надо знать как указать диапазон строк:

  3                  третья строка
  2,                 со второй строки до текущей
  1,$                во всем файле
  ,                  во всем файле
  /regex1/,/regex2/  строки после
  ?regex1?,?regex2?  строки до

Теперь можем скопировать в/из ed:

  $ touch myfilefromhosttovm
  $ ed myfilefromhosttovm
  rclick -- paste

  $ ed myfilefromvmtohost
    ,p

xterm: выбрать мышкой, вставить (paste) в notepad++ (на хосте)

3. Копирование через графический текстовый редактор.

На Windows хост устанавливаем X-сервер VcXsrv, (искать "x server for windows 10"). Запускаем VcXsrv (икона на столе) -- запущен (икона в трее)

  putty: $ gedit &

(в случае необходимости sudo apt-get install gedit).

NB! Значок & в конце команды обязателен и означает "запустить в фоновом режиме" иначе потеряете доступ к сессии PuTTY.


## Чей файл /usr/share/dict/american-english?

  # apt-get install apt-file
  # apt-file update
  $ apt-file search american-english
  wamerican: /usr/share/dict/american-english
  wamerican: /usr/share/man/man5/american-english.5.gz
  wamerican-huge: /usr/share/dict/american-english-huge
  wamerican-huge: /usr/share/man/man5/american-english-huge.5.gz
  wamerican-insane: /usr/share/dict/american-english-insane
  wamerican-insane: /usr/share/man/man5/american-english-insane.5.gz
  wamerican-large: /usr/share/dict/american-english-large
  wamerican-large: /usr/share/man/man5/american-english-large.5.gz
  wamerican-small: /usr/share/dict/american-english-small
  wamerican-small: /usr/share/man/man5/american-english-small.5.gz

Доустановим русский и эстонский словари

  # apt-get install aspell-ru aspell-et


## Адаптация статьи "Fun with aspell word lists" под русский

Оригинал здесь:

  http://typethinker.blogspot.com.ee/2008/02
    /fun-with-aspell-word-lists.html

Пятница, 15 февраля 2008 г.
Развлечения с списками слов aspell

  http://typethinker.blogspot.com.ee/2008/02
    /fun-with-aspell-word-lists.html

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

К сожалению, aspell слишком продвинутый, чтобы использовать простой текстовый список слов. Но есть способ получить дамп{*}:

  aspell dump master

------
{*} https://chto-eto-takoe.ru/dump
------

Эта команда напечатает весь список слов для вашего языка по умолчанию. Вы можете указать язык, используемый с -l:

  aspell -l ru dump master

Аргументом для -l является код языка ISO 639 (подробности см. В man aspell). Мастер аргументов говорит программе aspell использовать системный словарь, а не ваш личный список слов. Словарь должен быть установлен в вашей системе; на Debian пакет русского языка называется aspell-ru, эстонского aspell-et.

Когда мы запускаем aspell dump master для русского языка, мы получаем что-то неожиданное:

  $ aspell -l ru dump master | sort | \
  sed 's/\([^\/]*\/\{0,1\}\)/\1\t/' | sort | uniq | \
  awk '{print length($2), $1, $2;}' | sort -nr | head -n 4

  6 урезать/ BLMPRY
  6 ссыпать/ BLMPRV
  6 срезать/ BLMPRY
  6 рассыпаться/ BLMPRV

К концу многих слов прилагаются странные теги. Это аффиксы, и они представляют вариации этого слова.

Все аффиксы

  $ aspell -l ru dump master | sort | sed 's/[^\/]*\/\{0,1\}//' | \
  sed 's/\([A-Z]\)/\1\n/g' | sort | uniq | tr -d '\n' | \
  tee /dev/stderr | wc -c | sed 's/\([0-9]\+\)/(\1)/'

  ABDEFGHIJKLMNOPQRSTUVWXYZ(25)

(Несмотря на то, что есть и английский файл аффикса, теги аффиксов не печатаются, если мы делаем дамп английского словаря.) Мы можем расширить теги аффикса во все возможные варианты, отправив их через aspell expand:

  $ aspell -l ru dump master | grep рассыпать/ | aspell -l ru expand

Это лучше:

  рассыпать рассыпай рассыпайте рассыпал рассыпала рассыпали
  рассыпало рассыпаю рассыпают рассыпаем рассыпает рассыпаете
  рассыпаешь рассыпая рассыпав рассыплю рассыплют рассыплем
  рассыплет рассыплете рассыплешь

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

  $ aspell -l ru dump master | aspell -l ru expand | tr ' ' '\n'

Обратите внимание, что это ломается для слов, которые первоначально содержали пробелы. В списке русских слов их нет:

  $ aspell -l ru dump master | grep ' ' | wc -l
  0

Затем мне стало интересно, как работают эти аффиксы. Возьмите, например, 'рассыпать'; Далее следуют BLMPRV. Глядя в файл определения аффикса /usr/lib/aspell/ru_affix.dat Есть несколько строк, которые определяют значение этих символов:

  SET KOI8-R

  SFX Z Y 4

Чтобы прочитать дальше, нужен конвертер KOI-8R в UTF-8.

  $ cat /usr/lib/aspell/ru_affix.dat | iconv -f KOI8-R -t UTF-8 | \
  tail +3 | head

  SFX Z Y 4
  SFX Z   ый   о            [лнртв]ый
  SFX Z   ий   о            ький
  SFX Z   ий   и            [цс]кий
  SFX Z   ий   е            щий

  SFX Y Y 435
  SFX Y   чь   жешь         чь
  SFX Y   чь   жете         чь
  SFX Y   чь   жет          чь

Так что все это значит? SFX и PFX означают суффикс (окончание) и префикс (начало). Первая строка каждого блока дает количество строк в остальной части блока; Y или N перед номером указывает, может ли суффикс быть объединен с префиксами или наоборот.

Строка SFX M 0 просто создает множественную прошлую форму

...

Файл nl_affix.dat также содержит список общих правил замены. Эти правила используются, когда предлагаются возможные исправления для слова с ошибками.

Так чем я только-что занимался? Ах да, составлением списка слов. Чтобы поиграть. Для удовольствия.

Отправил Thomas ten Cate в 5:35 вечера


## Знакомство с регулярными выражениями.

Теперь можно заняться изучением регулярных выражений и разгадыванием кроссвордов. Смотрите источники [2] и [3].

"Удачи и помните -- не всегда задачу стоит решать именно с помощью регулярных выражений («У программиста была проблема, которую он начал решать регэкспами. Теперь у него две проблемы»). Иногда лучше, например, написать развёрнутый автомат конечных состояний.{2}"

Займемся автоматами? Мили, Мур, Хофман, кто там еще.. В следующий раз.


## Ссылки

1. Linux ed and red commands

  https://www.computerhope.com/unix/ued.htm

2. Регулярки для начинающих

  https://tproger.ru/articles/regexp-for-beginners/

3. "Регулярные кроссворды"

  https://tproger.ru/digest/regex-crosswords/
  https://mariolurig.com/crossword/
