Все рубрики — Блог Валерия Леонтьева https://valera.ws Место публикации личных заметок. Технологии, управление, бизнес, жизнь Sun, 26 Nov 2023 21:48:47 +0000 ru-RU hourly 1 https://wordpress.org/?v=5.6.2 https://valera.ws/wp-content/uploads/2020/02/favicon.png Все рубрики — Блог Валерия Леонтьева https://valera.ws 32 32 The Computer and Internet Era is over. The AI Era is next https://valera.ws/2023.11.26~the-computer-and-internet-era-is-over-the-ai-era-next/ https://valera.ws/2023.11.26~the-computer-and-internet-era-is-over-the-ai-era-next/#respond Sun, 26 Nov 2023 21:48:47 +0000 https://valera.ws/?p=903 Читать далее The Computer and Internet Era is over. The AI Era is next ]]>

I began working in software engineering in the early 2000s. In 2001, when I was in 9th grade, I completed my first paid project – a website for a local company. Back then, web development was something that is now referred to as a «webmaster» type of work. We had to create HTML pages and upload them to shared hosting manually. We used scripting languages like PHP or Perl for dynamic elements on the websites. This was commonly seen in features like the feedback form.

The 2000s were a big deal for the internet. It went from a niche to being everywhere – in businesses, daily life, everywhere. Along with the progress in mobile technology, the Internet has greatly changed the world. Almost everything shifted to the web. For younger folks, it might be hard to see the big difference, but for those who remember the times before the internet and mobile phones, it’s clear how massive the change has been.

The 20th century was indeed the age of computers and telecommunications. All the major advancements in these fields happened during that time, laying the groundwork for further human development. The global digital infrastructure was constructed, taking us from having zero digitalization to a completely digital world.

The first digital computer emerged in the 1940s, but it wasn’t until the 1970s that it became widely adopted – that’s about 30 years. The internet prototype was crafted around 1970, but it took roughly 20 years for widespread adoption in the 1990s. Global scaling followed in the next 10 years, and our modern digital infrastructure took another 15 years of development. The journey from the first digital computer to our current ubiquitous digital landscape spanned many decades, each phase building upon the progress of the previous one.

In the 20th century, two distinct waves of progress unfolded: the invention and integration of computers, and the development of the internet. However, these waves collectively appear as a singular «Digital Revolution » when viewed through a historical lens.» According to Wikipedia, the First Industrial Revolution spanned from 1760 to 1840, taking 80 years to reshape the world. The Second Industrial Revolution, occurring from 1870 to 1914, had a transformative impact in just 44 years. Similarly, both revolutions significantly and fundamentally changed the world.

I view the «Digital Revolution» as the third Industrial Revolution in human history. It seems to have taken approximately 70 years to progress from zero digitalization to nearly 100%. The revolution commenced around 1940 and reached its culmination around 2010. This period witnessed a profound transformation in how we live, work, and communicate, marking a significant shift towards an interconnected, digital world.

The next era appears to be dominated by Artificial Intelligence (AI). Unlike the progression of AI being a direct continuation of internet or computer development, it’s more like a distinct evolution. Computers became the building blocks for the internet, and the internet, in turn, evolved into the infrastructure that AI relies on. However, AI stands as a separate entity, not directly tethered to the internet. It’s like a passenger or cargo, distinct from the train but relying on transportation for delivery.

The initial attempts to develop AI date back to the 1950s, but significant progress occurred in the 2010s, coinciding with the rise of deep learning. Deep learning relies heavily on computational power and robust data infrastructure, both of which became available around the same time. While acknowledging the importance of prior AI research, the emergence of deep learning can be likened to pivotal events like the invention of the first digital computer or the creation of ARPANET (the predecessor of the internet). It marks a transformative moment in AI, akin to discovering a solution after years of searching and experimentation.

AI technology took about a decade to become mainstream and undergo global adoption. We currently find ourselves in the initial stages of a new wave of technological advancement—the AI era. This upcoming era will bring significant changes to both the economy and people’s lives, much like the transformative impact of computers and the internet combined. The trajectory of AI suggests it will play a pivotal role in shaping the future landscape of technology and society.

How long will it take for AI to revolutionize the world? What’s the timeline for its adoption and technological progress? I anticipate a minimum of 10 years for substantial change, similar to the internet’s trajectory from 1990 to 2000. Given AI’s potentially more profound impact, comparable to the combined influence of computers and the internet, it’s likely to take even longer. The transformation is expected to be more radical than that brought about by the internet alone, becoming a significant force in reshaping our world.

AI’s growth will drive demand for new hardware, potentially paving the way for a new generation of technology, with quantum computing being a notable candidate. This surge will also push for greener, more efficient energy sources, as traditional options like coal will struggle to meet the increasing energy needs of the AI era.

The «AI Revolution» might unfold over the next 50 to 100 years, but the world will be vastly different when it’s complete. It’s a remarkable time to be alive, with the opportunity to witness and be part of this transformative era.

]]>
https://valera.ws/2023.11.26~the-computer-and-internet-era-is-over-the-ai-era-next/feed/ 0
Software Engineers Titles https://valera.ws/2023.03.23~software-engineers-titles/ https://valera.ws/2023.03.23~software-engineers-titles/#respond Thu, 23 Mar 2023 11:11:35 +0000 https://valera.ws/?p=892 Читать далее Software Engineers Titles ]]>

I recently wrote a post about how some companies use attractive job titles to lure in candidates, even if the title doesn’t accurately reflect the job. At least by 2023, due to the hot labor market, companies have been lowering their expectations for industry-standard job titles. This trend is known as «title inflation» and it stems from the rapid growth of the global IT industry over the past 20 years, where companies have been using fancy job titles to attract people seeking career advancement.

My previous post focused on job titles for managers and how they correspond to industry standards. Now, I will share my thoughts on job titles for individual contributors (ICs).

The inflation of engineers’ job titles has happened not only due to the reasons mentioned earlier, but also because of the shift from local software to internet and distributed systems. This shift has created a new generation of engineers who are capable of creating complex, stable, and performant systems with less experience than the previous generation. In the past, a Senior engineer role required 10+ years of experience, but nowadays this requirement sounds ridiculous. Senior engineers usually have 5 to 10 years of experience, while 10+ years usually means someone with a staff or principal title for ICs.

To summarize, I will now outline the criteria I use to define the expectations for engineers who hold an industry-standard IC title:

  • An Intern / Software Engineer I is a recent graduate (or a last-years student) with no commercial experience. They require training and deep supervision, as they are still in the learning phase of their career. While they can produce some code independently, it may not meet production-quality standards. They have basic computer science knowledge and are proficient in at least one programming language, although their experience with it may be limited to non-commercial projects.
  • A Junior / Software Engineer I typically has between 3 months to 2 years of experience and requires supervision, mentoring, and guidance. They are capable of completing small, well-defined problems independently and producing production-quality code. However, they are still in the early stages of their career and are expected to grow rapidly by improving their technical knowledge through code reviews, reading, observing, and hands-on experience.
  • A Middle / Software Engineer II typically has 2 to 5 years of experience and is a solid independent contributor who produces high-quality code. They are capable of owning and completing short-term projects (epics) autonomously. While they still require some guidance and mentoring, they are able to mentor interns themselves. They are skilled communicators and proactive collaborators who continue to grow and develop their skills.
  • A Senior Software Engineer (III) typically has 5 to 10 years of experience and is an experienced and independent technical contributor who also serves as a leader. They have the ability to organize and implement complex, loosely defined projects and are experts in their domain and tooling. They efficiently handle uncertainty and can understand and adopt unfamiliar codebases quickly. They are responsible for owning and driving application and long-term project scopes, methodically estimating timelines and budgets, cutting scope as needed, removing or working around roadblocks, and being accountable end-to-end for projects. They are strong, clear communicators who move their team forward through collaboration. They actively mentor engineers of lower levels to help them grow and develop their skills.
  • A Lead Software Engineer IV typically has 8 or more years of experience and is an experienced engineer whose technical expertise benefits the entire team. They are proficient beyond their own domain and can handle cross-team collaboration and solve wider technical issues. They are responsible for driving their team and ensuring they are working on the right things while reliably delivering results. They also manage stakeholders’ expectations. Independently, they scope and implement solutions to extremely complex problems and projects. They contribute to hiring and performance management and are proactive in mentoring all engineers of lower levels, actively sharing knowledge beyond their team. They have ownership over team/domain/roadmap/solution architecture scopes.
  • Software Engineers at the level of «Staff» or above typically have 10 or more years of experience and are proven and respected cross-team technical leaders and solution architects. They are responsible for delivering complex cross-team initiatives that align with the top-level company goals. They work closely with engineering and product leadership, contributing to culture building, hiring, and performance management. They scope, design, and deliver solutions for large, complex challenges and provide oversight, coaching, and guidance through code and design reviews both on and off the team. They are very strong communicators and have outstanding stakeholder management skills. They have ownership over cross-team/domain/cross-domain/enterprise scope.
]]>
https://valera.ws/2023.03.23~software-engineers-titles/feed/ 0
Engineering Managers’ Titles https://valera.ws/2023.03.23~engineering-managers-titles/ https://valera.ws/2023.03.23~engineering-managers-titles/#respond Thu, 23 Mar 2023 11:10:10 +0000 https://valera.ws/?p=894 Читать далее Engineering Managers’ Titles ]]>

