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

Позднее Ctrl + ↑

Структуры и CGO

Обновление: в комментариях в Фейсбуке мне бывший коллега попенял, что я забыл Си и что поведение правильное — тут объявляется анонимная структура, а потом к ней определяется тип. Верно, практики на Си у меня за последние годы почти не было, вымылось всё из памяти. Так что текст ниже читайте с учётом этого обновления заметки.

Каждый раз расстраиваюсь, когда сталкиваюсь с CGO. Идея-то прекрасная — встраивать в программы на Гоу сишные библиотеки почти без программирования на Си. Но частности всё убивают. То нельзя функцию по указателю передать, то вот убил час с утра сегодня, пытаясь починить ошибку в своей библиотеке go-gd.

Документация говорит нам, что сишные структуры доступны в Гоу через конструкцию C.struct_name, а её размер — через C.sizeof_struct_name.

Я так и пытался сделать и получал ошибки:

package main

/*
typedef struct {
    int x, y;
} test;
*/
import "C"
import . "fmt"

func main() {
    Println(C.struct_test{}) // «{}»? Что за…
    Println(C.sizeof_struct_test) // could not determine kind of name for C.sizeof_struct_test
}

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

Оказывается, и я набрёл на это случайно, в ходе экспериментов, struct просто не надо писать, тогда всё будет работать:

Println(C.test{}) // «{0 0}»
Println(C.sizeof_test) // 8

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

Интонационное ударение

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

Интонационное ударение ставится, чтобы указать место, где в речи мы выделили бы слово интонацией. В стихотворении Лермонтова о Бородине есть строчки:

Вам не видать таких сражений!..
Носились знамена, как тени,
В дыму огонь блестел,
Звучал булат, картечь визжала,
Рука бойцов колоть устала,
И ядрам пролетать мешала
Гора кровавых тел.

Фраза «рука бойцов колоть устала» ушла в народ и её, не зная контекста, можно прочитать двояко: чья-то рука устала колоть бойцов («рука бойцо́в колоть устала»), либо у бойцов рука устала колоть («рука́ бойцов колоть устала»).

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

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

30 марта  

Яндекс.Аллергия

Прогноз распространения аллергенов на основании данных за последние семь лет

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

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

29 марта  

Телеграм приуныл

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

29 марта  

Клейма или счётные метки?

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

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

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

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

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

А вот отметины на снимках выше загадочны тем, что совершенно неясно что это такое. Найдены они в своде здания первой половины 19-го века по адресу ул. Профсоюзная, 10. Мой приятель открывал бар, я подъехал посмотреть на кирпичи, познакомился с хозяином здания и осмотрел остальные помещения, вот там и наткнулся.

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

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

Баг в PHP 7.2 с output_add_rewrite_var

Для того, чтобы не подставлять в каждую ссылку и форму глобальные для проекта параметры запроса (идентификатор сессии, например), в ПХП используется техника, называемая Url Rewriting. У нас в проекте так передаётся токен против XSRF — благо есть возможность указать собственные параметры, которые надо передать и даже задать список тегов с атрибутами в которых это будет работать.

И при переходе на ПХП 7.2 словили неприятный баг, который уже поправлен в 7.1.9, но ещё почему-то не влит дальше: если урл не содержит ничего, кроме якоря, то параметры добавляются неправильно. Код для повторения бага такой:

<?php
output_add_rewrite_var('foo', 'bar');
?>
<a href="index.php">This is link</a>
<a href="#place">This is anchor</a>

В первую ссылку «foo=bar» добавится нормально, а во второй это будет не к месту, якорь будет испорчен:

<a href="index.php?foo=bar">This is link</a>
<a href="#place/?foo=bar">This is anchor</a>

Наверняка со стандартными сессиями ПХП, передаваемыми в урле, будет тот же результат, но я не пробовал.

Либо надо ждать обновления, либо поставлять вместо якоря текущий полный урл.

26 марта   php   php7   программирование

Lubunta 13.04 на Toshiba AC100

Делал недавно предпродажную установку «Лубунты» 12.10 на «тошку» — смартбук «Тошиба ЭйСи-100», и уже после установки обнаружил, что под эту машинку есть две более свежие версии — 13.04 и 13.10.

Внешний вид «Лубунты» 13.04, запущенной на смартбуке «Тошиба ЭйСи-100»

