Бытовой ислам

Во всём мире интерес к исламу сейчас носит нездоровый характер. Я почти 30 лет прожил в республике Татарстан, где одна из главенствующих религий — ислам (булгары, которых сейчас называют «казанские татары», приняли ислам ещё в 922 году).

В этой связи мне частенько задают вопросы как в Татарстане с исламским экстремизмом. Отвечаю сразу всем: никак, друзья.

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

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

Путешествуя по мусульманским странам за границей (Турция, Египет, Мальдивы, Иордания, Палестина), я понял, что бытовой ислам там выражен куда сильнее, чем в Татарстане. При этом, после поездки в Турцию у меня никто не спрашивал у меня как с экстремизмом в Турции.

Белый подвесной унитаз с открытой крышкой, из которого течёт струя воды в чашу на тёмном фоне.
Белый напольный унитаз-инсталляция с рифлёными подставками для ног, установленный в плиточном полу; рядом стоит белый мусорный бак и лежит жёлтый шланг.

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

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

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

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

Постановление правительства Москвы о порядке переустройства и (или) планировки жилых и нежилых помещений в жилых домах на территории города Москвы

Я как-то искал что же действует сейчас вместо закона Москвы от 29 сентября 1999 года №37 «О порядке переустройства помещений в жилых домах на территории города Москвы», который был отменён 7 декабря 2005 года законом города Москвы №66.

Нашёл норматив города Москвы по эксплуатации жилищного фонда (ЖНМ-2005/01) «Регламент оформления и проведения переустройства и (или) перепланировки жилых и нежилых помещений в жилых домах на территории города Москвы» (это в Приложении №2 к постановлению Правительства Москвы от 25 сентября 2007 года, № 831-ПП).

Цитирую:

В жилых домах в период проведения ремонтно-строительных работ не допускается:

— производить работы в воскресные и праздничные нерабочие дни; — начинать работы, сопряженные с шумом, ранее 9.00 и (или) заканчивать их позднее 19.00; — применять при производстве работ оборудование и инструменты, вызывающие превышение нормативно допустимого уровня шума и вибрации;

Хочу заметить, что тут ничего нет про субботы, за исключем уровня шума.

Допустимый уровень шума регламентируется СанПиН 2.1.2.2645-10 (вступил в силу 15 августа 2010 года), в Приложении №3. Там указан, например, максимальный уровень звука с семи утра до 23 вечера, он должен быть не выше 55 дБА.

«дБА» — это «децибелл акустический», уровень звука, скорректированный с учётом восприятия его человеком. Чтобы было с чем сравнить, 55 — это примерно уровень разговорной речи, а на 70 дБА шумит квартирный пылесос.

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

Язык программирования «Go»

В этом году я решил выучить язык программирования «Go». Язык разработан в стенах «Гугла» и это один из проектов, который у «Гугла», что называется, «не взлетел». В компании не очень-то занимаются его продвижением и поддержкой, если ничего не изменится, то язык, по всей видимости, будет обречён на забвение.

Самое интересное в языке — это то, как он запросто справляется с параллелизацией задач, но я пока не успел это попробовать, видел лишь на примерах. Выглядит очень круто. Интересен он ещё и тем, что компилируется (архитектуры AMD64, i386 и ARM), но при этом сам умеет управлять памятью. Ошибочно считается, что в языке нет «традиционных» указателей (с арифметикой), это не так, там они есть, просто спрятаны в модуль.

Компиляция, как утверждается, даёт хороший прирост скорости (всего лишь в 5-10 раз медленее Си и в сотни раз быстрее PHP). При этом моя небольшая программа (см. ниже) скомпилировалась в файл размером 5,8 мегабайт.

Язык сильно меняется со временем, можно заметить, что примеры кода, которым только год, уже не компилируются. Документация по некоторым модулям не просто скудная, её нет, взгляните, к примеру, на функцию Accept модуля syscall.

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

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

Оказалось, что на «Go» программа решается буквально в несколько строк, поэтому это было неинтересно. Я усложнил задачу — после запуска программа должна была сказать по какому IP-адресу можно будет зайти браузером.

Читать дальше.

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

Я использовал модуль syscall и вызвал системный вызов ioctl с параметром SIOCGIFCONF. Из-за того, что язык самовольно выравнивает структуру (struct) по границе 8 байт (надо бы проверить будет ли тот же эффект на архитектуре с 32 битами), я очень долго не мог понять почему мой вызов даёт ошибку.

Дальше всё просто — я получаю все адреса IPv4 (можно и IPv6, но мне пока не хочется возиться), если их несколько, то убираю из них те, что относятся к Private IP (10/8, 172.16/12, 192.168/16) и возвращаю один из тех, что остались. В противном случае, возвращаю тот единственный, что у меня в наличии.

Сама программа ниже:

// httphere 0.1. Написана Евгений Степанищевым, май 2011. //bolknote.ru
package main

import (
    "http"
    "flag"
    "strconv"
    "os"
    "syscall"
    "unsafe"
    "strings"
    "path"
    "path/filepath"
)

const IF_BUFFER int = 2048

type ifconf struct {
    _   int32
    len int32              "Размер буфера"
    ifr unsafe.Pointer  "Указатель на буфер"
}

func exit(message string, code int) {
    os.Stderr.WriteString("Error: " + message + "\n")
    os.Exit(code)
}

/* Проверка входного параметра (порт) на допустимые значения */
func checkargs(port int) {
    if port > 65535 || port < 1 {
        exit("invalid port range", 1)
    }

    if syscall.Geteuid() > 0 && port < 1024 {
        exit("if you want to use ports lower than 1024, you must run httphere as the root user", 3)
    }
}

/* преобразование IP-адреса в строку */
func joinip4(ip []byte) string {
    var ipstr []string

    for _, s := range ip {
        ipstr = append(ipstr, strconv.Itoa(int(s)))
    }

    return strings.Join(ipstr, ".")
}