Lots of companies (especially startups) attract candidates with impressive-sounding titles that don’t match the job they offer. For instance, they might advertise for a CTO or VP to lead a team of just 10–15 engineers. They might also want a manager who still spends half their time writing code. It’s limited to management positions. The same happens for individual contributors. For instance, hiring a software engineer with only three years of experience and calling them a senior engineer wouldn’t make sense. There are lots of other examples, too.

Employers can easily manipulate job titles since they don’t cost anything. However, titles generally have some meaning in the industry, based on the job’s function. For instance, senior engineers are expected to complete complicated projects independently. Engineering managers or team lead managers (sometimes called team leads) are responsible for building and leading a team of 6 to 16 engineers. Directors usually lead a handful of teams managing managers, while VPs manage bigger organizations based on lines of business or domain. CTOs manage technology organizations.

An engineer’s ability to solve problems on their own determines their true title. For managers, the number of people they lead is the main indicator (with a few exceptions, but usually this is the case).

Let me clarify: I’m not saying that the number of direct reports is the most crucial factor. However, in practice, it often determines the scope of the manager’s responsibilities. Managing a team of 8, 25, 50, or 150 people requires completely different skills and experience. The expectations from the managers are different. And the challenges managers face are different as well.

I’ll share my thoughts about individual contributors’ titles in later posts, but for managers, here’s the title mapping that I prefer:

  • It is a Team Lead or Staff Engineer position if a significant hands-on coding contribution is expected and/or required (30%+).
  • It is an Engineering Manager or Team Lead position to manage less than 20 people (1 or 2 teams).
  • It is an Engineering Director position to manage from 20 to 50 engineers (3–6 teams).
  • It is a VP of Engineering position to manage 50+ engineers (6+ teams), but not the whole technology organization.
  • It is a CTO position to manage the whole technology organization. In this case, the number of reports is not as important as the scope of responsibilities. At the same time, real CTO-level *people-management* work starts at the scale of approximately 100+ reports.

In bigger companies, Directors, VPs, and CTOs can manage more people. The figures I provided are what I believe are enablers of the level’s real challenges.
That’s my view. Do you agree? Let me know in the comments.

]]>
https://valera.ws/2023.03.23~engineering-managers-titles/feed/ 0
Super-set of Books for Managers and Leaders https://valera.ws/2022.10.15~super-set-of-books-for-managers-and-leaders/ https://valera.ws/2022.10.15~super-set-of-books-for-managers-and-leaders/#respond Sat, 15 Oct 2022 09:51:53 +0000 https://valera.ws/?p=884 Читать далее Super-set of Books for Managers and Leaders ]]>

Today I want to share the super-set of books that helped me to learn the principles modern and successful software engineering companies relied on to grow and prosper.

I sincerely recommend the books for leaders who aim to build effective product teams, create outstanding software products and grow their own professional level in leadership and management.

Even if you can’t apply all of the principles at your current workplace, the knowledge can serve as a North Start in your personal development and help to become more efficient in any environment.


EMPOWERED: Ordinary People, Extraordinary Products (Silicon Valley Product Group) — learn about the main difference between the best and the rest.

The Manager’s Path: A Guide for Tech Leaders Navigating Growth and Change — a comprehensive guide on the manager’s path from the first steps to the top level.

Team Topologies: Organizing Business and Technology Teams for Fast Flow — the basics of building teams composition in a software engineering company.

Who: The A Method for Hiring — tips and tricks to hire the best

Software Engineering at Google: Lessons Learned from Programming Over Time — what is software engineering and how to build Google from a technological perspective.

Working Backwards: Insights, Stories, and Secrets from Inside Amazon — Amazon’s tips and tricks to build an efficient environment in a modern software engineering organization.

No Rules Rules: Netflix and the Culture of Reinvention — learn the insights of Netflix’s success in building and running its technology team.

I wish you a good reading :-) Don’t hesitate to share the best books you can recommend to improve leadership and tech management skills in the comments.

* The links are referral

]]>
https://valera.ws/2022.10.15~super-set-of-books-for-managers-and-leaders/feed/ 0
Фотография в CV https://valera.ws/2020.11.20~photo-in-cv/ https://valera.ws/2020.11.20~photo-in-cv/#respond Fri, 20 Nov 2020 07:11:59 +0000 https://valera.ws/?p=857 Пару слов о том, почему фотка в CV важна и как она работает. Последнее дело – это отбирать сотрудников по фотке (ну кроме областей, где именно внешность имеет первичное знание, типа модельного бизнеса). Многие считают, что фото – это аттрибут, не имеющий отношения к работе, и он не должен находиться в CV наравне с указанием рассы, возраста/даты рождения, семейного статуса и т.д. Я с этим не согласен.

Безусловно, фото не является обязательным атрибутом CV. Но оно играет важную роль в передаче невербальной информации о кандидате. Кроме фото, такую информацию передает стиль оформления CV, стиль текста, даже название файла CV :-) Это все влияет на эмоциональную оценку CV, а следовательно и самого кандидата.

Все эти казалось бы мелочи сразу заметны глазу, который просматривает десятки CV в день. Фото многое рассказывает о кандидате в связке с остальными аспектами.

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

Точно так же кандидат выбирает свое фото. Как правило у человека свои фото, которые ему нравятся или, наоборот, не нравятся. В свою очередь каждая картинка несет некое эмоциональные наполение. Т.е. выбирая фото кандидат осознанно или неосознанно рассказывает что-то о себе. Какая поза на фото – сильная и уверенная в себе или слабая, фото обработанное в фотошопе или отсканированное из паспорта, антиураж на фото про отдых и развлечения или про работу, какие эмоции на лице – дружелюбность или высокомерие, и т.д.

Еще раз, никакой рекрутер или нанимающий менеджер в здравом уме не будет отсеивать по фото (кроме очень редких случаев, когда на фото беспредел). Оно хорошо дополняет общую картину и дает больше информации о кандиате. А самое интересное в том, что кандидат может использовать фото для того, чтобы представить себя в том или ином свете осознанно. Например, хотите показать свою серьезность и деловитость – сделайте стильное фото в костюме с галстуком. Хотите показать свободу ума и вольный характер – майка и в горах. Хотите отметить свое CV позитивными эмоциями – сделайте прикольное фото, заставляющее улыбаться. Хотите показать свою целеустремленность – покажите на фото свои достижения (например, кубки или дипломы).

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

]]>
https://valera.ws/2020.11.20~photo-in-cv/feed/ 0
Законы победителей https://valera.ws/2020.04.12~winners-laws/ https://valera.ws/2020.04.12~winners-laws/#respond Sun, 12 Apr 2020 09:27:26 +0000 https://valera.ws/?p=833 Около трех лет назад, читая замечательную книгу «Законы победителей» Бодо Шефера‎, я сделал для себя конспект 30 законов, предложенных в книге. Это прекрасная книга. В ней очень четко и структурно подаются 30 основных принципов, опираясь на которые точно получится достичь в жизни больших высот. У книги высокий КПД (отношение полезной информации к воде), она отлично структурирована и очень практична. Тема раскрыта полностью.

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

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

Итак, конспект книги Бодо Шефера «Законы победителей».

Внимание! Этот конспект не имеет смысла без прочтения самой книги. Электронная версия стоит меньше 5 долларов. Вы не пожалеете!

1. Прими решение

  • Только осознанные и целенаправленные изменения могут привести к желаемой цели.
  • Боязнь неизвестности ведет к откладыванию решений, что препятствует росту.
  • Любое принятое решение – движение вперед, непринятое решение – застой.
  • Любой выбор связан с риском и потерями. Фокусироваться нужно на приобретениях.

2. Постоянно учись и расти

  • Рост заложен генетически. Это основная потребность человека.
  • Остановки быть не может: если не вверх, то вниз.
  • Постоянное принятие решений, связанное с изменением условий за счет роста.
  • Все в жизни накапливается – как хорошее, так и плохое. Постепенно и незаметно.
  • Долгосрочные тренды формируются ежедневно, день за днем.

3. Осознанно проживай каждый день

  • Жизнь – это конечный набор отдельных дней.
  • Завтра – это никогда, вчера – это уже не важно.
  • Планирование важных вещей, а не мелочей.
  • Время остановиться и подумать.
  • Каждый день – это шанс.
  • Благодарность за каждый день.

