windows-10

Обновление Windows 10 KB3206632 для ПК и смартфонов — flash KB3209498

Корпорация Microsoft запустила накопительный пакет обновления Windows 10 Build 14393.576 для ПК и смартфонов (обновление для ПК- KB3206632). Обновление включает в себя только некоторые исправления ошибок и,  разнообразные улучшения в безопасности.

Список изменений:

• Улучшена надёжность Security Support Provider Interface;
• Исправлен сбой службы в CDPSVC, который в некоторых ситуациях мог привести к тому, что ПК был не в состоянии получить IP-адрес;
• Исправлена проблема, при которой установка модуля Catalog-signed не работала на Nano Server;
• Исправлена проблема с Devices left with Hello, при которой оно чрезмерное количество времени не переходили в режим энергосбережения;
• Исправлена проблема с gl_pointSize, которая не работала должны образом при использовании метода drawElements в Internet Explorer 11;
• Исправлена проблема, при которой Azure Active Directory-joined machines после обновления до Windows 10 Version 1607 не синхронизировались с Exchang
• Исправлены дополнительные проблемы с совместимостью приложений, обновлением информациии о часовом поясе, Internet Explorer;
• Есть обновления безопасности для Microsoft Edge, Internet Explorer, Microsoft Uniscribe, Common Log File System Driver;

Лучшие аналоги crazybump

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

Лучшие по моему это:

Ну самый простой и универсальный — это

crazybump — сайт владельца почему то упорот как хз что, но прога супер.

PixPlant — локанично, удобно, быстро, но сложно найти кряк).

Quixel nDo — красиво, профессионально.

Knald — тоже не большой комбайн для normals, displacement-ОВ, bump-ОВ, и других шейдеров.

 

 

Настройка параметров php5-fpm (502 nginx)

При появлении проблем с хостингом (505 nginx) смотрим логи fpm — и если

ALERT: [pool www] pm.max_spare_servers(3) must not be less than pm.min_spare_servers(5)

и

 WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 17 total children

делаем следующие настройки php5-fpm в /etc/php5/fpm/pool.d/www.conf

pm.max_children = необходимо вычислить сколько памяти занимает один процесс, потом разделить тот объем памяти который вы хотите выделить для php5-fpm, на объем одного процессора, получите количество pm.max_children (наример 10000мб/50мб=200)
pm.min_spare_servers = этот параметр начать с количество ядер процессора умножить на 2 (пример 4 ядра * 2 = 8)
pm.max_spare_servers = этот параметр количество ядер процессора * 4 (пример 4 *4 = 16)
pm.start_servers = этот параметр вычисляется по формуле (pm.min_spare_servers+pm.max_spare_servers)/2 (пример (8+16)/2=12)
Итого на выходе получаем примерно конфигурацию для 4 ядерного процессора 10гб памяти (выделенные только под PHP5-FPM, возможно у вас 16Гб общей)
pm.max_children = 200
pm.start_servers = 12
pm.min_spare_servers = 8
pm.max_spare_servers = 16

 

Cкрипт выставляющий верные настройки прав папок и файлов DRUPAL

Часто бывает что на движке drupal случаются косяки и приходится работать с правами на папки и файлы, фот скрипт выставляющий верные настройки прав:

# Script made by Alex Belyj, admin@azfest.ru
echo "Начинаю изменение прав..."
echo "Устанавливаю владельца www-data для всех папок и файлов"
chown -R www-data:www-data '/var/www/'
echo "Выставляю права 755 для всех папок"
find '/var/www/' -type d -exec chmod 755 {} \;
echo "Выставляю права 644 для всех файлов"
find '/var/www/' -type f -exec chmod 644 {} \;
echo "Выставляю права 440 для .htaccess"
chmod 440 '/var/www/.htaccess'
echo "Выставляю права 775 для tmp"
chmod 775 '/var/www/tmp'
echo "Выставляю права 440 для tmp/.htaccess"
chmod 440 '/var/www/tmp/.htaccess'
echo "Выставляю права 775 для sites"
chmod 775 '/var/www/sites'
echo "Выставляю права 775 для sites/default"
chmod 755 '/var/www/sites/default'
echo "Выставляю права 775 для sites/default/files"
chmod 775 '/var/www/sites/default/files'
echo "Корректирую права g+w для поддеррикторий sites/default/files"
chmod g+w -R '/var/www/sites/default/files'
echo "Выставляю права 440 для sites/default/files/.htaccess"
chmod 440 '/var/www/sites/default/files/.htaccess'
echo "Выставляю права 440 для sites/default/settings.php"
chmod 440 '/var/www/sites/default/settings.php'
echo "Выставляю права 440 для sites/default/default.settings.php"
chmod 440 '/var/www/sites/default/default.settings.php'
echo "Выставляю права 775 для sites/all/themes"
chmod 755 -R '/var/www/sites/all/themes'
echo "Выставляю права 775 для sites/all/modules"
chmod 755 -R '/var/www/sites/all/modules'
echo "Выставляю права 775 для sites/all/libraries"
chmod 755 -R '/var/www/sites/all/libraries'
echo "Изменение прав закончил! Убедись, что всё верно..."
echo "Выставляю права 440 для sites/default/settings.php" chmod 440 '/var/www/sites/default/settings.php' echo "Выставляю права 440 для sites/default/default.settings.php" chmod 440 '/var/www/sites/default/default.settings.php' echo "Выставляю права 775 для sites/all/themes" chmod 755 -R '/var/www/sites/all/themes' echo "Выставляю права 775 для sites/all/modules" chmod 755 -R '/var/www/sites/all/modules' echo "Выставляю права 775 для sites/all/libraries" chmod 755 -R '/var/www/sites/all/libraries' echo "Изменение прав закончил! Убедись, что всё верно..."

