PHP 5.3 и поддержка old passwords в MySQL

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

После обновления PHP и либы mysqlnd один из production-серверов вскрякнул:


Warning: mysql_connect() [function.mysql-connect]: Premature end of data (mysqlnd_wireprotocol.c:554) in ...
Warning: mysql_connect() [function.mysql-connect]: OK packet 1 bytes shorter than expected in ...
Warning: mysql_connect() [function.mysql-connect]: mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file in ...

Ларчик просто открывается — собственно, все и написано в ошибке. Старый хеш имеет длину в 16 символов, новые — в 41. До сих пор даже в самых последних версиях MySQL не могут по каким-то причинам отказаться от старых паролей и таскают в конфиге этот allow_old_passwords = 1.

Ну, надо идти в ногу со временем.


SELECT `user` FROM `mysql`.`user` WHERE LENGTH(`Password`) = 16;

Ну и


UPDATE `mysql`.`user` SET `Password` = PASSWORD('старый пароль') WHERE `user` = 'юзер со старым хешом';

Удивительно только как проникает-то туда! Подозреваю что это все злой phpMyAdmin с его автоматическими созданиями юзеров

Вертолетный шум MacBook Pro

MAMP App вконец меня выбесил своей абсолютной некрутостью виртуальных хостов.

Вычистил его корни отовсюду, запустил

sudo port install apache2 mod_perl2 mod_ssi_func mysql5-server mysql5-client php5 php5-mysql

ии кааак пойдет на взлет прошка моя — что прям думал со стола улетит — такой шум поднялся от кулеров — негодует видимо =)

В итоге наслаждаюсь нормальным «MAMP» набором :) Перевыкаю от путей конфигов — зато теперь все четко-четко, без хрени всякой — и рестартится нормально — и конфигурится по-людски.

Сбросить пароль в Redmine

Оказалось что это не так очевидно и просто как могло бы быть. Забыл админский пароль в Redmine.

Первым делом полез в БД — смотреть на хеши. Попробовал md5, потом все-таки полез в гугл искать алгоритм шифрования — оказалось SHA1. Но и с sha1 не пустило.

Смотрел таблицу users — поле hashed_password.

Взял готовый хеш пароля из db/migrate/001_setup.rb — тоже не подходит (ну и нечего удивляться — тот же sha1 от admin)

Загуглил вплотную — и помогла команда:
RAILS_ENV=production script/runner ‘user = User.find(:first, :conditions => {:admin => true}) ; user.password, user.password_confirmation = «my_password», «my_password»; user.save!’

Вуаля, так пароль сбрасывается. Где хранится — прям вот в затруднениях. Но сбрасывается.

DevConf’2011 — 4 июня

http://devconf.ru
Буду дебютировать в роли докладчика на Perl-секции — http://devconf.ru/offers/24 , в 18-00, закрывая секцию.

«Концепция алгоритма построения стабильного многопоточного приложения которое обрабатывает слова, нормализуя их с помощью инструмента от Яндекса — mystem.»

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

Отключить рекламу Beeline

На телефон стали приходить USSD-сообщения. Порыл как отключить, поругался, всё как надо.
Оказывается, это услуга Хамелеон, подключаемая автоматически при проверке баланса через *102#.

Отключаем:

Или звоним 0684-700-000
Или *110*20#
Или меню «Beeinfo» —> «Хамелеон» —> «Активация» —> «Откл.»

C# — работа с вебом и файлами

Внутреннее веб-окружение офиса не имеет NS-записей — и мало того, из офиса нельзя достучаться к нему через внешний IP офиса.

А извне — можно, веб-гейт проброшен. Из-за этого приходилось каждый раз — дома и на работе — менять hosts-файл, раскомментируя нужные записи и закомментируя ненужные.

Поморочился неделю, скачал MS VS C# Express и набросал интерфейс с двумя кнопками и одним окном.
Нажимаешь кнопку — программка считывает с сервера XML, выбирает оттуда нужный IP, статик-хосты и пишет в hosts, сохраняя предыдущие записи и фильтруя потенциальные дубликаты.

Лепота!

Странные, правда, дела. При первом веб-запросе интерфейс зависает на время запроса. А если делать последующие — то уже всё моментом. До тредов я так и не добрался, — оставил так.