4. Сфокусируйся на деятельности, которая приносит доход

  • Избавься от пустого, ненужного, лишнего.
  • 20% усилий формируют 80% результата. Делай больше 20%-й деятельности.
  • Победители отличаются не тем, что они хорошо решают исключительно сложные задачи, а тем, что они исключительно хорошо делают простые вещи. Но самое главное, что они их все-таки делают.
  • Неудача как часть системы: полоска черная, полоска белая – обязательно будет и то, и другое; закон больших чисел – вероятность успеха поддается контролю на большом числе повторений.
  • Неудача “из-за себя” – часть обучения. На ошибках нужно учиться и не повторять одни и те же ошибки.

5. Стань личностью

  • Для того чтобы наши обстоятельства изменились к лучшему, мы должны сначала измениться сами.
  • Личностью можно стать только в процессе труда.
  • Уроки сеятеля: не каждое семя прорастает; необходимо сосредоточиться на себе, а не на врагах; не посеяв, не соберешь урожай; тебе потребуется терпение; что посеял, то и пожнешь.
  • Препятствия на пути к успеху: самомнение, невежество, тщеславие, страх, сомнения, чувство вины.
  • Хорошая работа и правильное отношение.
  • Не тратить энергию на изменение того, что изменить невозможно.

6. Возьми и сделай (Just Do It)

  • Самый большой талант победителей заключается в том, что они способны находить мотивацию для собственных действий.
  • “Синдром водопада”: прыгают в реку жизни, плывут по течению, “просыпаются”, обнаружив, что до водопада осталось всего-ничего, но падения уже не избежать.
  • Самый лучший момент, чтобы начать действовать – сейчас.
  • Лучше действовать, совершая ошибки, чем медлить, стремясь к безошибочности.
  • Самый лучший способ подготовиться к работе – начинать работать.
  • Бежать к цели можно только тогда, когда цель есть, и она понятна и нужна.

7. Отношение к стрессу

  • Стресс – это нормально. Важно уметь его контролировать.
  • Если научиться контролировать свои мысли, стресс станет нестрашен.
  • Мыслить сегодняшним днем, а не переживать о прошлом и будущем.
  • Фокусировать на одном деле, которое делается сейчас.
  • Физическое ощущение стресса – плечи и зубы.
  • 24 правила контроля над стрессом.
  • Время на ничего-не-деланье.

8. Учись преодолевать трудности

  • Никогда, никогда, никогда не сдавайся.
  • Трудности необходимы человеку, чтобы стать сильнее.
  • Трудности становятся сильнее с подъемом на каждую ступеньку.
  • Как только я решу какую-то проблему, сразу же возьмусь за новую, более сложную.
  • В начале каждой новой деятельности легкие вещи кажутся трудными, но затем трудные вещи становятся легкими.

9. Не изобретай колесо заново

  • В полный стакан налить невозможно.
  • Разумно строить свой успех на базе чужого опыта.
  • Повторение правильных вещей приводит к мастерству.
  • Ребенок познает, подросток отрицает, а зрелый человек открыт новому.
  • Делегировать работу экспертам правильно и выгодно, оно окупается. Свое время нужно использовать на то, на чем фокус.
  • Лучшая учеба – это подражание.

10. Создай импульс движения

  • Поезд, пробивающий стену, и локомотив, застопоренный тормозным башмаком.
  • Пробовать что-то невозможно, можно только делать. Тогда есть шанс сделать.
  • Работа, ориентированная только на успех, тормозит развитие импульса движения.
  • Когда появляется движение, находятся пути и средства, не видимые ранее.
  • Не жди идеальной стратегии, подбирай ее перебором.
  • Импульс может быть не в ту сторону.
  • Импульс начинается с дисциплины.
  • Фазы выработки дисциплины: 3–6 недель, 3–6 месяцев, 6–12 месяцев.
  • Когда ты в движении, не прекращай его поддерживать.

11. Мечтай и претворяй мечты в жизнь

  • Мечтать нужно всегда. Никогда не поздно что-то менять.
  • Катастрофа – новый старт.
  • Мечты реализуются. Чем больше мечтаешь, тем сильнее становишься.

12. Позаботьтесь о своем здоровье

  • Скаковая лошадь на 1 млн долларов.
  • Здоровье – это не только отсутствие болезней.
  • Избегай крайностей.
  • Ешь медленнее, меньше и спокойнее.
  • Ешь натуральные продукты.
  • Больше пей воды.
  • Больше двигайся.
  • Регулярно отдыхай.
  • Долгосрочная стратегия важнее сиюминутных удовольствий.

13. Не бойся критики

  • Три группы: критическая, нейтральная и положительная.
  • Три фазы: насмешки, критика и признание.
  • Фильтруй конструктив.
  • В любом случае, целеустремленность и твердость в достижении цели часто может перевесить.
  • Важна не сама критика и насмешки, а наше к ним отношение.
  • Мы сами решаем, на чем сконцентрировать внимание.

14. Выполняй работу на 110%

  • Дополнительный шаг свыше “меры” – основа роста.
  • Возможность роста таиться в “дополнительной” попытке, когда сил уже не осталось.
  • Не все работают на 100% потому что им не интересно.
  • Работать на 100% тоже мало – не будет роста.
  • “Если бы да кабы” – это отговорки, которые вообще не приводят ни к какому результату.

15. Используй проблемы как стимул для роста

  • Реальная проблема – это не возникшая сложная ситуация, а твое отношение к ней.
  • Превращай отрицательные эмоции в положительную энергию.
  • Победители никогда не считают проблему неразрешимой.
  • Победители не допускают, чтобы проблема затрагивала другие жизненные сферы.
  • Победители не считают причиной возникновения проблемы свои личные качества.
  • Отношение к проблемам:
    1. Проблема состоит в том, как ты к ней относишься. Решение проблемы превращает ее в задачу.
    2. В любой задаче хранится ответ на нее.
    3. При решении проблемы выходи из зоны комфорта – только так можно сделать что-то значимое.
    4. Чтобы разбогатеть нужно преодолеть большой перечень проблем.
    5. Не стремись иметь дело только с простыми проблемами, развивай способности справляться со сложными.
    6. С успехом справится любой, но лишь немногие умеют справляться с неудачами.
    7. Благодаря проблемам в нас рождаются самые лучшие качества.
    8. Нет проблем и неудач, за которыми не следовала бы награда.
    9. Часто не хватает способностей увидеть всю картину целиком.
  • 3 вида проблем: контролируемые непосредственно (в твоей власти), контролируемые косвенно (требуют расширения сферы влияния), неконтролируемые (контроль своих чувств и реакций).
  • 6 шагов решения проблемы:
    1. Что полезного в этой проблеме?
    2. Какие недостатки в моей жизни способствовали возникновению проблемы.
    3. Что я готов сделать, чтобы потом не попадать в такое положение?
    4. Какие варианты решения существуют? Обратись к компетентным людям.
    5. Какое решение самое лучшее?
    6. Каким образом решение проблемы может доставить мне удовольствие?
  • Жизнь нас не наказывает, а воспитывает. Проблемы повторяются пока на них не научатся.
  • Зачастую нам просто не хочется делать то, что мы обязаны сделать, чтобы стать теми людьми, какими хотели бы стать.
  • Если проблема решена, нужно отправляться на поиски новой, более сложной.

16. Будь сам себе начальником и подчиненным

  • Успех и неудача напрямую связаны с нашими привычками.
  • Новоиспеченные предприниматели часто терпят неудачу из-за привычки работать под контролем.
  • Решающее различие иногда кажется несущественным. Главное сейчас та работа, которой ты занимаешься в данный момент (фокус).
  • Как может считать себя свободным тот, кто не в состоянии сделать даже то, что он сам себе запланировал?
  • Тому, кто хочет разбогатеть, стоит выполнять не задания исключительной сложности, а просто исключительно хорошо выполнять обычные дела.
  • Даже предприниматели должны выполнять любую работу так, словно их контролирует начальник.
  • В тот момент, когда ставишь перед собой задачу, ты должен быть уверен, что ее выполнишь.
  • Будь честен перед собой.
  • Веди письменный учет целей, задач и достигнутых результатов.

17. Ставь перед собой высокие цели

  • Став старше, мы будем сожалеть только о том, чего не сделали.
  • Смутные желания – это еще не цели.
  • Преимущества целей: они дают ориентир, делают продвижение вперед осмысленным, дают мотивацию и стимул.
  • Истинное значение великой цели заключается в нашем развитии в процессе ее достижения.
  • Большинство людей склонны преувеличивать те результаты, которых они достигнут через год, и недооценивать те, которых они смогут добиться через 10 лет.
  • Реализованные цели обогащают нашу жизнь, но самое главное – они меняют нас самих.
  • Краткосрочные цели должны быть достижимы и реальны, долгосрочные – труднодостижимые и великие.
  • Три категории целей: A – обязально реализовать, B – они планируются, но не являются абсолютно обязательными, C – необязательные.

