Bloodhound Tsoy

Вчера ехал на такси в аэропорт утром, таксист поставил Цоя и, спросонья, проигрыш из песни «Мама мы все тяжело больны» вдруг напомнил песню «The Bad Touch» группы «Bloodhound Gang».

Сейчас послушал на «трезвую» голову, что-то похожее есть, вроде.

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

«Хром» → «Сафари»

С 30 октября, уже больше месяца я пользуюсь «Хромом». Любимой «Опере» я не простил очередное падение с потерей вкладок, поэтому решил перейти на другой браузер. «Хром» меня разочаровал.

Во-первых, у него совершенно бесполезный стартовый экран, на который «Хром» сам добавляет наиболее открываемые сайты. Для меня это бесполезно. Почему я не могу поместить туда страницу личного кабинета своего банка, посещаю которую я редко, но она для меня важна и имеет более замысловатый УРЛ. Кроме того, «Хром» путает меня, постоянно сдвигая более используемые сайты к началу, исходя из моей истории перемещений. Мне хочется запомнить — «окно №6, это банк», а не искать его каждый раз заново. Ну и ожидаемо — весь интранет у меня в первом ряду. Очень «полезно», спасибо.

Во-вторых, и это жутко раздражает, когда я тыкаю на ссылку в какой-нибудь ЖЖ (или другой сайт, который постоянно лежит), «Хром» открывает новый таб с адресом «about:blank», запоминая УРЛ где-то у себя внутри. Когда ему не удаётся соединиться, он просто оставляет таб с этой ссылкой — «about:blank», начисто теряя исходный УРЛ. Это какой-то рак мозга. В «Опере» я в этом случае просто перезагружал страницу и всё работало. Это не даёт мне полноценно пользовать браузером и только из-за этого я готов его выкинуть.

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

В общем, попробую «Сафари», в последних версиях он всё хорошеет, а выбора больше нет. «Файрфокс» — это некрофилия какая-то.

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

Продавцы антенн?

Антенны (45.29КиБ)

Это дом, мимо которого я иду обедать каждый рабочий день. Он весь в таких антеннах. Зачем людям так много антенн? Они их продают? Сушат на зиму? Коллекционируют? Или что?

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

«Оплутонить»

Американское диалектологическое общество признало глагол «to pluto» («оплутонить») «новым словом 2006 года». Новый глагол означает «понижение в звании или ценности кого-либо или чего-либо, как это произошло с теперь уже бывшей планетой Плутон»

Из статьи про Плутон в «Википедии».

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

Всякая мелочь одним постом-7

Завтра выборы, не забудьте сходить и проголосовать! О своём опыте участия в выборах в качестве наблюдателя от «Яблока» рассказывает Надя Яцык. Другая интересная ссылка про выборы — «Статистическое исследование результатов российских выборов 2007…2009 гг».

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

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

Как вы, наверное, уже заметили, я обожаю старые фотографии. На этот раз — фотоподборка Венеция, 19 век, чёрно-белые фотографии, раскрашенные вручную.

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

Сканирование по фамилии на сайте MyHeritage

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

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

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

Код скрипта.

