• Для поиска теперь нужна авторизация

      Господа, не знаю, как давно это произошло, но теперь для поиска по mysql.com (встроенной в документацию форме поиска, которая и так работала очень плохо в последнее время) теперь нужно авторизоваться в oracle networks.

      image

      Лично я считаю это совершенно глупым поступком.

      PS: да, раньше пользовались гуглом с «site:dev.mysql.com» потому что оно искало лучше, а теперь — потому что никак иначе.

      PPS: судя по всему эта «фича» работает очень избирательно. У меня есть аккаунт в их сети, но я сейчас разлогинен. Как результат — оно спрашивает авторизацию. Если потереть куки (или попросту запустить браузер в анонимном режиме) — тогда ищет нормально. Но всё равно легче не стало :-(
    • Входите! Аутентификация без логина и пароля, v2

        Раз оказалось, что аудитории небезразлична такая тема, как создание одноразовых (работающих в течение некоторого времени) ссылок, позволяющих идентифицировать пользователя.

        А особенно в свете того, что я считаю подобное решение (которое я опубликую ниже) приемлемее — решил написать, как решение этой задачи вижу я:
        Читать дальше →
      • HgAssist — программа для уведомления о забытых push'ах

          HgAssist — repositories are synced!



          Пользуясь системой управления кодом Mercurial мы часто сталкивались с тем, что забывали делать push после того, как в локальный репозиторий были сделаны комиты.

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

          Поэтому мы написали HgAssist.
          продолжить чтение
        • docs.com изнутри

            Утром получил письмо с инвайтом.

            Thanks for your interest in Docs. Our Docs service is expanding, and as a result, you can now create and/or upload your own documents (Microsoft Word, PowerPoint or Excel documents) in the service.

            We have already enabled these services for you; just go to http://docs.com/ where you can begin creating and uploading documents to share with your Facebook friends.

            We hope you enjoy Docs.

            The FUSE Labs Team


            Пара скриншотов внутри…
            Читать дальше →
          • tvfёdor — человек и пароход

              Наверное это мода такая, но, господа, мы хотим вам представить очередной сервис уведомления о выходе новых серий :-) За последние пару недель это стало негласным трендом, наверное.

              image

              Мы верим, что вы любите сериалы. Мы тоже их любим! Мы с нетерпением ждем каждого нового эпизода, добавляем даты выхода новых серий в календарик и очень огорчаемся, когда случайно их пропускаем. Никто не любит огорчаться, правда?

              Поэтому мы написали Фёдора.

              Читать дальше →
            • Never send a human to do a machine's job

                Здравствуйте, господа.
                Как новичок в C# и .NET я вчера спросил на stackoverflow (http://stackoverflow.com/questions/2192808/simple-but-interesting-task-for-c-newbie) о предложениях тестовых заданий для новичков. В результате получил ряд ответов, интересных и не очень. Но среди них выгодно выделялся один, с предложением решить программерский quiz.
                Читать дальше →
              • Мой FireFox сошёл с ума

                  В трее появилось сообщение об обновлении 2х экстеншнов. Как обычно нажал на «обновить». Вот что из этого вышло:
                  image
                • моддинг wTorrent'a

                    Здравствуйте, господа.
                    Преамбула:
                    Неделю назад я купил себе дешёвый PC для организации на нём локального файл-сервера, роутера, качалки и прочих удобных сервисов, которые на десктопной машине держать надоело. Всё это дело крутится под gentoo.

                    Амбула:
                    Сегодня потратил вечер и немного подмоддил wTorrent:
                    Теперь он выглядит вот так:

                    Из нововведений:
                    1. Теперь он показывает общий объём траффика, in/out.
                    2. Представленный в центре страницы график входящего/исходящего трафика.

                    Рассмотрим пункт первый. Реализация его проста:
                    Добавляем в планировщик rtorrent'а правила. Делается это через ctrl+x в клиенте или добавлением строки в конфиг и перезапуск.
                    schedule=export_traffic,0,15,«execute=/var/www/localhost/htdocs/wtorrent/schedule/passthrough,$get_up_total=,$get_down_total=,/var/www/localhost/htdocs/wtorrent/schedule/traffic.rtorrent»
                    это правило каждые 15 секунд в файл traffic.rtorrent через маленький скрипт passthrough
                    #!/bin/sh
                    echo $1 $2 > $3

                    будет писать 2 числа: исходящий и входящий объём трафика. Сделано это потому, что через xmlrpc отдаётся signed integer, которое при объёме трафика > 2Гб ожидаемо уходит в отрицательный диапазон :-) Как его научить отдавать большие числа я не нашёл — поэтому пришлось сделать такой костыль.

                    Теперь в rtorrent.cls.php добавим следующие три метода:
                    private function getTrafficInfo()
                    {
                    static $data;

                    if (!$data){
                    if (is_file('./schedule/traffic.rtorrent')) {
                    $data = file('./schedule/traffic.rtorrent');
                    $data = explode(' ', $data[0]);
                    } else {
                    $data = array(0, 0);
                    }
                    }

                    return $data;
                    }

                    public function getDownTotal()
                    {
                    if ($data = $this->getTrafficInfo()) {
                    return $this->getCorrectUnits($data[1]);
                    }

                    return $this->getCorrectUnits($this->get_info_rtorrent('get_down_total', false, false));
                    }

                    public function getUpTotal()
                    {
                    if ($data = $this->getTrafficInfo()) {
                    return $this->getCorrectUnits($data[0]);
                    }

                    return $this->getCorrectUnits($this->get_info_rtorrent('get_up_total', false, false));
                    }

                    которые просто извлекают из файла экспортируемые торрент-клиентом числа. Теперь в шаблоне menu.tpl.php просто покажем эти два числа:
                    {$str.dw_rate} {$web->getDownload()} ({$web->getDownTotal()})
                    {$str.up_rate} {$web->getUpload()} ({$web->getUpTotal()})

                    добавив их в скобки после блоков с текущей скоростью.

                    Задача рисования графика немногим более сложная.
                    Для её реализации мы добавляем ещё одно правило в планировщик:
                    schedule=import_traffic,0,60,«execute=/usr/bin/php,-f,/var/www/localhost/htdocs/wtorrent/schedule/bandwidth.php»
                    это правило каждую минуту запускает php-скрипт:
                    <?php

                    chdir(dirname(__FILE__));

                    $datafile = './traffic.rtorrent';

                    if (is_file($datafile)) {
                    $data = file($datafile);
                    list($out, $in) = explode(' ', $data[0]);

                    $out = (double)$out;
                    $in = (double)$in;

                    require_once '../conf/user.conf.php';

                    $db = new PDO(DB_STAT_DSN, DB_STAT_LOGIN, DB_STAT_PWD);

                    $qry = 'SELECT `in`, `out`, `time` FROM `bandwidth` ORDER BY `id` DESC LIMIT 1';
                    $stmt = $db->query($qry);

                    $delta_in = 0;
                    $delta_out = 0;

                    if ($row = $stmt->fetch()) {
                    if ($in >= $row['in'] && $out >= $row['out']) {
                    $delta_in = $in - $row['in'];
                    $delta_out = $out - $row['out'];
                    }
                    }

                    $db->query('INSERT INTO `bandwidth` (`in`, `delta_in`, `out`, `delta_out`, `period`) VALUES (' . $in . ', ' . $delta_in . ', ' . $out . ', ' . $delta_out . ", TIME_TO_SEC(TIMEDIFF(NOW(), '" . $row['time'] . "')))");
                    }

                    ?>


                    Этот примитивный скрипт сравнивает текущие значения трафика в файле traffic.torrent и на основании этих данных записывает в базу текущие значения и разницу с предыдущими.

                    Вот схема БД и таблицы, в которую скрипт пишет данные:
                    CREATE DATABASE `rtorrent`
                    CHARACTER SET 'utf8'
                    COLLATE 'utf8_general_ci';

                    CREATE TABLE `bandwidth` (
                    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
                    `in` BIGINT(20) DEFAULT NULL,
                    `delta_in` BIGINT(20) DEFAULT NULL,
                    `out` BIGINT(20) DEFAULT NULL,
                    `delta_out` BIGINT(20) DEFAULT NULL,
                    `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
                    `period` INTEGER(11) DEFAULT NULL,
                    PRIMARY KEY (`id`),
                    KEY `time` (`time`)
                    )ENGINE=MyISAM
                    AUTO_INCREMENT=1 ROW_FORMAT=FIXED CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';


                    Осталось совсем немного :-) Скрипт, рисующий график будет использовать jpgraph. Вот содержание самого скрипта:

                    <?php

                    include "../../lib/jpgraph/jpgraph.php";
                    include "../../lib/jpgraph/jpgraph_line.php";
                    include "../../lib/jpgraph/jpgraph_scatter.php";
                    include "../../lib/jpgraph/jpgraph_regstat.php";

                    include "../../conf/user.conf.php";

                    $db = new PDO(DB_STAT_DSN, DB_STAT_LOGIN, DB_STAT_PWD);

                    $stmt = $db->query('SELECT SUM(`delta_in`) / 1024 / SUM(`period`) AS `in`,
                    SUM(`delta_out`) / 1024 / SUM(`period`) AS `out`,
                    MAX(`time`) AS `time`
                    FROM `bandwidth`
                    WHERE `time` > DATE_SUB(NOW(), INTERVAL 12 HOUR)
                    GROUP BY CONCAT(DATE(`time`), HOUR(`time`), FLOOR(MINUTE(`time`) / 5))
                    ORDER BY `time`');
                    $x = $in = $out = array();
                    while ($row = $stmt->fetch()) {
                    $ts = strtotime($row['time']);
                    $x[] = $ts;
                    $in[] = $row['in'];
                    $out[] = $row['out'];
                    }

                    // Setup the basic graph
                    $graph = new Graph(800, 400);
                    $graph->SetMargin(30, 10, 0, 30);
                    $graph->title->Set('Bandwidth, KB/s');
                    $graph->SetAlphaBlending();

                    // Setup a manual x-scale (We leave the sentinels for the
                    // Y-axis at 0 which will then autoscale the Y-axis.)
                    // We could also use autoscaling for the x-axis but then it
                    // probably will start a little bit earlier than the first value
                    // to make the first value an even number as it sees the timestamp
                    // as an normal integer value.
                    $graph->SetScale("intlin", 0, max(max($out), max($in)) * 1.1, reset($x), end($x));
                    $graph->xgrid->Show();
                    $graph->yaxis->HideZeroLabel();
                    $graph->SetFrame(false);

                    function TimeCallback($aVal) {
                    return Date('H:i',$aVal);
                    }
                    // Setup the x-axis with a format callback to convert the timestamp
                    // to a user readable time
                    $graph->xaxis->SetLabelFormatCallback('TimeCallback');
                    //$graph->xaxis->SetLabelAngle(90);

                    // Create the line
                    $p1 = new LinePlot($out, $x);
                    $p1->SetColor("red");

                    $p2 = new LinePlot($in, $x);
                    $p2->SetColor("blue");

                    // Add lineplot to the graph
                    $graph->Add($p1);
                    $graph->Add($p2);

                    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
                    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
                    header("Cache-Control: no-cache, must-revalidate");
                    header("Cache-Control: post-check=0,pre-check=0");
                    header("Cache-Control: max-age=0");
                    header("Pragma: no-cache");

                    // Output line
                    $graph->Stroke();

                    ?>


                    Вначале мы подключаем необходимые библиотеки. Затем — простым запросом выбираем данные из базы. Причём аггрегируем их в интервалы по 5 минут, чтобы график получался более усреднённым и плавным. Затем — на основе примеров, идущих с jpgraph, «собираем» график нужного вида. Полученный код помещаем в файл wt/img/bandwidth.php.

                    Ну и самое последнее — отображение полученного графика на странице wtorrent.

                    Добавляем пункт меню. Это делается также в файле rtorrent.cls.php, добавлением элемента 'Graphic' => 'Graphic' в ассоциативный массив с меню menu_admin.
                    Потом — создаём класс, который будет управлять отображением страницы Graphic.cls.php:

                    <?php

                    class Graphic extends rtorrent
                    {
                    public function construct()
                    {
                    if(!$this->setClient())
                    {
                    return false;
                    }
                    }
                    }
                    ?>


                    Ну и наконец создаём шаблон с единственной строчкой, которая и будет показывать график, graphic.tpl.php:


                    Всё, после этих нехитрых манипуляций у вас должно было получиться результат, сходный с тем, что я продемонстрировал выше. :-)

                    PS: все исходники, которые приводились выше, можно скачать тут.
                  • Реклама на купюрах

                      Товарищи, если не ошибаюсь — сейчас это не противоречит законодательству.
                      Но — почему не печатают рекламу на купюрах? Вроде бы и стоимость сабжа низкая и распространение будет бесплатное.
                      Может быть кто-нибудь знает — почему? ;)