shoorick: (Рыжий)
Появилась задача преобразования из одного XML в другой. Метод понятен — это обсуждалось ужеXSLT.

XSLT

Только вот в голове — пусто, почти всё забыл. «Как так? — удивляешься, — Недавно же вроде делал...» Лезешь в багтрекер за деталями — выясняешь ненароком, что «недавно» — это восемь с половиной лет.

http://shoorick.ru/2016/11/12/forgiven-details/
shoorick: (Рыжий)
Челябинская «Касторама» с апреля продлевает своё рабочее время — будут работать, если верить тому, что у них в магазине говорят, с 6 до 23 часов. Чую, этим и ограничатся — не сто́ит ждать других улучшений. Сейчас по сравнению с ними в «Леруа Мерлене» цены в среднем чуть ниже (как мне показалось), сайт сделан лучше да и ассортимент побогаче. От дома до обоих магазинов растояние одинаково, а вот с работы до жёлто-синего можно через парк прогуляться, а до зелёного — нет. Так что у жёлто-синих ещё есть шанс увидеть меня в качестве покупателя.

http://shoorick.ru/2016/03/24/diy-competition/
shoorick: (Рыжий)
На перекрёстках Сони Кривой с Воровского и Красной заменили жёлтые секции светофоров — теперь они с таймерами.

Светофор
shoorick: (Рыжий)
Функция selectall_arrayref перлового модуля DBI хороша для тех, кому лень писать:
This utility method combines "prepare", "execute" and "fetchall_arrayref" into a single call. It returns a reference to an array containing a reference to an array (or hash, see below) for each row of data fetched.

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

Реальный пример: скрипт, извлекающий тайлы из пакета, созданного Тайлмиллом, пытался читать данные как раз функцией selectall_arrayref. Зная, что применяется запрос
SELECT * FROM tiles

и что представление tiles содержит, помимо прочего, содержимое тайлов, занимающее места больше всего остального, нетрудно догадаться, что попытка выполнения запроса потребует выделения памяти в объёме, сопоставимом с размером файла, в котором сидит база (пакет с тайлами — это база SQLite).

Набор тайлов для территории размером 600×400 км в средних широтах — например, с Челябинском по центру, Ашой на западе, Карталами на юге и Тюменью на северо-востоке — займёт больше гигабайта для набора масштабов не больше шестнадцатого. На практике так и получилось: скрипт отжирал больше гигабайта памяти и всё никак не мог приступить к полезной части, пытаясь отожрать ещё. Если же увеличивать масштаб, затраты вырастут ещё сильнее: добавим семнадцатый зум масштаб — понадобятся ещё три-четыре гигабайта, Добавим восемнадцатый, которого хватит даже для любопытных исследователей карт — ещё на десять-двадцать объём вырастет. Если будем сохранять тайлы с глубиной цвета 24 бита, а не восемь — ещё больше места израсходуем. Получается, что средних размеров российская область может занять своими тайлами десятки гигабайт. И скрипт бы безуспешно пытался эти десятки получить.

