Xpenology

Xpenology on PC (DS3615xs DSM 6.1.1-15101 Update 4)

Xpenology on PC (DS3615xs DSM 6.1.1-15101 Update 4)

Установка synology xpenology версии DSM 6.1.1-15101 Update 2 а потом обновление до версии DSM 6.1.1-15101 Update 4

Бутлоадер есть под несколько версий synology ds3615xsds3617xsDS916p
Установить и запустить ds3617xs не получилось. С ds3615xs получилось после десятка неудачных попыток. Пишу шпаргалку на память.

Необходимо:
1. Usb флэшка хватит 128МБ
2. PC с sata дисками
3. Подключить к роутеру сетевым кабелем
4. На флэшку установить бутлоадер (предварительно нужно отредактировать grub.cfg )
5. Загрузить компьютер с флэшки в режиме ForceInstall
6. Установить на ноуте и запустить synology-assistant-6.1-15030.exe. Выполнить поиск устройств, двойным кликом выбрать нужное устройство. Откроется вебинтерфейс xpenology.
7. Выбрать .pat файл и установить систему.
https://global.download.synology.com/download/DSM/release/6.1.1/15101/DSM_DS3615xs_15101.pat
8. Система перезагрузится в меню загрузчика выбрать пункт.
9. Включить SSH (Панель управления -> Терминал и SNMP -> Терминал -> Включить службу SSH и желательно сменить стандартный порт)
10. Установка дополнительных репозиториев
Центр пакетов -> Настройка
Основное -> Любой разработчик
Бета -> Да, я хочу посмотреть бета-версию
Источники пакетов -> Добавить
http://spk.diablos-netzwerk.de/
http://packages.synocommunity.com
http://pvr.unzureichende.info/synology
http://www.cphub.net
http://packages.pcloadletter.co.uk
http://spk.unzureichende.info
10. Обновляем систему: Панель управления -> Обновление и безопасность -> Обновление DSM
11. Я добавил usb-wi-fi модуль, он определился системой, подключился к точке доступа, и я использую беспроводное подключение xpenology к локальной сети.

Загрузчик bootloader Jun’s Mod
тема на форуме, посвещённая загрузчику для DSM 6.1
тема на форуме, посвещённая загрузчику для DSM 6.2

https://mega.nz/#F!yQpw0YTI!DQqIzUCG2RbBtQ6YieScWg!7AoyySoS
v1.03b (DS3615xs, DS3617xs) is for DSM 6.2

Готовим загрузчик на флэшке
Я использовал загрузчик v1.02a под DS3615xs
1. Генерируем серийный номер
https://xpenology.github.io/serial_generator/serial_generator_new.html
2. Генерируем мак адрес для сетевой карты (Если нужно несколько, то в последнем октете меняем на единицу)
https://onedrive.live.com/view.aspx?resid=AFD1164BAADDF81C!168&ithint=file%2cxlsm&lor=shortUrl&app=Excel
3. Узнаем VID & PID флэшки (например с помощью USBDeview)
4. Монтируем .img файл, открываем grub.conf с помощью Notepad++
Меняем параметры на наши:
set vid=0x0ea0
set pid=0x2168
set sn=13цифр
set mac1=00113*******
Меняем set timeout=’1′ на set timeout=’10’ чтобы появилось меню выбора загрузки системы.
5. Отмонтировать .img диск.
6. Записать на usb флэшку с помощью Rufus образ .img.
7. Вставить в PC флэшку, выбрать в БИОС загрузку с USB флэшки.
8. Выбрать в меню загрузчика ForceInstall (ReInstall)
9. Продолжаем с 6-го пункта

root можно получить с помощью putty или другого ssh клиента под Админом sudo su
Если нужно пользователя root, то, synouser —setpw root Ваш_Пароль_Для_Root
Далее можно заходить под root используя установленный пароль.

Редактирование образа .img:
http://www.osforensics.com/tools/mount-disk-images.html
https://sourceforge.net/projects/imdisk-toolkit/

VID & PID можно узнать с помощью программы http://www.nirsoft.net/utils/usb_devices_view.html или в диспетчере устройств посмотреть в свойствах usb флэшки.

Rufus — простое создание загрузочных USB-дисков
https://rufus.akeo.ie/?locale=ru_RU

Правильный текстовый редактор с поддержкой редактирования тестовых файлов Linux
https://notepad-plus-plus.org/download/v7.4.1.html
http://www.pspad.com/ru/download.php

[Ссылки…]

Update4: обновился до DSM 6.2 Xpenology повис и цикически перезагружался, в августе выпустили новый загрузчик v1.03b установил на флешку, воткнул, запустил комп, система установилась, всё нормально. Затем обновил до DSM 6.2-23739 Update 2.
Прежде чем обновлять систему, советую читать ветку на форуме: https://xpenology.com/forum/forum/78-dsm-updates-reporting/