<?php
    $SURNAME = array('Иванов', 'Иванова');
    $EXCLUDETREE = array(111111); // дерево, которое надо пропустить (например, ваше собственное)

    $MANMASK = 'http\://www\.myheritage\.com/person\-(\d+)_(\d+)_(\d+)/[^"]+';
    $CONTACTMASK = 'contactWebmasterViaInbox\((\d+)\)';
    $CONTACTURL = 'http://www.myheritage.com/site-%d/t?lang=RU';
    $URL = 'http://www.myheritage.com/FP/smart-research-search.php?offset=%d&l=%s';

    $trees = array();

    $context = stream_context_create(array(
        'http' => array(
            'method' => 'GET',
            'header' => "User-agent: Opera/9.80 (Darwin x86_64; U; Edition Next; ru) Presto/2.10.238 Version/12.00\r\n".
                        "Accept-encoding: gzip",
            'protocol_version' => PHP_VERSION >= 5.3 ? '1.1' : '1.0',
            'timeout' => 5,
        )
    ));

    foreach ($SURNAME as $surname) {
        echo 'Поиск по фамилии «', $surname, "».\n";

        for ($i = 0;;$i += 10) {
            echo 'Смещение: ', $i;

            $content = DecodeResponse(file_get_contents(sprintf($URL, $i, urlencode($surname)), false, $context), $http_response_header);

            echo ", длина полученного документа: ", strlen($content), " байт, ";

            if (preg_match_all("!$MANMASK!", $content, $m)) {
                echo 'найдено записей: ', $peoplecount = count($m[0]), ".\n";

                $trees = array_merge($trees, $m[3]);
            } else {
                $peoplecount = 0;
                echo "записей не найдено.\n";
            }

            if ($peoplecount != 10) {
                break;
            }
        }
    }

    $trees = array_diff(array_unique($trees), $EXCLUDETREE);

    echo 'Найдено деревьев: ', count($trees), ".\n";

    foreach ($trees as $id) {
        $content = DecodeResponse(file_get_contents(sprintf($CONTACTURL, $id), false, $context), $http_response_header);

        if (preg_match("!$CONTACTMASK!", $content, $m)) {
            echo "http://www.myheritage.com/FP/inbox.php?lang=RU&compose=1&recipient={$m[1]}&type=1\n";
        }
    }

    function DecodeResponse($content, $headers) {
        foreach ($headers as $header) {
            if (stripos($header, 'Content-Encoding:') === 0 && strpos($header, 'gzip') !== false) {
                return gzinflate(substr($content, 10));
            }
        }

        return $content;
    }

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

☀ спасибо ☀

В вашем городе водители говорят «спасибо» друг другу «аварийкой»?

Мне интересно, как это могло зародиться и распространиться в такие короткие сроки? И самое главное, сигнал настолько чёткий, что даже те, кто ни разу его не видели, очень быстро понимает что ему хотели сообщить. Всего несколько лет назад не было же его. Он откуда-то пришёл или зародился у нас? Кто в курсе?

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

Инте̲рне̲т

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

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

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

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

С Днём рождения, жена!

Подарок (44.34КиБ)

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

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

Всякая мелочь одним постом-6

Интересное видео — что будет с пиявкой если её поместить в воду, оставшуюся от кальяна. Задумайтесь, чем дышат курящие кальян.

Появился прибор «СПИДометр», использующий «неинвазивный, скрининговый метод диагностики», чтобы определять наличие СПИДа. Некоторые люди совсем потеряли совесть. В пользовательском соглашении написано: «использование Пользователем сервисов сайта не налагает на Администрацию сайта каких-либо обязательств по предоставлению любых товаров, услуг, информации, а также не налагает обязательств по соблюдению проверки достоверности услуг, товаров, информации, размещаемых на сайте».

Другое видео — диктор «РенТВ», читая текст про Барака Обаму, показывает в эфире средний палец. Что это было?

Для желающих понастальгировать девятого декабря выходит ремейк знаменитой игры для «Спектрума», главным героем которой является Диззи. Это ремейк шестой части, которая называется «Dizzy. Prince of The YolkFolk», игра будет выпущена под «Андроид», «Айпад» и «Айфон». Я куплю.

«Старое радио» — уникальный проект по оцифровке старых передач, аудиоплёнок и пластинок. В ЖЖ «Оттенки серого» великолепный рассказ об авторе этого проекта.

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

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

Первый язык программирования высокого уровня — Планкалкюль ★

Планкалкюль (Plankalkül) — первый в мире язык программирования высокого уровня, разработанный немецким инженером Конрадом Цузе между 1942 и 1946 годами для его компьютера «Z4».