18. Дай людям то, в чем они нуждаются

  • Ты добьешься большего, если будешь относиться к людям с пониманием, добротой, симпатией и спокойствием, приветливо и заинтересованно.
  • Давать человеку нужно то, что важно для него самого. То, что важно для тебя, ему может оказаться ненужным.
  • 24 правила:
    1. Поддерживай и одобряй людей при каждой возможности.
    2. Давай человеку возможность всегда сохранить свое лицо.
    3. “За спиной” говори о человеке только хорошее.
    4. Наблюдай за людьми, чтобы видеть, что за можно обоснованно похвалить.
    5. Всегда апеллируй к благородным чувствам и мотивам людей.
    6. Как можно реже критикуй людей (допустима только конструктивная критика поступков).
    7. Дай человеку почувствовать собственную значимость.
    8. Совершил ошибку – извинись.
    9. Предлагай вместо того чтобы отдавать приказы.
    10. С пониманием относись к тому, что окружающие могут быть порой раздражены.
    11. Говори как можно меньше, больше слушай.
    12. Заставь человека поверить, что идея принадлежит ему.
    13. Не перебивай говорящих, даже если кажется, что они неправы.
    14. Ставь себя на место другого человека и оценивай все с его позиции.
    15. Не следует стремиться доказывать свою правоту.
    16. Чаще делай приятные подарки.
    17. Если тебе возражают, сдержи эмоции, постарайся найти общее во мнениях, будь самокритичен, пообещай собеседнику подумать над тем, что он сказал.
    18. Проявляй искренний интерес к людям и демонстрируй готовность помочь.
    19. Улыбайся больше.
    20. Обращайся к человеку по имени.
    21. Учись смотреть на мир глазами другого человека.
    22. Постарайся, чтобы после беседы с тобой у человека улучшилось настроение.
    23. Умей прощать, не будь злопамятным.
    24. Не скупись на комплименты окружающим.
  • Окружающий мир таков, каковы мы сами – в человеке мы видим то, что думаем о нем в глубине души.
  • “Перемывая” косточки окружающим, ты сосредотачиваешься на их слабостях. В результате весь мир оказывается полон ошибок и несправедливостей.
  • Отношения могут стать прочными только в том случае, если обе стороны настроены давать другому то, что ему нужно.

19. Не позволяй себе отвлекаться от работы

  • Чтобы добиться подлинного успеха, необходимо сконцентрировать всю энергию и силы на одном деле.
  • Чем многословнее оправдание, тем сильнее сочувствие к себе.
  • Часто мы используем отвлекающие факторы в качестве оправдания собственных неудач и недостаточных усилий.
  • Смысл отговорок заключается в том, чтобы отвлечь внимание от себя и привлечь его к кому-либо или чему-либо другому.
  • Случайные обстоятельства, которые можно предвидеть, необходимо “обрабатывать” заранее.
  • Для тех обстоятельств, которые не предвидятся, можно выделять в рабочем графике специальное время.
  • Иногда приходится и “тушить пожары”. Главное, чтобы это не стало регулярностью.
  • Отвлекающее обстоятельство иногда помогает сделать перерыв и взглянуть на проблему по-новому.
  • Вопросы, направленные на идентификацию проблем с чрезмерным временем, уделяемым случайным обстоятельствам:
    • Оптимально ли я использую свое время?
    • Занимаюсь ли я долгосрочными целями или решаю только сиюминутные проблемы?
    • Можно ли более эффективно использовать свое время в плане достижения жизненных целей.

20. Будь примером

  • Наши слова будут иметь больший вес, если мы подкрепляем их собственным опытом.
  • Ловушки, когда слова расходятся с делом:
    • Руководство, не подкрепленное продуктивной деятельностью
      • Продуктивная фаза
      • Фаза управления
      • Фаза надсмотрщика
      • Фаза надсмотрщика над надсмотрщиками
  • Многие полагают, что им значимость придает занимаемая должность. На самом деле вес твоим словам предают только действия.
  • “Вот я в свое время…”
  • Если мы хотим, чтобы нас воспринимали всерьез, необходимо иногда возвращаться к продуктивной деятельности и добиваться результатов.
  • “Вы еще увидите, кем я стану…”
  • Отсутствие личного примера

Если ты хочешь стимулировать людей упорно трудиться, должен сам показывать в этом пример.

  • Удиви окружающих своей производительностью.
  • Правило трех дней: каждые 3 дня нам требуется очередной успех (любой положительный результат, поддающийся измерению).
  • Не обольщайся успехами: это может быть результат предыдущих трудов.
  • Труды в период застоя могут дать о себе знать лишь в следующей фазе подъема.

21. Начинай все важные дела как можно скорее

  • Чем большее влияние на нашу жизнь оказывает срочность, тем меньше времени остается важности.
  • Победители важные дела делают срочными.
  • Большие камни в банку нужно класть первыми.
  • Правило 72-х часов: для выполнения своего плана ты должен в течение 72-х часов предпринять какое-то первое действие к его достижению.
  • Не нужно путать срочность и спешку.
  • Неприятные дела лучше делать сразу (“съедать лягушку”).
  • Перфекционизм часто мешает достигать результата.

22. Бери на себя ответственность

  • Дело не в обстоятельствах, а в том, как ты ими пользуешься.
  • “Мы привыкли во всех своих бедах обвинять обстоятельства. Я не верю ни в какие обстоятельства. Тот, кто хочет добиться в этой жизни успеха, идет и находит себе обстоятельства, которые ему нужны. А если не может найти, то создает их сам”.
  • Тот, кто снимает с себя ответственность, попадает в плен. Тот, кто берет ее на себя, обретает свободу.
  • Самая последняя из оставшихся человеку свобод заключается в том, чтобы самостоятельно избирать свое отношение к любой сложившейся ситуации.
  • Каждый новый день дает тебе возможность изменить все, что лишает твою жизнь счастья.
  • Ответственность за карьерный рост: все зависит от того, как ты сам распорядился своими возможностями.
  • Ответственность за отношения с окружающими: твоя реакция на других лежит в твоей власти:
    • Зачастую мы сами являемся причиной негативного отношения к нам. Если это признать, то исправить поведение будет в твоих силах.
    • За агрессивным поведением другого человека чаще всего скрывается страх. Возможно он просто боится твоего превосходства.
    • Значительно проще изменить свои критерии оценки людей, чем их самих. Возможно ты слишком высоко поднял планку.
  • Только от тебя зависит, претворятся ли в жизнь, твои мечты. Но если слишком долго не проявлять волю и решимость, силы становятся слабее и исчезают.
  • Победители знают, что отрицательные эмоции теряют власть над человеком в тот момент, когда он берет на себя ответственность.

23. Учись справляться со своими страхами

  • Смелый не тот, кто ничего не боится, а тот, кто не смотря на страх, идет вперед.
  • Страх можно победить, оглянувшись назад и оценив то, что уже достигнуто.
  • Великие цели затмевают страх.
  • Страх может одолеть нас только в том случае, если мы потеряли из виду цель.
  • 10 советов:
    1. Что стало с моими прошлыми страхами? Не более 5% стали действительностью.
    2. До сих пор было все в порядке, я справлюсь и с новой задачей.
    3. То, чего я боюсь, может произойти, а может и не произойти. К сегодняшнему дню это не имеет никакого отношения.
    4. Жизнь состоит из последовательности отдельных дней. Один день закончился хорошо, закончится и второй.
    5. Если страх слишком силен, поговори о нем с победителем. Спроси его совета.
    6. Страх давит сильнее всего тогда, когда сидишь без дела.
    7. Не думай о том, справишься ли ты с заданием. Думай о том, каким образом ты с ним справишься.
    8. Фантазируй позитивно о предстоящих событиях.
    9. Слушай музыку, которая нравится. Это прогоняет страх.
    10. Вспомни, сколько всего уже сделано и что тревожиться не о чем.
  • Если я не испытываю страха перед тем, как сделать новый шаг, это признак того, что намеченный шаг для меня слишком мал.
  • Победители не прячутся от катастроф:
    1. глупо тратить время и энергию на страдания о том, что еще не произошло;
    2. победители знают, что им хватит сил и мудрости пережить черный период;
    3. катастрофа – возможность начать сначала.
  • Позитивное мировоззрение и смысл жизни необходимы для движения вперед к успеху.

