Goracle
В прошлом году немного рассказывал о взаимодействии языка «Гоу» и «Оракла» — я тогда выбирал из двух драйверов и выбрал в итоге ГОракл. Всё в нём хорошо, да вот незадача — некоторые запросы не выполнялись, падало всё с невнятной ошибкой
Разбирательство привело меня к мысли, что дело в числовых значениях — если запрос возвращал только строки, всё было нормально. Я тогда преобразовал всё при помощи 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, должно помочь.
PHP7: функции → опкоды
Как известно, в ПХП7 некоторые функции будут заменены на опкоды для ускорения работы. Вызов функции — дорогая операция в этом интерпретаторе, а опкоды — дёшевы. Я заглянул в исходные коды (см. функцию zend_try_compile_special_func, если интересно) и нашёл там список функций, которые заменяются в текущей версии «семёрки».
Это strlen, все функции is_* (is_float, is_string и прочие), defined, call_user_func_array, call_user_func и assert.
Mu, H, D, Т
Про дейтерий и тритий я знал, но оказывается существует ещё и мюоний (Mu) — более лёгкий, чем сам водород его изотоп, где в качестве ядра выступает положительный мюон. Время его жизни невелико — всего две микросекунды, но это не мешает ему участвовать в реальных химических реакциях.
Более того, появился новый раздел химии — нюонная химия, которая занимается разработкой химических применений Mu. Насколько я понимаю, её поле деятельности недавно расширилось — к списку добавился мюонный атом гелия (его обозначают как ⁴H). Исследование соединений мюонных элементов позволило выявить новый тип химических связей — вибрационный.
Насколько я понял, смысл в том, что мюонный элемент «вибрирует» между двумя разными элементами, так что молекула, как бы кратковременно разваливается и существует в динамическом равновесии переходя через стадии (на примере одного из таких химических соединений) Br + MuBr → BrMuBr → BrMu + Br, а потом в обратном направлении.
Что интересно, наличие этой связи обнаружили
text-decoration-line