Экспонат в музее: деревянный пульт управления с клавиатурой и панелью приборов, застеклённый, рядом — высокие шкафы с электронными компонентами.
Компьютер «Z4», фото взято из «Википедии»

Шла Вторая Мировая Война, Цузе работал в отрыве от учёных других стран, совершенно самостоятельно. За это время он создал не только язык программирования, но и написал на нём 49 страниц программ для оценки шахматных позиций. Полностью его работа была опубликована много позже, в 1972.

Только в 1957 году (работы были начаты в 1954) появился Фортран — язык, который большинство считает первым языком высокого уровня.

«Z4» был электро-механическим, поэтому компилятора или интерпретатора Планкалкюля не существовало, но в 2000 году в Свободном универсистете Берлина (Freie Universität Berlin) был создан интерпретатор его диалекта (запускается в виде Ява-аплета в браузере).

Диалект, который реализуется, назван Plankalkül-2000 и отличается упрощённой формой записи программ. Например, упрощена форма записи, Цузе использовал двухмерную запись — первой строкой записывалось само выражение, а ниже некоторые его аргументы (тип переменной, индексы и так далее). Кроме того, были упрощены и значки самих операций, приведены к более привычному нам с вами виду.

Язык довольно богатый, на мой взгляд, для сороковых годов-то: есть условные конструкции, два вида циклов (аналог while и for), есть массивы и кортежи, можно описывать и вызывать подпрограммы (но рекурсии нет).

Все переменные делятся на четыре вида.

  • Variablen (Входные переменные) — это входные переменные подпрограмм, доступны только для чтения начинаются с буквы V и номера;
  • Zwischenwert (Значения промежуточные), доступны для чтения и записи, предназначены для хранения промежуточных вычисляемых значения, начинаются с Z и номера;
  • Resultatwerte (Результат) — в этих переменных возвращается результат вычисления, начинаются с R и номера;
  • Indizes (Индексы) — переменные цикла (аналога for), начинаются с i, дальше может быть номер, номер необходим для организации вложенных циклов.

Доступны три типа переменных. Несмотря на то, что «Z4» умел оперировать числами с плавающей точкой, интерпретатор этого не умеет.

Для целого неотрицательного указывается размерность в битах. Есть две формы записи 0 — один бит, n.0 — «n» бит, например, 8.0 — один байт (8 бит). Кортеж указывается в скобках, например (3.0, 4.0) — это две переменные в три и четыре бита, кортеж должен иметь более одного элемента. Массив записывается через точку, к примеру: 4.5.0 — массив из четырёх элементов по пять бит в каждом, 32.(0, 8.0, 16.0) — 32 кортежа, в каждом из которых три переменных: один бит, восемь и шестнадцать.

«Планкалкюль» явно можно сильно упростить по синтаксису, но современный диалект почти в точности копирует ту запись, которую использовал Цузе, я полагаю, что такой синтаксис родился из-за необходимости «отлаживать» программу на бумаге. Впрочем, язык настолько прост, что я его выучил целиком минут за 15 и даже написал на нём парочку программ в нескольких вариантах.

Одна из них вычисляет указанное (по порядку) число Фибоначчи:

P0 FactEvgenyStepanischev (V0[:4.0]) => (R0[:10.0])
(0, 1) => (Z0[:10.0], Z1[:10.0])

W1 (V0[:4.0]) [
    i > 0 -> (Z0[:10.0] + Z1[:10.0], Z1[:10.0] - Z0[:10.0]) => (Z1[:10.0], Z0[:10.0])
]

Z1[:10.0] => R0[:10.0]

END

Запускать следует так: открываете страницу с интерпретатором, копируете в окно мою программу, нажимаете «Compile», открывается отдельное окно с Ява-аплетом (требует, чтобы на компьютере была установлена Ява), в открывшемся окне мышкой побитно набираете начальное значение V0 (нажимать надо на зелёные кружки́), потом в окне браузера нажимаете «Run», в красной строчке (R0) увидите получившееся значение.