Update3: обновился до DSM 6.1.7-15284

Update2: Добавил ссылку на тему, посвещенной загрузчику, появился новый загрузчик 6.1.2 Jun’s Mod V1.02b. Записал на другую флэшку, серийник и мак оставил старый, vid, pid от новой флэшки, заменил флэшку, система запустилась в режиме восстановления. Восстановил удалённо с помощью synology assistant, затем обновил систему через веб интерфейс .pat файлом DSM_DS3615xs_15152.pat. Из панели управления DSM обновил до версии DSM 6.1.3 15152 update 4.

Update: Мой конфиг: xeon e5440 4GB 8GB DDR2, asus p5k se bios mod, seagate 80GB hdd + wd purple 4TB
Про бэкапы с защитой от вирусов-шифровальщиков: http://2gusia.livejournal.com/521600.html
http://alex-avr2.livejournal.com/223948.html#comments




[Конспект админа] Домены, адреса и Windows: смешивать, но не взбалтывать

[Конспект админа] Домены, адреса и Windows: смешивать, но не взбалтывать

В очередном «конспекте админа» остановимся на еще одной фундаментальной вещи – механизме разрешения имен в IP-сетях. Кстати, знаете почему в доменной сети nslookup на все запросы может отвечать одним адресом? И это при том, что сайты исправно открываются. Если задумались – добро пожаловать под кат..

Для преобразования имени в IP-адрес в операционных системах Windows традиционно используются две технологии – NetBIOS и более известная DNS.

Дедушка NetBIOS

NetBIOS (Network Basic Input/Output System) – технология, пришедшая к нам в 1983 году. Она обеспечивает такие возможности как:

  • регистрация и проверка сетевых имен;
  • установление и разрыв соединений;
  • связь с гарантированной доставкой информации;
  • связь с негарантированной доставкой информации;
  • поддержка управления и мониторинга драйвера и сетевой карты.

В рамках этого материала нас интересует только первый пункт. При использовании NetBIOS имя ограниченно 16 байтами – 15 символов и спец-символ, обозначающий тип узла. Процедура преобразования имени в адрес реализована широковещательными запросами.

Небольшая памятка о сути широковещательных запросов.

Интересная особенность в том, что можно привязывать имя не к хосту, а к сервису. Например, к имени пользователя для отправки сообщений через net send.

Естественно, постоянно рассылать широковещательные запросы не эффективно, поэтому существует кэш NetBIOS – временная таблица соответствий имен и IP-адреса. Таблица находится в оперативной памяти, по умолчанию количество записей ограничено шестнадцатью, а срок жизни каждой – десять минут. Посмотреть его содержимое можно с помощью команды nbtstat -c, а очистить – nbtstat -R.

Пример работы кэша для разрешения имени узла «хр».

Что происходило при этом с точки зрения сниффера.

В крупных сетях из-за ограничения на количество записей и срока их жизни кэш уже не спасает. Да и большое количество широковещательных запросов запросто может замедлить быстродействие сети. Для того чтобы этого избежать, используется сервер WINS (Windows Internet Name Service). Адрес сервера администратор может прописать сам либо его назначит DHCP сервер. Компьютеры при включении регистрируют NetBIOS имена на сервере, к нему же обращаются и для разрешения имен.

В сетях с *nix серверами можно использовать пакет программ Samba в качестве замены WINS. Для этого достаточно добавить в конфигурационный файл строку «wins support = yes». Подробнее – в документации.

В отсутствие службы WINS можно использовать файл lmhosts, в который система будет «заглядывать» при невозможности разрешить имя другими способами. В современных системах по умолчанию он отсутствует. Есть только файл-пример-документация по адресу %systemroot%\System32\drivers\etc\lmhost.sam. Если lmhosts понадобится, его можно создать рядом с lmhosts.sam.

Сейчас технология NetBIOS не на слуху, но по умолчанию она включена. Стоит иметь это ввиду при диагностике проблем.

Стандарт наших дней – DNS

DNS (Domain Name System) – распределенная иерархическая система для получения информации о доменах. Пожалуй, самая известная из перечисленных. Механизм работы предельно простой, рассмотрим его на примере определения IP адреса хоста www.google.com:

  • если в кэше резолвера адреса нет, система запрашивает указанный в сетевых настройках интерфейса сервер DNS;
  • сервер DNS смотрит запись у себя, и если у него нет информации даже о домене google.com – отправляет запрос на вышестоящие сервера DNS, например, провайдерские. Если вышестоящих серверов нет, запрос отправляется сразу на один из 13 (не считая реплик) корневых серверов, на которых есть информация о тех, кто держит верхнюю зону. В нашем случае – com.
  • после этого наш сервер спрашивает об имени www.google.com сервер, который держит зону com;
  • затем сервер, который держит зону google.com уже выдает ответ.