/* получаем список IPv4-адресов на внешних интерфейсах */
func getallip4() (iplist []([]byte)) {
    fd, errno := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, syscall.IPPROTO_TCP)
    if err := os.NewSyscallError("socket", int(errno)); err == nil {
        defer syscall.Close(fd)

        ifr := new([IF_BUFFER]byte)
        ifc := ifconf{len: int32(unsafe.Sizeof(*ifr)), ifr: unsafe.Pointer(ifr)}

        ifcwopadding := uintptr(unsafe.Pointer(uintptr(unsafe.Pointer(&ifc)) + 4))
        _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.SIOCGIFCONF), ifcwopadding)

        if err := os.NewSyscallError("ioctl", int(errno)); err != nil {
            return
        }

        for i := int32(0); i < ifc.len; {
            i += 16 /* skip interface name */
            length, family := int32(ifr[i]), ifr[i+1]

            sockaddr := ifr[i+2:i+length]
            i += length

            if family == syscall.AF_INET {
                iplist = append(iplist, sockaddr[2:6]) 
            }
        }
    }

    return
}

/* на вход подаётся список IPv4-адресов, если их несколько, то функция выбрасывает локальные.
   на выходе — один IPv4 
*/
func filterip4(iplist []([]byte)) []byte {
    switch len(iplist) {
        case 0:
            return []byte{127, 0, 0, 1}

        case 1:
            return iplist[0]
    }

    var private []byte = nil

    for _, ip := range iplist {
        if ip[0] == 192 && ip[1] == 168 || ip[0] == 10 || ip[0] == 172 && ip[1] >= 16 && ip[1] <= 31 {
            private = ip
        } else if ip[0] != 127 {
            return ip
        }
    }

    if private != nil {
        return private
    }

    return iplist[0]
}

func main() {
    port := flag.Int("port", 8080, "http port address (1-65535)")
    flag.Parse()
    checkargs(*port)

    portstr := strconv.Itoa(*port)
    ip := joinip4(filterip4(getallip4()))

    os.Stdout.WriteString("Listen on " + portstr + ". Go to http://" + ip + ":" + portstr + "/\n")

    http.Handle("/", http.HandlerFunc(handler))
    if err := http.ListenAndServe(":" + portstr, nil); err != nil {
        exit(err.String(), 2)
    }
}

func handler(w http.ResponseWriter, r *http.Request) {
    cwd, _ := os.Getwd()
    path := path.Join(cwd, filepath.Clean(r.URL.Path))

    http.ServeFile(w, r, path)
}

У программы есть единственный параметр (он выводится, если запустить программу с ключом „—help“) — можно указать порт, который программа будет слушать (по умолчанию использутеся 8080).

Программа прерывается по Ctrl+C.

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

Послевкусие от «Go»

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

У «Go» есть хеши, называются «map», описываются несколько необычно: нужно описать не только тип значений, но и тип ключей. «Go» язык строгий, для него это важно:

package main
import `fmt`

func main() {
    arr := map [string] byte { `a`: 1, `b`: 2}
    fmt.Println(arr)
}

Эта простенькая программка выведет на экран что ожидается: «map[a:1 b:2]», то есть строковое представление нашей переменной типа «map». Давайте представим, что из переменной «arr» нужно удалить какое-то значение по ключу. Что для этого нужно сделать, как вы думаете?

Можете прочитать руководство и попробовать найти нам функции «del», «delete», «remove», «destroy», что угодно, ничего такого вы там не найдёте. Попытка присвоить «nil» ни к чему не приведёт — язык не позволит это сделать. Что делать?

Можно, конечно, пересоздать переменную с новым значениями, но есть способ… э… лучше. Почему я в этом не уверен будет понятно дальше.

Каждый элемент переменной типа «map» содержит специальную магию. Если запросить у элемента не одно, а два значения, то вернутся два — значение элемента и флаг, существует ли он:

val, exists := arr["a"]
fmt.Println(val, exists) // выведет «1 true»

Чтобы удалить значение из хеша надо присвоить второму значению «false»:

arr["a"] = arr["a"], false // a["a"][1] = false не сработает, у него другой смысл
fmt.Println(arr) // выдаёт map[b:2]

val, exists = arr["a"]
fmt.Println(val, exists) // выведет «0 false», значение сброшено и «не существует»

Если запросить у хеша значение с ключом, которого никогда в нём не было, эффект будет тот же — нулевое или эквивалентное ему значение и «false», тут всё логично.

Выбор такого решения для удаления значения мне кажется странным.

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

Similarly, if an assignment to a map has the special form a[x] = v, ok and boolean ok has the value false, the entry for key x is deleted from the map; if ok is true, the construct acts like a regular assignment to an element of the map.

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

«Go» паникует

Попробую рассказать ещё об одной вещи, которая показалась мне в «Go» странной, дополню предыдущий пост.

Иногда, скомпилированная программа, написанная на «Go» «паникует»:

bolk-osx:Sample bolk$ 6g t.go && 6l t.6 && ./6.out
panic: runtime error: index out of range

runtime.panic+0xac /Users/bolk/go/src/pkg/runtime/proc.c:1083
    runtime.panic(0x11ea8, 0xf8400011f0)
runtime.panicstring+0xa3 /Users/bolk/go/src/pkg/runtime/runtime.c:116
    runtime.panicstring(0x295e6, 0xce63)
runtime.panicindex+0x25 /Users/bolk/go/src/pkg/runtime/runtime.c:73
    runtime.panicindex()
main.main+0x5e /Users/bolk/Проекты/Sample/t.go:6
    main.main()
runtime.mainstart+0xf /Users/bolk/go/src/pkg/runtime/amd64/asm.s:77
    runtime.mainstart()
runtime.goexit /Users/bolk/go/src/pkg/runtime/proc.c:150
    runtime.goexit()
----- goroutine created by -----
_rt0_amd64+0x8e /Users/bolk/go/src/pkg/runtime/amd64/asm.s:64

То есть возникает ошибка, которая аварийно завершает выполнение программы. Самый простой способ этого добиться — вызов «panic», более реальный — обратиться за границу массива:

package main

func main() {
    arr := []int{1,2,3}

    print(arr[1000])
}

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

Я спросил пару человек, незнакомых с «Go», что, по их мнению, язык должен бы предоставить программисту для решения этой проблемы, оба человека назвали обработку исключений. К сожалению, тут исключений нет. Подход к решению этой проблемы у «Go» чем-то напоминает Visual Basic, а именно конструкцию On Error GoTo line.

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

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

Выглядит это вот так:

package main

func main() {
    defer func() {
        if r := recover(); r != nil {
            print("Recovered")
        }
    }()

    arr := []int{1,2,3}

    print(arr[1000])
}