Прошивка Teclast Taipower X98 Air HG8N Android + Windows 10 dualboot

Прошивка Teclast Taipower X98 Air HG8N под:

A)Адекватный, легкий, без приложений ANDROID 4.4.4 mirek190 rom v3.1 (ROOTованный, без китайского мусора, вообще никаких приложений, камеры не перевернуты, интерфейс не китайский, тротлинга не наблюдается)  — уже есть и более новая версия от мирека…
B)Windows 8.1 (Уже с драйверами)
C)Windows 10 (Драйвер требуется только на дисплей)

————————————————————————————————————————-

A)

Качаем софт:

1.a)

Устанавливаем iSocUSB-Driver-Setup-1.2.0.exe iSocUSB-Driver, убеждаемся что в устройствах компьютера есть Intel SOC USB Driver.

Intel SOC USB Driver

Intel SOC USB Driver

1.b)

Устанавливаем IntelAndroidDrvSetup1.9.0.exe, убеждаемся что появилось устройство    Android ADB Interface

Android ADB Interface

Android ADB Interface

2)

Устанавливаем ManufacturingFlashTool_Setup_6.0.51.exe, и делаем настройки:
в «Settings»-
В верхней строке сменить данные на:
VID: 8087 PID: 0A65
В нижней строке:
VID: 8087 PID: 09EF
Нажмите «Oк».

3.a)

В архиве (X98 Air 3G (C8J7) mirek190_v3.1\PARTITION TABLES) нужно взять и перенести нужный вам файл разметки partition.tbl в корень прошивки, что бы сделать то что вам нужно с системой и разделами, прошить только WINDOWS или ANDROID или то и то…

3.b)

Выбрать вкладку «File/Open«, в разархивированном архиве прошивки выбрать или
«flash-full_with_pattitioning«. (Будет сделан полный формат всего и собраны новые партиции, винда слетит, и под неё зарезервируется место).
или «flash-system_only.xml» — Прошивка только системы дройда.
После чего появится в консоле программы надпись READY TO FLASH

4.a)

Выключаем аппарат совсем, потом зажимаем одновременно «ВКЛ+ГРОМКОСТЬ+и-» — Включится режим «DNX»

Teclast DNX mode

Teclast DNX mode

 

4.b)

Вставить шнур, дождаться установки драйверов (если ещё не настроено) и если всё ок увидеть как через секунд 5 — 10 планшет перейдет в режим FASTBOOT и во флештуле пойдут проценты прошивки, а на планшете будет виден результат операции в консоле.

 

B)

Windows ставится вообще без бубнов! — После манипуляций с разделами и установки чистого дройда при включении планшета будет только иконка ANDROID, и что бы установить WIN 8 надо:

1.a)

Форматируем флешку в fat32. Скачиваем и распаковываем архив, содержимое папки «X98Air3GWin8.1ProStore.zip» копируем на флешку.

Версия Win 8.1 with Bing взята у Onda w975. Пост тут. В нее были инсталированы все драйвера от нашего планшета.аншета.

После чего при подключении флешки вместо винды появится маленькая иконка «окон», и при нажатии на неё плашет минут с полчаса будет » ставить» WINDOWS, после загрузки в винду надо поставить пару фиксов и твиков (Время — запустить файл fix_windows_time.reg) и датчик положения — X98Air3GWin8.1ProStore.zip\Drivers\Kionixx\kxaccel-1.0.13.20-win8-x86.exe и 8.reg).

 

C)

Установка WINDOWS 10 — легко и без бубна:
1.a)

На планшете ставим Windows10InsiderPreview.exe, тыкаем установить и …устанавливаем
2)

Бежим за пивком пока устанавливается (Около часа) —
Уменьшено на 88%
IMG_1147
3264 x 2448 (1,06 МБ)

P.S. Не установится видеодрайвер и будет всё тупить — ставим Intel Driver Update Utility Installer.exe и обновляемся.

 

У тех у кого не работает тач после установки android 5,  ЕСТЬ ФИКС — альтернативные ядра.

Кстати удобный и качественные сборки делает MIREK с XDA!

 

Тест: прошивок на совместимость с HG9N:

X98 Air 3G 4.4.4(Air2) mirek190_v4.2

X98_Air_3g_android_5.0_mirek190_v5.0-ultra-light

X98_Air_2_android_5.0_mirek190_v5.0-ultra-light

