Эксперт

Помните этот известный ролик про приглашённого эксперта по рисованию красных линий? Я как-то быстро придумал как бы я себя вёл, будучи приглашённым на это совещание в качестве эксперта.

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

Меньше всего проблем вызвала бы перпендикулярность всех линий. Что тут сложного? В ролике нет требования, что линии должны быть прямыми, а если бы и было, детские эксперименты с лентой Мёбиуса подсказывают нам, что можно придумать поверхность с самыми чудны́ми свойствами. Легко вообразить и такую, где можно провести семь прямых линий, перпендикулярных друг другу.

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

Опять же не очень сложно сделать прозрачные красные линии — надо всего лишь нарисовать их чем-то прозрачным на красном фоне. Линии прозрачные? Прозрачные! Красные? Красные! Что ещё надо?

Загвоздка с зелёным. Но если вспомнить анекдот про Роберта Вуда и светофор, то можно предложить разогнать наш объект до скорости 60 000 км/сек — на этой скорости красный свет из-за эффекта Допплера станет зелёным. Как это сделать, дело не моё, я же эксперт только по красным линиям.

Это, кстати, не единственный вариант, можно попробовать выбрать оттенок красного, в котором содержится зелёный и осветить нужные нам линии чистым зелёным светом — тогда именно он и отразится. Либо, добавить в красный краситель фосфор — какое-то время в темноте линия будет зелёной. Опять же, существуют краски, которые светятся в инфракрасном свете — среди них есть и такие, которые светятся зелёным. Принцип понятен, я думаю.

Оказывается (спасибо, Ирек, что показал) существует ролик-видеоответ, где какой-то мужик (некий Ди. Скот Виллиамсон) таки рисует (ролик на английском) всё требуемое. Причём с зелёным цветом он придумал круче, чем я, но тут сказывается несовпадение языков (я смотрел ролик на русском).

Виллиамсон рисует линии «используя зелёные чернила» (two drawn using green ink), в английском ролике-то как раз требуется нарисовать не зелёные линии (как в русском), а «некоторые — используя зелёные чернила» (some with green ink). Так что всё верно.

Приходится признать, что в мире существуют эксперты по красным линиям круче меня!

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

JSOND

JSOND — это ещё один «дешёвый» способ увеличить производительность вашего проекта на ПХП, наряду с igbinary. Исходный код есть на PECL, для всех систем существуют пакеты. Насколько я знаю, есть планы по замене стандартного расширения JSON в ПХП7 на JSOND.

Для интереса погонял стандартный тест пакета на одной из наших машин (мы там вчера перешли на ПХП 5.5 наконец-то, стоит последняя версия), вот результаты (меньше — лучше):

STR: {"i": 23, "array": [1, null, false, true, ["aha", "baba", 23, {"test": 23}]]}
JSON: time for 100000 iterations: 1.096384
JSOND: time for 100000 iterations: 0.353658
STR: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
JSON: time for 100000 iterations: 0.700904
JSOND: time for 100000 iterations: 0.202519
STR: {"a": 23.2234232}
JSON: time for 100000 iterations: 0.398129
JSOND: time for 100000 iterations: 0.083977
STR: сериализуется очень длинная строка
JSON: time for 100000 iterations: 0.392990
JSOND: time for 100000 iterations: 0.341663
STR: сериализуется переменная $_SERVER
JSON: time for 100000 iterations: 4.983888
JSOND: time for 100000 iterations: 2.321528

Что приятно, АПИ полностью совместимо, так что проблем нет никаких — в вызовах надо просто добавить одну букву. Есть так же несложный способ самостоятельной замены стандартного JSON на этот модуль в интерпретаторе.

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

Кто крайний присаживаться?

Азбучная истина № 6. Подойдя к очереди в кассу или ко врачу в поликлинике, грамотно спросить у людей: кто последний? Предлагая гостю принять сидячее положение, вежливо сказать: садитесь, пожалуйста. А «кто крайний?» и «присаживайтесь» — это неправильно.

Пишет В. М. Пахомов, кандидат филологических наук, главный редактор портала Грамота.РУ.

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

Конструкция «??»

В ПХП 7 появилась, наконец, конструкция, которая должна была быть в языке с первых версий:

echo $_GET['var'] ?? 'default'; // PHP 7
echo isset($_GET['var']) ? $_GET['var'] : 'default'; // PHP 5.6 и ниже

Очень похоже на тернарный оператор без средней части, появившийся в версии 5.3, но с одним отличием: проверяется не ложь или истина, а существование.

Теперь в ПХП можно писать намного более эмоционально:

echo X-D ? :-D ??!! O_o; // это работает в PHP 7, я даже могу сказать что это значит.

