Уоррен Баффет. Для чего ему столько кэша?
История Berkshire Hathaway показывает, что доля кэша и ликвидных активов в портфеле у Уоррена Баффета сильно менялась в зависимости от рыночной конъюнктуры и его уверенности в инвестиционных возможностях.
Исторические периоды высокого уровня кэша у У. Баффета.
1. Конец 1990-х (dot-com bubble)
▪️ Баффет избегал интернет-акций, которые считались «обязательными» для портфеля.
▪️ В 1998–1999 гг. Berkshire накапливала значительный кэш, так как Баффет «не находил разумных цен».
▪️ В момент пика пузыря у компании было более $15–20 млрд наличности, что было очень большой долей по тем временам.
▪️ После краха dot-com он смог делать покупки на выгодных условиях.
2. Финансовый кризис 2007–2009 гг.
▪️ Перед кризисом 2007 года у Berkshire было более $40 млрд кэша (исторический рекорд на тот момент).
▪️ Во время кризиса Баффет активно инвестировал — сделки с Goldman Sachs, General Electric, покупка железной дороги BNSF в 2009 году.
▪️ Доля кэша тогда резко снизилась после этих сделок.
3. 2016–2019 гг.
▪️ Кэш у Berkshire снова стал быстро расти.
▪️ В 2016 году — около $85 млрд.
▪️ К концу 2019 года — более $125 млрд, что было примерно 20–25% активов.
▪️ Баффет открыто говорил, что «не видит компаний по приемлемой цене».
4. COVID-кризис 2020
▪️ На начало 2020 года у Berkshire было почти $137 млрд кэша (рекордный показатель).
▪️ Во время обвала марта Баффет почти не тратил этот кэш, что стало неожиданностью для многих.
▪️ Он объяснял это необходимостью поддерживать финансовую устойчивость и готовностью к худшему сценарию.
5. 2022–2025 гг.
▪️ В 2022 году кэш снова вырос выше $140 млрд.
▪️ На середину 2025 года доля наличности и казначейских бумаг составляет более 55% активов Berkshire (абсолютно рекордная доля за всю историю).
▪️ Для сравнения: раньше он обычно держал 20–30% в ликвидности, максимум 35–40% — но нынешние 55% выглядят как крайне осторожная позиция.
📊 Итог. Рекордные пики кэша у Berkshire:
▪️ 1999 (dot-com bubble)
▪️ 2007–2008 (перед кризисом)
▪️ 2016–2019 (рынок дорогой)
▪️ 2020 (COVID)
▪️ 2025 (сейчас — абсолютный максимум, более половины активов).
👉 То есть Баффет уже не раз накапливал большие резервы в ожидании «распродажи», но текущий уровень ликвидных активов — самый высокий в истории компании.
Приложение Авито на айфоне
Собираюсь в отпуск,надо освободить место для фоточек и видосиков, начала чистить память на моем 13 айфоне. Чищу кэш у приложений. В настройках вижу, что приложение Авито заняло на моем телефоне около 9гб. Как такое может быть, это ж не соцсеть, не мессенджер. Пытаюсь искать в настройках приложения, там нет функции очистить кэш. Яндекс Алиса предлагает сгрузить это приложение и установить заново, но позвольте, его же апп стор заблокировал, и установить заново я его уже не смогу. Что делать, может кто подскажет?
Т-банк... кеш - жадность = ноль
Специально купил топливо на эту сумму, посмотреть как я ещё должен буду, но у Т-банка наглости не хватило.
Обход кэширования игр, сделанных на Construct 3
Добрый день!
Меня зовут Руслан.
С 2016 года делаю игры в редакторе Construct 3 (раньше он назывался Construct 2), преимущественно без использования "настоящего" кода.
Что-то в последнее время у меня загорелось начать где-то сохранять свой опыт работы с этим редактором. И пока идут праздники, решил попробовать.
В этом посте описан мой способ обновлять игры, сделанные на Construct 3.
Сегодня китайская нейросеть сподобилась выдать работающую версию скрипта для автоматического обновления игры. Хочу поделиться результатом.
Суть проблемы:
Браузеры любят всё кэшировать. Они распихивают себе по кармашкам (в кэш) все скрипты игры, картинки, звуки и прочее, из чего состоит игра.
В итоге, когда мы заливаем на сервер новую версию, то может произойти вот что.
1. Игрок, который раньше уже играл в эту игру, запускает её у себя в браузере,
2. Браузер показывает ему устаревшую версию, загруженную из кэша, а не с сервера. Вроде как это снижает нагрузку на сервер, но в итоге игрок не увидит обновление.
Как это решается теперь в наших проектах:
1. Чтобы понять, новая это версия или старая, я стараюсь всегда выводить на экран номер версии, где-нибудь в нижнем углу, бледненько, но читаемо.
При старте каждого экрана в это текст вывожу номер версии из системной переменной projectversion.
Иначе можно бесконечно чинить баги, не понимая, это старая версия загружена или просто новая сломалась.
2. Добавляю в проект группу с группами, в которой происходит обработка автоматического обновления.
Немного ниже покажу содержимое этих групп подробнее.
3. Создаю отдельный слой update, на котором располагаю одноцветный фон, вращающуюся иконку загрузки, кнопку обновления и текст с оповещением, что найдена новая версия.
Фон растягиваю на весь экран.
4. Прозрачность слоя update привязываю к прозрачности иконки на этом слое. Иконке заданы поведения Rotate и Tween, что позволяет ей бесконечно крутиться и плавно менять прозрачность.
То есть, теперь можно управлять прозрачностью слоя, задавая прозрачность иконки.
На старте каждого экрана делаю иконку и фон полностью прозрачными, чтобы они не появились раньше времени.
5. Далее, используем плагин Browser. Когда он сигнализирует, что нашёл обновление - включаем окно (точнее сказать - слой) Обновления.
Важный момент. Как Браузер понимает, что есть новая версия игры?
По номеру версии!
Поэтому стараемся не забывать обновлять этот номер в поле Version (в главных настройках проекта в самом верху.
Для удобства, я нумерую версии текущей датой и примерным временем сохранения проекта.
6. Параллельно с включением окна (слоя) Обновления у меня блокируются все активные игровые слои, чтобы игрок не ускакал случайно на другой экран.
Также включаю вращение иконки (Rotate, до включения слоя она не вращается, чтобы не тратить системные ресурсы).
И затем с помощью Tween плавно делаю иконку, а за ней и весь слой непрозрачным, чтобы игрок увидел предупреждение о новой версии, которая в данный момент загружается.
7. Когда обновление наконец загрузилось (определяем это с помощью того же плагина Browser), проверяем, если иконка Обновления ещё не включалась (может случиться и такое), то включаем её и показываем поверх кнопку "Обновить".
Если же экран обновления уже включен, то просто включаем кнопку, чтобы игрок мог сам нажать её в удобный для него момент.
Также меняем текст на новый.
8. И наконец последнее - обработка нажатия кнопки.
Тут всплыла та самая закавыка со скриптом, из-за которой пришлось напрягать китайскую нейросеть.
В браузерах Chrome, Opera, Yandex - в целом всё работает нормально и без скрипта. Когда кнопка нажата - страница просто обновляется с помощью Browser - Reload и всё ок - грузится новая версия.
Но Firefox решил выпендриться и в нём эта конструкция уходит в бесконечную перезагрузку: Грузится старая версия и снова появляется окно Обновления, пока игрок не догадается нажать Shift-F5, чтобы вручную загрузить самую новую версию.
if ('serviceWorker' in navigator) {
navigator.serviceWorker.getRegistrations().then(function(registrations) {
// 1. Удаляем все сервис-воркеры
for (let registration of registrations) {
registration.unregister();
}
// 2. Очищаем кеш (если доступно)
if ('caches' in window) {
caches.keys().then(function(cacheNames) {
cacheNames.forEach(function(cacheName) {
caches.delete(cacheName);
});
});
}
// 3. Задержка 500 мс + жесткая перезагрузка
setTimeout(() => {
window.location.reload(); // Или window.location.href = window.location.href;
}, 1000);
});
} else {
// Просто перезагружаем, если сервис-воркеров нет
window.location.reload();
}
Поэтому здесь пришлось прикрутить вышеупомянутый JS-скрипт, сгенерированный нейросетью с 20-й попытки.
Переменную browserName пришлось завести вручную, чтобы определять, в каком браузере запущена игра.
var userAgent = navigator.userAgent;
if (userAgent.indexOf("Chrome") > -1) {
runtime.globalVars.browserName = "Chrome";
} else if (userAgent.indexOf("Firefox") > -1) {
runtime.globalVars.browserName = "Firefox";
} else if (userAgent.indexOf("Safari") > -1) {
runtime.globalVars.browserName = "Safari";
} else if (userAgent.indexOf("Edge") > -1) {
runtime.globalVars.browserName = "Edge";
} else if (userAgent.indexOf("MSIE") > -1 || userAgent.indexOf("Trident") > -1) {
runtime.globalVars.browserName = "Internet Explorer";
} else {
runtime.globalVars.browserName = "Unknown";
}
// Теперь вы можете использовать переменную browserName в вашем проекте
console.log("Browser: " + runtime.globalVars.browserName);
Соответственно, для Firefox используем чудо-скрипт на JS, а в остальных браузерах, стандартный Browser - Reload.
У меня этот способ сработал. Возможно в каких-то ещё браузерах тоже нужно обрабатывать нажатие кнопки с помощью скрипта.
P.S. В следующих постах планирую выкладывать другие нюансы работы в Construct 3, которые применяю в своей работе.
P.P.S. Для более надёжного хранения завёл также телеграм-канал Игрушечный программист: https://t.me/toyprogrammer
Занимательная математика от Альфа-банка
Всем доброго дня!
Давно на Пикабу, но написать решил впервые.
На днях пришло мне письмо от Альфа-банка с предложением сэкономить на топливе. Банк дарит 20% кэшбэка при заправке на АЗС Газпромнефть в период с 24 по 27 апреля и при этом обещает вернуть максимум 200 рублей.
Путем несложных подсчетов выходит, что при 20% кэшбэка для получения максимальной суммы 200 рублей нужно потратить на заправку 1000 рублей.
До этого момента у меня вопросов не возникло, поэтому решил заехать по пути домой на АЗС Газпромнефть и действительно немного сэкономить.
Однако по факту условия игры поменялись. Через сервис "Заправки" приложения Альфа-Банка я уже дошел до ввода номера колонки и суммы оплаты в размере 1000 рублей, как вдруг на экране высвечивается информация, что кэшбэк начисляется только за покупку от 1500 рублей.
То есть при оплате 1000 рублей кэшбэка вообще не будет, а при оплате 1500 рублей кэшбэк составит те самые максимально обещанные 200 рублей, а это ведь уже не 20%, а всего лишь 13,33% кэшбэка!
Отменил заправку и решил уточнить в чате поддержки, может я что не так понял.
Но из переписки стало ясно, что понял я всё правильно.
В приложении Альфа-Банка не проучилось сделать скриншоты, сделал фото переписки другим телефоном.
И вот у меня вопрос, возможно, его даже как-то прокомментируют представители Альфа-банка:
- Это ошибка оператора в чате и действительно можно получить 20% кэшбэка в размере 200 рублей, потратив 1000 рублей за топливо на АЗС Газпромнефть или у банка такие хитрые и/или математически одаренные маркетологи?
P.S. К слову сказать, пользуюсь подобными акциями от других банков и там всё честно - обещали 20 или 30 процентов кэшбэка с заправки при максимальной сумме возврата 200 или 300 рублей соответственно, значит при оплате 1000 рублей за топливо мне эти 200 или 300 рублей и начисляют.