С первым апреля!

Поздравляю с первым апреля (35.96КиБ)

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

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

Башорг такой башорг

flapenguin: Знаешь, что у моей племянницы написано в учебнике по геометрии?
flapenguin: Треугольник называется прямоугольным, если _хотя бы один_ из углов равен 90 градусам.
flapenguin: Хотя бы один бл#дь. Fuck you, Pythagoras.

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

На Башорге, как обычно, такие математики и профессионалы…

С днём математика вас!

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

Турецкий язык

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

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

Татарский: бер, ике, өч, дүрт, биш, алты, җиде, сигез, тугыз, ун. Турецкий: bir, iki, üç, dört, beş, altı, yedi, sekiz, dokuz, on.

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

Средиземное море

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

Вот оно какое — Средиземное море! Погода так себе, примерно +15, иногда дождь. Решили, что будем ездить на экскурсии и ходить в хамам (хамам входит в стоимость). Зато отель отличный и кормят хорошо, в любое время суток есть что поесть и всё очень качественное.

Кстати, живём мы всё же не в самой Анталье, а недалеко от Лара Сиде. До Антальи ходит 105 автобус, проезд стоит около доллара.

Татарский пригодился почти сразу, мы съездили в торговый центр «Özdilek», там и в маршрутном автобусе никто не говорил по-английски или русски, пришлось прибегать к своему скудному татарскому (впрочем, в магазине «Colin’s» всё же нашёлся паренёк, говоривший по-английски лучше меня).

Моя подруга Лена рассказала мне, что есть такая поговорка «счастлив тот, кто видел пять морей». Мы с женой видели Чёрное, Красное, Мёртвое, Средиземное и, если Индийский океан считается за море, то получается как раз пять.

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

Памуккале

Так как погода в Лара Сиде, где мы отдыхаем, нас не порадовала, то вчера, в пять утра мы уехали за несколько сотен километров, в старинный город Памуккале, часть всемирного наследия ЮНЕСКО.

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

Историческое название — Гиераполь («священный город» с греческого), город был построен во втором тысячилетии до нашей эры и был разрушен землетрясением в 1534.

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

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

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

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

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

Вода чистая, прекрасно видно дно, глубина, преимущественно, небольшая (около 1,5 метра), но в одном месте доходит до 4,5. Забавный контраст — купаешься в источнике, наслаждаешься теплом, а на мостике округляют глаза наглухо одетые японцы, спрашивающие «is it warm?», погода-то солнцем не балует.

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

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

Жаль, не смогли посетить музей на территории — по понедельникам он закрыт.

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

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

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

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

Несколько наблюдений о жизни в Турции

В Турции встречаются поделия российского автопрома. Причём, не какие-нибудь Нива-Шевроле, а самые что ни на есть ВАЗ-2109. Гид объяснил нам, что в Антальи бывает очень жарко — иногда 45—50°С, а у российских машин хороший движок (он так сказал!) — запускается даже при такой жаре.

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

На одном недостроенном здании заметил амулет от сглаза, знаете, такой традиционный — синий «глаз» с цветными кольцами неправильной формы внутри.

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

Чайник с заварочным чайником (23.44КиБ)

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

Гора Тахталы

Поехали сегодня утром подниматься на фуникулёре на гору Тахталы — это гора около города Кемер, высота над уровнем моря — 2365 метров. Канатная дорога на эту гору вторая по длине в мире.

На вершине горы, конечно, лежит снег, там кристально чистый воздух. Сколько там до Кемера? Думаю, несколько километров, а город видно отлично. Правда иногда гору заволакивает облаками, но нам повезло, мы такое увидели только когда собрались обратно.

Скалистая гора, скрытая в густом тумане, видна сквозь ветви сосны на переднем плане; внизу — камни и кустарники.
Горный склон с хвойными деревьями и скалами, окутанный густым туманом и облаками.
Пассажиры в салоне общественного транспорта, вид со спины; человек в белой стёганой куртке на переднем плане, красный интерьер, окна и монитор на потолке.
Заснеженный горный склон с выступающими скалами на переднем плане, на заднем плане — облака, закрывающие долину и отдалённые холмы.
Снежная горная вершина на переднем плане, частично скрытая плотными облаками, за которыми виден лесистый склон другой горы.
Заснеженные горные вершины, частично скрытые густым туманом и низкими облаками, с видимыми скалистыми участками на склонах.
Красная горнолыжная кабина поднимается по канатной дороге над заснеженными скалистыми склонами горы в пасмурную погоду.
Мужчина в чёрной куртке смотрит на сенсорный экран управления подъёмником Frey AG Stans с цифрами и кнопками, установленный в красной раме.
Высокая металлическая опора канатной дороги на фоне туманных гор и деревьев, рядом — фрагменты современных зданий с белыми фасадами и жалюзи.

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