new_v5\X98_Air_2_android_5.0_mirek190_v4.1

X98 Air 3G (All variants) Android 5.0  mirek190_v2.0

X98 Air 3G (All variants) Android 5.0 beta v3.0 Mirek190

X98 Air 3G (C9J7) mirek190_v3.1

X98 Air 3G (C8J7) mirek190_v3.1

X98 Air 3G (C8J7)-Android4.4.4-V2.05

X98 Air 3G (C6J6) mirek190_v3.0

X98 Air 3G (C6J6) v4

X98 Air 3G (C6J6) v 4.4.4 light rom

X98 Air 3G (C6J6)-Android4.4.4-V2.01

X98 Air II (HG6M) light v4

X98 Air II (HG9M)_Android5.0-1

X98 Air II (HG7N)-Android4.4.4-V1.02_elvisi-EN

Teclast X98 Air 3G (C5J6)_android 5.0_trial version

Airclast X98 slim

X98 Airclast Slim Android 5 Lolipop custom rom

X98_Air_3g_android_5.0_mirek190_v6.0-ultra-light.7z

установка ок, камеры ок

установка ок, камеры не пашут.

установка ок,

после установки сразу ребут.. камеры не пашут.

установка ОК, камеры не пашут

установка ОК, камеры не пашут.

установка ОК, v4.4.4. камера ОК. CH

установка ОК — v4.4.4, камера ОК. ENG

установка ОК -камера ОК.  RU

установка ОК, v4.4.4, камера перевернута.

установка ОК, камера перевернута.

установка ОК, все работает, камера перевернута.

Gamma Update2do_flash_finished END OF FLASH — установка ОК, камера перевернута.

inished END OF FLASH — установка ОК, камера перевернута.
X98 Air II (HG6M) light v4

не устанавливается

не устанавливается

адекватный яркий загрузчик — no media found

ОК, камера не работает.

установка ОК, камера не работает.

установка ОК, камера не работает.

Безопасная настройка web-сервера (nginx+apache2-mpm-itk)

1. Создаем пользователей, файловая система.
Для начала я бы порекомендовал отделить под сайты отдельную директорию на сервере (вместо дефолтных, а-ля /home/user/www/). Создадим к примеру директорию sites, в корне. Выполним команды:

cd /
mkdir -m 755 sites

Тем самым мы создали директорию sites с правами доступа 755.
Далее создадим пользователей в системе. (для простоты мы будем настраивать сервер на 2-х пользователей.)

addgroup user1
(Добавляем группу для первого юзера)
useradd user1 -d /sites/user1 -g user1 -s /bin/false
(Добавляем первого юзера, устанавливаем ему домашнюю директорию, добавляем во вновь созданную группу, и убираем ему оболочку (/bin/bash))
passwd user1
(Устанавливаем пароль)
chmod 754 /sites/user1
(Правим права доступа к домашней директории)
mkdir -p -m 754 /sites/user1/public_html/www
(создаем веб-директорию, устанавливаем права доступа)
mkdir -p -m 777 /sites/user1/tmp
(создаем директорию для временных файлов, устанавливаем права доступа)
chown -R user1:user1 /web/user1/
(Рекурсивно меняем владельца домашней директории и всех вложенных)

2. Устанавливаем и настраиваем apache2-mpm-itk
Стандартный apache2 работает от одного юзера, что естественно критично снижает уровень безопасности, потому как apache грубо говоря имеет доступ ко всем php файлам всех сайтов. Таким образом хакер, взломавший один сайт на сервере и имеющий web-shell при стандартных условиях может прочитать файлы остальных сайтов.
Это нас естественно не устраивает, поэтому мы будем устанавливать модуль apache2-mpm-itk, что существенно повысит уровень безопасности нашего сервера.
Как гласит официальная документация:

apache2-mpm-itk (just mpm-itk for short) is an MPM (Multi-Processing Module) for the Apache web server. mpm-itk allows you to run each of your vhost under a separate uid and gid — in short, the scripts and configuration files for one vhost no longer have to be readable for all the other vhosts.

Поставим модуль из репозиториев:

apt-get install apache2-mpm-itk

Установка стандартна, расписывать не буду. Подробнее остановлюсь на конфигурации.
Вот пример конфигурационного файла /etc/apache2/sites-available/user1

<VirtualHost *:80>
ServerName www.user1.ru
ServerAlias user1.ru  *.user1.ru
DocumentRoot /sites/user1/public_html/www/»
ErrorLog /sites/user1/error_log
CustomLog /sites/site1/access_log combined
# Важный момент, указываем, что апач будет работать от пользователя wwwdata и нашей группы site1
AssignUserIdwwwdatasite1

# open_basedirдля домашней директории пользователя, можно добавить несколько директорий при необходимости, директории разделяются двоеточием «:»
php_admin_value open_basedir «/ sites/user1/:.»
# Включаем сейф-мод, я сделал это в каждом конфиге сайта для удобства отключения при необходимости.
php_admin_value safe_mode «on»
# Определяем нашу временную директорию как основную, вместо /tmp и устанавливаем её директорией для хранения сессий.
php_admin_value upload_tmp_dir «/ sites/user1/tmp»
php_admin_value session.save_path «/ sites/user1/tmp»
</VirtualHost>

