MySQL: Single row lock implementation

Рубрика: Development, MySQL | 24 June 2009, 16:01 | Vadim Voituk

При разработке приложений с использованием баз данных, часто возникает сценарий “insert if not exists”:

if ( <row exists in table> )
   then <insert new record into table>

Из-за того, что данный блок псевдо-кода не выполяняется атомано, может возникнуть ситуация, когда между проверкой <row exists in table> и выполнением действия <insert new record> паралельный поток (клиент)  выполнит добавление новой записи и в итоге в БД окажется 2 одинаковых записи (или произойдет ошибка “duplicate key”).

Такой, не самый приятный case, в книгах по паралельному программированию называют race condition и обходят путем создания синхронизирующих блокировок , использованием “выпрямителей” и тд.
[Далее...]

Using iptables to prevent SSH brute force

Рубрика: Development | 21 June 2009, 16:34 | Vadim Voituk

Себе на заметку, дабы потом опять не гуглить.
Эти 2 простых iptables-правила спасают сервер от brute force перебора пароля от SSH:
iptables -I INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsourceiptables -I INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 5 --name DEFAULT --rsource -j DROP
В результате те, кто делает более 5-ти попыток SSH-подключений за последние 3 минуты – блокируются на 3 минуты.
Для того, чтоб эти правила запускались при старте системы делаем dump rules-файла:
iptables-save > /etc/sysconfig/iptables

Mac OS X: Few Usefull Max OS hints

Рубрика: Mac OS X | 11 June 2009, 09:54 | Vadim Voituk

За почти 2 месяца иcпользования MacBook и Mac OS X скопилось несколько полезных советиков, коими и спешу поделиться. Все tips&tricks были честно найдены в глобальной сети и опробованы на себе.

  1. Nokia E50 Не хочет коннектиться по Bluetooth (точнее коннектится, но быстро отваливается).
    Удаляем файл, в котором хранятся bluetooth-профайлы устройств
    rm /Library/Preferences/com.apple.Bluetooth.plist и перенастраиваем коннект с мобильным гаджетом заново.
    Лично у меня 2-ждый такой трюк провернуть не удалось – проблема первый раз решилаcь, а повторно -уже не помогло.

  2. Когда-то я жаловался на отсутствие hotkey-я для максимизации/оптимизации текущего окна. Так вот действие для “зеленой кнопки максимизации”  в большинстве Mac OS приложениях называется “Zoom” и находится в меню View.
    Чтоб назначить горячую клавишу на это действие открываем:
    System Preferences → Keyboard and Mouse → Keyboard Shortcuts Далее в разделе "Application Keyboard Shortcuts → All Applications" добавляем такую запись:
    Zoom
    (в данном случае, я выбрал shortcut Command+Shift+M )

  3. В Finder в “Column mode” по дефолту колонки очень узкие, а после изменения и закрытия окна – их размеры не сохраняются.
    Решается просто: Если изменить ширину колонки при этом зажав “Option” – новый размер станет стандартным.
    Как сделать ширину auto-adjustable – я так и не нашел.
  4. Для того чтоб в заголовке окон Finder показывать полный путь к открытой директории (например “/home/vadim/Desktop” вместо простого “Desktop”), нужно в терминале выполнить:
    defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES; killall Finder
    ну и соответственно заменить YES на NO чтоб показывать “короткий” путь.
    Выглядит это так:
  5. При коннекте по SSH на Ubuntu/Debian линуксы, в оболочке screen не работает BackSpace (и мапинг Ctrl+H не спасает)
    Решение: Необходимо перед запуском установить переменную окружения TERM=screeen.
    В приниципе можно в .bashrc назначить alias:
    alias screen='TERM=screen screen'

  6. И еще несколько мелких советов, которые я почерпнул с твиттера @okertanov

    1. Shift-Minimize button – нууууу очень медленнноооое сворачивание окна в док
    2. Смена дефолтного браузера на Маке происходит через Safari → Preferences → Default Web Browser
    3. Alt-Shift-K = “символ яблочко” 
  7. Чтоб сменить unix-имя пользователя Max OS X (ну и заодно имя home-директории) нужно
    1. Включить root-пользователя, залогиниться под ним
    2. Переименовать home-директорию (For ex:  $ mv /Users/admin /Users/vadim)
    3. Через System Preferences → Accounts создать пользователя с желаемым именем, совпадающим с новым именем home-директории
    4. Согласиться с предупреждением, что существующая home-директория будет назначена новому пользователю.
    5. Залогиниться под новым пользователем, проверить все ли ок, удалить старого пользователя
    6. Отключить root-а

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