Uptime в Windows (на Powershell)

Написал на PowerShell скромный аналог утилиты uptime из Линукса (эта утилита показывает сколько дней компьютер работает без перезагрузки):

[math]::round(((Get-Date) - ($os=gwmi Win32_OperatingSystem).ConvertToDateTime($os.lastbootuptime)).TotalDays, 2)

В основном в сети предлагается запустить «net stats srv» и посмотреть строку «статистика после» («statistics since»), впрочем и вариантов на PowerShell тоже хватает. Кстати, можно сделать ещё и такой вариант:

[math]::round(((Get-Date) - (((net stats srv)[3] -split ' ')[2,3] -join ' ' | Get-Date)).TotalDays, 2)

Почти LISP. И всё-таки мне очень нравится PowerShell.

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

Uptime в Windows (на CMD)

Я заморочился и написал uptime на чистом CMD, раз уж на PowerShell уже до меня сделали. CMD — ужасный язык программирования!

Это я после Турции до программирования дорвался.

Посмотреть что получилось.

@ECHO OFF
REM Евгений Степанищев //bolknote.ru 2011/04/09

REM Здесь CALL нельзя использовать, иначе хилый CMD не выдержит и лопнет —
REM подстановки переменных через %var% и !var! хватать перестанет
FOR /F "usebackq tokens=3" %%i ^
IN (`net stats srv ^| findstr /R "[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]*"`) DO SET DATE0=%%i

SET YEAR0=%DATE0:~6%
SET MONTH0=%DATE0:~3,2%
SET DAY0=%DATE0:~0,2%

SET YEAR1=%DATE:~6%
SET MONTH1=%DATE:~3,2%
SET DAY1=%DATE:~0,2%

REM Избавляемся от ведущих нулей, иначе CMD будет считать
REM числа восьмеричными
IF %DAY0:~0,1% == 0 SET DAY0=%DAY0:~1%
IF %MONTH0:~0,1% == 0 SET MONTH0=%MONTH0:~1%
IF %DAY1:~0,1% == 0 SET DAY1=%DAY1:~1%
IF %MONTH1:~0,1% == 0 SET MONTH1=%MONTH1:~1%

SET /A SUM=%DAY1%-%DAY0%
SETLOCAL ENABLEDELAYEDEXPANSION

IF %YEAR1% == %YEAR0% (
    SET /A END=%MONTH1%-1

    FOR /L %%M IN (%MONTH0%,1,!END!) DO (
        CALL :getMonthDays %%M %YEAR0%
        SET /A SUM+=!DAYS!
    )
) ELSE (
    REM 02.2010 -> +10 months
    FOR /L %%M IN (%MONTH0%,1,12) DO (
        CALL :getMonthDays %%M %YEAR0%
        SET /A SUM+=!DAYS!
    )

    REM 02.2011 -> +2 months
    FOR /L %%M IN (1,1,%MONTH1%) DO (
        CALL :getMonthDays %%M %YEAR0%
        SET /A SUM+=!DAYS!
    )

    REM Full years
    SET /A START=%YEAR0%+1
    SET /A STOP=%YEAR1%-1

    FOR /L %%Y IN (!START!,1,!STOP!) DO (
        CALL :isLeapYear %%Y
        IF !FEB! == 29 (
            SET /A SUM+=366
        ) ELSE (
            SET /A SUM+=365
        )
    )
)

ECHO %SUM%

GOTO :EOF

REM ====== Функции ==========

REM Високосный ли год?
REM isLeapYear <год>
:isLeapYear
SET /A FEB=(%1/400)*400

IF %FEB% == %1 (
    SET FEB=29
    GOTO :EOF
)

SET /A FEB=(%1/100)*100

IF %FEB% == %1 (
    SET FEB=28
    GOTO :EOF
)

SET /A FEB=(%1/4)*4

IF %FEB% == %1 (
    SET FEB=29
    GOTO :EOF
)