24. Сосредоточься на своих сильных сторонах

  • Главное внимание следует концентрировать на тех вещах, которые мы можем сделать, имеем, понимаем. К сожалению, люди часто обращают больше внимания на то, чего они не могут, не имеют, не понимают.
  • Мы имеем только те таланты, что у нас есть, и глупо мечтать о том, что могло бы быть.
  • Думаешь, если бы у тебя было больше денег, лучше здоровье, любящая жена, то жизнь стала бы лучше? Нет, у тебя просто появились бы совсем другие проблемы.
  • Намного важнее то, как мы распоряжаемся тем, что имеем.
  • Трудолюбие важнее способностей. Любые выдающиеся достижения – это в первую очередь результат упорного труда.
  • Самый лучший розовый куст не тот,  у которого меньше шипов, а тот, на котором растут самый красивые цветы.
  • Ты останешься посредственностью до тех пор, пока не разовьешь в себе сильные стороны личности.
  • Рассматривай свои слабые стороны как шанс для того, чтобы избрать для себя новый путь и скооперироваться с людьми, которые сильны в этой области.
  • Не сравнивай себя с другими. Всегда можно отыскать людей сильнее тебя в той или иной области. В этом случае ты можешь потерять уверенность в себе и решимость.
  • Оценивать себя можно только по собственным критериям. Надо сравнивать себя с тем человеком, которым ты можешь и хочешь стать.
  • Не стоит желать чтобы у тебя появились достоинства другого человека, лучше развивать свои сильные стороны.
  • Общаться, находясь на разный уровнях, можно только по одному из двух путей: или слабому подняться выше, или сильному – опуститься. Зависть слабого тянет сильного вниз, лишая себя возможности стать лучше.
  • Ревность в результате всегда приводит к тому, с чем ревнующий отчаянно борется – она отталкивает людей друг от друга.
  • Любовь дарит чувство свободы, а ревность пытается привязать, сковать и удушить.
  • Если завистник желает разорения богатому, то ревнивец разрушает и свое счастье, и счастье того человека, которого он, как ему кажется, любит.

25. Умей давать и прощать

  • Основной жизненный принцип заключается в словах “брать и отдавать”.
  • Чем больше мы отдаем, тем больше получаем. Чем интенсивнее взаимный обмен между людьми, тем лучше и прочнее их взаимоотношения.
  • Желай всегда самого лучшего каждому человеку, который встретиться на твоем пути. Ты сам убедишься, что твоя положительная энергия может изменить окружающий мир к лучшему.
  • Прекрасный обычай – делать подарки.
  • Прощение – это высшая форма умения отдавать и делиться.
  • Прощай себе: нельзя допускать, чтобы ошибки прошлого влияли на сегодняшнюю жизнь.
  • Прощай родителям: только простив своих родителей, мы можем окончательно считать себя взрослыми людьми.
  • Пожизненная обида – это слишком страшная цена за то, что мы уже не в состоянии изменить.
  • Прощай своим супругам (и как можно скорее): любовь не может существовать, пока сохраняется обида.
  • Прощай всем остальным людям: нет ничего глупее, чем сердиться на человека, которому ты безразличен.

26. Умело обращайся с деньгами

  • Люди часто выдумывают хитроумные стратегии вместо того, чтобы вспомнить старые добрые истины.
  • Дивиденды приносит только капитал.
  • Чтобы накопить капитал, нужно экономить. Экономия может доставлять удовольствие.
  • Откладывай деньги с каждого повышения зарплаты.
  • Частным предпринимателям нужно особенно внимательно следить за использованием финансов.
  • Лучше всего создать систему распределения зарплаты на капитал, развлечения и основные траты, это повышает дисциплину и избавляет от постоянных страданий на тему “а может?…”.
  • Сначала капитал нужно накопить, затем вложить под хороший процент (~12% годовый) на длительную перспективу. Это и будет курица, несущая золотые яйца.
  • Деньги не важны сами по себе. Это лишь инструмент получения более высокого уровня в основных жизненных сферах.
  • Очень важно, обладая достаточными материальными богатствами, начинать делиться ими с другими.

27. Терпеливо закладывай фундамент своего развития

  • Каждая смена работы предполагает прохождение через “период адаптации”, когда изначальные радужные ожидания несколько прибиваются о раскрывшуюся реальность. Не стоит опускать руки в этот момент.
  • Чем большего успеха ты ожидаешь, тем прочнее должен быть фундамент.
  • Победители делают ставку на великие победы, а не на мелкие достижения.
  • Терпение помогает преодолеть период адаптации.
  • Не забывай, что ты работаешь не ради работы, а ради того, чтобы расти и развиваться.
  • Если тебя ввели в заблуждение, возможно ты сам того и хотел? (Касательно выбора новой работы.) Но и это не беда, главное пережить период адаптации и разобраться во всем. 

28. Окружи себя положительными примерами

  • В жизни человек непрерывно обучается, запоминая и копируя поведение окружающих его людей.
  • Заимствование у окружающих – самая эффективная методика обучения.
  • Пока ты не контактируешь с людьми, ты остаешься прежним. Но каждая встреча с другим человеком оставляет на тебе свой отпечаток.
  • Если ты хочешь добиться чего-то нового, то должен научиться по-новому мыслить и чувствовать.
  • Чтобы перенять мысли другого человека, нужно говорить также как он.
  • Так как автоматически мы воспринимаем все подряд, иногда нужно остановиться, осмотреться и разобраться, то ли получается, что требуется. Если нет, нужно что-то менять.
  • Выбор группы общения (кроме близких и важных людей) полностью во власти каждого. Ты можешь сознательно принять решение, кто и как будет влиять на тебя, и на кого и как будешь влиять ты.
  • Помогая другим, осторожно: тот, кто не спрашивает у вас совета, чаще всего не испытывает в этом необходимости.
  • Ища помощь для себя, осторожно: не стоит спрашивать совета у тех, которые не добились бОльших успехов, чем ты: чаще всего в ответ ты услышишь вместо советов жалобы на собственную тяжелую ситуацию.
  • Если окружить себя преуспевающими людьми, то добиться успеха будет значительно легче.
  • Находясь в обществе более слабых, они постоянно будут тянуть тебя вниз. Не давай этому случаться – не позволяй связывать себе руки.

29. Преврати недовольство собой в стимул для роста

  • Всем людям, добившимся больших успехов, присуща одна черта: все они хоть в чем-то были недовольны своей жизнью.
  • Многие путают понятия удовлетворенности и благодарности. Нужно быть постоянно благодарным за то, что есть уже (и в этом заключается счастье), но никогда не быть удовлетворенным тем, что есть уже (и в этом заключается мотивация к росту).
  • Ни в коем случае нельзя поддаваться соблазну самодовольства.
  • Удовлетворенность порождает лень и безразличие. Если твои успехи не растут, то они уменьшаются. Состояния покоя не бывает.
  • Неудовлетворенность приносит самые большие награды.
  • Обращайся за помощью к неудовлетворенным людям.

30. Будь орлом, а не уткой

  • Отличительный признак утки – они постоянно крякают. Когда хорошо или плохо, нравится или не нравится, по утрам или вечерам – вне зависимости от обстоятельств.
  • В работе утки видят проблемы и препятствия, не стараясь искать возможности и преимущества.
  • Орлы действуют, а утки крякают. Их кряканье состоит из отговорок, извинений, бессмысленного бормотания, насмешек и нытья.
  • У утки можно научиться быть уткой, у орла – стать орлом.

Внимание! Этот конспект не имеет смысла без прочтения самой книги. Электронная версия стоит меньше 5 долларов. Вы не пожалеете!

]]>
https://valera.ws/2020.04.12~winners-laws/feed/ 0
Мифы рекрутинга с точки зрения кандидата https://valera.ws/2020.02.21~%d0%bc%d0%b8%d1%84%d1%8b-%d1%80%d0%b5%d0%ba%d1%80%d1%83%d1%82%d0%b8%d0%bd%d0%b3%d0%b0/ https://valera.ws/2020.02.21~%d0%bc%d0%b8%d1%84%d1%8b-%d1%80%d0%b5%d0%ba%d1%80%d1%83%d1%82%d0%b8%d0%bd%d0%b3%d0%b0/#respond Fri, 21 Feb 2020 20:46:27 +0000 https://valera.ws/?p=815 Мои мысли на тему постоянно всплывающих со стороны соискателей мифов о том, как рекрутерам и менеджерам (hiring managers) стоит вести процесс найма.

]]>
https://valera.ws/2020.02.21~%d0%bc%d0%b8%d1%84%d1%8b-%d1%80%d0%b5%d0%ba%d1%80%d1%83%d1%82%d0%b8%d0%bd%d0%b3%d0%b0/feed/ 0
Возрождение блога https://valera.ws/2020.02.21~%d0%b2%d0%be%d0%b7%d1%80%d0%be%d0%b6%d0%b4%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b1%d0%bb%d0%be%d0%b3%d0%b0/ https://valera.ws/2020.02.21~%d0%b2%d0%be%d0%b7%d1%80%d0%be%d0%b6%d0%b4%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b1%d0%bb%d0%be%d0%b3%d0%b0/#respond Fri, 21 Feb 2020 20:38:07 +0000 https://valera.ws/?p=812 Решил я вернуться к ведению своего блога и привести его в порядок. Подробнее об этом я написал на страничке Об этом блоге. Stay tuned.

]]>
https://valera.ws/2020.02.21~%d0%b2%d0%be%d0%b7%d1%80%d0%be%d0%b6%d0%b4%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b1%d0%bb%d0%be%d0%b3%d0%b0/feed/ 0
Nginx: пример конфига для сайта с плюшками https://valera.ws/2013.03.23~nginx-bonus-config-example/ https://valera.ws/2013.03.23~nginx-bonus-config-example/#respond Sat, 23 Mar 2013 08:42:26 +0000 http://valera.ws/?p=702 Читать далее Nginx: пример конфига для сайта с плюшками ]]> nginxПросто готвый пример универсального конфига nginx с использованием php-fpm, и секциями для базовых инструментов (phpMyAdmin, RockMongo) и функционалом для закрытия сайта в режим обслуживания. Сервер одновременно слушает и HTTP, и HTTPS. Все запросы с www перекидываются на адрес «без-www».