Наглядная схема прохождения запроса DNS.

Разумеется, DNS не ограничивается просто соответствием «имя – адрес»: здесь поддерживаются разные виды записей, описанные стандартами RFC. Оставлю их список соответствующим статьям.

Сам сервис DNS работает на UDP порту 53, в редких случаях используя TCP.

DNS переключается на TCP с тем же 53 портом для переноса DNS-зоны и для запросов размером более 512 байт. Последнее встречается довольно редко, но на собеседованиях потенциальные работодатели любят задавать вопрос про порт DNS с хитрым прищуром.

Также как и у NetBIOS, у DNS существует кэш, чтобы не обращаться к серверу при каждом запросе, и файл, где можно вручную сопоставить адрес и имя – известный многим %Systemroot%\System32\drivers\etc\hosts.

В отличие от кэша NetBIOS в кэш DNS сразу считывается содержимое файла hosts. Помимо этого, интересное отличие заключается в том, что в кэше DNS хранятся не только соответствия доменов и адресов, но и неудачные попытки разрешения имен. Посмотреть содержимое кэша можно в командной строке с помощью команды ipconfig /displaydns, а очистить – ipconfig /flushdns. За работу кэша отвечает служба dnscache.

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

При попытке разрешения имени обычно используются сервера DNS, настроенные на сетевом адаптере. Но в ряде случаев, например, при подключении к корпоративному VPN, нужно отправлять запросы разрешения определенных имен на другие DNS. Для этого в системах Windows, начиная с 7\2008 R2, появилась таблица политик разрешения имен (Name Resolution Policy Table, NRPT). Настраивается она через реестр, в разделе HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\DnsClient\DnsPolicyConfig или групповыми политиками.

Настройка политики разрешения имен через GPO.

При наличии в одной сети нескольких технологий, где еще и каждая – со своим кэшем, важен порядок их использования.

Порядок разрешения имен

Операционная система Windows пытается разрешить имена в следующем порядке:

  • проверяет, не совпадает ли имя с локальным именем хоста;
  • смотрит в кэш DNS распознавателя;
  • если в кэше соответствие не найдено, идет запрос к серверу DNS;
  • если имя хоста «плоское», например, «servername», система обращается к кэшу NetBIOS. Имена более 16 символов или составные, например «servername.domainname.ru» – NetBIOS не используется;
  • если не получилось разрешить имя на этом этапе – происходит запрос на сервер WINS;
  • если постигла неудача, то система пытается получить имя широковещательным запросом, но не более трех попыток;
  • последняя попытка – система ищет записи в локальном файле lmhosts.

Для удобства проиллюстрирую алгоритм блок-схемой:

Алгоритм разрешения имен в Windows.

То есть, при запуске команды ping server.domain.com NetBIOS и его широковещательные запросы использоваться не будут, отработает только DNS, а вот с коротким именем процедура пойдет по длинному пути. В этом легко убедиться, запустив простейший скрипт:

@echo off
echo %time%
ping hjfskhfjkshjfkshjkhfdsjk.com
echo %time%
ping xyz
echo %time%
pause

Выполнение второго пинга происходит на несколько секунд дольше, а сниффер покажет широковещательные запросы.

Сниффер показывает запросы DNS для длинного имени и широковещательные запросы NetBIOS для короткого.

Отдельного упоминания заслуживают доменные сети – в них запрос с коротким именем отработает чуть по-другому.

Active Directory и суффиксы

Active Directory тесно интегрирована с DNS и не функционирует без него. Каждому компьютеру домена создается запись в DNS, и компьютер получает полное имя (FQDN — fully qualified domain name) вида name.subdomain.domain.com.

Для того чтоб при работе не нужно было вводить FQDN, система автоматически добавляет часть имени домена к хосту при различных операциях – будь то регистрация в DNS или получение IP адреса по имени. Сначала добавляется имя домена целиком, потом следующая часть до точки.

При попытке запуска команды ping servername система проделает следующее:

  • если в кэше DNS имя не существует, система спросит у DNS сервера о хосте servername.subdomain.domain.com;
  • если ответ будет отрицательный – система запросит servername.domain.com, на случай, если мы обращаемся к хосту родительского домена.

При этом к составным именам типа www.google.com суффиксы по умолчанию не добавляются. Это поведение настраивается групповыми политиками.

Настройка добавления суффиксов DNS через групповые политики.

Настраивать DNS суффиксы можно также групповыми политиками или на вкладке DNS дополнительных свойств TCP\IP сетевого адаптера. Просмотреть текущие настройки удобно командой ipconfig /all.