Сохраняем конфиг, теперь активируем конфиг командой:

a2ensite user1

Далее перечитываем конфиги

/etc/init.d/apache2 reload

2.1(Пояснения)
AssignUserId www-data site1
Почему же мы указываем одного пользователя и разные группы для всех?
Ответ связан с предыдущим пунктом. Рассмотрим пример:
Действующих лиц трое: site1, site2 и wwwdata
Имеется два сайта с такими конфигами:

  1. AssignUserIdwwwdatasite1
  2. AssignUserIdwwwdatasite2

У сайта site1 есть файл

-rwxr-x—  1 site1 site1           397      Dec  1            23:15   index.php

Обратите внимание на юзера и группу владельца файла.
Таким образом, веб-сервер, работающий от единого пользователя и разных групп для каждого сайта обеспечивает безопасность между пользователями.
Поясню – права доступа выставлены так, что файл сможет прочитать только лишь владелец файла и участники группы, в это число входит site1 и веб-сервер запущенный от имени www-data, т.к. он работает от группы site1. Т.е. site1 может прочитать файл, записать и выполнить, веб-сервер может только прочитать и выполнить, а site2 и веб-сервер запущенный от имени группы site2 уже не сможет прочесть важные файлы соседнего сайта, как то конфигурационный файл и т.п.

Установка nginx

Устанавливаем nginx из репозиториев (в репозиториях зачастую устаревшие версии, при желании можно установить из исходников.)

apt-get update
apt-get install nginx

Далее нам нужно поменять порт для apache2, для этого в файле /etc/apache2/ports.conf вносим изменения:

NameVirtualHost *:8080
Listen 8080

Т.е. заставляем apache работать на порту 8080
Далее нам нужно прописать изменения в конфигурационные файлы наших проектов. Вот пример конфигурации файла /etc/apache2/sites-available/site

<VirtualHost *:8080>
ServerName www. site.ru
ServerAlias site.ru *. site.ru
DocumentRoot «/sites/ site /public_html/www/»
ErrorLog /sites/site/error_log
CustomLog /sites/site/access_log combined
AssignUserId www-data site
php_admin_value open_basedir «/sites/site /:.»
php_admin_value upload_tmp_dir «/sites/site /tmp»
php_admin_value session.save_path «/sites/site /tmp»

И так каждый файл всех ваших проектов.
Далее нужно изменить конфигурацию nginx.
Пример конфигурации:

server {
listen 000.000.000.000:80;
# вместо 000.000.000.000 ip адрес вашего сервера
server_name site.ru;
location / {
proxy_pass 127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)$ {
root /sites/site/public_html/www;
access_log /sites/site/access_log;
}
}

Данную конструкцию повторить для каждого проекта отдельно.
Таким образом мы настроили nginx фронтэндом, который будет обрабатывать статику (jpg,jpeg,gif и т.д.).
Теперь перезагружаем apache и nginx.

/etc/init.d/apache2 restart
/etc/init.d/nginx restart

ВАЖНО!

При установке nginx поверх apache2-mpm-itk я столкнулся с проблемой – т.к. апач работал от разных юзеров (точнее от разных групп) для каждого сайта, а nginx от одного юзера, то файлы статики были недоступны для nginx, не хватало прав, вследствии чего ошибка 403.
Решение:
Т.к. официального функционала у nginx с работой от разных юзеров еще нет, то пришлось добавить юзера www-data, от которого он работает в группы юзеров наших проектов.

usermod -a -G site1,site2,site3 www-data

Установка eAccelerator

Установка проста, описывать особо нечего.

cd /tmp
wget httр://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
tar xvfj eaccelerator-0.9.5.3.tar.bz2
cd eaccelerator-0.9.5.3
phpize
./configure
make
make install

Далее правим конфиг акселератора /etc/php5/conf.d/eaccelerator.ini
Вот пример конфигурации:

extension=«eaccelerator.so»
eaccelerator.shm_size=«32»
eaccelerator.cache_dir=»/var/cache/eaccelerator»
eaccelerator.enable=«1»
eaccelerator.optimizer=«1»
eaccelerator.check_mtime=«1»
eaccelerator.debug=«0»
eaccelerator.filter=»»
eaccelerator.shm_max=«0»
eaccelerator.shm_ttl=«0»
eaccelerator.shm_prune_period=«0»
eaccelerator.shm_only=«0»
eaccelerator.compress=«1»
eaccelerator.compress_level=«9»

Далее создадим директорию для кэша:

mkdir -p /var/cache/eaccelerator
chmod 0777 /var/cache/eaccelerator

перезагружаем апач

/etc/init.d/apache2 restart

ВАЖНО!

При установке eaccelerator также возникла проблема – вылетали ошибки:

PHP Warning: Unknown: open_basedir restriction in effect. File() is not within the allowed path(s): (blablabla) in Unknown on line 0