Скриншот интерфейса «Plan P0» с рядами зелёных, синих и красных фигур (круги, ромбы) и цифрами 13, 253, 233.
Запущенная программа на Планкалкюле

Подпрограммы в языке начинаются с символа P и уникального номера, дальше идёт имя, по которому её можно будет вызвать, у меня подпрограмма называется FactEvgenyStepanischev, заканчивается подпрограмма ключевым словом END (в оригинальном Планкалкюле его не было).

У подпрограммы описываются принимаемые и возвращаемые значения, у меня используется одна переменная на вход, размерностью 4 бита и одна на выход, размерность в 10. Первой строкой присваиваются значения «ноль» и «один» промежуточным переменным Z0 и Z1. Тип переменных приходится указывать при каждом их использовании, преобразовать переменную в другой тип нельзя.

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

Операция «стрелка» (->) — условная конструкция, часть справа будет выполнена, если выражение слева истинно. В диалекте работают только самые простые выражения, например цикл туда подставить можно, но кнопка «Run» в аплете у меня не появилась, поэтому я ограничился присваиванием внутри цикла.

Я тут использовал комплексное присваивание, которое хорошо знакомо тем, кто использует Перл, Пайтон или ПХП, но работает оно иначе — присваивания выполняются последовательно, слева направо, поэтому я не могу ограничиться,

(Z0[:10.0] + Z1[:10.0], Z1[:10.0]) => (Z1[:10.0], Z0[:10.0])

результат будет не тот, который ожидается.

В конце я присваиваю промежуточное значение результирующему значению подпрограммы.

Кроме этого в языке почти ничего и нет. Обращение к элементам массива, вызов функции и цикл while описывать отдельно смысла не имеет, они выглядят достаточно естественно в рамках этого синтаксиса. Все операции, поддерживаемые языком (их немного — логические операции, битовые операции и четыре арифметические действия) выглядят привычно.

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

Многозадачность в «Гоу»

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

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

package main

import (
    "io"
    "os"
    "crypto/sha512"
    "encoding/hex"
    "runtime"
    "strconv"
)

func main () {
    ch := make(chan string)

    N := 3

    runtime.GOMAXPROCS(N)

    for i := 0; i<N; i++ {
        go func (name string, num int, ch chan string) {
            if f, err := os.OpenFile(name, os.O_RDONLY, 0666); err == nil {
                defer f.Close()
                h := sha512.New()

                io.Copy(h, f)

                ch <- strconv.Itoa(num) + ". " + hex.EncodeToString(h.Sum())
            } else {
                panic("Cannot open file")
            }
        }(os.Args[0], i, ch)
    }

    for ; N > 0; N-- {
        print(<-ch, "\n")
    }
}

Что здесь происходит.

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

Дальше, очевидно, подключаются модули, в языке базовых функций почти нет, поэтому даже для такой небольшой программы мне понадобилось шесть модулей: «io» для копирования данных из одного потока в другой, «os» для работы с файлом, «crypto/sha512» для хеширования, «encoding/hex» для кодирования получившейся хеш-суммы в шестнадцатеричное представление, «runtime» чтобы выставить сколько го-программ будет выполняться параллельно и «strconv» чтобы сконвертировать число в строку.

Функция main — входная точка основного модуля программы, именно она (как в «Си») вызывается в самом начале.

Далее я создаю (make) небуферизированный «канал» и объявляю, что по нему будут идти строки, конструкция «:=» многим напоминает Паскаль, но отношения к нему не имеет, это синтаксический сахар для создания локальной переменной. «Канал» — это хорошее, говорящее название, хорошо отображающее суть, это действительно канал общения го-программы с чем-то извне.

В цикле создаются и сразу запускаются в фоне (конструкцией «go») на выполнение N го-программ, которым передаётся имя файла от которого надо считать хеш, номер функции в цикле и переменная «канала» для общения.

