Легкопереносимый вариант установки Ксены.

AfterWork

Только чтение
Сообщения
64
Реакции
11
Баллы
1,705
Сразу прошу сильно ногами не пинать за кривизну некоторых решений и корявость кода. Все было написано и собрано за пару часов. Кроме этого моё общение с docker на тот момент исчислялось чуть больше чем теми-же парой часов.
Задумка была такой:
Хотелось сделать скрипт автоустановки ксены на чистую ВПС с восстановлением форума из бакапа причем в режиме "без заморочек". Типа ткнул кнопку и пошел курить.
Надеюсь кому-то будет полезно. Критика приветствуется.

Процесс вышел простым и незатейливым.
В качестве хост системы используется Debian 8.3 x64. На этой-же платформе сделаны и контейнеры docker.
1. Копируем архив нашего форума на удаленный хост в /root и распаковываем.
Код:
scp backup.tar.gz [email protected]:
Немного о структуре архива. В скриптах всё прибито гвоздями по этому структуру каталогов стоит первично разок воспроизвести.

/root/Data/ - Основной каталог архива. В нем лежат все скрипты.
/root/Data/www/site.com/ - каталог с файлами ксены.
/root/Data/sql/ - каталог с бакапом БД ксены.
/root/Data/conf/site.com/ - конфиг nginx.conf
/root/Data/conf.d/site.com/ - и еще конфиг default.conf

Структура получилась именно такой просто потому что в процессе написания всего этого время поджимало и задачи постепенно сужались. :-)

В качестве основы было решено использовать docker и в него завернуть по отдельности nginx, php-fpm и mariadb. После все слинковать.

nginx.conf
Код:
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid  /var/run/nginx.pid;


events {
  worker_connections  1024;
}