Может кому-то пригодится, я собирал у себя на «Маке» текущую версию ПХП 7 при помощи следующих команд:

git clone https://github.com/php/php-src.git
cd php-src

brew install re2c
brew info bison27
PATH=/usr/local/opt/bison27/bin/:$PATH

./buildconf
./configure --prefix=/opt/php-5.7 --disable-all
make
make install

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

Я — именитый писатель

Один из самых знаменитых и популярных писателей Евгений Владимирович Степанищев полноценно представлен в книжном каталоге интернет магазина OZON. У нас вы найдете, как лучшие книги бестселлеры, так и новинки 2013 года, которые написал автор . Кроме этого вы можете ознакомиться с краткой биографией писателя, посмотреть его фото и полный список литературы, к авторству которой, он причастен. Перед тем как купить книгу, которую написал Евгений Владимирович Степанищев вы можете прочитать отзывы читателей или анотацию к ней.

Жена на «Озоне» нашла (в самом низу страницы).

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

99 бутылок: AppleScript, Applesoft BASIC

У меня тут мой ноут поперхнулся чаем, так что я неделю был на стареньком компике под Виндой, почувствовал себя себя как без рук. По этой же причине почти не писал ничего в блог, лишь одним вечером на ноуте жены написал очередные две «Песни про пиво» на языках AppleScript и Applesoft BASIC. Первый — современный язык для автоматизации мелочи на «Маках», второй — древний (1977 год) бейсик, когда-то так же использовавшийся на «Маках».

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

В остальном, это обычный динамический интерпретируемый язык со слабой типизацией. Как видно в одном месте мне пришлось сделать преобразование типа. Вообще-то ЭплСкрипт делает это и сам, но в случае присоединения к строке, он число присоединит через запятую.

(* Песня про пиво. Автор — Евгений Степанищев *)
repeat with beer from 99 to 1 by -1
     set b to bottles(beer)
     log b & " on the wall, " & b & "."
     log "Take one down and pass it around, " & bottles(beer - 1) & " of beer on the wall."
     log
end repeat

log "No more bottles of beer on the wall, no more bottles of beer."
log "Go to the store and buy some more, 99 bottles of beer on the wall."

on bottles(beer)
     if beer = 0 then
 	        return "no bottles"
     else if beer > 1 then
 	        return (beer as string) & " bottles"
     else
 	        return "1 bottle"
     end if
end bottle


51. Applesoft BASIC — Бейсик разработанный компанией Майкрософт, использовавшийся в компьютерах фирмы Эпл, начиная с 1977 года. Ничего особо примечательного, вполне полнофункциональный язык, хоть и не без недостатков тех ранних «бейсиков» — вызов функций по номеру строки, параметров нет, локальных переменных нет, в общем, все прелести.

Я специально использовал конструкцию «ON…GOTO», хоть в ней и не было необходимости — хотел показать аналог конструкции switch. SGN тут — встроенная функция нахождения знака выражения.

000 REM Песня про пиво, автор — Евгений Степанищев
001 HOME: TEXT
010 FOR beer = 99 TO 1 STEP -1
020 b = beer: GOSUB 100
030 ? bottles$; " on the wall, "; bottles$; "."
035 b = beer - 1: GOSUB 100
040 ? "Take one down and pass it around, "; bottles$; " of beer on the wall."
050 ?
060 NEXT
070 ? "No more bottles of beer on the wall, no more bottles of beer."
080 ? "Go to the store and buy some more, 99 bottles of beer on the wall."
090 END
099 REM
100 ON SGN(b-1)+2 GOTO 120, 130, 110
110 LET bottles$ = STR$(b) + " bottles": RETURN
120 LET bottles$ = "no bottles": RETURN
130 LET bottles$ = "1 bottle": RETURN

Оставить комментарий

Как ускорить Yosemite

«Йосе́мити» — худшая по стабильности операционка Эпл из всех, которые я когда-либо видел, в ней столько всего сломано, что я начинаю думать, что службу контроля качества Эпл должны уволить в полном составе. Она же, возможно, худшая по скорости. Даже на моей свежайшей «прошке», купленной взамен прошлой, умершей от чая, она тормозит.

Я почитал в сети советы бывалых по ускорению её работы, кое-что применил сам, делюсь.

Во-первых, надо отключить полупрозрачность. Это даёт существенный прирост к отзывчивости системы, особенно при работе с двумя мониторами. Отключается она в системных настройках → «Универсальный доступ» → «Уменьшить прозрачность».

Уменьшить прозрачность (62.29КиБ)

Во-вторых, рекомендуют отключить экран виджетов. Говорят, на него тратится порядочно ресурсов системы. Опять «Системные настройки» → «Mission Control» → в списке «Dashboard» надо выбрать «Выкл.».