Внутри го-программы открывается файл, он копируется во входной поток хеширующей функции, считается хеш, конвертируется в шестнадцатеричное значение и отправляется (конструкцией «ch <- smth») в «канал».

Цикл не ждёт выполнения го-программы, а просто запускает их в фоне.

Дальше идёт второй цикл, где N раз запускается команда на чтение из канала („… <- ch»).

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

У такой лёгкости использования есть свои ограничения, но об этом как-нибудь в другой раз.

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

Какой язык программирования изучать на перспективу

Меня тут недавно спросили — какой язык программирования следует изучить на перспективу. Я ответил в том духе, что никаких формальных признаков того, что язык будет перспективен лет через пять, не существует и до сих пор думаю, что прав. В самом деле, если взять «моду» на языки за последние десять лет, видно, что их успех определяется подводными течениями, которые со стороны увидеть трудно, компании неисповедимы, могут «выстрелить» чем-то, что разрабатывали втихую много лет.

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

Над цифрами выше трудятся уже только оверклокеры, заливая штаны жидким азотом. Гонка частот уже, кажется, остановлена, началась гонка за количество ядер. Недавно был выпущен первый смартфон с четырьмя процессорами, а рабочая станция «Мак Про» поставляется в топовой конфигурацией с 12 процессорами. Сегодня на «Хабре» появилась новость о процессоре GA144, который будет продаваться за шестьсот рублей. У него 144 ядра.

Не говоря уже о GPU, у которых количество ядер приближается к тысячам.

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

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

Например, на «Пайтоне» как-то так:

@fork
def sort(arr):
    arr.sort()
    return arr

 # тут функция начала фоном работать
result = sort(somearray)

… много кода …

# а тут уже доступны результаты, если недоступны, то будем ждать
print([el for el in result if el])

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

Пока, наверное, верится с трудом. Но мой первый Айбиэм-совместимый компьютер имел жёсткий диск на 42 мегабайта, процессор там работал на частоте в пару десятков мегагерц, а памяти было около мегабайта, тогда я бы не поверил, если бы мне кто-то рассказал про терабайты, гигабайты и гигагерцы. Не успеете оглянуться, будем меряться гигаядрами.

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

Игорь Растеряев

Меня тут спросили какую я музыку слушаю. Я иногда клипы сюда вставляю или слова песен. Это всё то, что мне нравится. Недавно увидел Игоря Растеряева, хорошие слова, гармошка и «клипы», снятые на сотовый телефон. Мне очень нравится, есть за этим какая-то душа, искренность.

Автор слов и музыки — сам Игорь.

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

Археологи будущего о сигаретах

Ритуальное самоубийство (63.68КиБ)

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

Антитабачную тему одной из таких фантазий я, конечно же, не смог обойти вниманием и сделал кадр.

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

«Двести баксов»

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

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

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

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

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

«Здравствуй, мир» на Коболе

Я как-то проверял сколько занимает минимальная программа на «Гоу», оказалось — 232КБ. Посмотрел как дела с этим у Кобола. «ОупенКобол» скомпилировал мой helloword в девятикилобайтный запускаемый файл, что неплохо — сишный вариант у меня занял всего на килобайт меньше.

Вот так выглядит моя первая программа на Коболе:

000100*Моя первая программа на Коболе
000200 IDENTIFICATION DIVISION.
000300 PROGRAM-ID. hw.
000400 AUTHOR. Evgeny Stepanischev
000500 PROCEDURE DIVISION.
000600      DISPLAY "Привет, мир!".
000700      STOP RUN.

Первые шесть символов каждой строки — её номер, как легко догадаться. В современном Коболе их можно опустить (OpenCobol поддерживает этот синтаксис с ключом «-free»). Дальше идёт специальный символ, один из четырёх, насколько я знаю. Пробел — значит дальше начало новой строки кода, «звёздочка» — комментарий, минус — продолжение предыдущей строки кода (строки не должны быть длинее 80 символов) и «D» — некий «debug», для чего он, я пока не знаю.

