Разворачивание syslog-сервера с веб-интерфейсом

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

Мне же от вебморды много не надо — мне надо чтобы она лог показывала,  фильтры имела, и было бы неплохо чтобы составляла с сервером полностью FOSS-решение. И сам я давно уже использую под это дело LogAnalyzer, который с поставленной задачей — презентовать лог сислог-сервера, собирающего в базу данных логи с различного оборудования — справляется весьма неплохо.

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

Итак, скрипт писался и проверялся на Debian 10 «Buster», его актуальная версия находится на гитхабе, а текущую я оставлю здесь:

loganalyzer_install.sh
 
  1. #!/bin/bash
  2. # Syslog server with web interface for Debian 10
  3. # LAMP + phpmyadmin + rsyslog + Log Analyzer
  4. PHPMYADMINUSER="pma"
  5. PHPMYADMINPASS="321"
  6. SYSLOGDBPASSWORD="Qwerty"
  7. PMAVER="4.9.2"
  8. LAVERSION="4.1.7"
  9. export LANG="en_US.UTF-8"
  10. function check_packages {
  11.     notinstalled=""
  12.     if [ $# -eq 0 ]; then echo "Package name(s) required"; fi
  13.     if [ $# -gt 0 ]; then
  14.         for packagename in $@; do
  15.             if [[ "" == $(dpkg-query  -W --showformat='${Status}\n' ${packagename}  2>&1 | grep "install ok") ]]; then
  16.                 notinstalled=${notinstalled}${packagename}" "
  17.             fi
  18.         done
  19.     fi
  20.     if [[ "" == ${notinstalled} ]]; then
  21.         echo "true"
  22.     else
  23.         echo "${notinstalled}"
  24.     fi
  25. }
  26. ######## MARIA DB
  27. function check_sql {
  28.     if [[ "true" != $( check_packages  mariadb-server ) && "true" != $( check_packages  mysql-server) ]]; then
  29.         echo "false"
  30.     fi
  31.     if  [[ "true" == $( check_packages  mariadb-server ) ]]; then echo "mariadb"; fi
  32.     if  [[ "true" == $( check_packages  mysql-server ) ]]; then echo "mysql"; fi
  33. }
  34. function install_sql {
  35.     apt -y install mariadb-server
  36. #    mysql -uroot -e "UPDATE mysql.user SET Password=PASSWORD('${MYSQLROOTPASS}') WHERE User='root';\
  37. #    DELETE FROM mysql.user WHERE User='';\
  38. #    DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');\
  39. #    DROP DATABASE test;\
  40. #    DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';\
  41. #    FLUSH PRIVILEGES;"
  42. }
  43. ######### PHP
  44. function check_php {
  45.     phpnotinstalled=$( check_packages php libapache2-mod-php php-mysql php-common php-cli  php-json php-gd php-opcache php-readline php-mbstring )
  46.     if [[ "true" != ${phpnotinstalled} ]]; then
  47.         echo "${phpnotinstalled}"
  48.     else
  49.         echo "true"
  50.     fi
  51. }
  52. ######### PHPMYADMIN
  53. function check_phpmyadmin {
  54.     if [[ ! -d /usr/share/phpmyadmin/ ]]; then
  55.         echo "false"
  56.     fi
  57. }
  58. function install_phpmyadmin {
  59. IFS='' read -r -d '' SITECONFIG  <<"EOF"
  60. Alias /phpmyadmin /usr/share/phpmyadmin
  61. <Directory /usr/share/phpmyadmin>
  62.     Options SymLinksIfOwnerMatch
  63.     DirectoryIndex index.php
  64.     <IfModule mod_php5.c>
  65.         <IfModule mod_mime.c>
  66.             AddType application/x-httpd-php .php
  67.         </IfModule>
  68.         <FilesMatch ".+\.php$">
  69.             SetHandler application/x-httpd-php
  70.         </FilesMatch>
  71.         php_value include_path .
  72.         php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
  73.         php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
  74.         php_admin_value mbstring.func_overload 0
  75.     </IfModule>
  76.     <IfModule mod_php.c>
  77.         <IfModule mod_mime.c>
  78.             AddType application/x-httpd-php .php
  79.         </IfModule>
  80.         <FilesMatch ".+\.php$">
  81.             SetHandler application/x-httpd-php
  82.         </FilesMatch>
  83.         php_value include_path .
  84.         php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
  85.         php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
  86.         php_admin_value mbstring.func_overload 0
  87.     </IfModule>
  88. </Directory>
  89. # Authorize for setup
  90. <Directory /usr/share/phpmyadmin/setup>
  91.     <IfModule mod_authz_core.c>
  92.         <IfModule mod_authn_file.c>
  93.             AuthType Basic
  94.             AuthName "phpMyAdmin Setup"
  95.             AuthUserFile /etc/phpmyadmin/htpasswd.setup
  96.         </IfModule>
  97.         Require valid-user
  98.     </IfModule>
  99. </Directory>
  100. # Disallow web access to directories that don't need it
  101. <Directory /usr/share/phpmyadmin/templates>
  102.     Require all denied
  103. </Directory>
  104. <Directory /usr/share/phpmyadmin/libraries>
  105.     Require all denied
  106. </Directory>
  107. <Directory /usr/share/phpmyadmin/setup/lib>
  108.     Require all denied
  109. </Directory>
  110. EOF
  111. if [ ! -f phpMyAdmin-${PMAVER}-all-languages.tar.gz ]; then wget https://files.phpmyadmin.net/phpMyAdmin/${PMAVER}/phpMyAdmin-${PMAVER}-all-languages.tar.gz; fi
  112. tar -xf phpMyAdmin-${PMAVER}-all-languages.tar.gz
  113. mkdir /usr/share/phpmyadmin
  114. cp -r phpMyAdmin-${PMAVER}-all-languages/* /usr/share/phpmyadmin
  115. mkdir -p /var/lib/phpmyadmin/tmp
  116. chown -R www-data:www-data /var/lib/phpmyadmin
  117. mkdir /etc/phpmyadmin/
  118. cp /usr/share/phpmyadmin/config.sample.inc.php  /usr/share/phpmyadmin/config.inc.php
  119. ln -s /usr/share/phpmyadmin/config.inc.php /etc/phpmyadmin/
  120. echo "\$cfg['TempDir'] ='/var/lib/phpmyadmin/tmp';" >> /usr/share/phpmyadmin/config.inc.php
  121. r="\$cfg\['blowfish_secret'\] = '"
  122. sed -i  "s/${r}/${r}$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)/g" /usr/share/phpmyadmin/config.inc.php
  123. echo "$SITECONFIG" >  /etc/apache2/sites-available/phpmyadmin.conf
  124. ln -s /etc/apache2/sites-available/phpmyadmin.conf /etc/apache2/sites-enabled/
  125. service  apache2 restart
  126. mysql -uroot -e "use mysql; CREATE USER ${PHPMYADMINUSER}@localhost IDENTIFIED BY '${PHPMYADMINPASS}'; GRANT ALL ON *.* TO ${PHPMYADMINUSER}@localhost WITH GRANT OPTION;"
  127. service mysql restart
  128. }
  129. ######### SYSLOG
  130. function install_rsyslog_mysql {
  131. debconf-set-selections << END
  132. rsyslog-mysql      rsyslog-mysql/mysql/admin-pass      password
  133. # MySQL application password for rsyslog-mysql:
  134. rsyslog-mysql      rsyslog-mysql/mysql/app-pass      password ${SYSLOGDBPASSWORD}
  135. rsyslog-mysql      rsyslog-mysql/password-confirm      password ${SYSLOGDBPASSWORD}
  136. rsyslog-mysql      rsyslog-mysql/app-password-confirm      password ${SYSLOGDBPASSWORD}
  137. # MySQL username for rsyslog-mysql:
  138. rsyslog-mysql      rsyslog-mysql/db/app-user      string      rsyslog@localhost
  139. # Back up the database for rsyslog-mysql before upgrading?
  140. rsyslog-mysql      rsyslog-mysql/upgrade-backup      boolean      true
  141. # Host running the MySQL server for rsyslog-mysql:
  142. rsyslog-mysql      rsyslog-mysql/remote/newhost      string
  143. # MySQL database name for rsyslog-mysql:
  144. rsyslog-mysql      rsyslog-mysql/db/dbname      string      Syslog
  145. # Reinstall database for rsyslog-mysql?
  146. rsyslog-mysql      rsyslog-mysql/dbconfig-reinstall      boolean      false
  147. rsyslog-mysql      rsyslog-mysql/missing-db-package-error      select      abort
  148. rsyslog-mysql      rsyslog-mysql/remote/port      string
  149. # Perform upgrade on database for rsyslog-mysql with dbconfig-common?
  150. rsyslog-mysql      rsyslog-mysql/dbconfig-upgrade      boolean      true
  151. # Host name of the MySQL database server for rsyslog-mysql:
  152. rsyslog-mysql      rsyslog-mysql/remote/host      select      localhost
  153. # Deconfigure database for rsyslog-mysql with dbconfig-common?
  154. rsyslog-mysql      rsyslog-mysql/dbconfig-remove      boolean      true
  155. # Database type to be used by rsyslog-mysql:
  156. rsyslog-mysql      rsyslog-mysql/database-type      select      mysql
  157. rsyslog-mysql      rsyslog-mysql/upgrade-error      select      abort
  158. rsyslog-mysql      rsyslog-mysql/remove-error      select      abort
  159. rsyslog-mysql      rsyslog-mysql/install-error      select      abort
  160. rsyslog-mysql      rsyslog-mysql/passwords-do-not-match      error
  161. rsyslog-mysql      rsyslog-mysql/internal/skip-preseed      boolean      false
  162. # Delete the database for rsyslog-mysql?
  163. rsyslog-mysql      rsyslog-mysql/purge      boolean      false
  164. # Connection method for MySQL database of rsyslog-mysql:
  165. rsyslog-mysql      rsyslog-mysql/mysql/method      select      Unix socket
  166. rsyslog-mysql      rsyslog-mysql/mysql/admin-user      string      root
  167. rsyslog-mysql      rsyslog-mysql/internal/reconfiguring      boolean      false
  168. # Configure database for rsyslog-mysql with dbconfig-common?
  169. rsyslog-mysql      rsyslog-mysql/dbconfig-install      boolean      true
  170. END
  171. DEBIAN_FRONTEND=noninteractive apt-get install -y rsyslog-mysql
  172. echo "Creating /etc/rsyslog.d/enable-remote.conf"
  173. echo "module(load=\"imudp\")" > /etc/rsyslog.d/enable-remote.conf
  174. echo "input(type=\"imudp\" port=\"514\")" >> /etc/rsyslog.d/enable-remote.conf
  175. echo "module(load=\"imtcp\")" >> /etc/rsyslog.d/enable-remote.conf
  176. echo "input(type=\"imtcp\" port=\"514\")" >> /etc/rsyslog.d/enable-remote.conf
  177. service rsyslog restart
  178. echo "17 2     * * *     root mysql -uroot -e 'use Syslog; DELETE FROM SystemEvents WHERE ReceivedAt < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 365 DAY);'" > /etc/cron.d/rsyslog_mysql
  179. #mysql -uroot -e "CREATE DATABASE Syslog_template;"
  180. #mysqldump -uroot Syslog > /tmp/sql.sql
  181. #mysql -uroot Syslog_template < /tmp/sql.sql
  182. #mysql -uroot -e "TRUNCATE TABLE Syslog_template.SystemEvents"
  183. }
  184. ######### LOG ANALYZER
  185. function install_loganalyzer {
  186. if [ ! -f loganalyzer-${LAVERSION}.tar.gz ]; then wget http://download.adiscon.com/loganalyzer/loganalyzer-${LAVERSION}.tar.gz; fi
  187. tar -xf loganalyzer-${LAVERSION}.tar.gz
  188. cp -r loganalyzer-${LAVERSION}/src/* /var/www/html/
  189. rm -rf ./loganalyzer-${LAVERSION}/
  190. rm /var/www/html/index.html
  191. chown www-data:www-data -R /var/www/html/
  192. #create new db for loganalyzer user and settings with rsyslog user as admin
  193. mysql -uroot -e "create database loganalyzer; grant all privileges on loganalyzer.* to rsyslog@localhost"
  194. #disable new version check during logon into admin panel
  195. r="\$content\['UPDATEURL'\] = \"http://loganalyzer.adiscon.com/files/version.txt\";"
  196. sed -i  "s|${r}|\$content\['UPDATEURL'\] = \"\";|g"  /var/www/html/include/functions_common.php
  197. }
  198. ####
  199. ## MAIN
  200. ####
  201. instaldebconf="false"
  202. installmariadb="false"
  203. installapache="false"
  204. installphp="false"
  205. instalphpmyadmin="false"
  206. installrsyslog="false"
  207. printf "Checking debconf-utils..."
  208. check=$( check_packages debconf-utils )
  209. if [[ $check != "true" ]]; then
  210.     echo "......will be installed"
  211.     instaldebconf="true"
  212. else
  213.     echo "......found!"
  214. fi
  215. printf "Checking sql..."
  216. check=$( check_sql )
  217. case ${check} in
  218.     false)
  219.         echo "................will be installed: MariaDB"
  220.         installmariadb="true"
  221.         ;;
  222.     mysql)
  223.         echo "................MySQL found, it will be used during installation"
  224.         ;;
  225.     mariadb)
  226.         echo "................MariaDB found, it will be used during installation"
  227.         ;;
  228. esac
  229. printf "Checking apache..."
  230. check=$( check_packages apache2 )
  231. if [[ $check != "true" ]]; then
  232.     echo ".............will be installed"
  233.     installapache="true"
  234. else
  235.     echo ".............found!"
  236. fi
  237. printf "Checking php..."
  238. check=$( check_php )
  239. if [[ $check != "true" ]]; then
  240.     echo "................will be installed: ${check}"
  241.     installphp="true"
  242.     phptoinstall=${check}
  243. else
  244.     echo "................found!"
  245. fi
  246. printf "Checking rsyslog-mysql..."
  247. check=$( check_packages rsyslog-mysql )
  248. if [[ $check != "true" ]]; then
  249.     echo "......will be installed"
  250.     installrsyslog="true"
  251. else
  252.     echo "......found!"
  253. fi
  254. printf "Checking phpmyadmin..."
  255. check=$( check_phpmyadmin )
  256. if [[ $check == "false" ]]; then
  257.     echo ".........not found in /usr/share/phpmyadmin/"
  258.     echo
  259.     while true; do
  260.         read -p "Do you wish to install phpmyadmin? (y/n): " yn
  261.         case $yn in
  262.             [Yy] ) instalphpmyadmin="true"; break;;
  263.             [Nn] ) break;;
  264.             * ) echo "Please answer [y]es or [n]o.";;
  265.         esac
  266.     done
  267. else
  268.     echo ".........found!"
  269. fi
  270. echo
  271. echo "This file(s) should be downloaded:"
  272. if [[ ${instalphpmyadmin} != "false" ]]; then echo "https://files.phpmyadmin.net/phpMyAdmin/${PMAVER}/phpMyAdmin-${PMAVER}-all-languages.tar.gz" ; fi
  273. echo "http://download.adiscon.com/loganalyzer/loganalyzer-${LAVERSION}.tar.gz"
  274. echo "You can place this file(s) into current directory manually if you have not an Internet connection."
  275. echo "Debian repository must be accessible!"
  276. echo
  277. read -p "Ok, let's do it. Press ENTER to install, CTRL-C - to abort."
  278. # INSTALL
  279. apt update
  280. if [[ ${instaldebconf} != "false" ]]; then apt -y install debconf-utils ; fi
  281. if [[ ${installmariadb} != "false" ]]; then install_sql ; fi
  282. if [[ ${installapache} != "false" ]]; then apt -y install apache2 ; fi
  283. if [[ ${installphp} != "false" ]]; then  apt -y install ${phptoinstall} ; fi
  284. if [[ ${installrsyslog} != "false" ]]; then  install_rsyslog_mysql  ; fi
  285. installrsyslog
  286. if [[ ${instalphpmyadmin} != "false" ]]; then install_phpmyadmin ; fi
  287. install_loganalyzer
  288. serverip=$(ip addr show | grep -o "inet [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | grep -v "^127.0.0.1" | head -n 1)
  289. echo
  290. echo
  291. echo Installation complete
  292. echo
  293. if [[ ${instalphpmyadmin} != "false" ]]; then
  294.     echo "phpmyadmin address: http://${serverip}/phpmyadmin"
  295.     echo "             login:${PHPMYADMINUSER}"
  296.     echo "          password:${PHPMYADMINPASS}"
  297.     echo
  298. fi
  299. echo "Open IP address of this server in web-browser (http://${serverip}/)"
  300. echo and use next settings for wizard:
  301. echo
  302. echo "User Database Options (optional)"
  303. echo "Enable User Database: Yes"
  304. echo "       Database User: rsyslog"
  305. echo "   Database Password: ${SYSLOGDBPASSWORD}"
  306. echo
  307. echo "First Syslog Source"
  308. echo "                        Source Type: MYSQL Native"
  309. echo "     Database Name (case-sensitive): Syslog"
  310. echo "Database Tablename (case-sensitive): SystemEvents"
  311. echo "                      Database User: rsyslog"
  312. echo "                  Database Password: ${SYSLOGDBPASSWORD}"
  313. echo "                Enable Row Counting: No"

 

Лучше всего использовать его на свежеустановленном дебиане в минимальной конфигурации. Перед запуском нужно его отредактировать, изменив пароль для создаваемого в процессе пользователя (базы данных) rsyslog, а также логин и пароль дополнительного администратора БД, который будет создан в случае установки (опциональной) PhpMyAdmin.  Всего скрипт установит:

  1. mariadb в качестве сервера баз данных,
  2. rsyslog с коннектором rsyslog-mysql в качестве сислог сервера, и создаст конфиг для приема логов по сети
  3. веб-сервер apache
  4. опционально phpmyadmin для управления базой данных
  5. LogAnalyzer.

После завершения работы скрипта останется пройти мастера настройки LogAnalyzer, перейдя в браузере по адресу вашего сервера. Так что если вы решите его использовать, то можете листать к разделу «Настройка LogAnalyzer», а также посмотреть наглядное видео:

Настройка сервера syslog с веб-интерфейсом и хранением логов в базе данных (на Debian 10 «buster»)

Установка debian

Для наших целей подойдет установленный в минимальной конфигурации дебиан. Идеально сразу при установке поставить LAMP-набор, отметив опцию web server

Но можно обойтись пунктом standard system utilities, а все остальное установить самостоятельно. Я буду исходить из этого варианта.

Установка базы данных MariaDB

 
 
  1. apt update && apt -y install mariadb-server

Установка веб-сервера apache

 
 
  1. apt -y install apache2

Установка необходимых модулей PHP

 
 
  1. apt -y install php libapache2-mod-php php-mysql php-common php-cli php-json php-gd php-opcache php-readline php-mbstring

Установка rsyslog

 
 
  1. apt -y rsyslog-mysql

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

Придумываем и подтверждаем пароль для пользователя «rsyslog» БД

После того как сислог будет установлен, его нужно сконфигурировать так, чтобы он мог принимать события с сетевого оборудования. Создаем файл /etc/rsyslog.d/enable-remote.conf с таким содержанием:

/etc/rsyslog.d/enable-remote.conf
 
  1. module(load="imudp")
  2. input(type="imudp" port="514")
  3. module(load="imtcp")
  4. input(type="imtcp" port="514")

И перезагружаем сервис

 
 
  1. service rsyslog restart

Установка веб-интерфейса (LogAnalyzer)

Скачиваем и распаковываем файлы в директорию веб-сервера:

 
 
  1. wget http://download.adiscon.com/loganalyzer/loganalyzer-4.1.7.tar.gz
  2. tar -xvf loganalyzer-4.1.7.tar.gz
  3. rm loganalyzer-4.1.7.tar.gz
  4. cp -r loganalyzer-4.1.7/src/* /var/www/html/
  5. rm /var/www/html/index.html
  6. chown www-data:www-data -R /var/www/html/

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

 
 
  1. mysql -uroot -e "create database loganalyzer; grant all privileges on loganalyzer.* to rsyslog@localhost"

Настройка LogAnalyzer

Теперь к мастеру. Перейдя в браузере по адресу сервера мы должны увидеть его приглашение создать конфиг

Первые два шага пропускаем, интересное  начинается с третьего. Здесь нужно выбрать Enable User Database и ввести имя пользователя (rsyslog)  и пароль с которыми будет производиться подключение к созданной нами базе «loganalyzer». Остальные настройки можно оставить по умолчанию.

На шестом шаге создаем внутреннего администратора лог аналайзера

На следующем шаге выбираем источник данных — базу rsyslog\’а. Важные пункты, которые будет нужно здесь изменить:

  1. Source Type — MYSQL Native
  2. Database Name — Syslog (была создана при установке rsyslog-mysql)
  3. Database Tablename — SystemEvents (именно так — с большими буквами, а не как по дефолту)
  4. Database User — rsyslog
  5. Database Password — пароль юзера rsyslog
  6. Enable Row Counting — No (при объеме логов в несколько гигабайт этот подсчет приводит к более чем минутным запросам к БД)

Next, Finish и перед нами интерфейс лог аналайзера

Тюнинг

Теперь остается сделать две довольно важные вещи.

Во-первых, при попытке логина в админку, лог аналайзер пытается проверить свое собственное обновление, и это приводит к длительному ожиданию, если сервер не имеет выхода в интернет. Чтобы этого не происходило — нужно отредактировать файл /var/www/html/include/functions_common.php, изменив строку

 
 
  1. $content['UPDATEURL'] = "http://loganalyzer.adiscon.com/files/version.txt";

на

 
 
  1. $content['UPDATEURL'] = "";

Второе, и не менее важное. Со временем база сислога будет опухать, поэтому ее стоит периодически очищать от старых записей. Для этого нужно создать файлик /etc/cron.d/rsyslog_mysql с содержимым

 
 
  1. 23 2     * * *     root mysql -uroot -e 'use Syslog; DELETE FROM SystemEvents WHERE ReceivedAt < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 365 DAY);'

С ним каждый день из базы будут удаляться записи старше 365 дней (разумеется это количество можно поправить на необходимое)

 

Почему российская локализация фильмов сосет

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

Если вкратце: один из пунктов, который относится непосредственно к озвучке, и который меня неимоверно раздражает — особая стилистика озвучания, выраженная в каком-то… как бы выразиться… голосе-в-вакууме. Голоса в нашей озвучке очень часто звучат именно так — словно текст произносится в вакууме, отрезанном от окружающего мира. Словно актер озвучания находится в комнате увешанной коврами. И это, может быть, хорошо для записи голоса, но когда это в таком виде втыкают в итоговую звуковую дорогу, то начинает казаться, что все окружение вокруг персонажей — иллюзия, а они вещают из гробовой тишины космоса. И в сочетании с тембрами голосов это напрочь убивает и погружает в сон спустя полчаса просмотра фильма.

Пример — вот это отрывок из зеленой мили. Он и в оригинале очень негромкий, снятый в замкнутом пространстве без особых шумов, типа шума улицы или природы. Но даже при этом есть эта разница между оригинальной озвучкой и российской.

Оригинал (с 1:18):

Локализация:

vSphere Launch Remote Console — сменить Workstation на Player в Linux

После переустановки VMware Workstation возникла проблема — ссылка «Launch Remote Console» в web-интерфейсе vSphere стала открываться при помощи основного Workstation вместо более легкого и не требующего аутентификации Player-приложения. Чинится в линуксе очень просто:

 
 
  1. xdg-mime default vmware-player.desktop  x-scheme-handler/vmrc

 

Не проверял, но по идее аналогично можно переключить на непосредственно VMware Remote Console, поставив название его ярлыка вместо «vmware-player.desktop» (ярлыки искать в /usr/local/share/applications/)

Было ли на самом деле обещано построить коммунизм к 1980-му году?

Вот уж не подумал бы, что окунусь в выяснение сабжевого вопроса =) Однако слово за слово, и мнения коллег разделились на «да, было, про 80-й год буквально в школе учили», и «было про текущее поколение, которое будет жить при коммунизме, но без конкретных дат».

Что ж, пришлось порыться в «Правде» за 61-й год, чтобы выяснить, что верны оба мнения.

В номере 211 от 30-го июля, на странице 9, опубликованный проект программы партии заканчивается словами:

Аналогично выглядит конец опубликованной резолюции съезда компартии — номер 306 от 1-го ноября, страница 4:

Это единственное упоминание сроков в каком бы то ни было виде, и таким образом в официальных документах, по крайней мере этих двух, действительно нет конкретных дат. Однако, в номере 293 от 19го октября опубликован доклад Хрущева «О программе коммунистической партии советского союза». На третьей странице (вторая колонка, 4-й абзац) приводятся сроки реализации обсуждаемой программы:

Вот из этого срока в 20 лет, вероятно, и взялось убеждение что в 80-м году (на самом деле в 81-м) будет построен коммунизм (на самом деле: построено «в основном коммунистическое общество»).

  • Правда, 1961 , № 211 (pdf) — Газета Правда. Программа коммунистической партии советского союза
  • Правда, 1961 , № 293 (pdf) — Газета Правда. О программе коммунистической партии советского союза — доклад товарища Хрущева на XXII съезде коммунистической партии советского союза 18 октября 1961 года
  • Правда, 1961 , № 306 (pdf) — Газета Правда. Резолюция XXII съезда коммунистической партии советского союза по отчету центрального комитета КПСС

Девятая планета — интервью с Батыгиным и комментарий астронома

Некоторое время назад вышло очень любопытное интервью с ученым российского происхождения Константином Батыгиным, который сформулировал гипотезу о существовании еще одной планеты в солнечной системе. Оно само по себе достойно репоста, но сейчас появился еще небольшой комментарий от астронома пулковской обсерватории — Кирилла Масленникова, который мне еще раз напомнил всю эту историю и, я думаю, правильно будет оба ролика собрать в одном месте.

Вересаев, «Записки врача» — окно в дореволюционную Россию

Прочитал, сталбыть, сабж. Очень крутая книжка, которую я постарался найти в бумаге и в оригинале — текст изначально 1902-го года и переиздавался позже в СССР с современной орфографией. Не пожалел ни разу — дореволюционная стилистика (а это не только «яти», но и все слова и обороты, которые сегодня не встретишь) очень важна для большего погружения в то время, когда текст был написан. Мысль автора, будучи переведенной даже с русского на русский, определенно теряет в том окрасе и интонациях, которые позволяют прочувствовать «разговор» с автором, принадлежащим «той» эпохе. Одним из ярких впечатлений для меня остается натыкание на войну миров — ну да, ту, с Томом Крузом, которую я так и не посмотрел:

Какое же старое произведение!  Именно при таком прочтении ощущается эта старость — романъ «Борьба мiровъ»… круть!

Так вот, «Записки врача» — это не только автобиографические заметки и мысли Вересаева о состоянии медицины на пороге веков, но и в принципе — весьма увлекательное окно в ту эпоху, так как нельзя говорить о медицине, не упоминая условий жизни пациентов. Хотя и о медицине Вересаев рассказывает увлекательно, поднимая довольно неочевидные, на первый взгляд, проблемы — часто морально-этического характера. Делает это он сквозь призму своих собственных ощущений от работы, которые у него менялись с течением времени.

Странно читать о плацебо — таком, вроде бы, современном и «на слуху» термине — в книге столетней давности.

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

Много о врачебной этике, о том как она подчас мешает; с какими противоречиями сталкиваются врачи, которые должны сострадать пациентам, но в тоже время относиться к ним чуть ли не как к вещам, чтобы эффективно работать. Об отношении пациентов к врачам — о том, как сильно оно зависит от результатов лечения при, порой, таком течении болезни, которое невозможно контролировать. Ну и конечно прилично зарисовок условий жизни, которые прямым образом влияют на здоровье.

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

А добавить к этому недоверие пациентов, вызванное не 100% гарантированным исцелением? Усугубляющим это недоверие появлением массы новых непроверенных лекарств, рекламой в газетах обещающих верное исцеление. Да и сами газетчики, ради громких заголовков высмеивающие врачей медицину в принципе — также упомянуты. И, конечно, проблема денег — медицине еще далеко до госфинансирования, и врачу самому нужно как-то зарабатывать. Здесь Вересаев  снова рассматривает и морально-этические вопросы, вроде «брать деньги с человека которому не смог помочь, или голодать?», и упоминает тяжелое положение медицины в деревнях, где нет пациентов, которые могли бы прокормить врача

 

В общем отличная книга — я остался крайне доволен возможностью немного ознакомиться с этим, так сказать, слоем жизни столетней давности. Какие-то вещи сейчас кажутся почти дикими, какие-то — на удивление почти не изменились, и это рождает ощущение связанности эпох. Обычно кажется что «тогда» — это какое-то очень далекое прошлое, в котором жили какие-то совсем другие люди, которые совершенно никак не относятся ни к нам, ни к нашей жизни сейчас. А читаешь такую книгу, и понимаешь что все те люди и их жизнь — не какой-то прям миф, а что-то буквально вчерашнее, с чем есть куча точек соприкосновения. Рекомендую.

Хорошо забытое старое?

«Столица идет в авангарде повышения уровня жизни». На «России 24» рассказали о достоинствах 11-метровых квартир

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

Ох щи… Да это же…

Дома хрущёвской постройки (разговорное «хрущёвки») — советские типовые панельные или кирпичные жилые дома, обычно 5-этажные, с малогабаритными квартирами.

С началом строительства хрущёвок советское домостроение стало преимущественно индустриальным. Хрущёвки в сравнении со сталинками, возводившимися только из кирпича, имели квартиры меньших размеров, архитектура домов была предельно проста и функциональна. (с) вики

Интересно, качество этих построек будет тоже аналогичным? Лет на 20, а там будь что будет.

В Нью-Йорке запретили фуа-гра

Читаю новость:

Законодатели обосновали запрет на фуа-гра тем, что производство деликатеса зачастую предполагает жестокое обращение с птицами: они подвергаются принудительному кормлению через трубку в горле, из-за чего их печень увеличивается до 10 раз. (c) meduza.io

Странная хреновина. Где проходит граница между жестоким обращением путем принудительного кормления, и жестоким обращением путем забоя животных в принципе? Почему закармливать — жестоко, а убивать буренку чтобы сожрать — норм? Можно же и просто забойных животных содержать так, что захочется воскликнуть: «Это же жестоко!», но все эти разговоры о жестокости базируются не на каких-то объективных параметрах, не на мнении животных, а тупо на каких-то субъективных оценках какой-то части общества, которая решает что сегодня жестоко, а что — нет. А при таких раскладах завтра можно будет сказать что разводить скот для жратвы и меха — жестоко и надо запретить. Но если это бред, то чем менее бредово запрещать фуа-гра?

Аладдин / Aladdin (2019)

Чтоооож-ж-ж…. Только что посмотрел очередной римейк от диснея. И, пожалуй, придется признать, что стоило мне больше верить в Гая Ричи. Понравилось =) Постараюсь без спойлеров.

Самое главное и основное, что бросается в глаза и о чем хочется сказать: это не попытка переснять то, что уже было, покадрово. И это было вдвойне сложнее, потому что все ключевые сцены и песни здесь в наличии, и невероятно радует, что сюжет при этом строился явно «по мотивам» и в деталях довольно серьезно расходится с первоисточником.

Конечно, любые нововведения могут быть удачными и неудачными, оправданными и не очень, так что будет справедливо сказать о том — что же не удалось. На мой взгляд, в фильме есть только один… скажем так косячок, который довольно незначителен на самом деле, но при этом, что забавно, таки связан с курсом на феминизацию. Речь про первое желание Джаффара, который, в отличие от мультфильма, здесь желает стать султаном Аграбы. Сама реализация этого желания джинном — совершенно странная и непонятная, сводящаяся к переодеванию Джаффара в новые шмотки — приводит к конфронтации с начальником стражи, и именно развязка этой конфронтации — явно та сцена, ради которой вообще все затевалось, все чтобы принцесса вышла и толкнула речь. И проблема здесь, как ни странно, не в финале этой сцены, не в феминизации, ни в том что Жасмин хочет быть сильной и независимой более чем в мультфильме — нет! Проблема именно в сцене «я хочу быть султаном», в том, что такое желание, будучи исполнено правильно и логично, не привело бы к такой развязке. На мой взгляд.

Все другие изменения — явно пошли на пользу, если не в смысле улучшения фильма в сравнении с оригиналом, то, по крайней мере, на пользу восприятия этого фильма как самостоятельного произведения. Новый Аладдин — это больше мьюзикл, чем фильм. Да, оригинальный мульт тоже им был, но именно с живыми актерами, дополнительными песнями и музыкой (сцена танцулек после прибытия принца Али — отличная), с декорациями, построенными в замкнутых пространствах, — ощущение театральности просто не покидает. Из-за этого ощущения сразу меняется восприятие режиссуры и оценка того как сняты сцены, и из-за этого же хочется простить фильму ряд довольно спорных и недокрученных спецэффектов (но не джинна, джинна надо было делать менее… пластиковым… не знаю, плохой джинн…) — некоторые из них действительно слабоваты для фильма-блокбастера, но для «очень размашистой театральной постановки» — все очень даже хорошо. Хорошие костюмы, хорошая хореография, вполне хорошее исполнение песен.

По касту. Многие ругают Джаффара, мол молодой, не сильно уж страшный… Ну, не могу как-то однозначно выразить свое отношение к этому персонажу. Думаю, в основном, его ругают все же за непохожесть на оригинальный образ. Но здесь и султан сильно отличается от мультяшного, и отношения между персонажами подаются немного в другом, более «реалистичном» ключе. Возможно, местному Джаффару не помешало бы быть постарше, но, с другой стороны, его амбиции, как мне показалось, вполне подходят человеку его возраста. Здесь он тоже бывший бедняк, и понятно его желание стать «номером один» в расцвете своих сил. Что до Аладдина и Жасмин — они… довольно приятные для мьюзикла, я бы так сказал. На мой взгляд обоим им не хватает харизмы, чтобы их образы врезались в память, и их поведение, особенно Аладдина, здесь менее яркое. Это опять же идет на пользу сюжету — Аладдин не такой энергичный и уверенный в себе пройдоха, каким был в мультфильме, здесь у него больше препятствий на пути к Жасмин, новые проблемы — новые решения, наблюдать за этим интересно. Но тот яркий образ из оригинала новому вряд ли удастся переплюнуть. Что же касается Жасмин — она здесь, пожалуй, более умная и сообразительная, чем в оригинале, и ее желания, я бы сказал, слегка переоформлены. Не радикально отличаются от «достал дворец, хочу сама чего-то решать», но тем не менее мне показалось что ее новый образ слегка недожат. Ее амбиции все ж таки требуют какой-то основы, предъявляют повышенные требования к личности и, может быть, тут бы стоило поработать чуть получше. А может быть и так сойдет — честно говоря какого-то дикого возмущения во время просмотра у меня не было, да и сама Жасмин показана не просто мечтающей о чем-то там принцессой, которая нифига не знает, не умеет, и целыми днями только и занята что своей большой кисой и забегами по рынку.

В общем, к актерам у меня больших претензий нет. Из Уилла Смита — со многими тут согласен — вышел очень добротный джинн. Спецэффекты — хороши для размашистого театрального действа, коим фильм по-моему и является. Сюжет — базируется на старой истории, но при этом достаточно сильно отличается, то там то тут, чтобы не заскучать и не начать от скуки сравнивать сцены покадрово. Лучше ли этот фильм, чем оригинальный мульт? Хрен знает как их сравнивать — все равно что пытаться сравнить фильм и спектакль, или мультфильм и книгу. И там и тут есть однозначно хорошие моменты, оба произведения вызывали у меня приятные, но при этом совершенно разные ощущения. На мой взгляд новый Аладдин достоин просмотра ничуть не менее Аладдина старого, но его способность понравиться, как мне кажется, во многом будет зависеть как от ожиданий смотрящего, так и от правильного восприятия жанра этого произведения. Я же поставлю 8 из 10.