Как оказалось eaccelerator некорректно работает с open_basedir.
Решение:
При установке конфигурировать исходник с параметром —without-eaccelerator-use-inode
phpize
./configure —without-eaccelerator-use-inode
make
make install

Оптимизация связки Nginx, Apache, PHP, MySql

Неожиданно поступила задача разобраться почему определенный сайт не работает столь быстро сколь хочется. В основе его CakePHP, в связке с Apache и MySQL. В статье описание процесса поиска узких мест и приведение в порядок на столько, на сколько это возможно.
Название сайта светить не буду — думаю, программисты сами узнают. Скажу лишь, что это приложение для социальной сети нагрузкой 70-150 тысяч посетителей в обычное время. Все усложняется тем, что периодически производится рекламная рассылка, которая привлекает около 200-300 тысяч посетителей за пару часов.
Итак, под катом описание всей борьбы на протяжении 4 дней.

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

В моем распоряжении оказался сервер EX10, находящийся на площадке hetzner. Для тех кто не в курсе — это 64 Гб ОЗУ и 6-ядерный процессор. Назовем это ядром системы. Есть еще 2 сервера, один со статикой, другой с бекэнд базой. Небольшое приложение, InnoDB база данных на 500Мб.

С постоянной нагрузкой, как позже выяснилось, 70-100 онлайн сессий, ситуация следующая: загрузка CPU по 100% на каждое ядро. В топе, понятное дело, MySQL и Apache дерутся за ресурсы системы.

Nginx

Первой попыткой было снизить нагрузку сервера за счет кеширования выдачи Apache с целью снять с него выдачу статики.

Установил в очень простой конфигурации: он должен был все все файлы по маске пробовать забирать из определенной папки, если в ней файла нет — забирать его с проксируемого сервера, складывать в эту папку и выдавать клиенту.

http {
proxy_cache_path  /var/tmp/nginx_cache/  levels=1:2   keys_zone=ok:100m inactive=1d max_size=1024m;
server {
        location ~*  \.(js|JPG|jpg|png|jpeg|gif|zip|tgz|gz|rar|doc|xls|exe|pdf|ppt|txt|wav|bmp|rtf)$ {
                expires 1y;
                open_file_cache_errors  off;
                error_page 404 = @fetch;
                root  /var/tmp/_fetch_ok;
                }

        location @fetch {
                proxy_store_access      user:rw  group:rw  all:r;
                proxy_store on;
                proxy_pass http://127.0.0.1:80;
                proxy_temp_path /var/tmp/_fetch_ok_temp;
                root  /var/tmp/_fetch_ok;
                }

       location / {
                proxy_cache ok;
                proxy_pass   http://127.0.0.1;
                proxy_cache_valid any 10m;
                proxy_buffer_size 8k;
               }
}
}

Конфиг приведен не полностью, а только нужными для данного примера блоками.

К сожалению, не очень это привело к каким-то результатам.
Плюсов было всего 3:

  • Apache перестал выдавать картинки, то есть стал чуть менее загружен
  • Apache перестал напрямую общаться с внешним миром, следовательно у него можно было выключить keep-alive и уменьшить количество детей.
  • Нашлось первое узкое место — абсолютно всеми запросами на сайт управляет PHP скрипт на который .htaccess переадресует любой запрос. Включая, вы не поверите, всю статику, и даже css.

MySQL

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

Так как имеем на руках InnoDB — я взял для исходной позиции конфигурационный файл из стандартной поставки my-innodb-heavy-4G.cnf

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

back_log = 5000
max_connections = 1600
Первый параметр отвечает за количество соединений, которые могут находится в очереди до того момента, как сервер перестанет отвечать на новые запросы. Второй — сколько подключений может быть принято сервером.
У меня эти значения достаточно большие, так как конкурентных сессий в среднем выходит до 1300. Ставить больше чем нужно — не стоит, так как каждое соединение может потребовать некоторого количества ОЗУ. Об этом позже.

max_connect_errors = 50
Тут просто — количество ошибок, которые может сделать клиент до того как получит дисконнект. Пришлось увеличить, в виду того что проект в стадии разработки и шансов некорректных запросов много.

table_cache = 2048
Открытие таблицы требует некоторых ресурсов, следовательно этот параметр отвечает за количество открытых таблиц ожидающих следующего соединения некоторое время после выполнения последнего.
Узнать надо ли его менять можно по переменной
SHOW GLOBAL STATUS LIKE 'Opened_tables';
Она не должна быть как можно меньше.
Тут хорошо написано: http://www.mysql.ru/docs/man/Table_cache.html

max_allowed_packet = 16M
Максимальный размер пакета. Если не пользуемся большими BLOB, изменять не имеет смысла.

binlog_cache_size = 1M
Размер кеша бинарного лога, для транзакции. В официальной документации рекомендуют увеличивать если у нас большие транзакции.
dev.mysql.com/doc/refman/5.5/en/replication-options-binary-log.html#sysvar_binlog_cache_size

