Goracle

В прошлом году немного рассказывал о взаимодействии языка «Гоу» и «Оракла» — я тогда выбирал из двух драйверов и выбрал в итоге ГОракл. Всё в нём хорошо, да вот незадача — некоторые запросы не выполнялись, падало всё с невнятной ошибкой ORA-22060.

Разбирательство привело меня к мысли, что дело в числовых значениях — если запрос возвращал только строки, всё было нормально. Я тогда преобразовал всё при помощи TO_CHAR, разбирая внутри «Гоу» строку в число и успокоился.

На прошлой неделе мне пришлось озаботиться увеличением производительности получившего и разобрался в проблеме чуть детальнее. Не скажу, что понимаю в чём дело (в код драйвера не смотрел), но выглядит всё так, как будто драйвер падает, если на месте числа из «Оракла» может прийти NULL. Например, агрегатные функции (я пробовал сумму и среднее) падения не вызывают. Опять же, если «защитить» все числа функцией NVL — тоже всё хорошо.

Так что если вы видите при использовании этого драйвера ошибки похожие на те, что ниже

ERR=&oracle.Error{Code:22060, Message:"[-1] ORA-22060: argument [2] is an invalid or uninitialized number
ORA-22060: argument [2] is an invalid or uninitialized number

Попробуйте обернуть все числовые возвращаемые значения функцией NVL, должно помочь.

2 комментария

PHP7: функции → опкоды

Как известно, в ПХП7 некоторые функции будут заменены на опкоды для ускорения работы. Вызов функции — дорогая операция в этом интерпретаторе, а опкоды — дёшевы. Я заглянул в исходные коды (см. функцию zend_try_compile_special_func, если интересно) и нашёл там список функций, которые заменяются в текущей версии «семёрки».

Это strlen, все функции is_* (is_float, is_string и прочие), defined, call_user_func_array, call_user_func и assert.

15 комментариев

Mu, H, D, Т

Про дейтерий и тритий я знал, но оказывается существует ещё и мюоний (Mu) — более лёгкий, чем сам водород его изотоп, где в качестве ядра выступает положительный мюон. Время его жизни невелико — всего две микросекунды, но это не мешает ему участвовать в реальных химических реакциях.

Более того, появился новый раздел химии — нюонная химия, которая занимается разработкой химических применений Mu. Насколько я понимаю, её поле деятельности недавно расширилось — к списку добавился мюонный атом гелия (его обозначают как ⁴H). Исследование соединений мюонных элементов позволило выявить новый тип химических связей — вибрационный.

Насколько я понял, смысл в том, что мюонный элемент «вибрирует» между двумя разными элементами, так что молекула, как бы кратковременно разваливается и существует в динамическом равновесии переходя через стадии (на примере одного из таких химических соединений)  Br + MuBr → BrMuBr → BrMu + Br, а потом в обратном направлении.

Что интересно, наличие этой связи обнаружили химики-теоретики ещё в 80-х годах, но тогда не удалось обнаружить эффект на практике.

2 комментария

text-decoration-line

Wavy (30.66КиБ)

Есть такая договорённость в вебе — псевдоссылки (которые похожи на ссылки, но не уводят со страницы) подчёркивать не сплошной чертой, а прерывистой или точечной. Обычно такую черту делают бордюром снизу тега, но если настоящие ссылки сделаны через text-decoration: underline, то черта оказывается на разной высоте: у ссылок она выше, чем у псевдоссылок.

Сейчас браузеры начинают поддерживать свойство text-decoration-line, но с переменным успехом — Хром — поддержка выключена по-умолчанию, Файерфокс поддерживает в полном объёме, Сафари как утверждает «КенАйЮз» — не поддерживает, ИЕ — тоже.

Оказалось, в данном случае — доверяй, но проверяй. «Сафари» (по крайней мере восьмая версия) всё-таки частично поддерживает это свойство, просто не все значения — отрисовываются wavy (на скриншоте), double и solid (остальные значения превращаются в solid).

4 комментария

PostgreSQL: сортировка без учёта регистра

Мы переводим свои некоторые продукты с «Оракла» на «Постргрес» и постоянно сталкиваемся с какими-то различиями разной величины. Сегодняшнее открытие — «Постгрес» (в отличие от «Оракла») сортирует числовые значения без учёта регистра:

test=# SELECT * FROM (SELECT 'Ба' UNION ALL SELECT 'бб' UNION ALL SELECT 'Бв') _ ORDER BY 1;
 ?column?
----------
 Ба
 бб
 Бв
(3 строки)

Ни в одном описании опыта такого же перехода я почему-то не натыкался на такую проблему. Если регистр для вас важен, то есть целых два выхода. Либо сменить принцип сравнения:

test=# SELECT * FROM (SELECT 'Ба' AS str UNION ALL SELECT 'бб' UNION ALL SELECT 'Бв') _ ORDER BY str COLLATE "C";
 str
-----
 Ба
 Бв
 бб
(3 строки)

Либо преобразовать строку к бинарному типу:

test=# SELECT * FROM (SELECT 'Ба' AS str UNION ALL SELECT 'бб' UNION ALL SELECT 'Бв') _ ORDER BY str::bytea;
 str
-----
 Ба
 Бв
 бб
(3 строки)

Правда в последнем случае неясно сможет ли «Постгрес» использовать индекс — мы пока таких испытаний не проводили.

9 комментариев

Не плюй в колодец, вылетит — не поймаешь

Завёл репозиторий неизвестных окончаний к известным пословицам. Например, известное «старый конь борозды не испортит» имеет забытое уже окончание «но и вспашет неглубоко». Добавляйте известные вам.

8 комментариев

99 бутылок: 𝄢 Cello

55. 𝄢 Cello. Попробовал попрограммировать с использованием библиотеки «libCello» — это набор макросов к Си, вводящих в язык кучу комплексных типов, простую работу с выделением и освобождением памяти под них, лямбда-функции, классы и так далее.

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

Пример ошибки в документации — функции в «стиле Си» не могут быть заданы внутри функции main, хотя на сайте указан пример, в котором утверждается обратное (и он не компилируется).

По идее, библиотека должна упрощать программирование, но в моём случае (я понимаю, «песня про пиво» не совсем та программа, в которой раскрывается эта библиотека) всё было ровно наоборот — на чистом Си я справился бы значительно быстрее.

Если бы её дописать и достойно задокументировать, вышло бы что-то интересное, пока же я пас — надо знать в деталях каждый макрос (а их там очень много) чтобы понять из-за чего скомпилированное в очередной раз упало.

#include "Cello.h"

int main() {
    lambda(bottles, args) {
        var beer = cast(at(args, 0), Int);

        if_eq(beer, $(Int, 0)) {
            print("no bottles");
        } else {
            if_gt(beer, $(Int, 1)) {
                print("%d bottles", beer);
            } else {
                print("1 bottle");
            };			
        }

        return None;
    };

    for (var beer = $(Int, 99); gt(beer, $(Int, 0));) {
        call(bottles, beer);
        print(" on the wall, ");
        call(bottles, beer);
        println(".");

        print("Take one down and pass it around, ");
        sub(beer, $(Int, 1));
        call(bottles, beer);
        println(" of beer on the wall.\n");
    }

    println("No more bottles of beer on the wall, no more bottles of beer.");
    println("Go to the store and buy some more, 99 bottles of beer on the wall.");
}

Судя по репозиторию, автор интерес к своему детищу не потерял, будем надеяться, что когда-нибудь из этого получится что-то вроде гугловского «Гоу».

2 комментария

Спецэффекты в СССР



Очень интересный небольшой документальный материал о Павле Клушанцеве, который в 50-х годах снимал в СССР кино со спецэффектами мирового уровня.

28 комментариев

PHP7: scalar hinting

Продолжаю потихоньку наблюдать за развитием ПХП 7. Сегодня с утра выписывал из репозитория и компилировал новую версию, заметил, что в  языке появилось указание типов для скаляров — поддерживаются int, float, string и bool.

Выглядит всё довольно естественно:

<?php
class Test
{
    public function __toString()
    {
        return "test";
    }
}

function len(string $a): int {
    return strlen($a);
}

echo len(new Test);
echo len(new stdClass); // Fatal error: Argument 1 passed to len() must be of the type string, object given

В данном случае первый вызов ошибку не вызовет (в отличие от второго), так как у объекта есть магический метод __toString, который вызывается, когда объект требуется привести к строке, так что всё логично. Возможные преобразования описаны в документации и ничего нового там нет, всё в соответствии с текущей логикой языка.

Есть и второй режим работы — строгий. Его можно включить при помощи конструкции declare, которая должна быть первой конструкцией языка (теперь у неё приоритет даже над namespace) в файле:

<?php
declare(strict_types=1);
namespace Test;

class Test
{
    public function __toString()
    {
        return "test";
    }
}

function len(string $a): int {
    return strlen($a);
}

echo len(new Test); // Fatal error: Argument 1 passed to Test\len() must be of the type string, object given

В этом случае все проверки на тип становятся строгими и никаких неявных преобразований не допускается.

По правде говоря, мне больше импонирует второй режим — несколько лет программирования на «Гоу» и «Пайтоне» позволили оценить все прелести строгой типизации, но существующий код большого продукта привести за приемлемое к строгому режиму будет часто невозможно, на мой взгляд. Видимо поэтому создатели языка ограничили действие строгого режима рамками файла — новые части можно писать, не затрагивая поведение старых, это удобно.

6 комментариев

Это не бином Ньютона

Репортёр вдруг заинтересовался выражением «это не ракетостроение» и решил исследовать, как оно употребляется. Вскоре ему представился случай посетить лабораторию, разрабатывающую реактивные двигатели, и в разговоре с одним из научных сотрудников он спросил: «С чем у вас сравнивают ситуацию, когда вы ещё не вполне представляете себе, как решается задача, но думаете, что скорее всего, с нею справитесь?

Вы ведь не можете сказать, что это не ракетостроение, коль скоро именно им и занимаетесь? Оказалось, что ракетостроители говорят: „В конце концов, это не нейрохирургия“.

Ещё через некоторое время репортёр побывал в отделении нейрохирургии больницы Джонса Гопкинса и задал там аналогичный вопрос. Врачи немного подумали и дали ответ: „Это не ядерная физика“. Естественно, репортёру очень захотелось узнать, как в подобных ситуациях выражаются физики-ядерщики, и он, находясь в одном из ведущих институтов в этой области, спросил их.

Физики посмотрели на него с презрением, но потом снизошли и объяснили, что они говорят: „Это не социология“.

— из книги Говарда Бехара и Джанет Голдстайн „Дело не в кофе. Корпоративная культура Starbucks“.

Во внутренних сервисах „Яндекса“ много лет назад мы говорили „задача-чёрная дыра“ — в том смысле, что неясно сколько ресурсов она съест.

15 комментариев

Дыбонины в Новом Исакове (Васильевке)

Подробное изучение титульных листов одной ревизских сказок 1850 года принесло внезапные плоды. Лишние напоминание тому, что хороший исследователь истории должен внимательно относиться ко всему исследуемому объёму.

Речь пойдёт о Дыбониных — моих предках-однодворцах с маминой стороны, в исследовании которых я сегодня немного продвинулся.

Всё, что я о них знаю, в основном, найдено путём кропотливого сквозного просмотра дел самарского архива. Самарский архив частично оцифрован, но, к сожалению, заголовки дел иногда ничего не говорят исследователю. Так в фонде 150, описи 1, деле 125, которое называется буквально «О прибытии помещичьих крестьян Староверского пр. Бугульминского у.» я случайно нашёл ревизскую сказку по нужному мне насёленному пункту и упоминание своих предков, причём впервые с фамилией.

В прошлых своих исследованиях я остановился на том факте, что Дыбонины (на 1850 год) жили в небольшой деревне Новое Исаково. Заголовок дела «О прибытии…» предполагает переезд откуда-то, но откуда — неизвестно (надо ещё раз выписать дело и попробовать прочитать его полностью, возможно есть какие-то подсказки).

Деревней и моими предками (Дыбонины на то время были помещичьими крестьянами) владели Аничковы, краткую родословную которых я тоже на всякий случай изготовил:

Схема родословной семьи Аничковых: Михаил, Никанор, Иван, Анна (?–1838), Фёдор, Василий (1814–?), Надежда, Николай — с датами и связями поколений.
Аничковы

Что-то к 1850 году серьёзно выкосило эту семью, поэтому титульники пестрят словами о наследовании, что и позволило мне за пару минут нарисовать четыре поколения этой семьи. Возможно однажды мне это пригодится, пока же просто положу это в копилку фактов, эти населённые пункты постоянно меняли владельцев, не исключено, что в записях о переуступке где-то могут упоминаться и мои предки.

Изучение титульника переписи деревни даёт нам два интересных факта: селом владел Валерьян Иванович Аничков (на родословной выше его нет) и, что более интересно, у деревни было другое название — Васильевка.

Ревизская сказка Оренбургской губернии, Бурцевского уезда, подпоручика Василия Иванова, от 15 октября 1795 года, с перечнем дворовых людей.
Новое Исаково — это Васильевка

Название Новое Исаково, как мне казалось, намекает на возраст относительно Старого Исакова (другое название которого — Лисьи Горы), но на нарисованной от руки карте 1805 года, которая меня постоянно выручает, Васильевка (точнее — деревня Васильевская) легко находится, тогда как Лисьих Гор (или какого-то другого населённого пункта на этом месте) просто нет.

Я выделил опорные точки, чтобы было легче ориентироваться — красным село Спасское, циановым — село Наратлы, жёлтым — Новое Исаково (Васильевскую). О правильности ориентирования говорят так же названия речек — Дымка и Бобровка, которые текут рядом.

Сравнение старой карты с отметкой «Село Спасское» и современной карты, где на том же месте указано «Спасское», а рядом — «Новое Исаково» и «Старое Исаково».
Новое Исаково и Васильевка на картах

Что это нам даёт? Крайне важную штуку — новое название для поиска. Как видите, в 1805 году название Исаково даже не упоминается, а сама деревня есть. Бумаги по этому региону есть в башкирском архиве — тоже электронном, где по и Васильевке, и по Васильевской находится несколько документов.

Буду продолжать поиски.

3 комментария

Как скачать документ из АИС ЦГАСО-3

Архив ЦГАСО несколько изменил у себя вёрстку и предыдущий способ скачивания работать перестал. Сегодня мне понадобились документы из этого архива, пришлось посмотреть в чём дело.

Для того, чтобы скачать листы дела, вам нужно в браузере (настоятельно рекомендую «Хром», в других браузерах я код не испытывал) перейти в раздел «Требования дел» и открыть на просмотр нужное вам дело (для этого нужно нажать на значок «книжки» в колонце «Действие»).

Дело (38.24КиБ)

Когда дело откроется, нужно открыть панель разработчика (открывается по Ctrl+Alt+I на «Виндоузе» или Cmd+Alt+I на «Маках») и там перейти во вкладку «Консоль» (Console). В этой вкладке вставить нижеприведённый код и нажать «Энтер».

!function () {
    var id = '[id=storageFilesViewerPnl]';
    var bt = '[id$=ForwardBtn]';
    var pages = {};
    var o = document.querySelector(id);

    !function _observe(undefined) {
        var ob = new MutationObserver(function() {
            var imgs = $(id+' img[src*=Pages]:first');
            if (imgs && imgs[0]) {
                var page = imgs[0].src.match(/id=([^&]+)/)[1];
                if (pages[page] == undefined) {
                    pages[page] = true;

                    ob.disconnect();

                    var next = $(bt);
                    if (next && next[0]) {
                        _observe();
                        next[0].click();
                    } else {
                        console.clear();
                        console.log("dxo.itemsValue=['" + Object.keys(pages).join("','")+"'];");
                    }
                }
            }
        });

        ob.observe(o, { childList: true, attributes: true, subtree: true, attributeFilter: ['src'] });
    }();

    o.setAttribute('src', true);
}();

Начнётся пролистывание документа. Запаситесь терпением. Как только оно закончится, на экране появится длинная строка, как на скриншоте ниже. Её надо скопировать в файл целиком.

Длинная строка в «Хроме» (302.25КиБ)

Далее, увы, вам придётся занять компилированием. Как это делается, рассказывать не буду, ищите в интернете. Вам понадобится программа cgodownloader.go из моего репозитория, её надо сохранить к себе на диск и скомпилировать (она написана на Гоу). Ей на вход надо передать имя файла (в моём случае это 150-1-120) и директорию, куда будут сохраняться картинки листов дела (у меня это 150-1-201-pict):

Запуск cgodownloader.go (27.49КиБ)

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

83 комментария

← сюда туда →