SET FEB=28
GOTO :EOF

REM Количество дней в месяце
REM getMonthDays <месяц> <год>

:getMonthDays
CALL :isLeapYear %2

IF %1 == 2 (
    SET DAYS=%FEB%
    GOTO :EOF
)

IF /I %1 LSS 8 (
    SET DAYS=30
    SET /A DAYS+="%1&1"
) ELSE (
    SET DAYS=31
    SET /A DAYS-="%1&1"
)

GOTO :EOF

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

Размер табуляции в CSS

В CSS3 есть хорошее свойство tab-size, оно контролирует размер, в пробелах, отображаемой табуляции. Оно пока в стадии черновика; например, неизвестно будет ли введена новая единица измерения (скажем «sp») и можно ли будет указать размер в процентах, пикселях и т. п.

Тем временем, свойство уже реализовано в некоторых браузерах, с собственным префиксом. Свойство первым поддержала «Опера» (с версии 10.60, именно от этой компании и было выдвинуто предложение добавить это свойство в CSS3), затем оно было реализовано в четвёртой версии FireFox. Остальные браузеры пока не подтянулись.

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

body {
    -o-tab-size: 4; /* размер табуляции — 4 (для Оперы 10.60+) */
    -moz-tab-size: 4; /* размер табуляции — 4 (для FireFox 4+) */
    -webkit-tab-size: 4; /* для будущих версий Safari и Chrome */
     tab-size: 4; /* размер табуляции — 4, на будущее */
}

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

Добавлено позднее: для WebKit уже есть патч для поддержки свойства «-webkit-tab-size».

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

Windows → Mac OS X

Только не подумайте, что я сошёл с ума, но со вчерашнего дня я работаю под Mac OS X. Вчера я поменял свой Dell E4200 с Windows 7 на MacBook Air.

Причин такого перехода несколько.

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

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

Третья серьёзная причина: MacOS X — это всё-таки нечто похожее на Linux, тут я себе несколько упрощаю жизнь, я много работаю с удалёнными машинами под Ubuntu, так что система, где есть bash, grep и прочее — это возможность не переключаться. Хотя PowerShell мне будет не хватать.

Есть ещё и масса минорных причин. Их несколько, но достойны упоминания две.

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

Вторая минорная причина: некоторые важные для меня вещи в MacOS X делаются удобнее. Например, тут есть возможность примонтировать FTP как файловую систему, в Windows ничего лучше глючного WebDrive я не вижу уже много лет.

Я уже столкнулся с тем, что где-то мне придётся сильно ломать свои привычки, но, собственно, именно этого я и добивался. Меня пока сильно разочаровывают несколько вещей, например, отсутствие некоторого класса ПО хорошего качества. В частности, я пока так и не нашёл хорошего клиента к ЖЖ (выбрал пока Phoenix, но он слабое подобие Semagic), а для меня это важно — все посты в блог я пишу клиентом ЖЖ.

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

IE 10 Platform Preview 1

Microsoft уже предлагает скачать Internet Explorer 10 Platform Preview 1.

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

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

Почему я использую «Семажик», чтобы постить в блог

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

Когда я писал движок своего блога (а я его именно писал, а не взял готовый, мне было интересно попробовать кое-какие новые идеи), один из принципов, которыми я руководствовался, был «используй готовое где только можно». Клиент для ЖЖ тогда имелся для любой платформы и его использование полностью освобождало меня от написания админки для сайта.

Я просто реализовал протокол ЖЖ (на деле даже два — Flat и Metaweblog) и несколько лет, не зная горя, писал в блог даже с телефонов, где нет ничего, кроме J2ME.

Так что «выкинь „Семажик“ и пиши через веб» — это совет от незнания, чтобы постить через веб, нужно обеспечить такую возможность, а у меня нет времени и желания этим заниматься, мне просто не интересно.

Так что я просто потратил немного времени и нашёл себе клиент, который меня устраивает — это Phoenix. Он не такой удобный, как «Семажик», но, в целом, неплох.

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

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

Вопрос про iPod Touch G1

Кто знает, подскажите, пожалуйста.

У подруги iPod Touch первого поколения. Когда был куплен (с рук, б/у), там стояла какая-то достаточно старая прошивка и он был джейбрейкнут.

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

Теперь вопрос — это ли способ, не делая джейлбрейк, ставить приложения на это устройство? Если нет, то чем сейчас модно делать джейлбрейк iPod’ов? Я уже попробовал ZiPhone, не получилось, выдаёт какую-то невразумительную ошибку, что какой-то файл не найден.

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

Запуск сайтов из Spotlight

Занялся потихоньку автоматизацией своих задач на «Маке».

Очень хотелось сделать так, чтобы по короткому имени, набираемому в Spotlight, открывались какие-то сайты. В интранете «Яндекса» очень много сайтов, которые я открываю десятки раз за день, вот я и подумал — было бы круто, если бы я набирал в Spotlight «wiki», нажимал Enter и мне открывался бы сайт wiki.yandex-team.ru.

Я знаю, что тут много ребят сидят на Windows, поэтому поясню. Spotlight (его аналог) есть на Windows 7 — это поисковая строка, куда можно вбить начальные буквы какого-то названия, а операционная система предложит к запуску список программ и/или файлов, имена или метаинформация которых наилучшим образом подходит под заданную пользователем строку.

В Mac OS X удобно, что это поисковое поле появляется по кнопке Ctrl+Пробел.

Написать плагин к Spotlight мне пока слабо́, а вот набросать на AppleScript программу, открывающую одноимённый сайт — пожалуйста.

Идея такова: кладу на диск одну и ту же программу в нескольких копиях, с разными именами — «wiki», «jira», «calendar» и так далее. Теперь их можно запускать откуда угодно, включая Spotlight. После запуска программа смотрит какое у неё имя, прибавляет к нему префикс/суффикс и проверяет существует ли получившийся домен, если да, то открывает его в браузере.

Программу надо сохранить при помощи редактора AppleScript (AppleScript Editor) с нужным именем (↑⌘S), формат файла должен быть «программа» («application»).

Вот сама программа (наверное маску «%.yandex-team.ru» нужно будет убрать, она вам будет мешать, если вы только не работаете в «Яндексе»):

-- Ищет по маскам хост, подставляя имя программы,
-- если найден, открывает его в браузере
-- bolknote.ru апрель 2011

tell application "System Events"
    set appname to the name of the current application
end tell

repeat with mask in {"%.yandex-team.ru", "www.%.ru", "www.%.com"}
    set AppleScript's text item delimiters to "%"
    set mask to text items of mask
    set AppleScript's text item delimiters to appname
    set hostname to "" & mask
    
    if resolve(hostname) then
        open location "http://" & hostname
        exit repeat
    end if
end repeat

on resolve(host)
    try
        do shell script "host '" & host & "'"
        return true
    on error
        return false
    end try
end resolve

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

Добавлено позднее: в комментариях один из читателей предложил более простой и изящный вариант. Ура!

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

«Эпл» не заплатила за рекламу?

В сериале «Числа» (Numb3rs), в одиннадцатой серии первого сезона, Чарли Эппс, один из главных героев, работает на «МакБуке» с заклееным бумажкой яблоком.

Кстати, в фильмах, кроме продукции «Эпл», часто встречается продукция фирмы Dell.

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

«Мак» для программиста

В комментариях кто-то мне писал, что «Мак» не очень-то подходит для программиста. Кому как, а под мои скромные нужды всё есть из коробки:

bolk-osx:~ bolk$ java -version 2>&1 | head -1
java version "1.6.0_24"

bolk-osx:~ bolk$ httpd -v | head -1
Server version: Apache/2.2.17 (Unix)

bolk-osx:~ bolk$ sqlite3 -version
3.6.12

bolk-osx:~ bolk$ ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]

bolk-osx:~ bolk$ python -V
Python 2.6.1

bolk-osx:~ bolk$ perl -v | head -2 | tail -1
This is perl, v5.10.0 built for darwin-thread-multi-2level

bolk-osx:~ bolk$ bash --version | head -1
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)

bolk-osx:~ bolk$ php -v | head -1
PHP 5.3.4 (cli) (built: Dec 15 2010 12:15:07)

Ну и так далее.

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

Увеличение числа параллельных соединений браузера к одному домену из HTML

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

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

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

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

Выглядеть это может так: static1.example.org, static2.example.org и так далее. «Яндекс», к примеру, грузит свои данные с домена yandex.st. Как видите, подходит другой домен любого уровня.

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

Ничего страшного, чаще всего у пользователя такого хостинга аж четыре домена, просто мало кто об этом подозревает. Первые два достаточно очевидны — хостер часто, кроме какого-нибудь example.org, заводит ещё и www.example.org. Но ведь это два разных домена!

Ещё два не так очевидны— это домены «example.org.» и «www.example.org.». Обратите внимание на точку в конце домена.

Мои эксперименты (проверял на сервисе BrowserShots, операционные системы Linux, Windows XP, Mac OS X) говорят о том, что браузеры умеют с ними работать, то есть картинки с URL, где имя домена кончалось на точку, грузились нормально.

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

В эксперименте я выставил максимальное количество соединений к серверу в единицу («Опера» и «FireFox» позволяют это сделать, где это делается в браузерах на WebKit я не знаю, подскажите, если знаете) и создал две HTML-страницы: одну, где две картинки из моего скрипта грузятся с одного домена, вторую, где одна из них грузится с домена с точкой.

Варианты загрузки (49.40КиБ)

На скриншоте хорошо заметен результат и видно где какой эксперимент (по колонке «Домен»). По скриншоту видно, что я использовал хорошо всем знакомый FireBug, но на Dragonfly из «Оперы» картина такая же.

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

Москва ✈ Казань ✈ Москва

Две ближайшие поездки в Казань: с 21-го по 24-е апреля лечу один на SQA Days-9, с 6-го по 10-е мая летим вместе с женой, повидаться с родными, друзьями.

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

CSS и JS в одном файле

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

Насколько я знаю, первым эту технику исследовал некий ShivaP в статье «Combine CSS with JS and make it into a single download!» ещё четыре года назад.

Идея такова: в файле специальными ухищрениями помещается и код JavaScript, и код CSS, файл подключается два раза — один раз через тег SCRIPT, второй раз через тег LINK (как CSS), браузер грузит файл один раз, а второй раз берёт его уже из кеша.

Автор проверил свою идею на двух браузерах — IE и FireFox, на том и остановился.

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

У техники есть ограничение, которое не портит много крови, но о нём необходимо знать — в тексте CSS и JS не должна встречаться конструкция «*/». Если в CSS достаточно просто выкусить все комментарии («*/» там, можно считать, нигде больше встретиться не может), то в JS за этим придётся следить, так как такая комбинация вполне может встретиться, в частности, в регулярных выражениях. Например: var regexp = /smth*/g;

В таких случаях звёздочку необходимо прятать (например, заменять её в регулярных выражениях на \x2A или разбивать строку: «smth*» + «/»).

Как ShivaP, первый исследователь этой техники, решил проблему размещения JS и CSS в одном файле можно почитать в оринальной статье, я же поступил несколько иначе, но сходным образом. Конструкции размещаются так, чтобы JS оказывался в комментариях CSS и наоборот. Я похожими вещами уже занимался неоднократно.

Мой код выглядит следующим образом (я поставил рядом две картинки, чтобы можно было сравнить как один и тот же код воспринимается интерпретатором JavaScript и парсером CSS):

JS и CSS (15.58КиБ)

Как видите, принцип довольно несложен.

Теперь несколько слов о том как это всё подключается:

<link type="text/css" rel="stylesheet" href="core.jscss" />

<script type="text/javascript" src="core.jscss#2"></script>

Обратите внимание на «#2» после core.jscss, этот хак позволяет обойти странное поведение некоторых версий «Хрома» — без него браузер не делал попыток подгрузить файл ещё раз и JavaScript не выполнялся.

Немаловажно так же, что заголовок «content-type» должен быть выставлен в «*/*», чтобы избежать проблем с FireFox 2.

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

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

<?
ob_start();
$dir     = 'media/';
$expires = 10 * 365 * 24 * 60 * 60; // 10 years

$files = explode(',', str_replace('..', '', $_SERVER['QUERY_STRING']));
$css = $js = array();

foreach ($files as $file) {
   switch (pathinfo($file,  PATHINFO_EXTENSION)) {
       case 'css':
          $css[] = $dir . $file;
          break;

       case 'js':
          $js[] = $dir . $file;
          break;
    }
}

$css = @array_map('file_get_contents', array_unique($css));
$js  = @array_map('file_get_contents', array_unique($js));

$css = implode($css);
$js  = implode($js, ';');

// removes /* comments */ from css
$css = preg_replace('!/\*.*?\*/!s', '', $css);

// removes only first /* comment */ from js
$js  = preg_replace('!^/\*.*?\*/!s', '', $js);

echo <<<JSCSS
// /*
$js
"*/{"/*"}
$css
*/
JSCSS;

$len  = ob_get_length();
$txt  = ob_get_clean();
$etag = '"' . sha1($etag) . '"';

header("Content-type: */*; charset=utf-8");
header("Expires: " . gmdate('D, d M Y H:i:s \G\M\T', $_SERVER['REQUEST_TIME'] + $expires));
header("Cache-control: max-age=$expires, public");
header("Content-length: " . $len);
header('ETag: ' . $etag);

if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
    list ($hash) = explode(';', $_SERVER['HTTP_IF_NONE_MATCH']);

    if ($hash == $etag) {
        header('HTTP/1.1 304 Not modified, thanx for yr question');
        exit;
    }
}

echo $txt;

Формат вызова простой: скрипту через запятую перечисляются файлы, которые нужно объединить и подключить (файлы берутся из папки «media», см. переменную «$dir»):

/util/js+css.php?core.js,core.css,another.css,another.js

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

Жест «сколько времени»?

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

Уже потом, когда я ответил на вопрос и пошёл дальше, я подумал — часы уже мало кто носит, а жест остался. Интересно, сколько пройдёт времени, прежде чем он превратиться в чистый символ, совершенно оторванный от ношения часов на руке?

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

«Крыть органами»

Узнал новое для себя выражение: «крыть о́рганами».

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

Как появился первый отечественный «Спектрум»

«Спектрум» (ZX Spectrum) — это компьютер, с которым связано три года моей жизни, несмотря на то, что настальгии по нему давно нет, всё равно иногда интересно узнать что-то новое о нём. В шестом номере газеты «Optron» за 10 января 1998 года была, оказывается, такая статья «Так, кто же первый?», о том как появился первый отечественный клон «Спектрума».

Статья интересна, помимо самой истории, описанием (хоть и без деталей) как вообще клонировалась тогда такая техника. Например:

Был такой Женя, где-то он имел контакты. Кто-то из иностранных студентов привез фирменный Спектрум сюда, в ОКБ. Этот Женя контактировал с Натоптой Евгением Евгеньевичем, который, увидев этот компьютер, попросил Женю взять его себе домой поиграться… Мы берем с работы 99-й осциллограф, тащим его туда и буквально проходим по всем ножкам, зарисовываем осциллограммы этой ULA’шки. Кроме того, у нас была информация по структуре программного обеспечения: буквально был исписан один листок.

Еще мы считали информацию из ROM компьютера. И начали работать. Евгений Евгеньевич Натопта занимался программным обеспечением, а  я, молодой еще тогда специалист, — конкретно железом. Собственно разработкой. По осцилограммам восстанавливал схему. (…)

Это было недолго. Месяц максимум.

Первый отечественный клон появился во Львове, а «разломали» его в ОКБ Львовского Политехнического института.

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

Как мне на «Мак ОС»

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

Последним совет: тщательно подумайте зачем вам это.

На «Маке» всё как везде: за прошедшую неделю «Мак» у меня завис наглухо (пришлось выключить и включить) три раза. Я осознаю, что у меня весьма специфическая настройка — он введён в домен (имеется ввиду виндовый домен) и я часто хожу в интернет по VPN-туннелю. Тем не менее, факт остаётся фактом, иногда система висит.

Бывает, что «макось» зависает некритично (не навсегда), но неприятно. У меня это чаще всего это проверка пароля администратора. Из-за того, что моя машина в домене, операционная система пытается опросить домен и проверить пароль там, а домен не всегда доступен (нет WiFi или не включен VPN), из-за этого пароль проверяется иногда минутами. Во время проверки пароля делать ничего нельзя — система не даёт.

Приходится искать программы. Счастье, что у нас на работе очень много «маководов», они часто что-то могут подсказать. На «Маке» есть несколько программ, которых мне нехватало под «Виндоуз» (яркий пример — Sparrow, который показывает почту как instant messenger), но чаще ситуация обратная, подходящие программы найти трудно. Не в последнюю очередь это происходит из-за того, что под Mac OS очень много качественных платных программ, но мало бесплатных, пусть даже и некачественных. А для меня слово «подходящий» включает так же понятие «бесплатный».

С другой стороны, некоторые качественные программы стоят до смешного мало. Sparrow я купил, попользовавшись неделю, за $9,99.

У меня последняя модель MacBook Air (как говорят владельцы автомобилей «модель этого года»), спрашивали сильно ли она греется. Не сильно, мой Dell E4200 грелся сильнее. Ещё один важный вопрос — на сколько хватает аккумулятора. Я пока не понял, но судя по всему, это чрезвычайно сильно зависит от сценария использования. Вот сейчас со включенным WiFi и половиной яркостью экрана система мне посчитала, что аккумулятора хватит примерно на два с половиной часа.

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

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

Удобно ли мне. Лично мне — удобно. Меня уже не смущает, что запуск программы из Finder это не «Enter» («Enter» это переименование), а ⌘+↓. Такого в системе много.

Я никогда не смогу привыкнуть, что программы нельзя безнаказанно убрать из Dock («панель задач» в терминах «Виндоуз»). Например, Adium (это единственный удобоваримый instant messenger) меня очень раздражает тем, что вертит спиннером при попытке соединения. Интранет-джаббер не всегда доступен (когда не включен VPN), в этом случае спиннер крутится бесконечно, это неприятно.

Мне много советуют программ, заменяющих стандартную функциональность Finder, Spotlight и прочего. Я пока ничего из этого пробовать не хочу (правда, я заменил «Терминал»), чтобы почувствовать систему. Пока я не прочувствовал все достоинства и недостатки, очень легко привить себе какие-то плохие практики, перепутав непривычное с плохим.

Если у вас есть ещё какие-то вопросы о том как мне эту неделю живётся на Mac OS X, спрашивайте, я отвечу.

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

Ну не повар я

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

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

Надеюсь, теперь она верит, что мой единственный кулинарный талант — заказ готовой еды.

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

Точка WiFi в аэропорту «Шереметьево»

Вернулся из Казани, сишу в Шереметьеве, в терминале «Д», жду такси. Смешно — для того, чтобы попасть в бесплатную WiFi-сеть «Terminal-D Free WiFi» пришлось кое-что поправить в HTML-исходнике страницы, которая показывается при подключении к точке (там надо нажать на кнопку «Next», чтобы попасть-таки в сеть) — заменил метод «POST» в форме на «GET», иначе сервер выдавал ошибку 405 («Method not allowed»).

Я попробовал в «Опере» и «FireFox», в обоих та же ошибка.

Может кто-то из читателей пользовался этой точкой? Тут всегда так или временный глюк какой-то?

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

CSSO

Ребята из симферопольского «Яндекса» сказали новое слово в оптимизации CSS — CSSO. Оптимизатор интересен тем, что умеет минимизировать с изменением структуры — то есть удалять перекрываемые свойства, производить слияние блоков с одинаковыми селекторами и тому подобное.

Сергей Крыжановский, который занимается программированием CSSO, в своём блоге хорошо описал отличия CSSO от YUI Compressor, CSSTidy и им подобных.

Например, CSSO умеет вот такое:

/* до CSSO */
.a {
    color: red;
    border: 0;
}

.b {
    color: red;
}

/* после CSSO */
.a{border:0}.a,.b{color:red}

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

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

Терри Пратчетт «Я надену чёрное»

На форуме сайта «Цитадель Детей Цвета» перевели книгу Терри Пратчетта «Я надену чёрное» («I shall wear midnight»).

Скачать можно (в формате DOC, упакован ZIP) с iFolder, Zalil, Fayloobmennik, TempFile, LetitFile, DiPi и GetZilla.

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

«Fire in the hole»

Сейчас в сериале «4исла» («Numb3rs») фразу «fire in the hole» (букв. «огонь в дыру») перевели как «стреляй в окно». Забавно, вероятно переводчики не в курсе что это значит, поэтому перевели как смогли.

По сюжету взрывали дверь грузовика подрывным зарядом (двадцатая серия второго сезона), а «fire in the hole» означает что-то вроде «поберегись, сейчас рванёт». Обычно эту фразу кричат военные или, скажем, горняки перед взрывом.

Происхождение фразы достаточно ясно: когда-то порох в пушках поджигался через небольшое отверстие в стволе. «Fire in the hole» — команда канониру сунуть в отверстие факел и, заодно, предупреждение всем окружающим, что «сейчас бабахнет», что надо держаться в стороне от направления выстрела.

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

← сюда туда →