max_heap_table_size = 64M
tmp_table_size = 64M
Насколько я понимаю, учитывается меньший из них. Параметр отвечает за максимальный размер временной таблицы, умещающейся в памяти. Если таблица его достигает она кладется на диск. Следовательно необходимо стараться что бы таблиц на диске создавалось как можно меньше. Посмотреть какое отношение временных таблиц к таблицам на диске на данный момент можно запросив
show status like '%tmp%tables';
www.mysqlperformanceblog.com/2007/01/19/tmp_table_size-and-max_heap_table_size/

sort_buffer_size = 8M
Что бы не обмануть никого, не возьмусь переводить. Уточню лишь, что в документации советуют смотреть на этот параметр только если
show status like ‘%Sort_merge_passes%’; больше нуля
dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_sort_buffer_size

join_buffer_size = 2M
Насколько понимаю, максимальный размер буфера, рассчитанного на операции не использующие индекс. Пока не трогал.
dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_join_buffer_size

thread_cache_size = 4096
Максимальное количество треадов, которые остаются для повторного использования после выполнения запроса. Полезно держать достаточным для того что бы MySQL как можно меньше делал новых треадов и использовал старые. Понять эффективность данного параметра можно по отношению параметров Threads_created / Connections;
dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_thread_cache_size

query_cache_size = 256M
query_cache_limit = 8M
Я думаю тут лучше чем мой соратник, автор этого перевода habrahabr.ru/post/41166/ никто не скажет.
Это наверное наиболее важный параметр, так что лучше перечитать.

thread_stack = 192K
Не возьмусь описывать назначение данного параметра, обращу лишь внимание на то что он тоже влияет на количество потребляемой ОЗУ, так как тоже выделяется на каждое соединение. Следовательно опять умножайте на max connections

long_query_time = 2
log_long_format
log-queries-not-using-indexes
У сервера MySQL есть очень удобный инструмент для оценки производительности БД. Это лог файл длинных запросов. По моему опыту это чаще всего неэффективные запросы или запросы неиспользующие индекс.
Советую с этим лог файлом идти к программерам.

key_buffer_size = 1G
Параметр отвечает за кеширование индексов в памяти, для оптимизации данного значения смотрите на Key_read_requests, Key_reads. Второй параметр отвечает за количество чтений с диска а не их буфера.
mysqltips.blogspot.com/2007/03/key-buffer.html

read_buffer_size = 1M
boombick.org/blog/posts/3 — После прочтения этого текста, не рискну что либо добавлять, так как не буду уверен в своей правоте.

read_rnd_buffer_size = 24M
Параметр влияет на скорость операций сортировки. К сожалению не нашел как оценить его эффективность.
dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_read_rnd_buffer_size
www.mysqlperformanceblog.com/2007/07/24/what-exactly-is-read_rnd_buffer_size/

myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_max_extra_sort_file_size = 10G
Параметры влияют на сортировку, так же не рискнул их менять. Увеличил первый предполагая, что это увеличит производительность сложных запросов.

sync_binlog = 0
В нашем случае означает не синхронизировать бинарных лог на диск через системные функции. Если параметр больше нуля, то сервер будет синхронизировать данные каждые n запросов.
dev.mysql.com/doc/refman/5.5/en/replication-options-binary-log.html#sysvar_sync_binlog

innodb_buffer_pool_size = 4G
Увеличение этого параметра снижает количество дисковых операций. К сожалению тоже не нашел как его лучше замерить. Поскольку база небольшая решил его сильно не увеличивать. Где-то встречал совет, в случае большой БД увеличивать этот параметр до 70% ОЗУ.
dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_buffer_pool_size

innodb_log_buffer_size = 32M
Если верить описанию, снижает дисковые операции при тяжелых транзакциях.
dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_log_buffer_size

innodb_log_file_size = 1024M
Если верить документации, то увеличение лог файла уменьшает загруженность IO операций диска, но увеличивает время восстановления в случае сбоев.
dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_log_file_size

innodb_flush_log_at_trx_commit = 0
В значении 0, сброс буферов происходит раз в минутусекунду, а не после каждого инсерта.
dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

innodb_thread_concurrency = 14
Рекомендуют ставить чуть больше чем количество ядер.

innodb_sync_spin_loops=10
Насколько я понял, влияет на количество попыток доступа к заблокированным данным. Увеличивая данное значение мы можем потерять процессорное время, а уменьшая — надежность записи в БД.
www.mysqlperformanceblog.com/2006/09/07/internals-of-innodb-mutexes/
dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_sync_spin_loops

БД и оперативная память

Есть прекрасный скрипт на perl который дает базовое понимание того что надо поменять в БД. mysqltuner.pl/mysqltuner.pl
Очень часто данный скрипт ругается на максимальное потребление памяти сервером mysql.
Если посмотреть в исходник — вот как эта программа считает использование памяти:

per_thread_buffers = read_buffer_size +read_rnd_buffer_size + sort_buffer_size + thread_stack +join_buffer_size;
total_per_thread_buffers = per_thread_buffers * max_connections;
server_buffers = key_buffer_size +max_tmp_table_size;
server_buffers +=innodb_buffer_pool_size;
server_buffers +=innodb_additional_mem_pool_size;
server_buffers +=innodb_log_buffer_size;
server_buffers +=query_cache_size;
total_possible_used_memory =server_buffers + total_per_thread_buffers;