Листинг /etc/nginx/sites-available/example.com.conf:

map $http_cookie $isDevHack {
    default "";
    ~DEVELOPER_SECRET_COOKIE=10101 "/non-existed-location";
}

server {
    listen 80;
    listen 443 ssl;
    server_name example.com www.example.com;

    access_log /var/log/nginx/example.com.access_log;
    error_log /var/log/nginx/example.com.error_log;

    root /home/example.com/htdocs/;
    index index.html index.php;
    client_max_body_size 15M;

    location /phpmyadmin/ {
        root /usr/share/;
        index index.php index.html index.htm;
        location ~ ^/mysql-pma/(.+\.php)$ {
            try_files $uri =404;
            root /usr/share/;
            fastcgi_pass unix:/tmp/example.com.pool.socket;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include /etc/nginx/fastcgi_params;
        }
    }

    # Redirect www to no-www
    if ($host = 'www.example.com') {
        rewrite ^/(.*)$ http://example.com/$1 permanent;
    }

    # Only requests to our Host are allowed
    if ($host !~ ^(example.com|www.example.com)$ ) {
        return 444;
    }

    # Locations
    location / {
        if (-f "$isDevHack/home/example.com/maintenance") {
            return 503;
        }
        try_files $uri $uri/ /index.php?$args;
    }

    # RockMongo
    location /rockmongo/ {
        root /home/example.com/;
        try_files $uri $uri/ /index.php?$args;
    }
    location ~ ^/rockmongo/.*\.php {
        root /home/example.com/;
        fastcgi_pass unix:/tmp/example.com.pool.socket;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ \.(php|phtml) {
        fastcgi_pass unix:/tmp/example.com.pool.socket;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # APC status page
    location = /apc-status.php {
        fastcgi_pass unix:/tmp/example.com.pool.socket;
        fastcgi_param SCRIPT_FILENAME /home/example.com/apc.php;
        include fastcgi_params;
    }

    # Memcached status page
    location = /memcached-status.php {
        fastcgi_pass unix:/tmp/example.com.pool.socket;
        fastcgi_param SCRIPT_FILENAME /home/example.com/memcached.php;
        include fastcgi_params;
    }

    location ~ \.(tpl|xml|log)$ {
        deny all;
    }

    # Errors
    error_page 503 @maintenance;
    location @maintenance {
        rewrite ^(.*)$ /maintenance-mode.html break;
    }

    # SSL
    ssl_certificate /etc/nginx/ssl/example.com.chained.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_session_timeout 5m;
    ssl_protocols SSLv2 SSLv3 TLSv1;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
}
]]>
https://valera.ws/2013.03.23~nginx-bonus-config-example/feed/ 0
Рестарт Apache в случае недоступности сайта https://valera.ws/2012.09.29~%d1%80%d0%b5%d1%81%d1%82%d0%b0%d1%80%d1%82-apache-%d0%b2-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b5-%d0%bd%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d1%81%d0%b0%d0%b9%d1%82/ https://valera.ws/2012.09.29~%d1%80%d0%b5%d1%81%d1%82%d0%b0%d1%80%d1%82-apache-%d0%b2-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b5-%d0%bd%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d1%81%d0%b0%d0%b9%d1%82/#respond Sat, 29 Sep 2012 14:43:04 +0000 http://valera.ws/?p=683 Читать далее Рестарт Apache в случае недоступности сайта ]]> Иногда нужны простые но эффективные средства решения насущных задач. Например, у меня сложилась ситуация, когда сайт периодически начинает выдавать ошибку 500, не отмечая ничего в логах. Похоже, падает расширение PHP (подозрения на APC, но не в этмо суть). Рестарт Apache лечит проблему. Так как разбираться в ее истоках сейчас времени нет, я решил применить временное простое, но эффективное решение:

Создается скрипт, запуск которого можно поместить в cron (расписание зависит от ситуации и важности сайта). Код:

 

]]>
https://valera.ws/2012.09.29~%d1%80%d0%b5%d1%81%d1%82%d0%b0%d1%80%d1%82-apache-%d0%b2-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b5-%d0%bd%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d1%81%d0%b0%d0%b9%d1%82/feed/ 0
Бесплатный валидный (подписанный) SSL-сертификат через StartSSL https://valera.ws/2012.03.11~free-valid-signed-ssl-certificate-with-sratssl/ https://valera.ws/2012.03.11~free-valid-signed-ssl-certificate-with-sratssl/#comments Sun, 11 Mar 2012 13:31:25 +0000 http://valera.ws/?p=641 Читать далее Бесплатный валидный (подписанный) SSL-сертификат через StartSSL ]]> Итак, вы хотите получить бесплатный SSL-сертификат для своего сайта (для HTTPS). На сколько я знаю, единственный сервис, который выдает бесплатные валидные годовые сертификаты — это StartSSL. Израильская компания занимается цифровой сертификацией и является официальным Центром сертификации (CA) в PKI.

StartSSL раздает валидные годовые SSL-сертификаты бесплатно. Другие компании берут за это деньги начиная примерно от $20 в год. StartSSL зарабатывает на сертификатах более высоких классов, включая сертификат с расширенной валидацией, а базовый сертификат делает бесплатно. Их идея заключается в том, что они не берут деньги за сервис, в котором не используется труд людей (базовая валидация домена производится автоматически).

1. О системе StartSSL и их сертификатах

Особенность функционирования сайта StartSSL заключается в том, что авторизация в панель управления производится через клиентский S/MIME сертификат. Это большая редкость в наши дни. Отсюда возникает непонимание процесса неподготовленными пользователями и тупняк на этапе освоения сервиса.

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

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

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

Так же следует сразу отметить, что получить сертификат можно только для доменов из фиксированного списка зон. Это домены второго уровня во всех региональных и коммерческих зонах первого уровня, а так же отдельные зоны второго уровня (с доменами третьего уровня).

Кроме того, на домене должна работать почта. На один из ящиков из фиксированного списка (webmaster@домен, postmaster@домен, hostmaster@домен или адреса, указанные в Whois) придет письмо с кодом проверки.

2. Регистрация

Зайдите на сайт StarSSL и начните регистрацию (кликаем Sign-up). При этом нельзя использовать Google Chrome (можно Opera, Firefox, IE).

Страница авторизации StartSSL

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

Страница регистрации StartSSL

2.2. Укажите код подтверждения e-mail-а. Как правило, письмо с кодом приходит сразу или в течение минуты.

Страница ввода кода проверки e-mail-а на StartSSL

2.3. Дождитесь проверки указанных данных персоналом StartSSL. Да, они проверят то, что вы ввели в форме. Вручную. Если их ничего не смутит (а как правило ничего не смущает в реальных данных), вам придет ответ на e-mail, в котором будет указана ссылка на вторую активацию аккаунта (с кодом). Обратите внимание, что ссылка действует только в течение 24 часов.

Они могут задать дополнительные вопросы по e-mail для уточнения регистрационных данных. Отвечать на них имеет смысл, и опять-таки — честно.

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

Страница генерации приватного ключа на StartSSL

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

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

Окно генерации персонального сертификата StartSSL

Окно установки персонального сертификата в Opera

Устанавливаем обязательно.

2.4. На данный момент картина следующая: у вас есть подтвержденная учетная запись StartSSL и персональный сертификат, установленный в браузер, который заменяет для вас одновременно логин и пароль.

Окно об бэкапе сертификата в StartSSL

Этот сертификат необходимо «достать» из браузера и сохранить в надежном месте. В случае потери установленного сертификата (например, переустановка ОС или браузера) вы сможете его вновь импортировать. Кроме того, сертификат нужен для того, чтобы войти в панель с другого компьютера.

Конкретные действия для экспорта сертификата зависят от вашего браузера. Общее лишь то, что вы должны попасть в управление хранилищем сертификатов, найти там свой персональный сертификат StartSSL и экспортировать его в файл. В Opera это делается так:

Экспорт сертификата в Opera

Экспорт сертификата в Opera

Формат экспорта — с секретным ключем PKCS#12. Если такого формата нет и вы не знаете, какой формат экспорта лучше выбрать (при условии, что их несколько), экспортируйте во все :). Если вы экспортируете сертификат без ключа, смысла в этом не будет — он не будет работать.

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