Есть такая договорённость в вебе — псевдоссылки (которые похожи на ссылки, но не уводят со страницы) подчёркивать не сплошной чертой, а прерывистой или точечной. Обычно такую черту делают бордюром снизу тега, но если настоящие ссылки сделаны через
Сейчас браузеры начинают поддерживать свойство
Оказалось, в данном случае — доверяй, но проверяй. «Сафари» (по крайней мере восьмая версия)
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 строки)Правда в последнем случае неясно сможет ли «Постгрес» использовать индекс — мы пока таких испытаний не проводили.
Не плюй в колодец, вылетит — не поймаешь
Завёл репозиторий неизвестных окончаний к известным пословицам. Например, известное «старый конь борозды не испортит» имеет забытое уже окончание «но и вспашет неглубоко». Добавляйте известные вам.
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.");
}Судя по репозиторию, автор интерес к своему детищу не потерял, будем надеяться, что
Спецэффекты в СССР
Очень интересный небольшой документальный материал о Павле Клушанцеве, который в
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В этом случае все проверки на тип становятся строгими и никаких неявных преобразований не допускается.
По правде говоря, мне больше импонирует второй режим — несколько лет программирования на «Гоу» и «Пайтоне» позволили оценить все прелести строгой типизации, но существующий код большого продукта привести за приемлемое к строгому режиму будет часто невозможно, на мой взгляд. Видимо поэтому создатели языка ограничили действие строгого режима рамками файла — новые части можно писать, не затрагивая поведение старых, это удобно.
Это не бином Ньютона
Репортёр вдруг заинтересовался выражением «это не ракетостроение» и решил исследовать, как оно употребляется. Вскоре ему представился случай посетить лабораторию, разрабатывающую реактивные двигатели, и в разговоре с одним из научных сотрудников он спросил: «С чем у вас сравнивают ситуацию, когда вы ещё не вполне представляете себе, как решается задача, но думаете, что скорее всего, с нею справитесь?
Вы ведь не можете сказать, что это не ракетостроение, коль скоро именно им и занимаетесь? Оказалось, что ракетостроители говорят: „В конце концов, это не нейрохирургия“.
Ещё через некоторое время репортёр побывал в отделении нейрохирургии больницы Джонса Гопкинса и задал там аналогичный вопрос. Врачи немного подумали и дали ответ: „Это не ядерная физика“. Естественно, репортёру очень захотелось узнать, как в подобных ситуациях выражаются
физики-ядерщики, и он, находясь в одном из ведущих институтов в этой области, спросил их.Физики посмотрели на него с презрением, но потом снизошли и объяснили, что они говорят: „Это не социология“.
— из книги Говарда Бехара и Джанет Голдстайн „Дело не в кофе. Корпоративная культура Starbucks“.
Во внутренних сервисах „Яндекса“ много лет назад мы говорили
Дыбонины в Новом Исакове (Васильевке)
Подробное изучение титульных листов одной ревизских сказок 1850 года принесло внезапные плоды. Лишние напоминание тому, что хороший исследователь истории должен внимательно относиться ко всему исследуемому объёму.
Речь пойдёт о Дыбониных — моих
Всё, что я о них знаю, в основном, найдено путём кропотливого сквозного просмотра дел самарского архива. Самарский архив частично оцифрован, но, к сожалению, заголовки дел иногда ничего не говорят исследователю. Так в фонде 150, описи 1, деле 125, которое называется буквально «О прибытии помещичьих крестьян Староверского пр. Бугульминского у.» я случайно нашёл ревизскую сказку по нужному мне насёленному пункту и упоминание своих предков, причём впервые с фамилией.
В прошлых своих исследованиях я остановился на том факте, что Дыбонины (на 1850 год) жили в небольшой деревне Новое Исаково. Заголовок дела «О прибытии…» предполагает переезд
Деревней и моими предками (Дыбонины на то время были помещичьими крестьянами) владели Аничковы, краткую родословную которых я тоже на всякий случай изготовил:
Изучение титульника переписи деревни даёт нам два интересных факта: селом владел Валерьян Иванович Аничков (на родословной выше его нет) и, что более интересно, у деревни было другое название — Васильевка.
Название Новое Исаково, как мне казалось, намекает на возраст относительно Старого Исакова (другое название которого — Лисьи Горы), но на нарисованной от руки карте 1805 года, которая меня постоянно выручает, Васильевка (точнее — деревня Васильевская) легко находится, тогда как Лисьих Гор
Я выделил опорные точки, чтобы было легче ориентироваться — красным село Спасское, циановым — село Наратлы, жёлтым — Новое Исаково (Васильевскую). О правильности ориентирования говорят так же названия речек — Дымка и Бобровка, которые текут рядом.
Что это нам даёт? Крайне важную штуку — новое название для поиска. Как видите, в 1805 году название Исаково даже не упоминается, а сама деревня есть. Бумаги по этому региону есть в башкирском архиве — тоже электронном, где по и Васильевке, и по Васильевской находится несколько документов.
Буду продолжать поиски.
Как скачать документ из АИС ЦГАСО-3
Архив ЦГАСО несколько изменил у себя вёрстку и предыдущий способ скачивания работать перестал. Сегодня мне понадобились документы из этого архива, пришлось посмотреть в чём дело.
Для того, чтобы скачать листы дела, вам нужно в браузере (настоятельно рекомендую «Хром», в других браузерах я код не испытывал) перейти в раздел «Требования дел» и открыть на просмотр нужное вам дело (для этого нужно нажать на значок «книжки» в колонце «Действие»).

Когда дело откроется, нужно открыть панель разработчика (открывается по 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);
}();Начнётся пролистывание документа. Запаситесь терпением. Как только оно закончится, на экране появится длинная строка, как на скриншоте ниже. Её надо скопировать в файл целиком.

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

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