Суффиксы DNS и их порядок в выводе ipconfig /all.

Однако утилита nslookup работает немного по-другому: она добавляет суффиксы в том числе и к длинным именам. Посмотреть, что именно происходит внутри nslookup можно, включив диагностический режим директивой debug или расширенный диагностический режим директивой dc2. Для примера приведу вывод команды для разрешения имени ya.ru:

nslookup -dc2 ya.ru

------------
Got answer:
    HEADER:
        opcode = QUERY, id = 1, rcode = NOERROR
        header flags:  response, want recursion, recursion avail.
        questions = 1,  answers = 1,  authority records = 0,  additional = 0

    QUESTIONS:
        4.4.8.8.in-addr.arpa, type = PTR, class = IN

    ANSWERS:
    ->  4.4.8.8.in-addr.arpa
        name = google-public-dns-b.google.com
        ttl = 86399 (23 hours 59 mins 59 secs)

------------
╤хЁтхЁ:  google-public-dns-b.google.com
Address:  8.8.4.4

------------
Got answer:

    HEADER:
        opcode = QUERY, id = 2, rcode = NOERROR
        header flags:  response, want recursion, recursion avail.
        questions = 1,  answers = 1,  authority records = 0,  additional = 0

    QUESTIONS:
        ya.ru.subdomain.domain.com, type = A, class = IN

    ANSWERS:
    ->  ya.ru.subdomain.domain.com
        internet address = 66.96.162.92
        ttl = 599 (9 mins 59 secs)

------------
Не заслуживающий доверия ответ:

------------
Got answer:

    HEADER:
        opcode = QUERY, id = 3, rcode = NOERROR
        header flags:  response, want recursion, recursion avail.
        questions = 1,  answers = 0,  authority records = 1,  additional = 0

    QUESTIONS:
        ya.ru.subdomain.domain.com, type = AAAA, class = IN

    AUTHORITY RECORDS:
    ->  domain.com
        ttl = 19 (19 secs)
        primary name server = ns-2022.awsdns-60.co.uk
        responsible mail addr = awsdns-hostmaster.amazon.com
        serial  = 1
        refresh = 7200 (2 hours)
        retry   = 900 (15 mins)
        expire  = 1209600 (14 days)
        default TTL = 86400 (1 day)

------------
╚ь :     ya.ru.subdomain.domain.com
Address:  66.96.162.92

Из-за суффиксов утилита nslookup выдала совсем не тот результат, который выдаст например пинг:

ping ya.ru -n 1
Обмен пакетами с ya.ru [87.250.250.242] с 32 байтами данных:
Ответ от 87.250.250.242: число байт=32 время=170мс TTL=52

Это поведение иногда приводит в замешательство начинающих системных администраторов.

Лично сталкивался с такой проблемой: в домене nslookup выдавал всегда один и тот же адрес в ответ на любой запрос. Как оказалось, при создании домена кто-то выбрал имя domain.com.ru, не принадлежащее организации в «большом интернете». Nslookup добавляла ко всем запросам имя домена, затем родительский суффикс – com.ru. Домен com.ru в интернете имеет wildcard запись, то есть любой запрос вида XXX.com.ru будет успешно разрешен. Поэтому nslookup и выдавал на все вопросы один ответ. Чтобы избежать подобных проблем, не рекомендуется использовать для именования не принадлежащие вам домены.

При диагностике стоит помнить, что утилита nslookup работает напрямую с сервером DNS, в отличие от обычного распознавателя имен. Если вывести компьютер из домена и расположить его в другой подсети, nslookup будет показывать, что всё в порядке, но без настройки суффиксов DNS система не сможет обращаться к серверам по коротким именам.

Отсюда частые вопросы – почему ping не работает, а nslookup работает.

В плане поиска и устранения ошибок разрешения имен могу порекомендовать не бояться использовать инструмент для анализа трафика – сниффер. С ним весь трафик как на ладони, и если добавляются лишние суффиксы, то это отразится в запросах DNS. Если запросов DNS и NetBIOS нет, некорректный ответ берется из кэша.

Если же нет возможности запустить сниффер, рекомендую сравнить вывод ping и nslookup, очистить кэши, проверить работу с другим сервером DNS.

Кстати, если вспомните любопытные DNS-курьезы из собственной практики – поделитесь в комментариях.




WordPress multisite с разными базами данных

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

Они везде добавляют свои js / css и туда, где они не нужны. Таким образом, если установить несколько мощных тяжёлых плагинов и еще + 10-15 дополнительных поменьше, можно увидеть огромное количество скриптов и стилей везде, практически на каждой странице.

Решение этому нашлось — режим multisite.

Подключить его не составит труда и начать пользоваться можно за пару минут.