Происходит тут следующее: в зоне вызова функции «main» (тут, как в Си, при запуске вызывается «main») определена анонимная функция, которая тут же вызвана как defer, при возникновении ошибки (обращение за границу массива в предпоследней строке), управление покидает зону видимости функции «main» из-за чего вызывается наша анонимная функция, которая проверяет из-за чего она была вызвана (присваивает значение, полученное из recover, переменной „r“ и проверяет его на nil), чем «успокаивает панику», если она была, и выводит сообщение «Recovered» в этом случае.

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

«Go»: указатели и арифметика

Одна из особенностей «Go», о которой пишут в большинстве статей по языку, это наличие в языке указателей, но отсутствие арифметики с ними. Вот, например, цитата из статьи «Go For C++ Programmers»:

Go has pointers but not pointer arithmetic. You cannot use a pointer variable to walk through the bytes of a string.

В самом деле, если попробовать скомпилировать следующий пример, то нас ждёт неудача:

package main
func main() {
    var pointer *[]uint8 = new([]uint8)
    pointer++ // invalid operation: pointer += 1 (mismatched types *[]uint8 and int)
}

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

В модуле «unsafe» есть специальный тип «Pointer», в руководстве по использованию которого написано следующее:

1) A pointer value of any type can be converted to a Pointer.
2) A Pointer can be converted to a pointer value of any type.
3) A uintptr can be converted to a Pointer. 4) A Pointer can be converted to a uintptr.

В свою очередь, uintptr встроен в язык и это не указатель, это обычный числовой тип, пусть вас не смущает слово «ptr». Указатель напрямую нельзя преобразовать к типу uintptr или обратно, но можно это сделать через unsafe.Pointer, как видно из цитаты выше.

И вот что получается:

package main

import "fmt"
import "unsafe"

func main() {
    e := [...]uint8{11,22,33} // создаю массив из трёх байт — 1, 2, 3
    p := &e[0] // p — указатель на первый элемент массива (тип *uint8)

    fmt.Println(*p) // выводит «11»

    p = (*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + 1)) // указатель преобразован в число, прибавляется «1», преобразуем обратно в указатель
    fmt.Println(*p) // выводит «22»

    s := "12345" // строка, содержащая «12345»
    *(*uintptr)(unsafe.Pointer(&s))++ // сдвигаем адрес, на который ссылается «s» 

    fmt.Println(s, len(s)) // «2345», но длина всё равно 5 (!), в последнем байте неотображаемый символ
}

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

QR-коды в казанском кремле

На светлой каменной стене закреплена табличка с надписью «Мечеть Кул Шариф» и QR-кодом, рядом — окно с металлической решёткой.
Белая табличка на кирпичной стене с надписью «Южный корпус Пушкинского двора», QR-кодом и ссылкой http://www.pushkin-dvor.ru/703.
Две информационные таблички с QR-кодами: «Комплекс Пушечного двора» (m.kazan-kremlin.ru/700) и «Главный корпус Пушечного двора» (m.kazan-kremlin.ru/701).

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

Из Казани давно хотят сделать туристический город, очевидно это один из шагов в этом направлении.

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

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

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

«Горбушка»

На сайте 3Dnews появилась статья «Легендарная „Горбушка“: вид с другой стороны прилавка», в статье интервью с один из продавцов на «Горбушке». Вот несколько выдержек:

Илья Тараканов: С места в карьер — вопрос: почему такие цены? Ведь приходит человек и видит — дорого.

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

Может у этого продавца всё именно так и обстоит, но он не показатель. Ходили мы с женой по Горбушке пару недель назад и искали где бы купить смартбук Тошиба АЦ-100. Нашли в нескольких местах, всё очень дорого. Типичный разговор:

— Здравствуйте, Тошиба АЦ-100 есть? — Есть, да. — А почём? — Могу за двенадцать отдать… — Двенадцать?! Почему так дорого?! — показываю продавцу «Яндекс.Маркет» с телефона, там цена с 6,5 тысяч начинается — Ну вы в интернете… не сравнивайте. — Почему?..

В ответ молчание. Я не стал спрашивать почему я не должен сравнивать.

Иван: Знаешь, сам раньше тоже думал, что продавцы — хамы, а когда сам какое-то время поработал на рынке — а в торговле я уже пару десятков лет — понял, что иногда банально сдают нервы. Работа, как ты понимаешь, далека от спокойной, ходит много неадекватных людей, и с каждым годом все больше. Продавцы, грубо говоря, садятся на валерьянку. Вот, например, приходит человек и говорит «Nokia N72». И на меня смотрит. Что я на это должен ответить? Я на него просто смотрю, а он начинает раздражаться. Мне просто хочется, чтобы он грамотно сформулировал, что хочет.

Я не продавец, но как-то мгновенно догадался, что человек хочет «Нокию Н72». По себе знаю — обходишь пару десятков павильонов в разных концах рынка, убиваешь на это пару часов, соответственно, хочется сэкономить время — пришёл, спросил «Нокия Н72», получил ответ «нету» и пошёл дальше.

Обязанность продавца нормально отвечать на этот вопрос, а не раздражаться. Это работа, продавец обязан быть вежливым, это его необходимое профессиональное качество.

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

«Go»: обработка ошибок

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

Моё небольшое исследование показало, что это не так, «panic» — это стандартное средство генерации ошибки (аналог исключений), тогда как «defer» плюс «recover» — стандартный способ сгенерированную ошибку отловить и обработать.

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

Например:

package main