В старом Коболе очень жёсткий порядок всего и вся. Мало того, что секции программы должны быть описано в строгом порядке, так ещё и столбец тоже имеет значение! То есть Кобол строго следит за отступами. Например, мой код с DISPLAY и STOP RUN начинается с 12-го символа. Так надо. А c 73 символа до 80-й можно писать что угодно — проигнорируется.

Язык очень многословный и имеет целую тучу зарезервированных слов, некоторые из которых весьма доставляют:

bolk@Bolk ~/Projects/Cobol  $ cobc --list-reserved | wc -l
     530

bolk@Bolk ~/Projects/Cobol  $ cobc --list-reserved | egrep '[[:digit:]]' | egrep -v 'UTF|UCS|FLOAT'
COMP-1				(Y)
COMP-2				(Y)
COMP-3				(Y)
COMP-4				(Y)
COMP-5				(Y)
COMPUTATIONAL-1			(Y)
COMPUTATIONAL-2			(Y)
COMPUTATIONAL-3			(Y)
COMPUTATIONAL-4			(Y)
COMPUTATIONAL-5			(Y)
STANDARD-1			(Y)
STANDARD-2			(Y)
SUB-QUEUE-1			(N)
SUB-QUEUE-2			(N)
SUB-QUEUE-3			(N)

Как я буду учить это всё великолепие, пока не знаю, не уверен, что интерес к языку у меня настолько глубок. Впрочем, может оказаться, что бо́льшая часть из указанных 530 зарезервированных слов нужны в жизни очень редко. А ещё, бегло пробежавшись по документации, я нашёл большое количество синонимов. За примерами далеко ходить не надо, «COMP-N» и «COMPUTATIONAL-N» из вышеприведённого листинга — синонимы.

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

Всякая мелочь одним постом-5

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

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

Leon_sbp67 в своём ЖЖ справедливо критикует известный пропагандистский ролик «путинские сказки».

«Гугл мапс» обновил карты и внимательные пользователи нашли на них какой-то странный объект (и даже не один) в районе Китая. Что это такое, есть идеи?

Звездой интернета, думаю, неожиданно для себя стала некая Любовь Матвеевна за оригинальный подход к воспитанию собственных детей — она спрашивает совета на сайте «Ответы мейл.ру» по очень волнительным поводам. Например: «решила продать кровать дочери, пусть спит на полу» или «хочу за проступки сына наказывать дочь, а за проступки дочери — сына» или «хочу заставить сына ходить на физкультуру не в костюме „Рибок“, а в советском трико». Очень надеюсь, что это кто-то просто развлекается.

Полезное — таблица символов Юникода, все символы в таблице (строится по мере прокрутки), заодно увидете, что поддерживает ваши система и браузер, а что нет.

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

Как заменить табы, используя sed

Утилита командной строки sed (это потоковый редактор), как-то неочевидно работает с символом табуляции (tab). Выражения «\t», «\x09», «\011» не срабатывают даже в расширенном режиме регулярных выражений (включается флагами „-r“ или „-E“, в зависимости от системы).

Я немного поэксперементировал, оказалось, что sed вполне воспринимает этот символ как таковой, а все «магические выражения» не работают. Поскольку «таб» имеет специальное значение в командной строке, ввести его можно либо через комбинацию Ctrl+V, tab, либо Ctrl+V, Ctrl+I. Во многих шеллах (например, в bash, ksh, sh) сработает специальный синтаксис с долларом, как в примере ниже.

Например, если вам надо заменить последовательные «табы» на один, то это может выглядеть вот так:

sed $'s/\t\t*/\t/g' sample.txt # именно \t\t*, а не \t+

# или

sed -E $'s/\t+/\t/g' sample.txt # в Линуксе ключ „-r“

Если вы знаете как в sed можно работать с tab проще, расскажите, пожалуйста, в комментариях.

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