13.10 после установки не нашла точку вайфая, в логах были какие-то ошибки, я не стал разбираться. Попробовал 13.04. В этот раз я чуть подольше поработал с этой системой и в комментариях на «Фейсбуке» к прошлой заметке кое-что подсказали, поделюсь приобретённым опытом.

Во-первых, при установке следует выбрать часовой пояс Минска — из-за российской чехарды с отменой перевода времени у старых релизов проблемы с базой часовых поясов, 13.04 не исключение. Если этого не сделать, не буду открываться https-сайты.

Во-вторых, в программе Software & Updates на вкладке Ubuntu Software нужно выбрать обновление с Server for United States, потом выполнить в консоли:

sudo sed -i -e 's/us.archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
sudo sed -i -e 's/\(.*ports\)/#\1/' /etc/apt/sources.list
sudo apt-get update ; sudo apt-get upgrade

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

В-четвёртых, можно настроить верхний ряд горячих клавиш, я когда-то писал об этом, для этого нужно поставить несколько утилит, компилятор, скачать зип-архив утилиты input-event-daemon и скомпилировать её:

sudo apt-get install gcc make xdotool wmctrl
cd input-event-daemon; make

Утилиту и конфиг можно положить в /opt/input-event-daemon и прописать автозагрузку в /etc/rc.local.

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

Нашёлся и недостаток. В установленной «Лубунте» по-умолчанию идёт «Хромиум», к несчастью «Ютуб» в нём не работает — какие-то проблемы с воспроизведением H.264. Другой кодек, WebM играет, но без звука. Единственное, что работает без проблем — Ogg/Theora, есть и звук, и видео.

Попробовал поставить «Файерфокс», думал может там проблем не будет, но он еле ворочается. Больше ничего по этому поводу не предпринимал.

25 марта   toshiba   гаджет

Оригами: лягушка

Третья версия лягушки — из зелёной бумаги и с глазками дочку заинтересовала меньше всего

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

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

Думаю теперь, что такого из школьного оригами могло бы её так же поразить?

24 марта   дочка

Машина

В книге «Письма из деревни» Энгельгардта, о которой я уже упоминал, персонажи нередко разъезжают на машинах, хотя на дворе 19-й век. При этом книга — не фантастика, а публицистика.

Вот только одно упоминание, в пятом письме:

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

Вот что пишет Виктор Одинцов в своей книге «Лингвистические парадоксы» об истории более привычного нам названия:

Но в 1836 г. в связи с предстоящим открытием Царскосельской железной дороги и приобретением первых локомотивов в петербургской газете «Северная пчела» в № 223 от 30 сентября сообщалось: «Немедленно по прибытии паровых машин, которые для отличия от водяных пароходов можно было бы назвать паровозами, последуют опыты употребления их…» Наш современник, известный лингвист Ю. С. Сорокин считает, что редактор газеты Н. Греч, немец по происхождению, создал слово паровоз по образцу соответствующего немецкого слова.

Кстати, паровозы сошли с арены только к концу 20-го века — на отдельных направлениях они возили пассажиров до конца 1970-х годов. Папа как-то упоминал, что в 60-х года их к месту будущей службы везли через всю страну на составе с паровозом.

Правда некоторые действуют до сих пор — как аттракцион или на манёврах в железнодорожных депо и узлах.

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

23 марта   история   музеи

99 бутылок: SCSS

63. SCSS — язык шаблонизации для файлов CSS. Я написал реализацию «99 бутылок» на нём ещё в 2012 году, но по неизвестной причине так никуда и не выложил. Возможно к лучшему — посмотрел свежим взглядом и исправил несколько неточностей.

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

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

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

@function bottles($beer) {
    @if $beer == 0 { @return "no bottles" }
    @if $beer == 1 { @return "1 bottle" }

    @return $beer + " bottles"
}

@function beer($beer) {
    $b: bottles($beer);

    @return "#{ $b } on the wall, #{ $b }.
Take one down and pass it around, " + bottles($beer - 1) + " of beer on the wall.

"
}

$result: "
";

@for $i from 99 through 1 {
    $result: $result + beer($i)
}

@debug $result +
"No more bottles of beer on the wall, no more bottles of beer.
Go to the store and buy some more, 99 bottles of beer on the wall."
Ранее Ctrl + ↓