func test() int {
    defer func() {
        if e := recover(); e != nil {
            print("Error\n")
        }

        panic(true)
}

func main() {
   print(test())
}

Ошибки могут быть типизированными: можно вызвать «panic(42)», «panic(„Hello“)», «panic(struct{h, k int}{0, 0})» или, к примеру, «panic(os.NewError(„Cannot open file“))», тип ошибки можно узнать, так же как и её содержимое. Это уже больше похоже на исключения.

Если внимательно посмотреть на мой пример выше, то не совсем ясно следующее: «паника» привёла к выполнению анонимной defer-функции и, фактически, прервала выполнение функции «test». Эта функция была описана, как возвращающая результат типа «int». Что нужно сделать, чтобы в случае вызова «panic», мы смогли вернуть какой-нибудь результат?

Способ есть, давайте разберём его в другом примере. В нём же я покажу как именно определить тип «паники».

package main

import . "os" // содержимое модуля будет доступно без префикса

func poisson(n int) (result string) {
    defer func() {
        switch r := recover(); r.(type) {
            case string:
                result = "Result: " + r.(string) + "\n"
            case Error:
                result = "Error: " + r.(Error).String() + "\n"
        }
    }()

    if n < 0 {
        // NewError и Error используется из модуля «os»
        panic(NewError("Poisson distributions have no value over negative numbers"))
    }

    panic("I dunno")
}

func main() {
    print(poisson(-1)) // Poisson distributions have no value over negative numbers
    print(poisson(+1)) // I dunno
}

У функции «poisson», которая притворяется, что считает распределение Пуассона, возвращаемый параметр имеет имя, он как бы связан с переменной «result». Если мы что-то поместим в эту переменную, то это и будет возвращаемым функцией значением. Поскольку в «Go» есть замыкания, мы можем использовать переменную «result» и внутри анонимной функции в defer-вызове. Всё просто.

Что происодит дальше. Вызов «panic» принимает на вход «interface{}», то есть, фактически, параметр любого типа. Чтобы определить тип этого параметра, используется специальнуя конструкция «переменная.(type)» (которая, к слову, может использоваться только в операторе «switch»).

Упомянутая конструкция может определить какой тип ошибки нам вернулся. Похожая конструкция «переменная.(имя-типа)» („r.(string)“ и „r.(Error)“) называется «type assertion». Она позволяет, в общих чертах, проверить, что в переменной сохранено значение указанного типа и получить это значение.

Полученные значения обрабатываются и сохраняются в переменной «result», которая связана со значением возвращаемым функцией «test», оно и попадает в print функции «main».

Я уже настолько проникся языком, что это решение уже мне не кажется таким странным, как поначалу.

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

Деревня Верхние Девлизери. Троицкий приход

Примерно в часе езды от Казани находится деревня Верхние Девлизери (Пестречинский район), исчезающе маленькая. Рядом находится Троицкий приход, от которого осталась потрясающе красивая церковь 1904 года, несколько разрушенная, но хорошо сохранившаяся. Внутри ещё различимы фрески, мы сегодня в ней побывали.

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

Эта каменная церковь была построена на средства мещанина г. Алатыря Василия Львовича Симбирина, по образцу церкви в селе Анатьли Рыбнослобоцкого района. В 1905 году церковь освятили, а в 1908 получила статус церковно-приходского совета, при церкви была открыта земская школа.

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

«Go»: чтение ini-файлов

Мне тут для программы на языке «Go» понадобился простой парсер ini-файлов, который я и написал. Делюсь.

Кстати говоря, я сильно облегчил себе жизнь, когда написал небольшой bash-скрипт, компилирующий и запускающий программы на «Go», вот он:

#!/bin/bash
NAME=$1

if [ -f "$NAME" ]; then
    TMPNAME=`mktemp -t go.XXXXXXX`

    shift
    6g -I. -o $TMPNAME.6 $NAME && 6l -L. -o $TMPNAME $TMPNAME.6 && $TMPNAME $*
    rm -f $TMPNAME.6 $TMPNAME >/dev/null 2>&1
else
    echo "Error: '$NAME' is not found."
fi

Сам модуль выглядит вот так (и называется «ini»):

package ini

import (
    "os"
    "bufio"
    "strings"
)

type inisection map[string]string
type inifile map[string]inisection

func ParseFile(name string) inifile {
    f, err := os.OpenFile(name, os.O_RDONLY, 0666)
    if err != nil {
        return nil
    }

    defer f.Close()

    r := bufio.NewReader(f)

    one := inisection{}             // одна, текущая секция
    ini := inifile   {}             // все секции
    section := ""                   // текущее название секции

    for {
        line, err := r.ReadString('\n')

        if err != nil {
            break
        }

        chunks := strings.Split(strings.TrimRight(line, "\r\n"), "=", 3)
        if len(chunks) == 2 {
            key, value := strings.Trim(chunks[0], "\t "), strings.Trim(chunks[1], "\t ")

            last := len(value) - 1
            if last > 0 && value[0] == '"' && value[last] == '"' {
                value = string(value[1:last])
            }

            one[key] = string(value)
        } else {
            last := len(chunks[0]) - 1

            if chunks[0][0] == '[' && chunks[0][last] == ']' {
                ini[section] = one
                one = inisection{}
                section = string(chunks[0][1:last])
            }
        }
    }

    // «поджимаем хвост», поскольку предыдущая секция попадает в map
    // только когда появляется следующая, последнюю нужно перекладывать «руками»

    if len(one) > 0 {
        ini[section] = one
    }

    return ini
}

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

Мой модуль экспортирует единственную функцию — ParseFile, принимающую на вход имя файла, на выходе будет ассоциативный массив ассоциативных массивов (map of maps), ключами верхнего уровня является имя секции (если отсутствует, то имя пустое), ключами второго уровня — ключи ini-файла.

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

Сколько занимает программа на «Go»

Хочу немного развеять тот миф, который я невольно создал — что скомпилированные программы, написанные на языке «Go» занимают очень много. Мой скомпилированный пример с веб-сервером (программа «httphere») занимает почти шесть мегабайт и это не выглядит много для такой программы.

На самом деле, всё не так просто. Простенькая программа на «Go», например, классический «Hello, world!» займёт около 230КБ:

bolk-osx:Hello bolk$ cat <<GO > hello.go
> package main; func main() { println("Hello, world!") }
> GO

bolk-osx:Hello bolk$ 6g hello.go && 6l -o hello hello.6 && du -h hello 
232K	hello

При увеличении исходного кода размер вырастает незначительно, в моей шестимегабайтной программе большую часть занимает веб-сервер (модуль «http»), если его убрать, то скомпилированная программа «похудеет» примерно на 5,5МБ.

Сейчас я пишу программу где уже 414 строк (в httphere — 132) и подключено 11 стандартных модулей, включая модуль для работы с изображениями («image»), скомпилированная версия занимает 1,5 мегабайта. Хотел бы попробовать сжать файл архиватором UPX, но, к сожалению, он не понимает тип запускаемых файлов моей системы (Mach-O 64 бита).

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

Биндинг графической библиотеки «GD» для «Go»

Написал за часть ночи и часть утра биндинг к графической библиотеке «GD»: go-gd.

Дело в том, что несмотря на существование модуля «image», в «Go» нет почти ничего для работы с графикой, всё что умеет язык — читать и писать JPEG и PNG (скоро появится поддержка GIF и TIFF), копировать области, получать значение цвета в заданных координатах, рисовать прямоугольники и точки. Это всё.

А мне, по условиям программисткой игры, в которую я ввязался, нужно уметь работать с графикой куда более разнообразно, например, изменять размеры изображения (resize image). Единственная сторонняя библиотека для этого, которая существует — «scale», сильно портит картинку.

Биндинги писать на «Гоу» чрезвычайно просто, единственное — язык запрещает читать переменную сишную errno и я не нашёл никакого способа получить её значение.

Покрытие «GD» у меня не 100%, есть функции, которые я просто поленился реализовывать. Руководства к пользованию нет, есть небольшой пример использования, makefile для его сборки и к модулю «GD» для PHP, там почти всё совпадает (только у меня функций намного меньше, GD в PHP не тот, что использую я, а форк).

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

Развитие биндинга графической библиотеки «GD» для «Go»

Несколько лет назад авторы языка PHP форкнули библиотеку GD, биндинг к которой для языка Go я вчера написал, и стали развивать собственную версию. В язык PHP входит именно форк.

Исходная библиотека беднее, например, там нет вызова ImageConvolution и всего того, что с ним можно делать (размытие, выделение краёв и так далее), а мне хочется, чтобы в моём биндинге они были. Можно, конечно, выдрать GD из РHP, но я хочу написать более-менее универсальное решение, а во все пакеты на всех платформах входит именно оригинальная библиотека.

Почесав репу, я потратил пару часов, переписал часть PHP-библиотеки GD на «Go» и воткнул её в свой биндинг. Теперь в go-gd есть вызовы GrayScale, Negate, Brightness, Contrast, Color, Convolution, GaussianBlur, EdgeDetectQuick и Emboss.

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

МТС Глонасс 945

МТС Глонасс 945 (13.46КиБ)

Взял посмотреть в агентстве Марины Рожковой телефон МТС Глонасс 945, посмотрю, расскажу о выводах. На фотографии запущена программа «GNSS Test», которая показывает количество и расположение обнаруженных спутников GPS (зелёные точки) и ГЛОНАСС (очень тёмные красные точки).

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

Незаконная ссылка на блог?

Незаконная ссылка на блог (9.26КиБ)

С сайта студии Артемия Лебедева, раздел юридического отдела студии. Что такое «незаконное использование фотографии Артемия Лебедева и ссылки на его блог»? Про фотографию я понимаю, а как может быть ссылка на блог незаконной?

Добавлено позднее: всё стало ясно, когда я посмотрел на сайт, к которому относилась претензия (спасибо читателю, обратившему моё внимание на это). Судя по всему, кто-то создал анкету на сайте и использовал в ней фото Лебедева и ссылку на его блог. Но я по-прежнему не вижу как ссылку можно назвать незаконной.

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

«Go»: количество го-программ

«Го-программы» (goroutines) — это термин языка «Go», это функции, которые выполняются параллельно, что-то вроде местных потоков. Я пока ещё почти не умею с ними работать, только учусь. Одна из особенностей, на которую я сразу наткнулся, то что в языке есть специальный вызов «GOMAXPROCS» (модуль runtime), который указывает сколько процессоров будет задействованно, чтобы запускать го-программы.

По-умолчанию, «Go» использует только один процессор, вот цитата:

It should be smarter and one day it will be smarter, but until it is if you want CPU parallelism you must tell the run-time how many goroutines you want executing code simultaneously. There are two related ways to do this. Either run your job with environment variable GOMAXPROCS set to the number of cores to use (default 1); or import the runtime package and call runtime.GOMAXPROCS(NCPU).

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

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

package main

import ("syscall"; "runtime")

func main() {
    if n, _ := syscall.SysctlUint32("hw.ncpu"); n > 0 {
        runtime.GOMAXPROCS(int(n))
    }
}

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

Возможно самое старое фото Москвы

Старая Москва (47.23КиБ)

Хочу порекомендовать интересный проект — «Фотографии старой Москвы», на нём собраны фотографии старой Москвы, начиная с 1842 года с привязкой к карте. Если вы живёте или были в Москве, можете посмотреть как выглядели знакомые места в разные годы.

Выше — возможно самая старая фотография Москвы (кстати, я спросил разрешения у владельцев проекта на использования фотографий с сайта):

Старейшее известное фото Москвы. Представляет собой раскрашенный и отретушированный дагерротип Леребура, сделанный в 1842 г. На фотографии виден начальный этап строительства Большого кремлевского дворца.

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

Дима…

С 18 мая по 21 мая в Лениногорске. Разбился на машине двоюродный братишка, завтра ему должно было исполниться 22. Не могу представить что чувствуют его родители. Комментарии отключаю. Не пишите, пожалуйста, мне ничего по этому поводу, очень прошу.

StackBlur в go-gd

Портировал алгоритм Stack Blur с языка Processing на Google Go, теперь в моей библиотеке go-gd появился метод StackBlur.

Методы Smooth и GaussianBlur, которые я портировал из форка PHP-GD мне не нравились, не давали удобоваримого размытия, StackBlur куда лучше.

Вот небольшое описание этого алгоритма от автора, Марио Клингемана:

This is a compromise between Gaussian Blur and Box blur. It creates much better looking blurs than Box Blur, but is 7x faster than my Gaussian Blur implementation.

I called it Stack Blur because this describes best how this filter works internally: it creates a kind of moving stack of colors whilst scanning through the image. Thereby it just has to add one new block of color to the right side of the stack and remove the leftmost color. The remaining colors on the topmost layer of the stack are either added on or reduced by one, depending on if they are on the right or on the left side of the stack.

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

JS Linux

JS/Linux (27.15КиБ)

Все уже видели Linux на JavaScript, который работает в браузере (нужен Google Chrome 11 или FireFox 4)?

В отличие от моего JUnix, который являлся эмулятором, написанным на JavaScript, это эмулятор процессора x86 с кое-какой периферией, на котором запущен Linux, в котором есть компилятор (tcc, Tiny C Compiler v 0.9.25), в котором можно скомпилировать программу на Си в полноценный ELF и запустить!

Можно сравнить насколько быстрее стали браузеры за прошедшие годы, JUnix я писал в 1999-2001 гг, тогда он еле ворочался, а тут — реализуется железо и это всё быстро работает. Фантастика!

Добавлено позднее: есть более ранний эмулятор Unix V6 на PDP-11, другого автора Шмидта, внутри есть ассемблер (команда as) и Фортран (fc).

Добавлено ещё позднее: 20 мая в JS/Linux была добавлена поддержка «Оперы» 11.11 и IE9.

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

Советская остановка буквой «У»

Заброшенный металлический павильон с полом и скамьей, покрытый граффити, стоит на обочине среди травы и берёз; на заднем плане виден забор и здание.

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

Добавлено позже: вот что ответил Артемий Лебедев (а он очень много путешествует) на мой вопрос не встречал ли он такие остановки где-то ещё:

На вид что-то из 60-х, тогда стало модным экспериментировать с подобными конструкциями, особенно при дизайне стел на въездах в населённые пункты.

Я такие остановки никогда не встречал.

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

У МВД какие-то другие данные о численности населения?

Со страницы МВД в сервисе «Вконтакте»:

Общая численность граждан РФ, занятых на службе в МВД, превышает 1 миллион человек — это почти полтора процента населения страны.

Миллион — это полтора процента населения? Я чуть чаем не подавился, выходит, что население России в два раза меньше, чем я привык думать?

Ничего подобного. Согласно данным Росстата, в России проживает 142 914 136 человек. Делим миллион на эту цифру, умножаем на 100, получаем:

(1 000 000 / 142 914 136) × 100% ≈ 0,7%

Всё в порядке.

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

Предсказания из прошлого, 1991-й год

Родители оцифровали видео, записанное в 1991-м году на юбилее моего папы, я его сейчас выборочно смотрю (какие все молодые!). Там папа затеял интересное: попытаться на камеру предсказать что произойдёт через пять лет, в 1996-м году, на следующий юбилей.

Предсказания моего папы: что документацию в республике будут вести на двух языках, русском и татарском (причём ему за кадром говорят, что это невозможно), талонов не будет, но мы не будем настолько уж обеспеченными, в 1992-м году будет перелом, наметится тенденция к улучшению, люди в 1996 году будут добрее.

Из того, что сбылось: 1992 году татарский язык становится вторым государственным языком в республике Татарстан (в соответствии с законом Республики Татарстан «О языках народов Республики Татарстан»), в 1992-93 гг талоны исчезли.

С остальным хуже — в 1992 году скорость роста цен на продукты питания снизилась, но сильно повысились цены на ЖКХ, сильно снизились пенсии, выросла смертность и люди вряд ли стали добрее.

Но всё-таки все конкретные прогнозы сбылись.

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

Необычные заборы в Лениногорском районе

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

Мне тут напомнили про необычные заборы, которые, встречаются в Лениногорском районе. Это такие толстые металлические листы с отверстиями (как на фото). Им нет сносу и стоят они в Лениногорске сколько я себя помню (оказывается, в Симферополе тоже такие же попадались, по словам одного из читателей).

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

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

Шевалье → шваль? Нет!

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

Более убедительная теория, с которой я только что ознакомился, выглядит так: жил-был в 1611 году Иван Прокофьев, по прозвищу «Шваль» (это слово обозначало тогда «портной»), эта самая шваль в обмен на освобождение из плена (был захвачен шведами), открыл в назначенное время ворота Новгорода, позволив шведам завоевать город.

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

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

Тибла

Когда я написал про «шевалье», «шваль» и французов, вспомнил про слово «тибла».

«Тибла» — так пренебрежительно называют русских в Эстонии. Догадайтесь от каких русских слов произошла это прозвище. Вот жирный намёк: там есть мат.

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

«Имеет место быть»

Имеет место (7.14КиБ)

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

В данной фразе «факты» — главное действующее лицо, они — подлежащее. Факты делают что? Имеют. «Имеют» — сказуемое. «Место» — очевидное дополнение, это объект действия «иметь», которое выполняют «факты». «Факты имеют место», то есть у фактов есть место, то есть факты наличествуют.

Что тут такое «быть»? Откуда оно взялось и что значит в этом предложении? Какой смысл в него вкладывают люди, которые его употребляют в такой форме? Расскажите?

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

Свой язык

Ребята, которые знают о моём увлечении языками программирования, спрашивают почему я до сих пор свой язык не придумал. Ну, почему же не придумал? Можно вспомнить, например, Price Contertor Small Talk (восьмой язык снизу), язык полный по Тьюрингу, был придуман в 1998 году, интерпретатор, кажется, был на Перле.

Не увидел свет интерпретируемый язык, основная идея которого была в том, что по pipe (как в PowerShell) идут объекты, а, кроме этого, поток можно было направлять в любую сторону (как в Befunge, только у меня поток данных, а не выполнения) и ветвить (как в команде tee, в Linux).

Было ещё несколько подобных вещей, сейчас уже их не найти.

А недавно, листая свои дневники жизни, я обнаружил следующую запись:

18/X — 1991 год

Стал кое-что понимать в Рапире, Алг. языке, Ф<неразборчиво, возможно «Фокале»>, скоро и с Ассемблером разберусь. Написал небольшую брошюру — проект своего языка «BASISE» («Базис»).

Что это был за язык я совершенно не помню, но, кажется, это был мой первый эксперимент на эту тему.

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

Вопрос про восприятие

Скажите, не заглядывая в статистику, какой процент людей, по вашему мнению, на Земле имеет доступ к компьютеру?

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

Сколько же людей имеет доступ к компьютеру?

Мне всегда казалось, что должно быть очень много, ну, хотя бы треть, это самый крайний вариант. Причина проста — я уже много лет буквально окружён компьютерами. Если прямо сейчас я поверчу головой, то я увижу 23 ноутбука и два стационарных компьютера. Думаю все, кто указали в комментариях десятки процентов, сделали это по той же причине — их опыт говорит о том, что большинство вокруг с компьютерами.

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

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

7% c компьютерами (11.01КиБ)

В комментариях к прошлой записи вспомнили про известный текст «если бы мир был деревней с населением 100 человек», данные в более серьёзных источниках, в общем-то, особо не отличаются — около 5—8% людей имеют доступ к компьютерам.

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

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

Гемосканирование

Гемосканирование (33.93КиБ)

Ходили сегодня с женой на гемосканирование в клинику «Салвия» (осторожно, трафик!), на снимке — моя кровь. Берут анализ из пальца, тут же на экране телевизора показывают как выглядит кровь и подробнейшим образом всё про неё рассказывают.

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

Ещё на фото видна часть лейкоцита (слева выглядывает) и плавают мелкие тромбоциты.

Добавлено позднее: комментарии заставляют задуматься (спасибо, ребята). Прежде чем идти туда снова попробую разобраться в вопросе получше. Если даже это всё развод, то 590 рублей за наблюдение за каплей своей крови в реальном времени мне не жалко.

Правда, несколько развеивают сомнения рекомендации врача: пропить желчегонный сбор и поменьше есть жаренного. Это всё.

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

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

Английская бюрократия

Дмитрий Астапов (_adopt_) в ЖЖ написал про свой опыт общения с английской бюрократией (попытка подключить интернет).

Из комментариев там выудил интересный термин: «скриптолюди» — люди которые действуют только по скриптам (готовым инструкциям).

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

MakeCorner на «Go»

У меня есть такая программа в проектах «MakeCorner», я ей фотографии готовлю перед публикацией, она скругляет уголки и оптимизирует изображения.

Когда я начал только её писать (PHP, перегнанный в exe), меня в комментах спросили будет ли версия для других ОС. Я ответил, что не будет, так как не знаю способа перегнать PHP в ELF или, скажем, Mach-O.

Некоторое время назад я начал писать MakeCorner на Go, а недавно выкатил весь проект на ГитХаб (до того времени он у меня жил в локальном репозитории).

Там есть почти всё, что в версии на PHP, кроме (пока) сохранения EXIF. Ключи совместимы (есть одно отличие: для ключа width нужно задавать ноль, чтобы ширина автоматически сохранялась). Кроме того, скругление уголков я переписал, теперь это делается качественнее.

Небольшая инструкция по сборке.

Если, вдруг, будете собирать под своей ОС, там есть Makefile, в нём возможно нужно будет исправить три переменные в начале. В системе должна присутствовать установленная библиотека GD.

Файл jpegtran.bz2 надо будет заменить, там должен лежать скопилированный и сжатый bzip2 файл jpegtran для вашей платформы (для Windows можно найти уже скомпилированный).

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

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

Маразм в США

Тогда выколи мне один глаз… Почему-то радует, да, что у более успешного соседа оказывается не всё так хорошо?

Радует, что маразм у чиновников в отношение интернета бывает не только у нас в России. Цитата из «Вебпланеты»:

Министерство юстиции и Служба иммиграционного и таможенного контроля США (ICE) приступили к следующей фазе операции по закрытию «пиратских» сайтов. В течение двух дней были нейтрализованы следующие ресурсы: Re1ease.net, Watchnewfilms.com, Dvdcollectionsale.com, Dvdscollection.com, Dvdsetsonline.com, Newstylerolex.com, Mygolfaccessory.com и Overbestmall.com.

Примечательно, что на Re1ease.net не хранилось вообще никаких материалов, нарушающих авторские права, а содержались лишь ссылки на видеохостинг Megavideo.com.

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

Переплата за ипотеку в России

Дешевле всего квартиры достаются жителям Дании, Швеции и Испании: там покупатели переплачивают около 20% кредита.

[…]

В результате анализа всех выплат за пользование кредитом аналитики выяснили, что российский покупатель гасит кредит как минимум дважды. К примеру, ставка Сбербанка 11,5% приводит к переплате в 141,1 тыс. евро, или 215% суммы ипотеки, а 15,5% от Альфа-банка — к 190,1 тыс. евро, или 260% кредита.

Статья на сайте «Банки.ру» «Переплата по ипотеке в России в среднем составляет 150 тысяч евро».

Нужно помнить ещё об уровне инфляции, конечно же, но разница всё равно впечатляет.

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

Серпухов

В исторической части Серпухова (Московская область) всё так же, как несколько веков назад. Добавились только автомобили.

Группа туристов осматривает руины старинной каменной крепости с аркой и остатками стен на фоне деревьев и голубого неба.
Белая церковь с шатровой колокольней и куполом на фоне голубого неба; люди гуляют по дорожке перед зданием.
Белая шатровая колокольня с зелёным куполом и крестом рядом с белым храмом в стиле барокко с синим куполом и крестом на фоне голубого неба.
Деревянный забор и крыша дома на переднем плане, за ними виднеются два церковных купола — зелёный шпиль и синий с крестом — среди зелёных деревьев под ясным небом.
Белые храмы с куполами и колокольней на фоне голубого неба, видны крыши домов и зелёные деревья в переднем плане.
Жёлто-белые храмы с зелёными куполами и золотыми крестами на фоне голубого неба, окружённые зелёными деревьями.
Православный храм с высокой колокольней и двумя куполами на фоне ясного голубого неба, окружённый зелёными деревьями и каменной оградой.

Кстати, остатки стены на второй фотографии — это всё, что осталось от серпуховского кремля (дата постройки — 1556 год). Когда в Москве строили метрополитен, очень нехватало строительного материала, время для страны было непростое (что стало традицией).

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

Остальные фотографии исторической части Серпухова можно найти в фотоальбоме на «Яндекс.Фотках».

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

Закрыли сайт Леонида Каганова

ФСБ закрыло сайт писателя Леонида Каганова (один из старейших сайтов рунета, кстати — заведён 15 лет назад). Закрыло за публикацию стихотворения признанного «экстримистским» в суде Иркутской области.

Работники ФСБ обратились к хостеру Леонида, хостер передал претензию устно и Каганов стихи убрал, заменив их своей пародией, но это не помогло.

Тут надо сказать, что сайт находился на домене lleo.aha.ru, который, естественно (как домен третьего уровня), принадлежит не Лёне, а хостеру, которому принадлежит домен второго уровня. Так что попадёт, в случае чего, хостеру, причём попадёт очень сильно.

Кончилось всё плохо — через два месяца Лёня просыпается, а сайта нет. Пришло предписание сайт закрыть.

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

Посмотрел МТС Глонасс 945

Чёрный смартфон HTC с включённым экраном, показывающим веб-страницу, лежит на красной коробке рядом с зарядным устройством, USB-кабелем и аксессуарами в упаковке на белом фоне.
МТС Глонасс 945

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

Увиденное так меня удручает, что я не решался поделиться с вами своей депрессией целых две недели. ГЛОНАСС — это, безусловно, очень важно для нашей страны. В случае вооружённого конфликта (тьфу-тьфу-тьфу, конечно) США просто прикроет лавочку с GPS или подкорректирует там что-нибудь и наша военная техника перестанет наводиться на цель, да и вполне мирные устройства сойдут с ума.

Телефон МТС 945 не является вершиной китайской мысли, это довольно неказистый смартфончик, камера 3.2 мегапикселя, 130МБ памяти (плюс карта 2ГБ), ёмкостной TFT-экран, полностью слепнущий, стоит только выйти на улицу, 240×400 точек, 262 тысячи цветов. Для телефона, основная фишка которого — навигация, такие характеристики экрана становятся жирным минусом.

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

С программным обеспечением всё тоже очень плохо (я сейчас не про «Андроид»).

Меня как-то сразу смутило, что ни одна установленная мной программа не увидела спутников больше, чем мой Nexus One. Оказывается, спутники ГЛОНАСС не видны через GPS API «Андроида» (ну, это же GPS API!), как было бы логично предположить. Для ГЛОНАСС используется отдельное API, о котором сторонние программы навигации понятия не имеют.

Смартфон МТС на белом фоне: экран показывает GPS-навигацию — направление С, высота 70 м, скорость 0 км/ч, подключено 7 спутников Glonass.
МТС Глонасс 945. Навигатор

Впрочем, на телефон предустановлен некий «Навигатор», который работает только при наличии подключения к интернету и только (sic!) через симку МТС. WiFi ему не подходит. Программа страшненькая, но только она пока умеет работать с ГЛОНАСС.

Должен признать, что точность при использовании ГЛОНАСС+GPS действительно выше, правда это маловажно. Я пару выходных проходил с двумя телефонами, с MTC 945 и своим «Нексусом». Там, где «Нексус» показывал точность 4 метра, MTC показывал один метр. Как последний справляется с переотражением сигнала от домов, я проверить не смог, не удалось обеспечить подходящих условий.

Резюмируя, нужно признать, что первый блин вышел, конечно, комом. Пусть бы в каком-нибудь следующем «Нексус 4G» или там «Самсунг S3» появится чип ГЛОНАСС, как конкурентное преимущество, а не способ снять с покупателя побольше капустки, не помешает же. Но то, что получилось у МТС, я не купил бы. Не за такие деньги. По правде говоря, ни за какие деньги. Я таким смартфоном пользоваться не смогу, а в качестве брелка он великоват.

Желаю МТС выпустить следующую модель телефона с ГЛОНАСС, более продуманную.

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

«Я, конечно, презираю отечество мое с головы до ног — но мне досадно, если иностранец разделяет со мною это чувство»

Помните знаменитое, у Пушкина, вынесенное в заголовок?

Оказывается полностью этот отрывок письма (Письмо П. А. Вяземскому, 27 мая 1826 года из Пскова в Петербург) выглядит следующим образом, что в корне меняет смысл высказывания, на мой взгляд:

Я, конечно, презираю отечество мое с головы до ног — но мне досадно, если иностранец разделяет со мною это чувство. Ты, который не на привязи, как можешь ты оставаться в России? если царь даст мне слободу, то я месяца не останусь.

Мы живем в печальном веке, но когда воображаю Лондон, чугунные дороги, паровые корабли, английские журналы или парижские театры и <бордели> — то мое глухое Михайловское наводит на меня тоску и бешенство. В 4-ой песне «Онегина» я изобразил свою жизнь; когда-нибудь прочтешь его и спросишь с милою улыбкой: где ж мой поэт? в нем дарование приметно — услышишь, милая, в ответ: он удрал в Париж и никогда в проклятую Русь не воротится — ай да умница.

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

Музей техники Вадима Задорожного

Съездили сегодня в музей техники Вадима Задорожного. Очень хороший, европейского уровня музей. Спасибо нашим друзьям, Дофину и Дине, за то, что нас туда свозили (находится музей в посёлке Архангельское, Красногорского района, МО).

Музей работает с 10 до 20, вход стоит 300 рублей в выходные и 200 в будни, оно того стоит.

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

Зелёная зенитная установка с красной звездой и серпом с молотом на фоне здания, вертолёта и ретроавтомобиля на открытом воздухе.
Зелёный танк с красной звездой, надписью «240 К РОВЬ ЗА КРОВЬ» и бочкой на броне, стоит под навесом на открытом воздухе.
Военные танки выставлены на открытом воздухе в парке, посетители осматривают экспонаты среди берёз и дорожек.
Два мальчика исследуют зелёную артиллерийскую установку на открытом воздухе, в то время как другие посетители прогуливаются по деревянной площадке среди деревьев.
Большая ракета на гусеничной пусковой установке в лесу, на ней сидит человек, видны маркировки и номер 505002005.
Красный биплан с большим винтом на выставке в музее, за металлическим ограждением; видны другие самолёты и мотоциклы на заднем плане.

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

«Мемориал»

Мой прадед (57.13КиБ)

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

Данные взяты из Центрального архива Минобороны РФ, Центрального военно-морского архива Минобороны РФ, Российского государственного военного архива, Государственного архива РФ и его региональных отделений, а так же Управления Минобороны РФ по увековечению памяти погибших при защите Отечества.

На скриншоте — информация об одном из моих прадедов, Стрелкове Степане Николаевиче, он пропал без вести в декабре 1941 года.

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

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

Координаты могил родственников

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

Встала проблема — не потерять координаты. Долго думал как это сделать, решил, что наилучший путь — выложить сюда, положу в комментарии. И другие родственники смогут найти могилы при случае и сам не потеряю.

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

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

«Рекомендации по созданию сайтов с качественным содержанием»

Из статьи «Рекомендации по созданию сайтов с качественным содержанием» в официальном блоге Гугла в России:

(…) Определение качественного содержания — сложная задача для поисковой системы, и решение ее не всегда однозначно.

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

Оказывается поисковый алгоритм учитывает ошибки в тексте! Вот уж не знал, что это важно.

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

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

Риск рака от сотовых

Риск рака от сотовых (77.76КиБ)

Скриншот из PDF-файла «IARC classifies radopfrequency electromagnetic fields as possibly carcinogenic to humans».

31 мая Международное агентство по изучению рака (IARC) классифицировало высокочастотные электромагнитные поля как вероятно канцерогенные для человека (группа 2Б), основываясь на том, что использование мобильных телефонов повышает риск глиомы (это опухоль головного мозга).

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

Похожие темы в моём блоге:  SAR и показатель излучения телефона.  Мате в группе 2А.

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

← сюда туда →