Мне было полезно понять где я не правильно указал значения.
Кстати, сразу кидаться занижать параметры, если скрипт ругается на большое потребление ОЗУ базой, не стоит. Так как многие отмечают, что это лишь теоретический показатель и БД может никогда не попытаться забрать себе столько памяти.

Оптимизация структуры БД.

Когда мы сделали все возможные настройки и все равно не получили хорошего результата — пора обратиться к slow-log файлу.
В стандартной комплектации к mysql есть приложение mysqldumpslow.
Запустив
mysqldumpslow -s c <путь к слоу-лог файлу>отсортированный по количеству вхождений список запросов к базе данных, которые были слишком долгими или не использовали индексы. Обычно добавление правильных индексов исправляет обе проблемы.

В большинстве случаев, когда вы видите в выводе этой программы большое количество долгих запросов(переменная count), копируете кусок этого запроса и ищете в тексте лог файла пример такого запроса.
Далее заходите в клиент БД и выполняете этот запрос, добавив вначале слово explain.
Про это так же можно прочитать подробнее вот тут:
habrahabr.ru/post/31072/

Так можно увидеть использует ли запрос индекс или нет.
Если таблице не хватает индексов их можно смело добавлять, хотя перебарщивать тоже не стоит. Индексы нужны тем столбцам которые используются после where и order. Начинайте с уникальных индексов на каждый стоблец. Иначе индекс может не сработать.
Вот тут можно узнать более подробно как эти индексы работают:
dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Скажу честно, после оптимизации примерно 5 ключевых запросов сервер смог обрабатывать 500-700 подключений вместо 50, а время выдачи php-страницы сократилось до 1с вместо 8с. При максимальной нагрузке время выдачи страницы составило 5с вместо 50с. (Имеются в виду замеры производительности с помощью Apache Benchmark c примерно 1000 потоков)

Еще немного об nginx.

После оптимизации заметил, что при больших нагрузках откидывает запросы больше определенного количества уже сам nginx, а не apache. При этом память и CPU не загружены.
Стал разбираться. Увидел в логах, что сервер nginx пытается открыть файлов больше, чем ему положено.
В ОС Suse, с которым мне пришлось столкнуться, за это ограничение отвечает файл
/etc/security/limits.conf
Дописал я туда вот такие строчки:

nginx		soft 	nofile		300000
nginx		hard	nofile		300000

Рестарта сервера не понадобилось.

Apache2

Сильно изменять конфигурацию я пока не стал. Единственное что сделал — так это выключил keep-alive. Что бы апач мог спокойно выдать ответ и заняться следующим запросом в тот момент, когда nginx все еще отдает клиенту страницу по медленному каналу.

eAccelerator

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

Вот что изменил я:
eaccelerator.shm_size = «2096»
Размер виртуальной памяти в мегабайтах который можно использовать

eaccelerator.shm_only = «1» — использовать только ОЗУ и не использовать диск, в борьбе за io на софт рейде из 2 сата дисков решил сделать так.

Вот еще что будет полезно почитать:

habrahabr.ru/post/41166/
habrahabr.ru/post/108418/
dev.mysql.com/doc/refman/5.5/en/server-system-variables.html

Отдельное спасибо моему другу, который помог вычитать статью и исправить целую гору грамматических и стилистических ошибок.

Вместо послесловия

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

UPD, Резюме по комментам

Спасибо за столь большой интерес. Не ожидал.

хорошая ссылка, рекомендую к прочтению
www.percona.com/files/presentations/percona-live/dc-2012/PLDC2012-optimizing-mysql-configuration.pdf
спасибо Albertum

По поводу систем кеширования php:
да действительно eAccelerator не единственный вариант.
Есть так же APC, и да действительно его собираются встроить в PHP.
Что лучше судить не возьмусь, так как не делал достаточного количества тестов.

Альтернативы MySQL тоже присутствуют и их много.
Ключевые конечно:
mAriadb
percona

Пример использования Zend Framework в компоненте Joomla

Joomla is a nice CMS (content management system) and Zend Framework is once of the famous and widely adopted MVC Framework since its first release. One of the nice thing about Zend is its loosely coupled components.

Keep in mind that component in joomla and Zend Framework don’t refer to the same concept. Those who have worked in Joomla and Zend Framework know the difference.

In this article I’m not going to discuss what Zend and Joomla are all about and how component is different in both, but instead I’m going to share a little secret of how to develop joomla component in Zend Framework.

This article is not for those who are unaware of joomla and Zend.

Although joomla has own API for developing its components and modules, but you can use any php code in addition to its own API.

Reason is simple. Joomla is developed in php.

As Zend also used php behind the scene, so both can interact easily.

This was a bit of introduction.

While discussing all these things I assumed that you have little knowledge of joomla and have some knowledge of Zend Framework as well.

So let’s dig in.

Before writing any code you will need to successfully download and install joomla. Also download Zend and save it in the directory of your choice.