Для этого нужно добавить строку в wp-config.php

<code class="php hljs"><span class="hljs-comment">/* Это всё, дальше не редактируем. Успехов! */</span>
define(<span class="hljs-string">'WP_ALLOW_MULTISITE'</span>, <span class="hljs-keyword">true</span>);
</code>

После чего пройти в Инструменты -> Установка сети.

Её обязательно нужно выполнять с выключенными плагинами.

image

Вам предложат заменить данные в wp-config и .htaccess и авторизоваться ещё раз на сайте.

Система multisite

Режимов сайта всего 2 — это либо папки / или поддомены.

сайт.ru/сайт2
сайт2.сайт.ru

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

Управление плагинами и темами для всех сайтов из панели. Можно добавить необходимые для всех в одном месте и далее активировать их только на тех, где они нужны по отдельности. Так же есть возможность активировать их сразу для всей сети.

Таким образом, возможно сократить потребление плагинов на 50% и более. Вроде бы всё хорошо, с фронтендом уже все в порядке, но вот беда:

image

multisite использует одну базу на все сайты — создавая на каждый из них отдельные таблицы.

wp_
wp_2
wp_3

Теперь одна база будет увеличиваться в несколько раз от каждого нового сайта.

Multisite c отдельной бд по каждый сайт

Для этого мы будем использовать плагин multi-db. Конечно, есть и другие, такие как HyperDB, SharDB, но я не нашёл никакой информации о них. Скачать multi-db вы можете по любой ссылке ниже.

cloud.mail.ru/public/KMNr/WDpoUeyUV
drive.google.com/open?id=0Bw4XcI3lCfQSUWZWLUUyUHZFVTA

Сам он предлагает сначала определиться, сколько баз вам нужно (16, 256, 4096).

Начну с 16. Важна последовательность. Сначала установите multisite, я буду начинать разделять базы данных, имея 3 созданных сайта — для того, чтобы протестировать его работу после этого.

Создание vip баз

Эта опция позволяет размещать конкретный сайт в конкретной базе данных. Мне она не нужна. Затрагивать её не буду. Без разницы мне, в какую, главное — что в любую другую, а не в одну.

Первым делом нужно подготовить новые базы