Переписал:
-my $tiles = $dbh->selectall_arrayref(
-    'SELECT * FROM tiles',
-    { Slice => {} },
-);
-
-foreach my $tile ( @$tiles ) {

+my $sth = $dbh->prepare('SELECT * FROM tiles');
+   $sth->execute;
+
+while ( my $tile = $sth->fetchrow_hashref ) {

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

Вывод: не всегда надо экономить рабочее время программиста — иногда надо и о машинном времени задумываться.

http://shoorick.ru/2015/08/26/more-code/
shoorick: (Рыжий)
Уточнил у Просекова — сегодняшний концерт Павла Фахртдинова начнётся в 18:30.
На странице встречи вконтакте указана неправильная информация.
shoorick: (Рыжий)
После нескольких неудачных попыток прилогиниться к сайту, сделанному на друпале 7.15, пользователь натыкается на сообщение:
Sorry, there have been more than 5 failed login attempts for this account. It is temporarily blocked. Try again later or request a new password.
Насколько позже стóит повторить попытку — непонятно.

Полез в БД — в таблице `users` никакой информации об активности пользователей. А вот в таблице `flood` — есть: в поле `event` — название события, `identifier` — идентификатор: IP либо строка вида UID-IP для попыток залогиниться, если логин существует, `timestamp` и `expiration` — время попытки входа и истечения бана (в секундах с начала эпохи). Продолжительность бана — 3600 секунд (час) для случаев, когда UID не указан и 21600 секунд (6 часов) — для пары UID-IP.

Если удалить из таблицы `flood` лишние записи — вход открывается.

P. S. Узнать текущее время в секундах с начала эпохи в юниксоподобных операционных системах можно командой
date +%s
в MySQL для этого есть функция UNIX_TIMESTAMP.
shoorick: (Default)
В комнате утром было +42 °C, сейчас, после проветривания — +30. За окном — +28 и громкие дорожные рабочие. Кондиционера нет, душа нет, а до вечернего купания — 80 км и весь день. СанПиН 2.2.4.548-96 рекомендует сократить продолжительность пребывания на рабочем месте до 5 часов.
shoorick: (Default)
Похоже, в друпале придётся применять тот же способ, как и в одном из предшествующих сайтов — отказаться от всяческих абстракций в пользу чистого SQL. Если, конечно, он предусмотрен.

Поглядев статистику потраченного друпалом времени и количества запросов к СУБД, офигел весь был неприятно удивлён: на формирование страницы со списком подмножества опубликованных статей друпал потратил от 100 до 11 тысяч запросов, что заняло от 2 секунд до более чем полутора минут. Это как так?

Я, конечно, понимаю, что время программиста сейчас ценится выше машинного времени плюс друпалу на отрисовку страницы ещё нужны кое-какие ресурсы, но это не может служить оправданием того безобразия, что я наблюдаю: сидя дома, не имея под рукой эпического полотна со структурой хотя бы части БД, я минут за 10 написал и отладил SQL-запрос, который формирует тот же самый список статей и при этом выполнение запроса укладывается в десятки миллисекунд. На то, чтобы понять, как работают Views, и поэкспериментировать с ними, я потратил часы и дни. И всё равно толком не понял.
shoorick: (Default)
Прилетел утром. Всё по расписанию, без опозданий. Багаж получил минут через 10 после посадки во Внуково и минут через 5 (если не быстрее) — в Челябинске.

Туда и обратно летел на тесном маленьком Боинге 737-500. Странно, что самолёт, когда снижается и поворачивает, летит весьма неровно (его потряхивает) и с каким-то скрипом и свистом, хотя вверху летит достаточно ровно. Так и должно быть?
shoorick: (Default)
Позавчера сдал Зину в утиль. Вчера купил другую жучку. Сегодня другую жучку продал.

Потратил в общей сложности какую-то невообразимую кучу времени. Наверное, проще было сразу сдать Зину в металлолом, а сэкономленное время потратить более разумно и выгодно.
shoorick: (Default)
22:50. В центре города слышно как летают военные самолёты. По закону Челябинской области 227 ЗО «О соблюдении общественного порядка на территории Челябинской области», шуметь можно до 23 часов. У них осталось 10 минут.

upd/23:35: Снова летают и шумят.
shoorick: (Default)
Маршрут Челябинск — поворот на Тюбук — Касли — Верхний Уфалей — Нязепетровск — Шемаха длиной 274 км проходится за 4 часа в спокойном случае и за 18 — в весёлом. Весёлый случай включает в себя 4 прикуривания, 2 катания на галстуке, толкание автомобиля, сопровождающееся 5 правонарушениями различной степени тяжести, 1 ночёвку возле заправки, предварённую чтением камасутры руководства по эксплуатации и ремонту, глубокомысленное заглядывание под капот и рассматривание предохранителей, а также поиск каслинского автоэлектрика Миши и ремонт электриком Мишей японского генератора при помощи русских инструментов: мата, молотка и паяльника.

Чуть не забыл! Ещё и посещение музея каслинского литья — он стоит в минуте ходьбы от перекрёстка улиц Советской и Революции. Взрослый билет — 50 рублей.
shoorick: (Default)
Не перевелись ещё часы на Руси!
shoorick: (Default)
В «Российской газете» пишут, что в Ижевске, Самаре и на Камчатке с Чукоткой будет другое время.

Это что же, теперь Новый год надо будет на час позже начинать отмечать?!
shoorick: (Default)
Некоторые песни, как и тосты, хороши, когда коротки.
Вот, скажем, current music помещается в 50 с хвостиком секунд.
Хороша!
shoorick: (Default)
Нет смысла в перлоскрипте вручную засекать время старта конструкциями типа
my $start_time = time;
Потому что есть переменная $^T, где нужно значение уже лежит.
shoorick: (Default)
Вчера просыпался с трудом и слышал сквозь сон по «Нашему радио»:
— Семь часов и семь минут в Москве.
— Ага, — подумалось, — значит, у нас 9:09.
shoorick: (Рыжий бородатый)
В первый день мы стартовали с опозданием, в 19:15, а закончили по плану, в 01:00. Сегодня идём по графику: с 17 часов. Планируем до 5 утра.
shoorick: (На велосипеде)
В Крыму многие учреждения закрываются в 17 часов. В 18 закрываются все остальные. А к 19 часам жизнь и вовсе замирает и все засыпают. В Керчи в 20 часов а главной улице трафик как у нас глубокой ночью.
shoorick: (Default)
В треках *.plt, записываемых ОзиЭксплорером, дата хранится не только в текстовом виде, как, например, «05-май-07, 6:30:37», но и в более понятном, цифровом: 39207.2712616. Эксперимент показал, что в Ёкселе даты хранятся аналогично: как число дней прошедших с 00.01.1900 0:00:00 (ага, именно с нулевого января). Если нам нужно обычное представление даты — в секундах с начала эпохи, то для его получения надо всего лишь отнять от озиной/ёксельной даты 25569 и умножить остаток на 86400.

Profile

shoorick: (Default)
shoorick

December 2016

S M T W T F S
    1 23
45678910
11121314151617
18 19 2021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 20th, 2017 02:35 pm
Powered by Dreamwidth Studios