{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блог Ильи Бирмана: заметки с тегом Какао",
    "_rss_description": "Блог Ильи Бирмана о дизайне, городах, музыке и жизни.",
    "_rss_language": "ru",
    "_itunes_email": "ilyabirman@ilyabirman.ru",
    "_itunes_categories_xml": "<itunes:category text=\"Arts\"><itunes:category text=\"Design\" \/><\/itunes:category>\r\n<itunes:category text=\"Society &amp; Culture\"><itunes:category text=\"Personal Journals\" \/><\/itunes:category>\r\n<itunes:category text=\"Technology\" \/>\r\n",
    "_itunes_image": "https:\/\/ilyabirman.ru\/meanwhile\/pictures\/userpic\/userpic-square@2x.jpg?1573933764",
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/ilyabirman.ru\/meanwhile\/tags\/kakao\/",
    "feed_url": "https:\/\/ilyabirman.ru\/meanwhile\/tags\/kakao\/json\/",
    "icon": "https:\/\/ilyabirman.ru\/meanwhile\/pictures\/userpic\/userpic@2x.jpg?1573933764",
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/ilyabirman.ru\/meanwhile\/",
            "avatar": "https:\/\/ilyabirman.ru\/meanwhile\/pictures\/userpic\/userpic@2x.jpg?1573933764"
        }
    ],
    "items": [
        {
            "id": "3053",
            "url": "https:\/\/ilyabirman.ru\/meanwhile\/all\/weekend-reading-26\/",
            "title": "Что почитать на выходных — 26",
            "content_html": "<p>Вот что:<\/p>\n<ol start=\"1\">\n  <li><a href=\"http:\/\/blog.oleganza.com\/post\/30093392395\/definitive-answer-to-message-eating-nil-argument\">Definitive answer to message-eating nil argument<\/a>. Олег Андреев объясняет, почему клёво, когда отправка сообщений несуществующему объекту (nil) не должна быть ошибкой. Мне всегда нравилось, что в Какао это так.<\/li>\n  <li><a href=\"http:\/\/counternotions.com\/2008\/07\/16\/bet-iphone\/\">iPhone: The bet Steve Jobs didn’t decline<\/a>. Почему заняться Айфоном было очень непростым решением для Эпла.<\/li>\n  <li><a href=\"http:\/\/kickingbear.com\/blog\/archives\/337\">Giant<\/a>. Гай Инглиш про Нила Армстронга.<\/li>\n<\/ol>\n",
            "summary": "Вот что...",
            "date_published": "2012-08-31T23:52:21+03:00",
            "date_modified": "2012-08-31T23:53:04+03:00",
            "tags": [
                "Айфон",
                "Какао",
                "программирование",
                "чтиво",
                "Эпл"
            ],
            "_date_published_rfc2822": "Fri, 31 Aug 2012 23:52:21 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "3053",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "2425",
            "url": "https:\/\/ilyabirman.ru\/meanwhile\/2009\/05\/12\/1\/",
            "title": "Нотация для названий функций",
            "content_html": "<p>В Какао мне очень нравится, как используется возможность «Объектного Си» вставлять параметры прямо в название методов («селекторов»):<br \/>\n<tt>[someObject doStuffWithThing:x andThing:y usingParameter:z];<\/tt><\/p>\n<p>Получаются нормальные предложения. В большинстве языков так делать нельзя, однако формулировать названия функций так, чтобы параметры продолжали предложение, никто не запрещает. Если параметр всего один, или параметры образуют очевидную последовательность, то это добавит удобочитаемости. Я принял нотацию, согласно которой название функции завершается подчёркиванием, если оно составлено по такому принципу. В этом случае открывающая скобка не отбивается пробелом (вообще, я всегда отбиваю; меня страшно бесит, что в ЦССе так делать нельзя).<\/p>\n<p>Пример перевода:<br \/>\n<tt>e2_note_by_id ($id)<\/tt> → <tt>e2_note_with_id_($id)<\/tt>.<\/p>\n<p>А так могли бы выглядеть некоторые функции с несколькими параметрами:<br \/>\n<tt>do_stuff_at_($x, $y)<\/tt>,<br \/>\n<tt>do_stuff_with_date_($year, $month, $day)<\/tt>.<\/p>\n<p>Если параметры не образуют очевидной последовательности или нормально переформулировать смысл функции не удаётся, то функция пишется «по старинке», без подчёркивания в конце:<br \/>\n<tt>e2_store_cache ($path, $data, $secure)<\/tt>.<\/p>\n<p>А какие вы используете хитрости для повышения удобочитаемости кода?<\/p>\n",
            "summary": "В Какао мне очень нравится, как используется возможность «Объектного Си» вставлять параметры прямо в название методов",
            "date_published": "2009-05-12T14:01:17+03:00",
            "date_modified": "2021-05-19T09:42:16+03:00",
            "tags": [
                "Какао",
                "программирование",
                "ПХП"
            ],
            "_date_published_rfc2822": "Tue, 12 May 2009 14:01:17 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2425",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "2401",
            "url": "https:\/\/ilyabirman.ru\/meanwhile\/2009\/04\/25\/1\/",
            "title": "Какао-наблюдения",
            "content_html": "<p>С одной стороны, программировать под Мак — в удовольствие: тут нет такой жести, как в Винде, когда какая-нибудь функция возвращает указатели на структуру из 18 указателей, половина из которых указывает на массивы структур других указателей, или когда, наоборот, ссылку на такую структуру нужно передать в качестве одного из 8 параметров какой-нибудь функции, чтобы она в неё же запихала результат (а все остальные параметры сделать NULL, потому, что понять по документации, что они значат, невозможно).<\/p>\n<p>Вот понадобилось мне на днях изменить шрифт в текстовом поле. Код угадал, не глядя в документацию (автозаполнение помогло, конечно); заработало с первого раза:<\/p>\n<pre class=\"e2-text-code\"><code>[textView setFont:[NSFont fontWithName:@&quot;Arial&quot; size:20]];<\/code><\/pre><p>Что касается setFont:, то я просто предположил, что такой метод может быть, начал писать set..., и выбрал из списка setFont:, у которого единственный параметр — экземпляр класса NSFont. Как сделать нужный NSFont — угадывается по аналогии: очень часто названия конструкторов начинаются с типа создаваемого объекта, например у NSString есть конструктор stringWithContentsOfFile:encoding:error:, который возвращает содержимое файла; у NSArray есть конструктор arrayWithObjects:, который возвращает массив с переданным набором объектов; а у NSColor есть конструктор colorWithCalibratedRed:green:blue:alpha:, который, как нетрудно догадаться, возвращает цвет с заданными R, G, B и непрозрачностью с учётом каких-то цветовых профилей.<\/p>\n<p>С другой стороны, эпловская терминология местами разрывает мозг. Иногда невозможно по три часа найти что-нибудь в документации просто потому, что ты ищешь, например, keyboard layout, а надо искать text input source.<\/p>\n",
            "summary": "С одной стороны, программировать под Мак — в удовольствие: тут нет такой жести, как в Винде, когда какая-нибудь функция возвращает указатели на структуру из 18 указателей",
            "date_published": "2009-04-25T12:37:06+03:00",
            "date_modified": "2021-05-19T09:43:26+03:00",
            "tags": [
                "Какао",
                "Мак",
                "программирование"
            ],
            "_date_published_rfc2822": "Sat, 25 Apr 2009 12:37:06 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2401",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "2382",
            "url": "https:\/\/ilyabirman.ru\/meanwhile\/2009\/03\/30\/2\/",
            "title": "Эмси будущего",
            "content_html": "<p>В выходные опять немного поигрался с Какао. Научился делать пункты меню, в которых нарисовано то, что я хочу. Получил поверхностное представление об использовании «имплисит анимейшенс» в Кор-анимейшене. Сделал экспериментальный билд <a href=\"http:\/\/ilyabirman.ru\/emcee\/\">Эмси<\/a>, в котором реализовал пару вещей.<\/p>\n<p>Во-первых, я сделал шрифт мельче. Когда пунктом меню выступал просто текст в виде NSString, он рисовался стандартным шрифтом для пунктов меню. Я думал, что изменить его я смогу только, если буду использовать кустомный вью (сейчас-то я уже думаю, что, наверное, можно было просто NSAttributedString использовать в качестве тайтла). Короче, теперь у меня используется более мелкий шрифт — из стандартных вещей такой применяется, например, в индикаторе уровня заряда батарейки на ноутбуках.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.ru\/meanwhile\/pictures\/emcee-2-alpha-ss1.png\" width=\"512\" height=\"21\" alt=\"Эмси будущего\" \/>\n<\/div>\n<p>Во-вторых, у меня теперь видно, какая часть трека уже проигралась. Я хочу сделать так, чтобы в эту штуку можно было тыкать, чтобы сразу прыгать в нужное место песни. Ещё есть гипотеза, что круче будет показывать, наоборот, сколько осталось до конца. Эта хрень использует Кор-анимейшен и плавненько переезжает в нужное место, если в Айтюнсе перемотать что-нибудь куда-нибудь резко.<\/p>\n<p>Во время паузы вся эта штука красиво зачёрнобеливается.<\/p>\n<p>Кстати, синий градиент — это просто синий прямоугольник высотой в несколько пикселей, которому с помощью Кор-имиджа был сделан вертикальный моушен-блюр ещё на несколько пикселей.<\/p>\n<p>К сожалению, чтобы показывать прогресс мне приходится снова по таймеру каждую секунду спрашивать Айтюнс о ситуации, что заметно грузит процессор. Само по себе время идёт со вполне предсказуемой скоростью, поэтому мне было бы достаточно знать только о моментах, когда пользователь перематывает что-то, а всё остальное время просто пририсовывать раз в секунду по секунде. Но, к сожалению, Айтюнс не уведомляет систему о перемотке, только о паузе, воспроизведении или смене песни. Если у вас есть идеи относительно того, как отлавливать момент перемотки, я был бы очень рад совету — можно было бы реализовать всё намного чище.<\/p>\n<p>Если кому интересно — пишите, пришлю последний билд посмотреть. Он глючит, иногда вдруг перестаёт рисовать синюю фигню, приходится перезапускать.<\/p>\n",
            "summary": "В выходные опять немного поигрался с Какао. Научился делать пункты меню, в которых нарисовано то, что я хочу",
            "date_published": "2009-03-30T21:13:05+03:00",
            "date_modified": "2020-05-27T22:17:21+03:00",
            "tags": [
                "Какао",
                "Мак",
                "программирование",
                "продукты",
                "проекты",
                "Эмси"
            ],
            "image": "https:\/\/ilyabirman.ru\/meanwhile\/pictures\/emcee-2-alpha-ss1.png",
            "_date_published_rfc2822": "Mon, 30 Mar 2009 21:13:05 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2382",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/ilyabirman.ru\/meanwhile\/pictures\/emcee-2-alpha-ss1.png"
                ]
            }
        },
        {
            "id": "2305",
            "url": "https:\/\/ilyabirman.ru\/meanwhile\/2009\/01\/02\/2\/",
            "title": "Эмси",
            "content_html": "<p>Совершенно поразительно, что все подряд программы-компаньоны к Айтюнсу показывают информацию о играющей песне во всплывающем временном окошке тогда, когда песня только начинается. Это ужасно неудобно:<\/p>\n<ul>\n  <li>когде песня только началась, тебе, как правило, на неё ещё наплевать;<\/li>\n  <li>временные окошки обязательно всплывают не там, где тебе нужно, мешая работе;<\/li>\n  <li>всплытия обычно сопровождаются анимацией, отвлекающей тебя от того, что ты делаешь;<\/li>\n  <li>они висят на экране слишком долго: ты уже прочитал, а они всё ещё загораживают что-нибудь;<\/li>\n  <li>они висят на экране слишком мало: ты только начал читать, а они исчезают;<\/li>\n  <li>в момент, когда тебе нравится песня, и ты задаёшься вопросом о её названии, ответа на этот вопрос нет на экране.<\/li>\n<\/ul>\n<p>В комплекте с каждым Маком идёт диск с инструментами для разрабоки. Понятное дело, что я их установил практически сразу же, как купил Мак. Я хотел сделать программу, которая бы тихо показывала в правой части меню текущую играющую в Айтюнсе песню. Безо всякого кретинского плавненького скролирования этого названия влево-вправо, как я видел в одной программе. Безо всяких там рейтинговых звёздочек. Тем же самым шрифтом, что и всё остальное. Короче, просто вот так:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.ru\/meanwhile\/pictures\/emcee-screenshot.png\" width=\"414\" height=\"100\" alt=\"Название песни в менюбаре\" \/>\n<\/div>\n<p>Тогда я довольно быстро справился с этой задачей: Жан-Даниель Дюпа, автор <a href=\"http:\/\/www.macupdate.com\/info.php\/id\/14352\">Спарка<\/a> (прекрасного менеджера клавиатурных шоткатов) подсказал мне, что нужно копать API под названием Scripting Bridge. Эта штука позволяет используя эплскриптовый словарь любых приложений общаться с ними. Получается вполне поэтический код. Вот так, например, узнаём, что играет в Айтюнсе:<\/p>\n<pre class=\"e2-text-code\"><code>iTunesApplication *iTunes;\niTunes = [SBApplication applicationWithBundleIdentifier:@&quot;com.apple.iTunes&quot;];\nif ([iTunes isRunning]) NSString *text = [[iTunes currentTrack] name];<\/code><\/pre><p>Добиться того, чего я хотел, оказалось не так сложно, но вот только для того, чтобы следить за Айтюнсом, приходилось использовать таймер. Каждые полсекунды я заново спрашивал у бедного Айтюнса, что же в нём играет:<\/p>\n<pre class=\"e2-text-code\"><code>updateTimer = [[NSTimer scheduledTimerWithTimeInterval:(.5)\n  target:self selector:@selector(updateSong:) userInfo:nil repeats:YES] retain];<\/code><\/pre><p>Вчера я наконец-то освоил штуку под названием Distributed Notification Center, которая позволяет отслеживать события в других программах. И поэтому теперь я делаю вот так:<\/p>\n<pre class=\"e2-text-code\"><code>notificationCenter = [NSDistributedNotificationCenter defaultCenter];\n[notificationCenter addObserver:self\n  selector:@selector(updateSong:) name:@&quot;com.apple.iTunes.playerInfo&quot; object:nil];<\/code><\/pre><p>А ведь такую штуку уже как бы не стыдно показать. Если кто-то хочет попробовать — вперёд, <a href=\"http:\/\/ilyabirman.ru\/download\/ilya-birman-emcee-0.1-alpha.zip\">всего 12 килобайт<\/a> (зип-архив). Называется «Эмси» (Emcee.app). У программы нет меню, иконки в Доке и она отсутствует в списке Force Quit, поэтому чтобы из неё выйти нужно либо открыть Activity Monitor и прибить её там, либо просто сказать терминалу: <tt>killall Emcee<\/tt><\/p>\n<p>Кстати, картинка сверху — это скриншот.<\/p>\n",
            "summary": "Совершенно поразительно, что все подряд программы-компаньоны к Айтюнсу показывают информацию о играющей песне во всплывающем временном окошке тогда, когда песня только начинается",
            "date_published": "2009-01-02T16:12:17+03:00",
            "date_modified": "2020-05-27T22:16:35+03:00",
            "tags": [
                "Айтюнс",
                "Какао",
                "музыка",
                "пользовательский интерфейс",
                "программирование",
                "продукты",
                "проекты",
                "Эмси"
            ],
            "image": "https:\/\/ilyabirman.ru\/meanwhile\/pictures\/emcee-screenshot.png",
            "_date_published_rfc2822": "Fri, 02 Jan 2009 16:12:17 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2305",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/ilyabirman.ru\/meanwhile\/pictures\/emcee-screenshot.png"
                ]
            }
        }
    ],
    "_e2_version": 4259,
    "_e2_ua_string": "Aegea 12.0a (v4259e)"
}