3. Итак, ваша учетная запись подтверждена и у вас есть персональный сертификат для авторизации в панели StartSSL. Теперь самое время зайти в панель. Нажимаем на кнопку с ключами и попадаем на страницу авторизации (смотрите на первом изображении в статье). Нажимаем «Authenticate». Подтверждаем передачу серверу нашего персонального сертификата. Авторизация пройдена — вы в панели.

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

Самое тяжелое позади. Теперь необходимо заказать и получить сертификат для вашего сайта. Он будет выдан на год. Спустя 11 месяцев необходимо зайти на сайт и получить новый сертификат на тот же сайт (то же имя). Как таковой процедуры продления сертификатов нет ни для сайта, ни для персональных сертификатов. Об окончании срока действия сертификатов StartSSL несколько раз раз предупреждает по почте.

Страница Tool Box панели StartSSL

Панель StartSSL состоит из 3-х разделов (вкладки на изображении выше):

  • Tool Box — инструментарий. Большая его часть бесполезна. Можно отметить только разделы для получения корневых и промежуточных сертификатов StartSSL и получения ранее созданных сертификатов.
  • Certificates Wizard — мастер создания нового сертификата. С него начинается заказ нового сертификата для сайта или персонального сертификата. Для создания сертификата должен быть заранее подтвержден домен или адрес e-mail соответственно.
  • Validations Wizard — это как раз и есть мастер проверки сайта и e-mail (а кроме того платных проверок личности и организации). С него нужно начинать получение сертификата для сайта. Каждая проверка действует 30 дней, так что при «продлении» сертификатов проверки необходимо повторять.

Итак, начинаем процесс получения сертификата для сайта.

3.1. Проверка (валидация) домена. Переходим в Validations Wizard, выбираем проверку домена (Domain Name Validation):

Окно мастера проверки StartSSL

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

Страница выбора e-mail-а для проверки домена StartSSL

3.2. После проверки принадлежности домена нужно заказать для него сертификат. Для этого перейдите в Certificates Wizard, выберите Web Server SSL/TSL Certificate. Далее выберите из списка один из предварительно проверенных доменов.

Получение сертификата StartSSL

На следующем шаге есть два варианта:

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

Получение сертификата StartSSL

Первый вариант выбирают те, кто знает, что такое CSR и как его сделать. В любом случае обратите внимание на то, что размер ключа (Keysize) не должен быть менее 2048 бит.

Предположим, что выбран вариант с генерацией ключа. Тогда заполните форму и нажмите «Continue». После некоторой паузы вы получите свой ключ. Сохраните его, он пригодится позже.

Получение приватного ключа StartSSL

На следующем шаге повторно выберите домен. Далее, укажите для него поддомен. Сертификат будет действителен для выбранного домена и указанного сабдомена (например, www).

Указание сабдомена для сертификата StartSSL

На следующем шаге просто подтверждается заказ сертификата. После этого вы получите сам сертификат (PEM-encoded). Сохраните его.

Получение сертификата StartSSL

Процесс получения сертификата на этом завершен. В результате у вас есть 2 файла: приватный ключ и сертификат. Их нужно указать в конфигах вашего веб-сервера. Приватный ключ необходимо предварительно расшифровать командой:

openssl rsa -in ssl.key -out ssl.key

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

]]>
https://valera.ws/2012.03.11~free-valid-signed-ssl-certificate-with-sratssl/feed/ 6
Выдача файла из PHP через nginx (Accel-Redirect) + докачка + некоторые тонкости https://valera.ws/2012.03.06~accel-redirect-apache-dokachka/ https://valera.ws/2012.03.06~accel-redirect-apache-dokachka/#respond Tue, 06 Mar 2012 20:28:27 +0000 http://valera.ws/?p=644 Читать далее Выдача файла из PHP через nginx (Accel-Redirect) + докачка + некоторые тонкости ]]> Как контролировать скачивание больших файлов, проверяя права доступа или считая количество закачек? Как сделать, чтобы при проксировании на Apache работала докачка? Как вообще работает докачка, почему она не работает с nginx в IE 9 и как она работает в других браузерах?

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

Это реализуется очень просто через заголовок Accel-Redirect. nginx получает запрос, передает его скрипту, скрипт в заголовки ответа выдает Accel-Redirect с ссылкой на файл, который нужно выдать пользователю. Если файл выдавать нельзя (например, нет прав), скрипт просто выдаст ошибку (например, 403).

В данном случае не важно, работает ваш PHP через проксирование из nginx на Apache, либо на *CGI. Предположим, что вы хотите отдавать на скачку файлы, которые находятся в каталоге /var/files. Тогда в секции server в nginx добавьте:

location /_download_files {
        root /var/files;
        internal;
}

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

header("X-Accel-Redirect: /_download_files/filename.zip");

Никакой выдачи (echo) делать не надо, после отдачи заголовка можно завершить работу скрипта. В этом случае будет скачан файл /var/files/filename.zip. Вместо filename.zip может быть любой длинный путь с каталогами, который должен повторять путь к файлу в /var/files/.

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

header("Content-Type: application/x-force-download");

Обратите так же внимание на то, что в случае проксирования на Apache последний обязательно установит Content-Type (по умолчанию обычно text/html) в случае PHP-скриптов, и этот тип отправится пользователю, так как nginx его не перепишет при выполнении Accel-Redirect. Т.е. в этом случае эту строку нужно писать обязательно. Как будет в случаях с *CGI, не знаю — не проверял.

Чтобы предложить пользователю имя файла для сохранения, отличное от того, что в адресной строке (это особо актуально в случаях «download.php&file_id=12332»), отправим такой заголовок:

Content-Disposition: attachment; filename="Super File Name.zip";

2. В такой схеме при проксировании на Apache не работает докачка. Исправляем.

Докачка в HTTP работает через HTTP-заголовок Range. В нем указывается с какого байта начать передачу. Можно так же указать, сколько байт нужно передать. Это передается в запросе. Например:

Range: bytes=33-
Range: bytes=33-100

Первый вариант просит отдать весь файл, начиная с 33 байта (включительно). Второй вариант просит отдать с 33 байта по 100. Чтобы браузер понял, что докачка поддерживается, сервер отдает в ответе заголовок:

Accept-Ranges: bytes

Докачка не работает из-за того, что HTTP-заголовок Range попадает в Apache после просирования и последний думает, что его просят отдать кусок PHP-файла. А он это делать не хочет и отдает ошибку: HTTP/1.1 416 Requested Range Not Satisfiable.

Исправляется это довольно легко — просто зануляйте при проксировании Range (это нужно добавить туда, где у вас описано проксирование на Apache в конфиге nginx):

proxy_set_header   Range   "";

Тогда Apache (или PHP-скрипт) ничего знать про него не будут и спокойно сделают свое дело. А nginx после Accel-Redirect отдаст ответ в соответствии с запрошенным Range.

Если жизненно необходимо видеть в скрипте запрошенный Range, то его можно либо передать через дополнительный заголовок при проксировании (proxy_add_header), либо последовать совету отсюда.

3. Даже так не работает докачка в IE 9.

Да. На сколько я понял методом простого тыка, IE требует поддержки ETag сервером для работы докачки. Игорь Сысоев (разработчик nginx) отказался внедрять в nginx поддержку ETag. Поэтому из коробки работать докачка в IE 9 не будет точно. Если это жизненно необходимо, пробуйте смотреть сюда (Ctrl+F Etag).

4. А как работает докачка в других браузерах?

Везде есть свои особенности. В общих чертах случай докачки выглядит так. Запрос/ответ на скачку (начало скачки):

GET /file.zip HTTP/1.1
Host: example.com

HTTP/1.1 200 OK
Server: nginx/1.0.3
Date: Tue, 06 Mar 2012 18:09:47 GMT
Content-Type: application/x-force-download
Content-Length: 13686314
Last-Modified: Thu, 23 Feb 2012 13:50:26 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Disposition: attachment; filename="Supre File Name.zip";
Accept-Ranges: bytes

Запрос/ответ на докачку:

GET /file.zip HTTP/1.1
Host: example.com
Range: bytes=5393683-

HTTP/1.1 206 Partial Content
Server: nginx/1.0.3
Date: Tue, 06 Mar 2012 18:10:11 GMT
Content-Type: application/x-force-download
Content-Length: 8292631
Last-Modified: Thu, 23 Feb 2012 13:50:26 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Disposition: attachment; filename="Super File Name.zip";
Content-Range: bytes 5393683-13686313/13686314

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

Opera. Она шлет указание на то, что «если файл не менялся со времени Last-Modified в первом ответе, дай мне указанный кусок; иначе — отдай мне весь файл заново». Делается это с помощью заголовка If-Range в запросе:

GET /file.zip HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.229 Version/11.61
Host: example.com
Accept text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, ..., */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
If-Range: Thu, 23 Feb 2012 13:50:26 GMT
Range: bytes=5393683-