http {
  include  /etc/nginx/mime.types;
  default_type  application/octet-stream;

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';

  access_log  /var/log/nginx/access.log  main;

  sendfile  on;
  #tcp_nopush  on;

  keepalive_timeout  65;

  #gzip  on;

  include /etc/nginx/conf.d/*.conf;

default.conf
Код:
server {
  listen  80;
  listen 443 ssl;
  server_name  site.com;

  root  /home/site.com;

  client_max_body_size 100m;

  location / {
  index  index.html index.htm index.php;
  try_files $uri /index.php$is_args$args;
  }

  location ~ \.php$ {
  include fastcgi_params;
  fastcgi_pass  phpfpm:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
  }
}
Ничего примечательного. Работает. Думаю каждый на свой вкус поправит как ему надо.

В основном каталоге еще лежит 5 исполняемых файлов скриптов. Содержимое ниже.

Backup.sh
Код:
#!/bin/bash

#Удаление предидущего резерва.
cd /root/BackUp/
rm *.tar.gz

#Делаем резервную копию БД.
docker exec mariadb /var/lib/mysql/bakBD.sh

#Копируем файлы.
mkdir /root/BackUp/Data
cd /root/BackUp/Data
mkdir conf conf.d www sql
cp -a /root/nginx/conf/* ./conf/
cp -a /root/nginx/conf.d/* ./conf.d/
cp -a /root/www/* ./www/
cp -a /root/mysql/*.sql ./sql/
cp /root/mysql/restBD.sh restBD.sh
cp /root/mysql/bakBD.sh bakBD.sh
cp /root/BackUp/Backup.sh Backup.sh
cp /root/BackUp/Rotate.sh Rotate.sh
cp /root/BackUp/Inst_forum.sh Inst_forum.sh

#Перезапуск контейнеров.
service docker restart

# Пакуем и удаляем.
tar cvvzf "/root/BackUp/bak-`date +%F-%X`.tar.gz" /root/BackUp/Data/
cd /root/BackUp
rm /root/mysql/*.sql
rm -r Data
cp *.tar.gz ./ThisWeek/
bakBD.sh
Код:
#!/bin/bash

var_data=`date -u +%d%m%Y`

mysqldump -u root -pПАРОЛЬ test_xeno > /var/lib/mysql/test_xeno_$var_data.sql
Inst_forum.sh
Код:
#!/bin/bash

#Создаем структуру папок и файлов.
cd /root
mkdir BackUp BackUp/ThisWeek BackUp/LastWeek

#Ставим MariaDB.
docker run --restart=always --name mariadb -v /root/mysql:/var/lib/mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=ПАРОЛЬ -d mariadb:latest

#Ставим nginx проксю. Может быть позже.
#docker run -d -p 80:80 -p 443:443 --restart=always --name proxy -v /root/nginx/htpasswd:/etc/nginx/htpasswd -v /root/nginx/ssl:/etc/nginx/certs  -v /var/run/docker.sock:/tmp/docker.sock:ro  jwilder/nginx-proxy

#Ставим PHP+FPM.
docker run -it --restart=always --name phpfpm --link mariadb:mysqlip -v /root/www:/home antares127/xen-phpfpm

#Ставим nginx.
docker run -e VIRTUAL_HOST=site.com,www.site.com --restart=always --name site.com --link mariadb:mysqlip --link phpfpm:phpfpm -v /root/nginx/conf.d/site.com:/etc/nginx/conf.d -v /root/nginx/conf/site.com:/etc/nginx/conf:ro -v /root/nginx/ssl/site.com:/etc/nginx/ssl -v /root/www/site.com:/home/site.com -d -p 80:80 nginx

#Рестартуем docker
service docker restart

#Разворачиваем бакап.
cd /root/Data
cp -a ./conf/* /root/nginx/conf/
cp -a ./conf.d/* /root/nginx/conf.d/
cp -a ./www/* /root/www/
cp -a ./sql/test_xeno*.sql /root/mysql/test_xeno.sql
cp Inst_forum.sh /root/BackUp/Inst_forum.sh
chmod +x /root/BackUp/Inst_forum.sh
cp restBD.sh /root/mysql/
chmod +x /root/mysql/restBD.sh
cp bakBD.sh /root/mysql/
chmod +x /root/mysql/bakBD.sh
cp Backup.sh /root/BackUp/Backup.sh
chmod +x /root/BackUp/Backup.sh
cp Rotate.sh /root/BackUp/Rotate.sh
chmod +x /root/BackUp/Rotate.sh


#Восстанавливаем базу.
docker exec -it mariadb /var/lib/mysql/restBD.sh

#Рестартуем docker
service docker restart

#Делаем первую резервную копию.
docker exec mariadb /var/lib/mysql/bakBD.sh

mkdir /root/BackUp/Data
cd /root/BackUp/Data
mkdir sql conf conf.d www
cp -a /root/nginx/conf/* ./conf/
cp -a /root/nginx/conf.d/* ./conf.d/
cp -a /root/www/* ./www/
cp -a /root/mysql/*.sql ./sql/
cp /root/mysql/restBD.sh restBD.sh
cp /root/mysql/bakBD.sh bakBD.sh
cp /root/BackUp/Backup.sh Backup.sh
cp /root/BackUp/Rotate.sh Rotate.sh
cp /root/BackUp/Inst_forum.sh Inst_forum.sh
tar cvvzf "/root/BackUp/bak-`date +%F-%X`.tar.gz" /root/BackUp/Data/
cd /root/BackUp
rm -r Data
rm /root/mysql/*.sql
cp *.tar.gz ./ThisWeek/


#Настраиваем крон для резервного копирования.
touch test
echo "08 04 * * * /root/BackUp/Backup.sh" >> test
echo "01 04 * * 3 /root/BackUp/Rotate.sh" >> test
crontab test
rm test
restBD.sh
Код:
#!/bin/bash

var_data=`date -u +%d%m%Y`

mysqldump -uroot -pПАРОЛЬ test_xeno > /var/lib/mysql/tcc1_test_$var_data.sql

mysql -u root -pПАРОЛЬ -e"DROP DATABASE test_xeno"
mysql -u root -pПАРОЛЬ -e"CREATE DATABASE test_xeno"
mysql -u root -pПАРОЛЬ -e"USE test_xeno"
mysql -u root -pПАРОЛЬ -e"GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'ПАРОЛЬ'"
mysql -u root -pПАРОЛЬ -e"FLUSH PRIVILEGES"
mysql -u root -pПАРОЛЬ test_xeno < /var/lib/mysql/test_xeno.sql
mysql -u root -pПАРОЛЬ -e"SHOW DATABASES"
Rotate.sh
Код:
#!/bin/bash

#Копируем файлы.
cd /root/BackUp/
rm -r ./LastWeek/
mkdir LastWeek
mv ./ThisWeek/* ./LastWeek/

Чуть не забыл. Нам нужен еще два файлика чтобы подготовить чистую машину для работы с docker.
Я их так и не удосужился запихать внутрь архива. Вот они.
fw.sh
Код:
#!/bin/sh
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -F
iptables -t nat -F
iptables -t mangle -F

iptables -X
iptables -t nat -X
iptables -t mangle -X
/etc/init.d/docker restart
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -i eth0 --match state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 --match state --state NEW -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 1193 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 1194 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -o eth0 --match state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Inst_Dock.sh
Код:
#!/bin/bash
#variables to file
echo "IP_ADDR=`ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/'`" > .vars
apt-get update
echo "deb http://apt.dockerproject.org/repo debian-jessie main" >> /etc/apt/sources.list
apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
apt-get update
apt-cache policy docker-engine
sudo apt-get update
apt-get install -y docker-engine curl fail2ban

curl -L https://github.com/docker/compose/releases/download/1.5.0/run.sh > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
/etc/init.d/fail2ban restart
cp fw.sh /etc/init.d/fw.sh
chmod +x /etc/init.d/fw.sh
update-rc.d fw.sh defaults
/etc/init.d/fw.sh

Содержимое файла config.php в каталоге ксены будет в этом случае таким
Код:
<?php

$config['db']['host'] = 'mysqlip';
$config['db']['port'] = '3306';
$config['db']['username'] = 'root';
$config['db']['password'] = 'ПАРОЛЬ';
$config['db']['dbname'] = 'test_xeno';


Что мы в итоге получаем на выходе:
1. Полностью рабочий форум.
2. Выполняется ежедневное резервное копирование форума с недельной ротацией. (Хоть и на локальный диск сервера) :-)
3. Все необходимые для развертывания форума на новой машине скрипты лежат в самом бакапе.
4. Логичную и удобную структуру данных на машине с форумом.
5. Возможность автоматом и не заморачиваясь сделать немедленно резервную копию форума.
6. Условно настроенный iptables. :-)

Вполне логично что во всех скриптах везде нужно заменить слово ПАРОЛЬ на пароль от вашей BD, test_xeno на имя вашей BD, а site.com на имя вашего домена.

Как-то так. Думаю новичкам будет не бесполезно.
 
Спасибо человеку который написал часть этих скриптов и подал идею.
 
Все хорошо, а docker то зачем?
 
Все хорошо, а docker то зачем?
Хороший вопрос. Вот ответ:
1. Как Вы наверное заметили в скриптах есть еще ряд избыточных вещей которые явно задел на что-то другое. Например мультисайт. Мне показалось с докером это реализовать удобнее.
2. Группа скриптов которые использованы в примере, заточена не только под развертывание ксены. Ксена только одна из опций. И без докера в этом случае сложно.
3. Мне приходилось переносить ксену как между ВПС-ками разных хостеров так и на физические сервера и не только я сам это делал. Докер в данном случае дань унификации процесса.

Надеюсь я ответил.
Меня гложут сомнения насчет производительности такой системы. Но случая протестировать её на тяжелом проекте и сравнить не было.
 
  • Мне нравится
Реакции: Exus
Как делал бы я.
Бекап: rsync + rsnapshot на его основе обеспечат файловый бекап директорий сайтов, каталога с предварительно созданным mysqldump дампом баз (несложная sh-обвертка), служебных директорий и файлов. Локально или на бекапный сервер, предварительно закинув туда ключ, over ssh. Получается компактно, производительно.

Разворачиваем, автоматизация?
Закидываем ключ, подключаем репозитории, yum/apt-get update/install бла-бла, восстанавливаем служебные файлы/директории (вместо некоторых служебных файлов можно писать скриптики, их генерирующие с привязкой к местности, (ip, хостнейм, юзверь, etc), хомяки через rsync, стартуем mysql, заливаем дампы, ребут. Если все ок, включаем/настраиваем бекап.

Продолжаем? Осваиваем puppet/ansible/etc.

Профит: репы (я могу держать свои, собирая бинарники со своими опциями) быстрее. Нет проблем бекапить/перенести сайты (и не только сайты) в десятки и сотни гиг, это быстро и не ресурсоемко, компактно, можно откатить к нужной дате. Конфиги еще можно таскать гитом и обвертками на его основе, это уже следующий уровень.

В чем профит докера для деплоя рабочих проектов? Стоит ли оно оверхеда на контейнеры?
 
Последнее редактирование:
Как делал бы я. .... это уже следующий уровень.

В чем профит докера для деплоя рабочих проектов? Стоит ли оно оверхеда на контейнеры?
Можно спорить о разных вариантах сборки рабочей среды под ксену. У каждого будет свой любимый. Какой лучше, реально не доказуемо.

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

P.S. Докер я выбрал не потому что он чем-то лучше иных вариантов, а потому, как и говорил выше, ксена просто еще один из продуктов интегрированных в общую систему, которая как из кирпичиков позволяет собрать разные конфигурации площадок и продукты на них могут обновляться не мешая друг другу. Да и не стану говорить что у меня опыт работы с линуксами такой уж огромный был на момент когда понадобилось развертывать и сопровождать ксену. С докером удалось разобраться до уровня написания статьи, за пару-тройку дней.
 
AfterWork, первый пост - это такое нагромождение костылей, что как решение это нельзя рекомендовать новичку для рабочего проекта, а для тестового это несколько громоздко.
Например вот это
mysql -u root -pПАРОЛЬ -e"DROP DATABASE test_xeno"
mysql -u root -pПАРОЛЬ -e"CREATE DATABASE test_xeno"
mysql -u root -pПАРОЛЬ -e"USE test_xeno"
mysql -u root -pПАРОЛЬ -e"GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'ПАРОЛЬ'"
mysql -u root -pПАРОЛЬ -e"FLUSH PRIVILEGES"
я бы записал вот так вот
Код:
mysql -uroot -ppasswd --execute="create database \`$db_name\`;grant all on \`$db_name\`.* to '$db_user'@'localhost' identified by  \'$db_user_password\';"
вынеся переменные пользовательской базы в шапку скрипта или передавая параметрами, потому что эти же переменные уйдут в library/config.php (не говоря уже о том, что если юзверь рут в базе, то достаточно голого create database)
Архиважный вопрос с правами на файлы и директории вообще не рассмотрен. Докер приплетен ни к селу, ни к городу, в чем разница между yum install -y nginx php mariadb-server (и затем yum update по мере необходимости) + готовые конфиги поверх + запуск сервисов? А почему не systemd-nspawn?

Какой лучше, реально не доказуемо.
Я не собираюсь доказывать. Я начал со слов "как делал бы я", дав направления, куда стоит посмотреть.

Делал аналогичный заказ, куча однотипных сервисов, брал , разворачивал в нем готовое окружение, которое потом клонировалось в нужном количестве.
Получилось довольно удобно.
 
  • Мне нравится
Реакции: Hope
AfterWork, первый пост - это такое нагромождение костылей, что как решение это нельзя рекомендовать новичку для рабочего проекта, а для тестового это несколько громоздко.
Например вот это
А кто спорит что это костыли? По моему никто не спорит. Но в отличии от ВАШЕГО "направления куда копать", коих кстати в инете гораздо больше чем Вам может показаться, это хоть и грубая но РАБОЧАЯ инструкция как сделать чтобы работало. Сейчас этот скрипт выглядит на много более причесанным и красивым хотя и сейчас есть что в нем доработать.
я бы записал вот так вот
Код:
mysql -uroot -ppasswd --execute="create database \`$db_name\`;grant all on \`$db_name\`.* to '$db_user'@'localhost' identified by  \'$db_user_password\';"
вынеся переменные пользовательской базы в шапку скрипта или передавая параметрами, потому что эти же переменные уйдут в library/config.php (не говоря уже о том, что если юзверь рут в базе, то достаточно голого create database)
Великолепное дополнение. И возможно кто-то им воспользуется если сможет понять о чем Вы говорите этой фразой: "вынеся переменные пользовательской базы в шапку скрипта или передавая параметрами"
Еще раз повторю, надо понимать разницу между "пошаговой инструкцией" и "направлением куда копать". Направлений для копания в инете ГОРА. И еще один полусовет от ГУРУ никому не нужен. Даже не тупым и не ленивым для начала нужна ПРОСТАЯ инструкция которая РАБОТАЕТ хоть как-то. Потому что надо запуститься, а уже после этого смотреть в каком направлении копать, как приводить все в порядок и тому подобное.
Архиважный вопрос с правами на файлы и директории вообще не рассмотрен.
Верно, не рассмотрен. На момент написания статьи этого еще не было. Я же не претендую на то что статья идеальна. :) Будет время, обновлю статью.
Докер приплетен ни к селу, ни к городу, в чем разница между yum install -y nginx php mariadb-server (и затем yum update по мере необходимости) + готовые конфиги поверх + запуск сервисов? А почему не systemd-nspawn?
Мне жаль что Вы не понимаете в чем разница. Она есть, хоть и не очевидна. Уж думаю не мне Вам пояснять в чем она состоит.

Я не собираюсь доказывать. Я начал со слов "как делал бы я", дав направления, куда стоит посмотреть.
Выше я писал про бестолковость советов о том куда копать. И причину бестолковости таких советов. Статья написана для других целей.
Делал аналогичный заказ, куча однотипных сервисов, брал , разворачивал в нем готовое окружение, которое потом клонировалось в нужном количестве.
Получилось довольно удобно.
Очень может быть. Напишите статью. Это будет полезнее праздных рассуждений о том как можно сделать.
 
Выше я писал про бестолковость советов о том куда копать. И причину бестолковости таких советов. Статья написана для других целей.
Моя аудитория - люди, умеющие читать хендбуки, маны и документацию, и где ctrl-v/ctrl+v считается медвежьей услугой.
 
Моя аудитория - люди, умеющие читать хендбуки, маны и документацию, и где ctrl-v/ctrl+v считается медвежьей услугой.
Это аудитория ОЧЕНЬ узкоспециализированная. И чаще всего профессиональная. В такой аудитории спорят о нюансах реализации просто потому что есть варианты, а не потому что один из вариантов лучше другого. Эта аудитория в паблики просто иногда захаживает но не сидит в них. У этой аудитории есть узкоспециализированне ресурсы на которых им сидеть действительно интересно.
Но даже такого уровня спецам иногда бывает нужно решить задачу не из их области. И вот тогда эти спецы обращаются в паблики потому что знают что для того чтобы полноценно решить задачу надо или нанять спеца которому доверяешь или стать таким спецом. Первое бывает невозможно по объективныым причинам, а второе просто долго и бестолково по причине еденичности или малочисленности задачи. Вот и ищется готовое решение по которому можно быстро создать/оценить систему и запустить её. И в первую очередь важно не качество решения и его повторяемость. И когда вместо решения видишь высокопарные отсылы в духе покопай-ка в направлении туда, это не может не раздражать. Особенно когда только на такие отсылы в разных направлениях и натыкаешься.

Если бы Вы спросили о том как в общих чертах обеспечить бесперебойным питанием ферму в 20 юнитов, а я вместо простого очень приближенного решения по оценке необходимой мощности ИБП отправил бы вас читать мануал по проектированию систем бесперебойного питания, Вас бы это тоже разозлило скорее всего. Хотя-бы потому что Вы и без моего совета знаете что есть мануалы которые можно почитать и научиться самостоятельно.

А маны и документацию лично я умею читать и научился этому весьма и весьма давно. Просто специализируюсь я не на настройке и установке ПО серверов.
 
Особенно когда только на такие отсылы в разных направлениях и натыкаешься.
По делу? По делу. В чем тогда вопрос?

Вот что может быть непонятного во фразе
вынеся переменные пользовательской базы в шапку скрипта или передавая параметрами
Я же не должен читать лекцию о том, как пишутся скрипты, про переменные и почему не надо писать
Код:
mysqldump -uroot -pПАРОЛЬ test_xeno > /var/lib/mysql/tcc1_test_$var_data.sql

mysql -u root -pПАРОЛЬ -e"DROP DATABASE test_xeno"
mysql -u root -pПАРОЛЬ -e"CREATE DATABASE test_xeno"
mysql -u root -pПАРОЛЬ -e"USE test_xeno"
mysql -u root -pПАРОЛЬ -e"GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'ПАРОЛЬ'"
mysql -u root -pПАРОЛЬ -e"FLUSH PRIVILEGES"
mysql -u root -pПАРОЛЬ test_xeno < /var/lib/mysql/test_xeno.sql
mysql -u root -pПАРОЛЬ -e"SHOW DATABASES"
а лучше писать как в примере?
 
Последнее редактирование:
Вот что может быть непонятного во фразе: вынеся переменные пользовательской базы в шапку скрипта или передавая параметрами.

Поверьте многое. Особенно если тебе за день-два надо ну хоть минимально освоить как минимум 2-е незнакомых системы. Как пример, впервые сталкиваешься с линуксом и впервые ставишь ксенфоро.
Я же не должен читать лекцию о том, как пишутся скрипты, про переменные и почему не надо писать:
Код:
mysqldump -uroot -pПАРОЛЬ test_xeno > /var/lib/mysql/tcc1_test_$var_data.sql

mysql -u root -pПАРОЛЬ -e"DROP DATABASE test_xeno"
mysql -u root -pПАРОЛЬ -e"CREATE DATABASE test_xeno"
mysql -u root -pПАРОЛЬ -e"USE test_xeno"
mysql -u root -pПАРОЛЬ -e"GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'ПАРОЛЬ'"
mysql -u root -pПАРОЛЬ -e"FLUSH PRIVILEGES"
mysql -u root -pПАРОЛЬ test_xeno < /var/lib/mysql/test_xeno.sql
mysql -u root -pПАРОЛЬ -e"SHOW DATABASES"
а лучше писать как в примере?
Не должны. Но раз уж Вы даёте указания в теме для НОВИЧКОВ, тем более в которой указано хоть и кривое но ГОТОВОЕ решение, то будьте любезны тоже давать что-то готовое. А то напоминает: "Это мясо я бы приготовил иначе, предварительно обжаривать надо не на гриле, а на сковороде и набор специй нужен другой. А как конкретно приготовить вы можете почитать в книге которая называется 22000 способов приготовить мясо ягненка."

Не надо напирать на то что код дрянь. Это и без вашей подсказки очевидно было еще до того как я это опубликовал. Вы бы лучше вместо препирательства со мной просто взяли бы и написали этот кусок кода грамотно. Пользы было бы на много больше.

P.S. Кстати, один из ваших советов касательно БД данный в этом топике, вредный. Но пока Вы на практике не проверите, то даже не сможете понять какой именно.
 
Не должны. Но раз уж Вы даёте указания в теме для НОВИЧКОВ, тем более в которой указано хоть и кривое но ГОТОВОЕ решение, то будьте любезны тоже давать что-то готовое. А то напоминает: "Это мясо я бы приготовил иначе, предварительно обжаривать надо не на гриле, а на сковороде и набор специй нужен другой. А как конкретно приготовить вы можете почитать в книге которая называется 22000 способов приготовить мясо ягненка."
Еще раз, для тех кто в танке и на бронепоезде. Возьму цитату одной хорошей знакомой, очень к месту.
Диалоги, просто диалоги....

- Мааааам! Постирала юбку-плиссе, складки разошлись! стала гладить - на складках ткань блестит, чё делать?
- 110 градусов, через фланель с уксусом
- Спасибо!

* * *

- Вкусное печенье, сама пекла?
- Угу, рецепт простой. 300 маргарина на тёрке, 300 муки, 300 творога, скатать колбаску, нарезать и раскатать кружочки. Кружок в сахар, пополам, опять в сахар, сложить ещё раз и снова в сахар.
- Спасибо!

Рецепты из кулинарной книги:

Шашлык из баранины в йогурте

* 2 кг. баранины
* 1 стакан йогурта
* 1 стакан белого сухого вина
* 4 репчатых лучинины
* сухой базилик
* свежая мята (пучок)
* черный молотый перец
* соль

Всё порезать, перемешать и поставить в холодильник мариноваться. Через сутки посолить и можно жарить.

* * *

Клецки по-фински

* картофель - 4 шт.
* сливки - 1/3 стакана
* мука - 4 ст. л.
* яйцо - 3 шт.
* изюм - 2 ст. л.
* имбирь - 1/4 ч. л.
* зелень (рубленая) - 1 ст. л.
* бульон или вода - 1 л
* соль

Приготовить картофельное тесто, разделать его с помощью чайной ложки и отваривать в воде или бульоне в течение 15-20 минут, посыпать зеленью.
Финны это блюдо подают на ужин горячим.

===

и снова диалоги...

- Как мне сделать так, вот так и вот так?
- шаблоны ad_ (навбар, хедер, футер, постбит, нужное подчеркнуть)
- А подробнее?

===

ну загадка же природы...
почему любая домохозяйка в состоянии понять, что нужно потереть на тёрке заранее охлаждённый кусок маргарина, высыпать его в муку, сформированную горкой на разделочном столе, добавить не-мокрый творог, замесить тесто, раскатать колбаску нужной толщины, порезать на кружочки - опять же, нужной толщины, раскатать - и при этом прикинуть нужный диаметр кружочков, чтобы на выходе получилось печенье примерно такое, как она видит у подруги... и температуру в духовке она сама в состоянии выставить, и время выпечки определить...
Почему девица-пятиклассница, выслушав совет про уксус, больше ничего не спрашивает, а идёт, набирает в кастрюльку воды, добавляет пару столовых ложек уксуса, находит фланелевую тряпочку, ставит утюг на 110 градусов, и прекрасно отглаживает складочки на юбке через фланель, смоченную уксусным раствором? И запоминает при этом на всю жизнь: чтобы чистая шерсть не блестела после отутюживания, её нужно утюжить через ткань.
Почему поколения домохозяек были довольны рецептами, в которых указывались ингредиенты и количество, в некоторых случаях - технология приготовления, но не был процесс расписан пошагово, "возьмите нож для мяса в ту руку, которой вам удобно его держать"


Я дал пару направлений, вполне отработанных. Для тех кто шарит или умеет читать маны с гуглом - проблем нет. Для тех, кто в ящичках со странным пониманием о чужом времени, посимвольно расписанный мануал останется китайской грамотой...
 
Последнее редактирование:
Еще раз, для тех кто в танке и на бронепоезде. Возьму цитату одной хорошей знакомой, очень к месту.
Кто из нас на бронепоезде это еще очень спорный вопрос. Вы в своем самолюбовании не способны понять простую истину: Ваши советы в ЭТОЙ теме в ТОМ виде в котором вы их даёте как минимум бесполезны, а как максимум вредны. Ваши советы как Вы сами сказали для тех кто шарит. А вся тема предназначена для тех кто НЕ ШАРИТ. Тем кто шарит, и сама тема и ваши советы в ней не нужны.
А тем кому тема полезна, Ваши советы просто будут мешать, так как будут отнимать драгоценное время.
Вы по какой-то не ясной причине решили что все кто интересуется данным вопросом, должны быть специалистами и заниматься глубоким изучением предмета. Запомните, это не так. Не думаю что Вы меня поймете до тех пор пока сами не столкнетесь с подобной ситуацией. Я очень надеюсь что когда-нить столкнетесь, а Вам ответят так как отвечаете сейчас Вы. Вы не понимаете что иногда надо не научиться решать задачи, а просто 1 раз решить задачу.
Впрочем лучше пусть Вас минует чаша сия, а то не дай бог Вы еще сильнее обозлитесь на людей.

Ну и касательно вашей большой цитаты, меня она порадовала. Вы этой самой цитатой полностью подтвердили что я не зря опубликовал этот топик.
Поясняю:
рецепт простой. 300 маргарина на тёрке, 300 муки, 300 творога, скатать колбаску, нарезать и раскатать кружочки. Кружок в сахар, пополам, опять в сахар, сложить ещё раз и снова в сахар.
Для автослесаря, даже если это автослесарь экстра класса, этот рецепт - просто набор букв. Для него надо подробнее и детальнее расписать процесс. Вы можете сказать что не фиг автослесарю лезть в кулинарию. В целом конечно верно, но бывает что нет выбора, а главное времени, детально изучать кулинарию. И попросить помочь нет возможности. Но надо изготовить печенье. Причем 1 раз в жизни.

ну загадка же природы...
Да нет тут никакой загадки. Всё просто и очевидно.
почему любая домохозяйка в состоянии понять, что нужно потереть на тёрке заранее охлаждённый кусок маргарина, высыпать его в муку, сформированную горкой на разделочном столе, добавить не-мокрый творог, замесить тесто, раскатать колбаску нужной толщины, порезать на кружочки - опять же, нужной толщины, раскатать - и при этом прикинуть нужный диаметр кружочков, чтобы на выходе получилось печенье примерно такое, как она видит у подруги... и температуру в духовке она сама в состоянии выставить, и время выпечки определить...
Потому что она ДОМОХОЗЯЙКА. То есть она специалист в этой теме.

Почему девица-пятиклассница, выслушав совет про уксус, больше ничего не спрашивает, а идёт, набирает в кастрюльку воды, добавляет пару столовых ложек уксуса, находит фланелевую тряпочку, ставит утюг на 110 градусов, и прекрасно отглаживает складочки на юбке через фланель, смоченную уксусным раствором? И запоминает при этом на всю жизнь: чтобы чистая шерсть не блестела после отутюживания, её нужно утюжить через ткань.
Потому что она УЖЕ умеет пользоваться утюгом, имеет опыт и применение краткого совета для нее очевидно. И дело не в том что она пятиклассница, а в том что у нее УЖЕ есть опыт и знания.

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

Специалисты почему-то думают что в силу того что они специалисты, это значит что они могут решить любую задачу. Это очень большая ошибка.
Специалист может быстро и эффективно решать задачи только своего узкого спектра. Для ЛЮБОГО специалиста даже малейший выход за пределы своей области знаний практически катастрофа.

Был случай, в компании устанавливался серьезный програмный продукт. Причем не только устанавливался, но и дорабатывался.
Над продуктом трудились одновременно группа программеров и группа админов. И админиы высококлассные и программеры того-же уровня работали. Но возникла проблема. Не работала связка. Программеры в голос утверждали что проблема в настроке серверов, админы в голос утверждали что проблема в коде. Причем обе команды не пытались спихнуть ситуацию с себя. Обе команды искренне пытались решить проблему. Такая ситуация продолжалась больше месяца. Руководители обоих групп ежедневно получали головомойки от начальства. Горели сроки. Ситуация швах.
За решение взялся как раз неспециалист. Он весь день донимал и тех и других тем что задавал идиотские вопросы и просил разжевать казалось-бы очевидные вещи. Всех достал. А потом предложил решение проблемы которое показалось идиотским как одним так и другим но в итоге решило проблему. А вся суть ситуации просто в том что решение было на стыке знаний программеров и админов. И для тех и других специалистов было в силу наличия знаний просто не очевидным.
 
Последнее редактирование:
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу