Count number of occurrences of a character in a string

I was looking for a more optimal solution to my approach of counting occurrences of a character in a string in R. And I found this post with the following solution:

countCharOccurrences <- function(char, s) { s2 <- gsub(char,"",s) return (nchar(s) - nchar(s2)) }

I don't see a contact information there to write to the author and suggest my solution, so I'll put it here:


countCharOccurrences2 <- function(char, s) { length(strsplit(s, char, fixed=TRUE)[[1]])-1 }

This test shows mine is 5 times faster.


library(microbenchmark)
microbenchmark(countCharOccurrences(":","2:2:00"), countCharOccurrences2(":","2:2:00"), times=10000L)

Unit: microseconds
expr min lq mean median uq max neval
countCharOccurrences(":", "2:2:00") 13.866 15.326 16.138550 15.690 16.056 1807.277 10000
countCharOccurrences2(":", "2:2:00") 2.190 3.284 3.940256 4.014 4.380 25.178 10000

I will actually pass the string as the first argument, and fixing "fixed" isn't ideal, instead ... should pass arguments. Except for that, it's still probably quite an awkward way to do it. What is the proper way?

Also, I needed to count it to now what format to apply when converting string to a time - sometimes timestamp is like "1:00: and sometimes "1:23:00" - depending if it's more than hour. I count ":" and apply either hms() or ms() from lubridate library. There should be a better way to do this, right?

Почему советским людям хочется спать от кофе

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

Брендон Сандерсон и яркость графики

По дороге в офис и назад я люблю слушать аудиокниги в машине. Человек я некультурный, поэтому предпочитаю низкие жанры — нуар про дубленых мстителей типа книг Andrew Vachss и всякую фэнтези (жанр, известный в узких кругах как «говнопрофей»). В частности, мне нравится Brandon Sanderson, особенно когда его читает Michael Kramer.

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

Так вот начал я тут слушать книжку Warbreaker. И удивился, как Сандерсон придумал еще круче фишку для игр. В этой книжке цветовосприятие героя зависит от его магического уровня. Чем круче маг — тем ярче цвета. А для заклинаний он, наоборот, забирает их от окружения. Поэтому города с защитой от магов — серые или выбеленные. Представьте себе, как круто это подходит для игр — чем дальше развил персонажа, тем ярче графика. Нечто вроде эволюционирования карт в мобильный игре Outcast Odyssey (там повышение уровня карты приводит к тому, что картинка на карте получает новые элементы, более яркие цвета и крутую анимацию).

Если бы можно было делать ставку на будущие медиа-тренды, я бы поставил на Сандерсона и фильмы/сериалы/игры по нему.

Слепые тесты музыки и качество звука на youtube

Разочарованный качеством звука в видеоклипах на ютюбе, я подумал, что может это достаточно хорошие наушники, чтобы слышать разницу в качестве хайрез и сжатого звука. Сделал слепой тест — нет, я все равно не могу уверенно услышать разницу между loseless треком в 60 мегабайт (3000kpbs) и пересжатой из него напрямую 3-мегабайтной версией (128kbps). При прослушивании подряд — различаю. Если включить отдельный трек — не могу уверенно сказать, кто это из них.
Но звук с ютюба все равно огорчает. Читать далее

Коварное время

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

Рассказ «Призовая игра»

Отредактировал рассказик, написанный 9 лет назад.

Призовая игра

День начался погано. Пока Степан собирался на работу, позвонила Катя. Она длинно сбивчиво объясняла, что между ними все кончено. Это было неожиданно. Степа сбился и ничего не мог сказать в ответ, ежился, слушая ее монолог, почти что мычал в ответ, и в голове крутилась одна мысль — почему сейчас? Что должно был случиться, чтобы она вдруг решила все порвать, да с утра пораньше? Бедный Степа чувствовал, как сердце колотит о лопатки, как нервы дергают организм — словно куклу за ниточки. Впрочем, они же ниточки и есть — неуместно всплыла в голове мысль. Подумать ее не было никаких сил. Любовь — не любовь, но есть в отношениях полов странной силы эмоция, оглушающая хуже боксера.

Прибитый звонком, Степа побрел на работу, не замечая ничего вокруг. Как в наушниках, на которых остроумные японцы писали, — use your head when using your headset. Переходя улицу на автопилоте, он вышел из-за припаркованной «Газели» и под визг тормозов отскочил назад. Это резко вцепилась в асфальт бордовая девятка, её даже чуть развернуло при торможении. Из девятки вылез плечистый брюнет с перекошенным от злобы лицом. Молча, он дал Степе с размаху в нос, буркнув что-то про учебу, прыгнул назад за руль и умчал.
Нос кровоточил. Ни капли не вытекло, но ощущение набухающих кровью капилляров было несомненным. Физически удар оказался сильнее романтического. Во всяком случае, Степа пришел в себя. И, переключившись с автопилота, — куда тот, интересно, вел? — направился в сторону метро.

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

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

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

Чебуречная в соседнем доме была не так страшна, как намалеванная на ней вывеска. Это было кафе контрастов: между сальными столами и вкусной пищей, между броской вывеской «Чебурешка» и табличкой «ООО Степная рыба», висевшей чуть ниже. Единственное, что здесь не стоило заказывать — это, собственно, чебуреки. Рыбы тут не предлагали. Сосиски же, вместе с бочковым пивом, были хитом в их меню — пища богов, как говорил себе Степа, — идеальная по форме и содержанию. Однако сегодня что-то сложилось не так — опять, как все этим утром. Сосиски пахли тонером. Степа успел положить в рот кусочек, прежде чем ощутил запах. На вкус, впрочем, сосиски были как сосиски. Но есть их дальше — как мифический зловонный дуриан — было затруднительно.

Степан не любил разборок с торговцами и кормильцами. В другом заведении он просто заплатил бы, ушел и кушал бы впредь в других пищеточках. Но здесь он был как родной:
— Ирина Львовна! — он помнил имя и без таблички на увесистой груди официантки, — что это у вас с сосисками сегодня? Чем это они пахнут?
Официантка склонилась над столом и посмотрела на жалобщика с сомнением:
— Сосиски как сосиски, чем не нравятся?
— Запахом не нравятся! Тонером они пахнут, черным таким тонером, как душа, от принтера.
Заинтересованный шумом дворовый интеллигент из-за соседнего столика — мы тут все одна семья — повернулся и тоже принял участие, распахнув нос над степиным завтраком.
— У вас, молодой человек, галлюцинации — сосиски как сосиски, не стройте напраслину. Ирина Львовна. Мне ещё пятьдесят.
— Вы как хотите, — смутившись, все же настаивал Степа, — а я это есть не могу. Он положил на стол купюры, округлив с чаевыми, и вышел вон.

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

Степ! — по лестнице спускалась начальница — слушай, мне тут позвонили, надо убегать, уже не вернусь — а мне же надо про директорский нотбук тебе рассказать, проводи меня, по дороге объясню. Да недалеко, я сначала подарок Светке купить, — забыл уже что ли, сотню сдавал?
— В парфюмерный магазин, да?
Теперь Степа испугался. Запаниковал — как бывало скорее во сне, когда с событиях обнаруживалась твердая логика, но чужая, непонятная. Это не просто ситуация вне контроля. События невероятным образом касались именно его и развивались слишком быстро. Итак, это предвидение. Обонятельное предвидение, — говорил себе Степа, спускаясь по лестнице. Я — носовой ясновидец. Яснонюшец. Яснонюхач. Цепочка мыслей мчалась в голове кислой бешеной каруселью, догадки хватали друг друга за хвост. Тормознуть их и сконцентрироваться на главном Степа никак не мог.

Надо обсудить это с начальницей, решил он. Она упорядоченная, она поможет.
— Слушай, тут такое дело. У меня странные проблемы. Как это? Да вот так — сам не верю, но все утро это наблюдаю. Я чувствую запах, который будет через полчаса. Вот и сейчас — я уже чувствую духи, да так сильно, будто влез во флакон.

В магазине, куда они тем временем дошли, пахло, в самом деле, резко. Продавщица с табличкой Анна на фирменном халате убирала с пола осколки — кажется, она только что разлила, разбив, несколько склянок. Так вот почему запах был сильным — начальница хотела было сказать ему об этом, но осеклась. Степан стоял, сморщив нос, закусив губу. Лоб его покрывала испарина. Он выглядел так, будто только что стер все файлы. И резервных копий нет. Его вид просто вопил — КОПИЙ НЕТ!
— Что случилось? Что ты чувствуешь?
— Кровь. Кровь, гарь, бензин и смерть. Ты знаешь запах смерти? Я думал — он бывает только в книгах. Теперь я его чувствую. А ещё я чувствую себя принцессой в башне, от которой спрятали все иглы — а она все равно возьмет веретено.

Сказать было нечего. Разве что бежать от Степы подальше. Даже если он поднялся бы в башню, подальше от машин, — кто знает, как оно там было в Нью-Йорке?
— Я знаю! — Степа прерывал её размышления — Я сам должен создать этот запах, создать безопасно. Чья это может быть кровь? Мясо? Где ближайший гастроном?

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

Никто не знает, что за странная фантазия посетила Андрея Анатольевича Зубковского, когда он решил назвать свою фирму «Призовая игра». Может, идея двойных замков — он занимался установкой металлических дверей, — а может изученные накануне главы налогового кодекса. Но именно фургон с яркой надписью «Призовая игра» во весь борт сбил Степана Михайловича Афанасьева, когда тот уже решил, что обманул судьбу. Нет, пожара не было.

(с) Александр Гагин, 2005-2014

Тонкости перевода: мартини Джеймса Бонда

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

Я сомневался, правильно ли я понимаю, но википедия подтверждает: Sometimes outside the James Bond scenario «shaken, not stirred» is used to mean «having had a shock but not suffering lasting mental effects from it».

Копии из фейсбука: зомбодоска и шмузница

Если телевизор — зомбоящик, то айпад — зомбодоска

Оказалось, по-русски чаще пишут смузи, а не смуси. Но надо локализовать дальше. Например, шмузи. А главное, кафе будет называться шмузница. Или, лучше, смушница.

Если бы условный Пелевин локализовал бы Матрицу, выбор красной или синей пилюли символизировал бы паспорта.

Свобода воли — это ошибка функции прогнозирования

Нашел у себя в записных книжках забавные тезисы на тему «мы в матрице»:
Законы онтомоделирования
1. В модели не может быть элементов, которых нет в прообразе
2. Вносить изменения в систему можно только в выборе стартовых условий
3. Лучшая модель — идентичная копия
4. Точность результатов обеспечивается точностью ситуации, экономить можно на поведенческих реакциях: вместо реальной памяти давать функцию
Свобода воли = маргинальные ошибки в функции прогнозирования

Автор записи Комментарии к записи Свобода воли — это ошибка функции прогнозирования отключены Записей в Copywrite