<code class="sql hljs"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_0`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_1`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_2`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_3`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_4`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_5`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_6`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_7`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_8`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_9`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_a`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_b`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_c`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_d`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_e`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_f`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_global`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
</code>

Выполните этот sql запрос и тогда вы увидите их.

image

Создание пользователей и паролей в PhpMyAdmin

Так как я на Localhoste, мне это не нужно. Подойдёт root, но вам может понадобиться создать новые имена и пароли, а так же дать нужные привилегии в случае, если вы делаете сайт не для себя одного, а, например, для нескольких людей. Поэтому я пропущу этот пункт.

Распаковка файлов

db-config.php, db.php нужно разместить в wp-content

move-blogs.php в любой папке после wp-content, например в новой /wp-content/scripts/

Настройка подключаемых модулей

DB-config.php

<code class="php hljs">define (<span class="hljs-string">'DB_SCALING'</span>, <span class="hljs-string">'16'</span>);

<span class="hljs-comment">//------------------------------------------------------------------------//</span>
<span class="hljs-comment">//---DC IPs---------------------------------------------------------------//</span>
<span class="hljs-comment">//------------------------------------------------------------------------//</span>
<span class="hljs-comment">//	Usage: add_dc_ip(IP, DC)</span>
<span class="hljs-comment">//	EX: add_dc_ip('123.123.123.', 'dc1');</span>
add_dc_ip(<span class="hljs-string">'127.0.0.'</span>, <span class="hljs-string">'dc1'</span>);
</code>

Здесь нужно указать кол-во баз, 16 в данном случае и ip сервера. В конце вместо последних цифр ставится точка 127.0.0.

Далее ниже на первом месте добавим глобальную таблицу add_global_table(‘dbname_global’);

<code class="php hljs"><span class="hljs-comment">//------------------------------------------------------------------------//</span>
<span class="hljs-comment">//---Global Tables--------------------------------------------------------//</span>
<span class="hljs-comment">//------------------------------------------------------------------------//</span>
<span class="hljs-comment">//	Do not include default global tables</span>
<span class="hljs-comment">//	Leave off base prefix (eg: wp_)</span>
<span class="hljs-comment">//  You don't really have to register these, they will work fine without.</span>
<span class="hljs-comment">//  However registering at least your busiest ones might shave a few milliseconds off by avoiding some regexes.</span>
<span class="hljs-comment">//</span>
<span class="hljs-comment">//	Usage: add_global_table(TABLE_NAME)</span>
<span class="hljs-comment">//	EX: add_global_table('something');</span>
add_global_table(<span class="hljs-string">'dbname_global'</span>);

add_global_table(<span class="hljs-string">'affiliatedata'</span>);
add_global_table(<span class="hljs-string">'affiliatereferrers'</span>);
add_global_table(<span class="hljs-string">'am_actions'</span>);
add_global_table(<span class="hljs-string">'am_queue'</span>);
add_global_table(<span class="hljs-string">'am_schedule'</span>);
add_global_table(<span class="hljs-string">'autoblog'</span>);

add_global_table(<span class="hljs-string">'bp_activity'</span>);
add_global_table(<span class="hljs-string">'bp_activity_meta'</span>);
add_global_table(<span class="hljs-string">'bp_friends'</span>);
add_global_table(<span class="hljs-string">'bp_groups'</span>);
add_global_table(<span class="hljs-string">'bp_groups_groupmeta'</span>);
add_global_table(<span class="hljs-string">'bp_groups_members'</span>);
add_global_table(<span class="hljs-string">'bp_messages_messages'</span>);
add_global_table(<span class="hljs-string">'bp_messages_notices'</span>);

add_global_table(<span class="hljs-string">'bp_messages_recipients'</span>);
add_global_table(<span class="hljs-string">'bp_notifications'</span>);
add_global_table(<span class="hljs-string">'bp_user_blogs'</span>);
add_global_table(<span class="hljs-string">'bp_user_blogs_blogmeta'</span>);
add_global_table(<span class="hljs-string">'bp_xprofile_data'</span>);
add_global_table(<span class="hljs-string">'bp_xprofile_fields'</span>);
add_global_table(<span class="hljs-string">'bp_xprofile_groups'</span>);

add_global_table(<span class="hljs-string">'domain_mapping'</span>);
</code>

После чего ниже останется установить логин и пароль для входа в mysql:

<code class="php hljs"><span class="hljs-comment">//------------------------------------------------------------------------//</span>
<span class="hljs-comment">//---DB Servers-----------------------------------------------------------//</span>
<span class="hljs-comment">//------------------------------------------------------------------------//</span>
<span class="hljs-comment">//	Database servers grouped by dataset.</span>
<span class="hljs-comment">//	R can be 0 (no reads) or a positive integer indicating the order</span>
<span class="hljs-comment">//	in which to attempt communication (all locals, then all remotes)</span>
<span class="hljs-comment">//</span>
<span class="hljs-comment">//	Usage: add_db_server(DS, DC, READ, WRITE, HOST, LAN_HOST, NAME, USER, PASS)</span>
<span class="hljs-comment">//	EX: add_db_server('global', 'dc1', 1, 1,'global.mysql.example.com:3509','global.mysql.example.lan:3509', 'global-db', 'globaluser',  'globalpassword');</span>
<span class="hljs-comment">//</span>
<span class="hljs-comment">//	<span class="hljs-doctag">Note:</span> you can also place this section in a file called db-list.php in wp-content</span>
<span class="hljs-comment">//  EX: add_db_server('global', 'dc1', 1, 1,'global.mysql.example.com:3509','global.mysql.example.lan:3509', 'global-db', 'globaluser',  'globalpassword');</span>
add_db_server(<span class="hljs-string">'global'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_global'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);

add_db_server(<span class="hljs-string">'0'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_0'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'1'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_1'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'2'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_2'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'3'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_3'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'4'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_4'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'5'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_5'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'6'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_6'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'7'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_7'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'8'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_8'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'9'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_9'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'a'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_a'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'b'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_b'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'c'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_c'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'d'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_d'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'e'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_e'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'f'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_f'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
</code>

логин root, пароль 1. Так же тут нужно указать эти названия которые мы регистрировали вначале: dbname_0, dbname_1…

Настройка move-blogs.php

Это самая важная часть. Здесь также формируется вывод разных ошибок.

<code class="php hljs">$dbname = <span class="hljs-string">"multi"</span>;  <span class="hljs-comment">//This is your current database</span>
$blog_table_prefix = <span class="hljs-string">'wp_'</span>;  <span class="hljs-comment">//Prefix of your wpmu blog tables, most likely this won't need to be changed</span>
$newdb_prefix = <span class="hljs-string">'dbname_'</span>;  <span class="hljs-comment">//This is the prefix of the db's you're moving your tables into - we assume they are all the same, if not, you're in trouble</span>

<span class="hljs-comment">//We need info to connect to the databases</span>
$dbhost = <span class="hljs-string">'localhost'</span>;
$dbuname = <span class="hljs-string">'root'</span>;
$dbpass = <span class="hljs-string">'1'</span>;

<span class="hljs-comment">//How many db's are you moving into (16, 256, or 4096)?</span>
$db_scaling = <span class="hljs-string">'16'</span>;
</code>

$dbname = «multi»; //multi — это имя моей общей базы данных которую я хочу разделить на куски, нужно писать без префикса

$blog_table_prefix = ‘wp_’; //это префикс в общей базе

$newdb_prefix = ‘dbname_’; //новое имя

Логин, сервер и пароль, а так же количество баз.

$dbhost = ‘localhost’;
$dbuname = ‘root’;
$dbpass = ‘1’;
$db_scaling = ’16’;

Теперь стоит пройти по адресу: localhost/wp-content/scripts/move-blogs.php

image

Жмём Click here.

Дожидаемся, когда закончится процесс, ссылка в адресной строке должна поменяться. После этого жмём clicking here для обновления страницы. Статус обновлен.

image

Теперь видно, что создалась одна глобальная база, в которой содержится wp_users и т.д.

image

Остальные два сайта помимо основного раскидало по другим базам в рандомном порядке, например, второй сайт попал в dbname_c, а третий в dbname_e.

image
image

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

image
image

В старую «multi» ничего не добавляется. Тогда, наверно, на этом всё. Пока что это только первые мнения об этой системе, выводы еще делать рано.

Нюансы multisite

Первое — это невозможность задать роли для новых зарегистрированных участников. Но для этого есть плагин. Помимо этого представим себе ситуацию, у вас два сайта — сайт 1 (основной) и сайт 2. Человек регистрируется на сайте 2 и он таки может теперь входить и отображаться на сайте 1, но вы его не видите из консоли сайта 1, несмотря на то, что он есть. Увидеть его можно или в общей сети, либо в сайте 2, с которого он совершил регистрацию.

Редирект регистрации

Если вы захотите регистрироваться через wp-login, wp-admin, wp-register с сайта 2, то вас перебросит на сайт 1. Как говорят разработчики multisite, это является логичным, так как аккаунт создаётся один для всей сети. Но это может быть неудобно и совсем не то что вам нужно. WooCommerce с его страницей My Account и шорткодом [woocommerce_my_account] поможет с нормальной регистрацией, так же можно использовать Login With Ajax.




МЕТЕОСТАНЦИИ, ПОСТЫ ВИДЕОКОНТРОЛЯ

http://fad.karelia.ru/?page_id=456




Есть ли жизнь в ИТ после 40?

С темой о которой я хочу поговорить впервые я столкнулся года 4 назад, когда начал регулярно подбирать персонал. Связана она с людьми которые подходя к 40 и перешагивая за этот возраст сталкиваются с серьезной проблемой при поиске работы. Есть мнение, что ИТ это молодая область, что ГИК — это человек 25 лет, но уже с бородой, молодой, динамичный с одной только мыслью как бы добраться быстрей до клавиатуры. Неужели такие штампы являются причиной того, что дядя за 40 с женой двумя детьми и ипотекой по полгода ищет хоть какую работу в своей области? Тема стала особо актуальна в последний год, когда сокращения персонала стали повсеместными. На мой взгляд штампы тут большой роли не играют, а сами проблемы лежат гораздо глубже, хотя и заметны намётанным глазом. Об этом мы сегодня и поговорим, все дальнейшие примеры выдумка, а совпадения случайны.

История первая: Семь лет в Бентли или профессиональная кома.

Пару лет назад был у меня на собеседовании мужчина лет 37-38, который попал под сокращение и искал новую работу. По резюме получался такой классический системный администратор. Последние семь лет он трудился в российском офисе производителя премиальных машины, который был не очень большой, но имел определенный серверный парк. Мужчина был вполне приятный, но в процессе общения было ощущение, что что-то тут не так, вроде и грамотно излагает общие вещи, но ощущение странное не покидало. В процессе дальнейшего общение выяснилось, что все семь человек работал под жестким управлением ИТ из страны производителя машин. Т.е вся работа сводилась к четкому выполнению конкретных операций: смонтировать железо в стойку, залить конфигурацию, физически перезагрузить, произвести изменения на серверах по инструкции, т.е только ученический набор без каких-либо прав и размышлений. На любой вопрос, который требовал обычного размышления обычно основанного на знаниях и опыте, он просто тух, что в принципе было объяснимо. Человек искал до нас уже три месяца и думаю, что и после нас устроился не стразу.

История вторая: Предпенсионный ИТ-директор

Другая ситуация более свежая, человек под 50 и последние 10 лет он проработал руководителем ИТ отдела в холдинге. Казалось бы, опыта более чем, возраст еще не древний, но человек испытывает проблемы с поиском работы. Начинаю читать резюме, а там слезы вроде «сопровождал сеть из 30 ПК», «сопровождал шлюз интернета», «создал ЦОД на основе двух серверов», ну и тому подобное. При этом человек руководил десятком других администраторов. Т.е. лично я, как человек из ИТ, могу такое читать так «10 лет Я и десять раздолбаев чего то делали, ну и деньги нам платили». Судя по описанию человек просто жил десять лет, а потом хоп и зарплату на карточку не перечислили. Я реально представляю, что дальше человеку будет сложно, особенно если учесть, что резюме он тоже писать не научился.

Грустных историй я могу привести много, но задача не в этом.

На каждую печальную историю есть и позитивные. Работал у меня инженер, было ему лет 36-38. Он пришел из коммерческой компании в интегратор. Инженер был от бога, человеку можно было поручать любые задачи, он делал четко, без ошибок, в срок и именно то, что просили. Когда он пришел к нам на собеседование, я сразу понял надо брать. И скажем честно пришел он не по тому, что уволили, а потому что засиделся на прошлом месте. Проработал он года полтора и ушел, у человека было одно слабое место, своя пята Ахиллесова – он все пропускал через себя, был перфекционистом и очень расстраивался если внутренние стандарты качества были не достигнуты. На крупных проектах это мешало, он реально ходил серый по цвету, хотя все шло штатно, так человек переживал за результат, за себя, за своих подчинных, за заказчиков. За полтора года он выжался как лимон, прокачался и ушел в туже компанию откуда пришел на зарплату в 2 раза больше чем уходил, причем ушел с повышением позиции. Когда он увольнялся, то сказал «Это был отличный опыт для меня, я за 1.5 года попробовал столько нового, сколько не пробовал за 10 лет до этого, но нашей компании тяжело пока делать такие большие проекты». Я тогда не стал ему отвечать, но в голове выскочила «Неее, дружок, это не компании тяжело, это для тебя тяжеловато». В принципе я оказался прав, следующие годы мы делали проекты гораздо сильней, но уже с новыми людьми и без нервов. Но разговор о другом, этот 40 летний специалист не испытывал проблем три года назад с поиском работы и я вас уверяю не будет испытывать и через тринадцать, искать он будет работу до первого собеседования, которое проводит человек понимающий в области на которую набирает сотрудников.

Есть множество других примеров, людей которые работали технарями, росли лет 5-6, потом понимали, что умеют говорить и видят проблемы людей, уходили в около ит-сферы, устраивались к вендору, делали карьеру там. Становились известными в узком кругу людьми с хорошим портфолио проектов и решенных задач. Кто-то успевал продвинуться до совладельца, кто-то просто на менеджерских позициях к сорока годам, но и те и другие себя прекрасно чувствуют. И даже если что-то станет с позицией на текущем месте очень быстро найдут другую. Переберите реальных профессионалов работающих в том же Miсrosoft, Касперском, Cisco и любом ит-вендоре который на виду и вы увидите, что жизнь в 40 не заканчивается, а зачастую начинается.

На контрасте успешных и не очень примеров, попробую резюмировать мысли:

Если взять ИТ область и все сопутствующие зоны рядом с ней, то с каждым годом количество позиций на которых вам можно будет работать станет сокращаться. Скажу честно на позиции младшего и просто рядового инженера человек после 40 не нужен совсем. Это позиция для худых, молодых, с шилом в пятой точке без заморочек в виде троих детей, дачи по выходным и ипотеки в Зеленограде.

Для возрастных остается старший инженерный состав, который будет нужен всегда, способный нарисовать архитектуру решения, продумать нюансы, показать молодежи подводные камни и проследить, что они будут пройдены. Для того, чтобы в 50 вас брали на работу инженером, надо всю жизнь относиться к своей работе как к образованию детей, а именно делать ее лучше, лучше и лучше. Развивать, открывать новые области, расти качественно не переставая. Такой подход дает вырастить в голове бриллиант за который будут готовы платить не глядя на возраст. Да можно от субъективности это на 100% не застрахует и будут находиться люди не готовые брать из-за возраста, но свой работодатель понимающий толк будет всегда. Работать неспешно, жить, получать зарплату и радоваться это тупиковый сценарий администратора из Бентли, я таких видел много, вам не советую.

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

P.S К чему я это пишу, делайте выводы и готовьтесь к зрелому возрасту заранее. На международных ИТ конференциях процент возрастных участников порядка 25% и все прекрасно работают, никто не жалуется, но там и осознанность у людей на порядок выше, число людей конспектирующих на технических докладах огромно, люди заплатили деньги, они выжимают с участия все что смогут, они знают, что такое рынок, у них он появился раньше. На рынке кто сильней, умней, быстрей тот и прав.Да прибудет с вами сила.

Покупайте самые вкусные жидкости тут

Оригинал статьи http://itband.ru/2015/03/it-life-after-40/#comment-84473