Once successfully installed joomla, open joomla/administrator/components and create a folder called com_yourcomp.

This is your component folder. You will need to create a file named yourcomp.php

If you want to add component in your administrator, the name should be admin.yourcomp.php.

That’s it, you have now created a the necessary directory structure for your joomla component development.

If you write a line “Hello world!” in youcomp.php or admin.yourcomp.php and browse your page as

http://localhost/joomla/index.php?option=com_yourcomp

you will see

“Hello world” printed.

These are the minimum requirements for developing joomla component.

Now we will using Zend Framework classes to add code to this file plus we will create Zend directory structure in order to work with Zend MVC.

Create following directory structure in your joomla/administrator/components.

zend_dir_structure

 

 

 

 

Here you can see that my component name is com_advertisers.

In this directory I’ve

* admin.advertiser.php file
* application directory
* Joomla directory

The file admin.advertiser.php will serve as the bootstrap file.

Application directory contain specific directory for controllers, models and views.

The most important role is played by our Joomla directory in developing joomla component in Zend Framework.

This directory contain Controllers/Plugins/Router.php file.

This file contains code for calling specific action based on particular task. Before going to discuss code in the Router.php file, I’m going to show the code need in our admin.advertisers.php file.

<?php
define('ROOT_DIR', dirname(__FILE__));
set_include_path('.'
    . PATH_SEPARATOR . ROOT_DIR . '/'
    . PATH_SEPARATOR . ROOT_DIR . '/application'
    . PATH_SEPARATOR . ROOT_DIR . '/application/models'
    . PATH_SEPARATOR . get_include_path()
);

require_once "Zend/Controller/Front.php";
require_once "Joomla/Controllers/Plugins/Router.php";

$frontController = Zend_Controller_Front::getInstance();
$frontController->throwExceptions(true);

$frontController->registerPlugin(new Joomla_Controllers_Plugins_Router());
$frontController->setControllerDirectory(ROOT_DIR.'/application/controllers');

$frontController->dispatch();

In the first few lines I have included path to our com_advertisers directory, application directory and models directory.

Next I include Zend Front Controller files and Router.php file. I’ll discuss code in the Router.php file later as it contain the most important code.

Next I initialize front controller, register Router Plugin class which is defined in our Router.php file, set controller directory and call dispatch.

That’s it. We have now defined our bootstrap file.

One important thing is setting path to our library files that contain Zend component.

You can include path using set_include_path or set it in your php.ini file.

If you don’t include this path, your application will not work as you expected.

Now go to controllers directory and create IndexController.php and write the following code in it.

<?php

require_once('Zend/Controller/Action.php');
class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
    }
    public function editAction()
    {
    }
    public function saveAction()
    {
    }
}

Noting special here. I’ve created only three actions.

Go to your application/views/scripts directory and create directory called index and create three files index.phtml, edit.phtml and save.phtml.

The code above is what you will need to work with Zend Framework MVC. In order to integrate this code with joomla will need one additional files. In my case the file is Router.php

I have create this file in com_advertiser/Joomla/Controllers/Plugins/ directory.

The code contain in this file is

<?php

require_once('Zend/Controller/Plugin/Abstract.php');
class Joomla_Controllers_Plugins_Router extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $task = $request->getParam('task')
        switch($task) {
            case 'edit':
                $request->setActionName('edit');
                break;
            case 'save':
                $request->setActionName('save');
                break;
            default:
                $request->setActionName('index');
                break;
        }
    }
}

First I’ve include plugin class and then extended my Router class from Zend_Controller_Plugin_Abstract.

This Zend_Controller_Plugin_Abstract class contain a method preDispatch that is called before any controller is called in the routing process.

In the preDispatch method, I get the param “task” and write a switch statement to check this param. If it is edit, I give control to my editAction of the default IndexController. And similarly if it is save, I route request to my saveAction and by default, if no parameter is specified, the request will be dispatched to indexAction of my IndexController.

That’s it.

Now if you write

http://localhost/joomla/administrator/index.php?option=com_advertisers&task=save

It will show what ever you have written in your save.phtml file.

And similarly if you write

http://localhost/joomla/administrator/index.php?option=com_advertisers&task=edit

it will route you to editAction and will display whatever you have define there.

Any question and suggestion are welcomed.

Ошибка при добавлении фотографии к сообщению на iphone 5s

Если при попытке прикрепить фотографию в приложении для iPhone появляется подобная ошибка, то пройдите в настройки телефона, выберите там пункт «Приватность», затем «Фотографии» и напротив VK измените положение ползунка для разрешения доступа.

Настройка геолокации на iphoneошибка фото к комментарию vk iphone 5s 2014

 

Если у Вас iOS 5.x, то нужно так же открыть настройки телефона, перейти в пункт «Геолокация» и там разрешить доступ нашему приложению.

P.S. Для тех у кого это не убирает ошибку официальный ответ поддержки приложения Vkontakte:

-Здравствуйте, мы решили вашу проблему, в ближайшем обновлении (xx.02.2014) ожидайте исправления этой ошибки, спасибо за понимание.