Ну, и манифест пришлось делать на запуск с правами администратора — иначе в 7 и Vista нельзя hosts поправить.

В любом случае, удобная штука получилась. Испытываю на коллегах.

Передача параметров по ссылке в PHP

Как-то один свежеперенесённый проект накакал в логи приличное количество сообщений.

В них он слёзно молил включить ему allow_call_time_pass_reference — иначе он работать отказывался.

Иню-то включили, — но заставило насторожиться — с чего это ссылки начали так ругаться.

И вот он и ответ:

allow_call_time_pass_reference (boolean)
In PHP5, allow_call_time_pass_reference is deprecated, in versions prior to PHP 5.3.0, use of this feature will emit an E_COMPILE_WARNING, and in PHP 5.3.0+, the warning is a E_DEPRECATED notice.

Cуть в том, что больше нельзя передавать в функциюю ссылку начиная с 5.3, но можно принимать ссылку.

В говнокоде соответственно пестрили конструкции вида $x = foo(&$a);

Правильно — $x = foo($a); function foo(&$a){…}

Пипец, как же в перле с этим хорошо!

Построчно вывести два файла рядом

Самый оптимальный способ вывести два больших файла «рядом»

Предположим, что есть два файла
1.txt cодержит:
1
2
3
4
5

2.txt содержит
6
7
8
9
0

Надо вывести запись из файла 2.txt рядом с записью 1.txt

perl -le ‘open F,»<$ARGV[0]»;while(<STDIN>){chomp;print «$_\t».readline(*F);}close F;’ 2.txt<1.txt

Соответственно, выводит реверсивно второй файл, — но ничего не мешает сортануть первый файл перед этим.

Суть задачи в обрезанной памяти на ВПС.

Все остальные способы будут жрать память

Выдача картинок из Гугла

Мерзоциды внедрили живой поиск и теперь пагинация страниц отсутствует — всё подгружается на одной и той же странице.

Впрочем, это не помешало такой-то матери и FireBug узнать — как надо грести страницы парсером.

images?um=1&hl=ru&gbv=2&prmdo=1&as_st=y&tbs=isch%3A1&sa=1&q=запрос&aq=f&aqi=g10&aql=&oq=&gs_rfai=&biw=1600&bih=338&addh=36&ijn=bg&page=2&start=25

UPD: когда дело дошло до юнит-тестов, оказалось что результаты совершенно непредсказуемые. Без сохранения кук, прямой простой запрос с разных User-Agent возвращает разное количество результатов. От 21 до 460. Бред.

UPD2:
Это всё же User-Agent виноваты. Палю бесценный список кошерных для гугла агентов, на которые у него стоИт и он им отдаёт по 460 результатов картинок.
my $google_ua_list = [
‘Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.48 Safari/525.19’,
‘Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11’,
‘Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1’,
‘Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.9) Gecko/2009040821 Firefox/3.0.9 (.NET CLR 3.5.30729)’,
‘Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 (.NET CLR 3.5.30729)’,
‘Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729)’
];

LiveJournal TabIndex Greasemonkey plugin

Взьярённый от нововведений ЖЖ, набросал махонький Greasemonkey-скрипт, чтобы комментарии по-прежнему отправлялись в стиле Write-Tab-Space-Style

// Adding TabIndex to LJ Post button user script
// version 0.1 BETA!
// 2010-09-01
// Copyright (c) 2010, Andrew Jumashev
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// ———————————————————————
//
// This is a Greasemonkey user script.
//
// To install, you need Greasemonkey: https://addons.mozilla.org/en-US/firefox/addon/748
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to «Install User Script».
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select «TabIndex LiveJournal», and click Uninstall.
//
// ———————————————————————
//
// ==UserScript==
// @name TabIndex LiveJournal
// @namespace http://www.skazkin.ru/
// @description This is a quick patch on LiveJournal innovation with adding FB and Twitter repost options. This script supports old Write-Tab-Post style for writing comments.
// @include *.livejournal.com/*
// ==/UserScript==

function setTabIndex () {
var button = document.getElementById(‘submitpost’);
var body = document.getElementById(‘body’);
if(!button || !body){
return false;
}
body.tabIndex = 1;
button.tabIndex = 2;

return false;
}
setTabIndex();