Firefox. Он делает немного иначе. Используется заголовок If-Unmodified-Since с указанием того же времени из Last-Modified. В этом случае сервер либо вернет запрошенный кусок (если файл не менялся), либо отдаст ошибку 412 Precondition Failed. Выглядит это так:

GET /file.zip HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Range: bytes=5878651-
If-Unmodified-Since: Thu, 23 Feb 2012 13:50:26 GMT

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

Вся эта информация получена методом наблюдения. Возможно в какой-то другой ситуации Хром повел бы себя иначе, но я через WireShark наблюдал именно такую картину.

IE. Про версию 9 уже сказано выше. Она требует работы Etag для поддержки докачки. В данном контексте ETag — это просто контрольная сумма файла. Когда Etag файла передается в первом ответе от сервера, IE даст возможность прервать скачку. При попытке докачки он отдаст заголовки:

GET /file.zip HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Host: falcongaze.com
Range: bytes=3494051-
Unless-Modified-Since: Mon, 05 Mar 2012 08:31:06 GMT
If-Range: "1448453-f77f31-4ba7abf5a8680"
Connection: Keep-Alive

В добавок к If-Range он передает нестадартный заголовок Unless-Modified-Since — вероятено IIS его обрабатывает (только не понятно, зачем он, если есть стандартный If-Unmodified-Since; может для поддержки старых версий IIS?).

Собственно в первом ответе Etag выглядит примерно так (если он поддерживается сервером, например, Apache):

...
ETag: "1448453-f77f31-4ba7abf5a8680"

Дополнительная информация:

]]>
https://valera.ws/2012.03.06~accel-redirect-apache-dokachka/feed/ 0
Google Maps Labs https://valera.ws/2011.07.08~google-maps-labs/ https://valera.ws/2011.07.08~google-maps-labs/#respond Fri, 08 Jul 2011 20:15:05 +0000 http://valera.ws/?p=602 Читать далее Google Maps Labs ]]> Сегодня почти случайно узнал, что для Google Maps есть такой же раздел Labs, как в Gmail. Правда он намного скромнее по количеству эксперементальных фич.

Чтобы попасть в список Labs, нужно зайти в Google Maps и нажать на шестеренку в правом верхнем углу. В выпадающем меню выбрать «Maps Labs».

Откроется окно со списком, где можно включить/отключить ту или иную фичу.

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

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

]]>
https://valera.ws/2011.07.08~google-maps-labs/feed/ 0
Легкое монтирование USB-флешки (NTFS) на сервер https://valera.ws/2011.01.18~mount-ntfs3g-usbflash/ https://valera.ws/2011.01.18~mount-ntfs3g-usbflash/#respond Tue, 18 Jan 2011 11:52:59 +0000 http://valera.ws/?p=537 Читать далее Легкое монтирование USB-флешки (NTFS) на сервер ]]> Дано:

  1. Домашний сервер на Debian 5.
  2. Физический доступ к нему.
  3. Доступ по SSH (не root).
  4. USB-флешка с разделом NTFS.

Необходимо: быстро монтировать и размонтировать флешку для чтения/записи.

Вся проблема сводится к тому, что автомантирование флешек в Дебиане по дефолту делается штатными драйверами (read-only) и только с правами на монтирование. А мне необходимо было периодически скидывать инфу на флешку или с нее. Захотелось процесс оптимизировать.

Для достижения цели необходимо решить 2 задачи:

  1. дать доступ к монтированию флешек (не всего, что попало, а именно USB NTFS флешек) рядовому пользователю без пароля,
  2. избавить от необходимости полностью писать команду монтирования каждый раз.

Делается все очень просто. Я создал shell-скрипт /root/flash следующего содержания:

#!/bin/bash

case "$1" in
	1)
		mount -t ntfs-3g /dev/sdc /media/flash/
		;;
	0)
		umount /media/flash/
		;;
	*)
		echo $"Usage: $0 {1|0}"
		exit 1
esac

При передаче скрипту 1 происходит монтирование, при передаче 0 — размонтирование флешки (если точнее, то усройства /dev/sdc).

Ссылку на скрипт размещаем в /usr/bin для удобного доступа к нему:

# ln -s /root/flash /usr/bin/flash

Теперь надо разрешить выполнение этого скрипта без пароля от имени root с помощью sudoers. Выполните:

# sudoedit

И в файл добавьте следующие строки (замените feedbee на имя вашего пользователя):

Cmnd_Alias FLASH_CMD = /usr/bin/flash
feedbee ALL=(ALL) NOPASSWD: FLASH_CMD

Собственно, всё. Теперь из под вашего пользователя можно просто выполнить:

$ sudo flash 1

для монтирования флешки, и

$ sudo flash 0

для размонтирования.

]]>
https://valera.ws/2011.01.18~mount-ntfs3g-usbflash/feed/ 0
Передача имени сайта скрипту через cron (crontab) https://valera.ws/2011.01.13~sitename-php-from-cron/ https://valera.ws/2011.01.13~sitename-php-from-cron/#comments Thu, 13 Jan 2011 20:32:58 +0000 http://valera.ws/?p=530 Читать далее Передача имени сайта скрипту через cron (crontab) ]]> PHP-скриптВчера на stackoverflow заметил вопрос о том, как передать скрипту через крон адрес сайта, если скрипт может выполняться «под разными сайтами». Это довольно интересный вопрос, и есть много вариантов решения. Сам решал его не так давно, а раз тема интерисует и других, решил об этом написать.

Немного подробнее о самом вопросе. Зачастую встречаются сайты, работающие на одной кодовой базе на одном сервере, но, при этом, на разных доменах. При схожем внешнем виде на этих сайтах содержится разная информация в разном дизайне.

Самый простой пример таких сайтов — это локализованные версии одного сайта на разных языках. У меня в практике — это тематические форумы для разных групп.

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

При запуске обработки пользовательского HTTP-запроса скриптам необходимо определить, какому именно домену предназначен запрос, и выбрать соответствующий конфиг. В PHP это довольно просто сделать: заглянуть в переменную $_SERVER[‘SERVER_NAME’]. В других языках программирования под веб, думаю, примерно так же просто.

По имени серевера определяется нужный конфиг и оттуда берутся все необходимые настройки. Все просто.

Но когда дело доходит до вызова скриптов из cron-а (или другого планировщика), то переменная $_SERVER[‘SERVER_NAME’] будет пуста. Оно-то и понятно: никакого сервера нет, скрипт запускается напрямую через CLI. И узнать, для какого сайта вызывается скрипт, без явной передачи домена скрипту невозможно.

Самый простой способ указать домен — это прописать его аргументом командной строки. При вызове из cron-а после имени скрипта просто пишем домен, а в коде получаем его из переменной $argv глобальной области видимости.

Но этот способ не отличается элегантностью, т.к. придется определять, как запускался сайт: через веб или CLI, и в зависимости от этого искать адрес сайта в разных местах.

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

Таким образом ищем более удобный способ передать «указатель» на сайт. И находим: это переменные окружения. Среду окружения интерпретатор PHP получает оттуда, откуда он был запущен. Если скрипт запущен веб-сервером, то переменные будут получены от сервера. Если запускается скрипт через CLI, то среда будет получена от shell-а, в котором производился запуск. Повторю: запуск скриптов из cron-а — это обыкновенный запуск исполнимого файла в режиме CLI.

Теперь к конкретике. Чтобы переменная среды окружения попала из веб-сервера в PHP-скрипт (или скрипт/программу, написанную на других языках), ее надо установить (прописать). Для Апача установить переменную можно в файле .htaccess, либо в конфигах сервера (httpd.conf или конфиги виртуальных хостов). В идеале предпочтительно последнее. Но достаточно и минимального уровня доступа к .htaccess. Добивим в соответствующий конфиг строку:

SetEnv SITE_NAME site1

Чтобы определить переменную среды при запуске в режиме CLI (php /filename), нужно ее объявить и экпортировать:

export SITE_NAME=site1;

При запуске скрипта вручную следующей командой можно запускать сам PHP. Если запуск производится cron-ом, то стоит создать скрипт, на который ссылаться из crontab:

#!/bin/bash
export SITE_NAME=site1;
php /path

Для других сайтов вместо site1 подставляются другие имена.

Остается прочитать переменную в скрипте:

echo getenv('SITE_NAME');

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

* Стоит отметить, что в случае разных «установок»1 одного и того же сайта (development, testing, production) принято это значение передавать сайту в виде тоже же переменной окружения. Как правило, конфиг в этом случае содержит очень много информации, одинаковой для всех «установок», а отличаться, например, могут только параметры доступа к БД. Тогда имеет смысл все установки считать за один сайт (хоть домены и разные), а отличающиеся параметры вынести в отдельный конфиг, зависимый от «установки».

1 — Я намеряно в последнем абзаце заменил термин «окружение приложения» (application environment: тестовое, рабочее) на «установку», чтобы не было путаницы с тем окружением, где устанавливаюся переменные.

]]>
https://valera.ws/2011.01.13~sitename-php-from-cron/feed/ 2