Однажды мне было необходимо узнать версию системы для обновления своего любимого сервачка и в этом мне помогли две программки:
lsb_release -a # Инфа об Убунте uname -a # Все данные о системе uname -m # Только разрядность x32 или x64
Однажды мне было необходимо узнать версию системы для обновления своего любимого сервачка и в этом мне помогли две программки:
lsb_release -a # Инфа об Убунте uname -a # Все данные о системе uname -m # Только разрядность x32 или x64
Редко, но все же приходиться иногда проставить с помощью инкремента некое поле в таблице базы данных, например место или позиция в рейтинге чего-либо. Для этого необходимо выполнить такие команды:
-- Определяем переменную select @i := 0; -- Используем ее в качестве инкремента и присваиваем значение нужному нам полю. UPDATE `site_statistic` SET `ratePosition` = (select @i := @i + 1) ORDER BY myPoint DESC;
Пожалуй, все.
Главным недостатком является то что, увы, я не могу пока, проводить "глубинное" сканирование крупных сайтов. Ввиду этого проверка идет только по одной странице - по главной. Альфа будет так работать, с выходом беты этот недостаток-ограничение будет снят. И вы сможете сканировать сайт такой какой захотите. А пока на алфу запланированы следующие инструменты, это:
Попутно будут исправляться ошибки и а также. Добавляться технические тесты.
Проект планирую перевести в бету с приходом весны, а конкретно в светлый женский праздник 8-го марта. В бете же проект буду держать довольно долго, вплоть до начала осени.
В общем, кому интересно, кто хочет поддержать. Добро пожаловать на myseobot.com. В скором времени появится RSS лента. А также недельные изменения будут публиковаться прямо на сайте робота, по пятницам. А еще, в скором времени на myseobot будут последние новости по поводу мировых трендов оптимизации и технического усовершенствования сайтов.
Я даже удивился немного когда увидел в других обзорах упоминание о том что мало софта для этой малышки. Если кто-то может объяснить чем это плохо, прошу в комменте отписать.sudo aptitude install phantomjsНо, как известно, стандартные пакеты славятся отсталостью версий. Как же быть если пакеты в репозиторые старые, а из сырцов поставить не вышло? На официальном сайте есть бинарники. Там вы найдете бинарники для популярных ОС.
console.log('Hello Phantom!!!');
Для запуска выполним phantomjs hello.jsПолучим сообщение в консоль. Ну, это по-моему очевидно. Далее чуть поинтереснее. Пример получения скриншота посещаемой страницы:
var page = require('webpage').create();
page.open('http://google.com', function () {
page.render('google.png');
phantom.exit();
});
Тут мы сначала подключаем необходимый нам модуль webpage. А затем открывает необходимую нам страницу, после успешной загрузки которой мы вызовим колбэк функцию. В этой функции мы сохраняем (рендерим) скриншот страницы в файл google.png и закрываем phantomjs.
var page = require('webpage').create(),
system = require('system'),
t, address;
if (system.args.length === 1) {
console.log('Usage: loadspeed.js ');
phantom.exit();
}
t = Date.now();
address = system.args[1];
page.open(address, function (status) {
if (status !== 'success') {
console.log('FAIL to load the address');
} else {
t = Date.now() - t;
console.log('Loading time ' + t + ' msec');
}
phantom.exit();
});
netsh>interface netsh interface>portproxy netsh interface portproxy>add v4tov4 listenport=80 listenaddress=192.168.1.101 connectaddress=192.168.56.101 connectport=80Проверяем все ли прошло гладко:
netsh interface portproxy>dump #=========================== # Конфигурация портов прокси #=========================== pushd interface portproxy reset add v4tov4 listenport=80 connectaddress=192.168.56.101 connectport=80 popd # Конец конфигурации портов проксиДа все нормально. Пробуем теперь обратиться локально по 192.168.1.101 и мы получим ответ от апача по адресу 192.168.56.101. Дальше пробуем уже по внешнему IP адресу, и вы должны получить тот же ответ что и от внутреннего адреса 192.168.56.101. Стоит уточнить, данный способ пробросит только TCP.
Работая надо одним проектом, часто приходилось работать с данными полученными из разных источников. Все эти данные были сформированы в виде CSV файлов. Причем все имели разные форматы. Нужен был инструмент для быстрой и удобной работы. Решил написать. Т.к. из того что я нашел не было ничего подходящего.
Итак что умеет этот класс. Главное это то что он осуществляет удобную загрузку данных CSV и, путем несложного дополнения, можно экспортировать данные в другой формат, а также формирование и сохранение данных в CSV формат. Все делается очень просто и без особых усилий. Из способностей этого класса есть еще такие "недопиленные" фишки как поиск по колонкам и по строкам, пока в некоторых случаях срабатывает некорректно. Но от класса этого и не требовалось, так сказать это побочный положительный эффект.
Итак по порядку. Класс можно забрать на Gitgub'e.
Использовать его очень просто. Ниже пример инициализации и загрузки CSV данных.
$options = array(
'splitter' => ';', // Это разделитель "колонок" в CSV файле
'wrapper' => '"', // А это то во что "завернуты" значения "колонок"
);
$csv = new Csv($options);
А вот так просто мы можем добавить строку в CSV файл, но данные сохранятся только после вызова метода Csv::save([file_name])// Можно передать и в конструктор в виде параметра file => 'filename.csv'
$csv->file('./users.csv');
$csv->add(
array ('id', 'user', 'name', 'email')
);
// Если как в этом примере мы указали имя файла то просто вызываем Csv::save если нет, то передаем в качестве параметра имя файла
$csv->save()
Если мы заранее указали имя файла с которым работаем, то и этот метод вызываем без параметров. Это загрузка CSV файла и его парсинг.
$csv->load();или
$csv->load("./users.csv');
Этот класс так может выполнять операции по получению данных из опреденных ячеек, а так же можно задать названия столбцов. Несколько примеров по работе с данными
$csv->rows(); // Получаем все распарсенные строки из файла (в виде массива)
$csv->row(1); // Получи первую строку, причем если вы укажите в параметрах конструктора параметр columnNames, то это строка выведет данные а не названия столбцов
$csv->cell(10, 3); // Выведет данные из 10 строки 3 колонки
$csv->remove(3); // Удалит 3ю строку из файла
$csv->readOnly(true); // Пометить объект как "только чтение" и методы add и remove будут генерировать исключения
$data = $csv->columns() // Получить все колонки
$userNames = $csv->column('name'); // Получить колонку с именами (если конечно был задан map колонок)
// Весь поиск прекращает работу и возвращает строку как только будет найдена первая строка удовлетворяющая поиску
$csv->find('Vasya'); // Будет работать медленее всего, вернет первую строку в которой есть 'Vasya', регистр важен
$csv->find('Vasya', 2); // Будет работать быстрее чем предыдущий вариант, с таким же результатом, но не по всей таблице а только по 3й колонке
$csv->find('Vasya', 2, Csv::FIND_SENS_CASE); // Быстрый регистронезависимый поиск по 3й колонке
$csv->save(); // Сохраняем все изменения если конечно объект не помечен как "только чтение"
Замечу, что поиск работает очень быстро, разумеется для этого типа данных. Я потратил наверное больше всего времени на этот кусочек реализации. Думаю вы оцените, для сравнения, поиск по списку из 450 тыс. (колонок было 13), данные из середины, находились без указания колонки поиска за ~2с. а с указанием за ~0.5), конечно, эти данные абсолютно ни о чем не говорят, а просто приблизительно показывают, что поиск вполне можно использовать.