Dashboard (92.69КиБ)

В-третьих, и это частый совет в таких ситуациях, нужно сбросить данные System Management Controller (SMC). Для этого нужно выключить ноутбук, зажать на десять секунд клавиши левого «шифта», «альт», «контрол» и кнопку питания, после чего включить ноут обратно.

В-четвертых, так же нужно сбросить PRAM. Для этого, опять же, нужно выключить ноутбук, включить его и зажать «комманд», «альт» и клавиши «P» и «R» до тех пор, пока не загрузится операционная система.

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

Импортозамещение слов

В санкциях, о которых не говорит сейчас только ленивый, я вижу и плюсы, а именно — импортозамещение программного обеспечения. Поверхностная точка зрения на этот вопрос — обычный распил денег, хотя оправданность тут ровно такая же как у сети «ГЛОНАСС». Так уж случилось, что мы живём внутри государств и они время от времени воюют. Использовать во время войны сеть геопозиционирования противника — глупость, точно так же использование его же операционной системы, прикладного ПО.

Промышленный шпионаж через программное обеспечение — не сказки, вы это знаете, если читаете хотя бы «Хабр». Шпионаж на уровне государств — такая же реальность. Поэтому важно иметь собственное программное обеспечение. Да, какая-то часть разработки такого ПО — распил, возможно даже бо́льшая, я не знаю. Но это не повод гнобить всё импортозамещение, это повод искать пути решения проблемы распилов.

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

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

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

Так же хочется чтобы померли «краудфандинг» («складчина») и «краудсорсинг» (хотя ничего лучше «толоки» я тут предложить не могу).

71 комментарий

Комментарии в формате JSON

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

{
  "api_host" : "The hostname of your API server. You may also specify the port.",
  "api_host" : "hodorhodor.com",

  "retry_interval" : "The interval in seconds between retrying failed API calls",
  "retry_interval" : 10,

  "auth_token" : "The authentication token. It is available in your developer dashboard under 'Settings'",
  "auth_token" : "5ad0eb93697215bc0d48a7b69aa6fb8b",

  "favorite_numbers": "An array containing my all-time favorite numbers",
  "favorite_numbers": [19, 13, 53]
}

Он полностью синтаксически верен и разбирается правильным образом во всех языках, по всей видимости.

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

Кодировка JSON

Я всегда полагал, что кодировка данных в формате JSON («джейсон») должна быть ЮТФ-8. Оказывается в стандарте указано только, что она должна быть Юникодом. Более того, в стандарте указаны способы определения разных типов кодировок.

Так как первые два символа данных в формате «джейсон» всегда будут в первой половине таблицы ASCII (в самом деле, как не крути, первый символ — «{» или «[», а далее кавычка, буква «f» («false»), «n» («null»), «t» («true») или цифра), то легко угадать в какой именно кодировке встретился Юникод:

00 00 00 xx  UTF-32BE
           00 xx 00 xx  UTF-16BE
           xx 00 00 00  UTF-32LE
           xx 00 xx 00  UTF-16LE
           xx xx xx xx  UTF-8

Как видите каких-либо маркеров для ЮТФ-8 не выделено, то есть во всех остальных случаях считается, что кодировка ЮТФ-8. Я посмотрел встроенные парсеры ПХП и Пайтона, они ни с какими другими кодировками Юникода, помимо ЮТФ-8, по всей видимости, не работают, то есть нарушают стандарт.

Оставить комментарий

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

Самарский архив видимо что-то у себя обновил и предыдущий способ для скачивания документов оттуда работать перестал. Очень жаль, удобство работы с интерфейсом архива оставляет желать лучшего, не говоря о скорости доступа к документам.

С просьбой что-то с этой проблемой сделать, мне написало около десятка человек, сегодня у меня наконец дошли руки посмотреть что изменилось. Как и в прошлый раз надо открыть окно консоли браузера и запустить скрипт (я проверял его в «Хроме»). Плохие новости в том, что скрипт будет работать относительно неспешно — 400 страниц обрабатывается примерно за 5—6 минут.

В конце работы в консоли будет длинная строка, начинающаяся с «dxo.itemsValue» и заканчивающаяся на «];». Её, как и в прошлый раз, надо будет скопировать в файл и передать в параметрах программе.

!function () {
    var id = '[id$=seadragonContainer] div div';
    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 });
    }();

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

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

Внимание: скрипт должным образом я ещё не протестировал (просто не успел), так что на корректную работу пока не рассчитывайте!

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

Прототип Айфона

Прототип Айфона (62.21КиБ)

Выше — первый прототип Айфона, который назывался «Пурпурный» («purple»), так он выглядел в августе 2005 года, примерно за год до выхода окончательного варианта.

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

← сюда туда →