barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

среда, 5 октября 2011 г.

Настройка внешнего UserStoreManager для WSO2IS

1) Создать структуру БД из соответствующего СУБД скрипта из директории wso2is-3.2.0/dbscripts
2) В /repository/components/lib положить jar-ник клиента Вашей СУБД
3) Изменить настройки управления пользователями в файле /repository/conf/user-mgt.xml. Вот пример настроек для БД postgers:

<UserManager>
    <Realm>
        <Configuration>
            <AdminRole>admin</AdminRole>
            <AdminUser>
                <UserName>admin</UserName>
                <Password>admin</Password>
            </AdminUser>
            <EveryOneRoleName>everyone</EveryOneRoleName>
            <ReadOnly>false</ReadOnly>
            <MaxUserNameListLength>500</MaxUserNameListLength>
            <Property name="url">jdbc:h2:repository/database/WSO2CARBON_DB;DB_CLOSE_ON_EXIT=FALSE</Property>
            <Property name="userName">wso2carbon</Property>
            <Property name="password">wso2carbon</Property>
            <Property name="driverName">org.h2.Driver</Property>
            <Property name="maxActive">50</Property>
            <Property name="maxWait">60000</Property>
            <Property name="minIdle">5</Property>
        </Configuration>
        <UserStoreManager class="org.wso2.carbon.user.core.jdbc.JDBCUserStoreManager">
<Property name="PasswordJavaScriptRegEx">[\\S]{5,30}</Property>
            <Property name="url">jdbc:postgresql://localhost:5432/wso2is_um</Property>
            <Property name="userName">postgres</Property>
            <Property name="password">postgres</Property>
            <Property name="driverName">org.postgresql.Driver</Property>
            <Property name="maxActive">50</Property>
            <Property name="maxWait">60000</Property>
            <Property name="minIdle">5</Property>
<Property name="ReadOnly">true</Property>
            <Property name="MaxUserNameListLength">100</Property>
            <Property name="IsEmailUserName">false</Property>
            <Property name="DomainCalculation">default</Property>
            <Property name="PasswordDigest">SHA</Property>
            <Property name="StoreSaltedPassword">true</Property>
            <Property name="UserNameUniqueAcrossTenants">false</Property>
        </UserStoreManager>
        <AuthorizationManager class="org.wso2.carbon.user.core.authorization.JDBCAuthorizationManager"/>
    </Realm>
</UserManager>

За основу взят пример с wso2.org (http://wso2.org/project/solutions/identity/3.2.0/docs/user-core/user-mgt-jdbc.xml), однако PasswordDigest заменен на "SHA", потому что иначе не получается залогиниться под admin/admin.Также добавлен параметр PasswordJavaScriptRegEx, без него через интерфейс карбона не создать пользователя, т.к. он ругается на любой введенный пароль, что он якобы менее 5 символов.
4) Запустить WSO2IS с ключом -Dsetup, который создаст первоначальное заполнение БД (впрочем, п.1 можно было бы и пропустить, -Dsetup вроде бы сам умеет создавать структуру). При этом в БД появятся 2 пользователя - admin и wso2.anonymous.user.

Изменение параметра innodb_log_file_size InnoDB-движка MySQL

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

InnoDB: Error: log file .\ib_logfile0 is of different size 0 <xxx> bytes
InnoDB: than specified in the .cnf file 0 <yyy> bytes! 
Причина:
MySQL видит, что размер существующего лог-файла отличается от указанного в настройках.

Решение:
Остановить сервер, сделать резервную копию файлов ib_logfile<x>, после чего удалить их, изменить значение параметра  innodb_log_file_size и запустить сервер. MySQL создаст новый лог-файл указанного в конфигурации размера.

вторник, 4 октября 2011 г.

KILL процесса MySQL, выполняющего ALTER TABLE

Делать KILL процесса, выполняющего модификацию структуры таблицы (ALTER TABLE), можно. По крайней мере, если верить mail-листам mysql.com. Действительно, при выполнении команды ALTER TABLE MySQL создает копию модифицируемой таблицы, а после успешного завершения процесса удаляет исходную таблицу, а скопированную переименовывает. На собственном опыте проверил (после 22 часов выполнения запроса ждать попросту надоело), таблица жива =)

Аналог wget для Windows

Аналог /dev/null в Windows

В Windows вместо "черной дыры" /dev/null можно использовать псевдофайл с именем "NUL", имеющийся в каждой директории. Также он позволяет проверить наличие какой-либо директории (командой "if exist somedir\nul", тогда как проверяя "if exist somedir" мы получим истину даже если somedir вовсе и не директория, а файл).

Запрет форвардинга X11 по ssh

В файле /etc/ssh/sshd_config установить:
X11Forwarding no

суббота, 1 октября 2011 г.

MySQL: #1005 - Can't create table (errno: 150) при попытке создания внешнего ключа

Проблема:
При попытке создать внешний ключ в таблице MySQL командой ALTER TABLE появляется ошибка "#1005 - Can't create table ...#sql-c84_... (errno: 150)".
Причина:
Причин может быть несколько: несовпадение типов поля, являющегося первичным ключом, и поля-внешнего ключа, или же поле, на которое ссылается внешний ключ вообще не является первичным ключом. Для того, чтобы увидеть текст ошибки, нужно выполнить SHOW ENGINE INNODB STATUS, где посмотреть в блок "LATEST FOREIGN KEY ERROR".