High-Performance Browser Networking, Ilya Grigorik

Post Tag: booktech

image

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

Notes:

  • “Good developers know how things work. Great developers know why things work.” We all resonate with this adage. We want to be that person who understands and can explain the underpinning of the systems we depend on.

  • All TCP connections begin with a three-way handshake: SYN, SYN ACK, ACK

  • The delay imposed by the three-way handshake makes new TCP connections expensive to create, and is one of the big reasons why connection reuse is a critical optimization for any application running over TCP.

  • So why is slow-start an important factor to keep in mind when we are building applications for the browser? Well, HTTP and many other application protocols run over TCP, and no matter the available bandwidth, every TCP connection must go through the slow-start phase—we cannot use the full capacity of the link immediately! Instead, we start with a small congestion window and double it for every roundtrip—i.e., exponential growth.

  • In addition to regulating the transmission rate of new connections, TCP also implements a slow-start restart (SSR) mechanism, which resets the congestion window of a connection after it has been idle for a defined period of time. The rationale is simple: the network conditions may have changed while the connection has been idle, and to avoid congestion, the window is reset to a “safe” default. Not surprisingly, SSR can have a significant impact on performance of long-lived TCP connections that may idle for bursts of time—e.g., HTTP keepalive connections. As a result, it is recommended to disable SSR on the server.

  • As a result, the rate with which a TCP connection can transfer data in modern high-speed networks is often limited by the roundtrip time between the receiver and sender. Further, while bandwidth continues to increase, latency is bounded by the speed of light and is already within a small constant factor of its maximum value. In most cases, latency, not bandwidth, is the bottleneck for TCP—e.g.

  • Tuning Server Configuration

    • As a starting point, prior to tuning any specific values for each buffer and timeout variable in TCP, of which there are dozens, you are much better off simply upgrading your hosts to their latest system versions. TCP best practices and underlying algorithms that govern its performance continue to evolve, and most of these changes are only available only in the latest kernels. In short, keep your servers up to date to ensure the optimal interaction between the sender’s and receiver’s TCP stacks.
    • On the surface, upgrading server kernel versions seems like trivial advice. However, in practice, it is often met with significant resistance: many existing servers are tuned for specific kernel versions, and system administrators are reluctant to perform the upgrade. To be fair, every upgrade brings its risks, but to get the best TCP performance, it is also likely the single best investment you can make. With the latest kernel in place, it is good practice to ensure that your server is configured to use the following best practices:
      • Increasing TCP’s Initial Congestion Window - A larger starting congestion window allows TCP transfers more data in the first roundtrip and significantly accelerates the window growth—an especially critical optimization for bursty and short-lived connections.
      • Slow-Start Restart - Disabling slow-start after idle will improve performance of long-lived TCP connections, which transfer data in bursts.
      • Window Scaling (RFC 1323) - Enabling window scaling increases the maximum receive window size and allows high-latency connections to achieve better throughput.
      • TCP Fast Open - Allows application data to be sent in the initial SYN packet in certain situations. TFO is a new optimization, which requires support both on client and server; investigate if your application can make use of it.
    • The combination of the preceding settings and the latest kernel will enable the best performance—lower latency and higher throughput—for individual TCP connections. Depending on your application, you may also need to tune other TCP settings on the server to optimize for high connection rates, memory consumption, or similar criteria. However, these configuration settings are dependent on the platform, application, and hardware—consult your platform documentation as required.
  • Performance Checklist for TCP:

    • Upgrade server kernel to latest version (Linux: 3.2+).
    • Ensure that cwnd size is set to 10.
    • Disable slow-start after idle.
    • Ensure that window scaling is enabled.
    • Eliminate redundant data transfers.
    • Compress transferred data.
    • Position servers closer to the user to reduce roundtrip times.
    • Reuse established TCP connections whenever possible.
  • Terminating the connection closer to the user is an optimization that will help decrease latency for your users in all cases, but once again, no bit is faster than a bit not sent—send fewer bits. Enabling TLS session caching and stateless resumption will allow you to eliminate an entire roundtrip for repeat visitors. Session identifiers, on which TLS session caching relies, were introduced in SSL 2.0 and have wide support among most clients and servers. However, if you are configuring SSL/TLS on your server, do not assume that session support will be on by default. In fact, it is more common to have it off on most servers by default—but you know better! You should double-check and verify your configuration:

    • Servers with multiple processes or workers should use a shared session cache.
    • Size of the shared session cache should be tuned to your levels of traffic.
    • A session timeout period should be provided.
    • In a multiserver setup, routing the same client IP, or the same TLS session ID, to the same server is one way to provide good session cache utilization.
    • Where “sticky” load balancing is not an option, a shared cache should be used between different servers to provide good session cache utilization.
    • Check and monitor your SSL/TLS session cache statistics for best performance.
    • Alternatively, if the client and server both support session tickets, then all session data will be stored on the client, and none of these steps are required—much, much simpler! However, because session tickets are a relatively new extension in TLS, not all clients support it. In practice, and for best results, you should enable both: session tickets will be used for clients that support them, and session identifiers as a fallback for older clients. These mechanisms are not exclusive, and they work together well.
  • Performance Checklist for TLS:

    • Get best performance from TCP; see Optimizing for TCP.
    • Upgrade TLS libraries to latest release, and (re)build servers against them.
    • Enable and configure session caching and stateless resumption
    • Monitor your session caching hit rates and adjust configuration accordingly.
    • Terminate TLS sessions closer to the user to minimize roundtrip latencies.
    • Configure your TLS record size to fit into a single TCP segment.
    • Ensure that your certificate chain does not overflow the initial congestion window.
    • Remove unnecessary certificates from your chain; minimize the depth.
    • Disable TLS compression on your server.
    • Configure SNI support on your server.
    • Configure OCSP stapling on your server.
    • Append HTTP Strict Transport Security header.
  • The parsing of the HTML document is what constructs the Document Object Model (DOM). In parallel, there is an oft-forgotten cousin, the CSS Object Model (CSSOM), which is constructed from the specified stylesheet rules and resources. The two are then combined to create the “render tree,” at which point the browser has enough information to perform a layout and paint something to the screen. So far, so good. However, this is where we must, unfortunately, introduce our favorite friend and foe: JavaScript. Script execution can issue a synchronous doc.write and block DOM parsing and construction. Similarly, scripts can query for a computed style of any object, which means that JavaScript can also block on CSS. Consequently, the construction of DOM and CSSOM objects is frequently intertwined: DOM construction cannot proceed until JavaScript is executed, and JavaScript execution cannot proceed until CSSOM is available. The performance of your application, especially the first load and the “time to render” depends directly on how this dependency graph between markup, stylesheets, and JavaScript is resolved. Incidentally, recall the popular “styles at the top, scripts at the bottom” best practice? Now you know why! Rendering and script execution are blocked on stylesheets; get the CSS down to the user as quickly as you can.

  • WebPageTest.org is an open-source project and a free web service that provides a system for testing the performance of web pages from multiple locations around the world: the browser runs within a virtual machine and can be configured and scripted with a variety of connection and browser-oriented settings. Following the test, the results are then available through a web interface, which makes WebPageTest an indispensable power tool in your web performance toolkit.

  • There are four techniques employed by most browsers:

    • Resource pre-fetching and prioritization - Document, CSS, and JavaScript parsers may communicate extra information to the network stack to indicate the relative priority of each resource: blocking resources required for first rendering are given high priority, while low-priority requests may be temporarily held back in a queue.
    • DNS pre-resolve - Likely hostnames are pre-resolved ahead of time to avoid DNS latency on a future HTTP request. A pre-resolve may be triggered through learned navigation history, a user action such as hovering over a link, or other signals on the page.
    • TCP pre-connect - Following a DNS resolution, the browser may speculatively open the TCP connection in an anticipation of an HTTP request. If it guesses right, it can eliminate another full roundtrip (TCP handshake) of network latency.
    • Page pre-rendering - Some browsers allow you to hint the likely next destination and can pre-render the entire page in a hidden tab, such that it can be instantly swapped in when the user initiates the navigation.
  • Similarly, speaking of good reference books, Steve Souders’ High Performance Web Sites offers great advice in the form of 14 rules, half of which are networking optimizations:

    • Reduce DNS lookups
    • Every hostname resolution requires a network roundtrip, imposing latency on the request and blocking the request while the lookup is in progress.
    • Make fewer HTTP requests
    • No request is faster than a request not made: eliminate unnecessary resources on your pages.
    • Use a Content Delivery Network
    • Locating the data geographically closer to the client can significantly reduce the network latency of every TCP connection and improve throughput.
    • Add an Expires header and configure ETags
    • Relevant resources should be cached to avoid re-requesting the same bytes on each and every page. An Expires header can be used to specify the cache lifetime of the object, allowing it to be retrieved directly from the user’s cache and eliminating the HTTP request entirely. ETags and Last-Modified headers provide an efficient cache revalidation mechanism—effectively a fingerprint or a timestamp of the last update.
    • Gzip assets
    • All text-based assets should be compressed with Gzip when transferred between the client and the server. On average, Gzip will reduce the file size by 60–80%, which makes it one of the simpler (configuration flag on the server) and high-benefit optimizations you can do.
    • Avoid HTTP redirects
    • HTTP redirects can be extremely costly, especially when they redirect the client to a different hostname, which results in additional DNS lookup, TCP connection latency, and so on.

Книга шифров. Тайная история шифров и их расшифровки, Саймон Сингх

Post Tag: booknon-fiction

image

Чудесная книга, пожалуй лучший нон-фикшен, что прочитал в этом году. Рассказана история возникновения и развития криптографии, людей что за ней стояли. Например, только отсюда узнал, что первым “энигму” взломал поляк Реевский, а не Тьюринг. А основа знаменитого алгоритма RSA придуман после вечеринки.

Самое обидное, последние главы посвящены ассиметричному шифрованию и приватности частной переписки. А в 1999 году, когда книга и была написана, не было биткойна (2008 год) и Сноудена (2013 год). Сколько еще хороших глав можно было бы прочитать. В общем, жду продолжения.

Заметки:

  • Секретная переписка, осуществляемая путем сокрытия имеющегося сообщения, носит название стеганография, которое происходит из греческих слов steganos — «покрытый» и graphein — «писать». … Стеганография также включает в себя применение невидимых чернил. Еще в первом веке н. э. Плиний-старший показал, как млечный сок некоторых растений может использоваться в качестве таких чернил. После высыхания надпись, сделанная этими чернилами, не видна, но при несильном нагреве она приобретает коричневый цвет. Многие органические жидкости ведут себя похожим образом: при нагреве, из-за того, что в них содержится большое количество углерода, они темнеют. И это не составляет секрета для нынешних шпионов, которые, в случае если у них исчерпались симпатические чернила, используют для этой цели собственную мочу.

  • Цель криптографии состоит не в том, чтобы скрыть наличие сообщения, а в том, чтобы скрыть его смысл, — процесс, известный как шифрование. Чтобы сделать сообщение непонятным, оно зашифровывается по определенному правилу, которое заранее оговаривается между отправителем сообщения и его получателем. Так что адресат, получив сообщение, может применить к нему правило шифрования в обратном порядке, после чего его смысл станет понятным. Преимущество криптографии состоит в том, что если противник перехватит зашифрованное сообщение, то прочитать его ему не удастся. Восстановить исходное сообщение из зашифрованного текста, не зная правила шифрования, может оказаться для противника сложной, а то и вообще невыполнимой задачей.

  • Хотя криптография и стеганография являются независимыми, но для обеспечения максимальной секретности, чтобы и зашифровать, и скрыть сообщение, можно пользоваться обеими. К примеру, во время Второй мировой войны стала популярной микроточка, которая является одним из видов стеганографии. Германские агенты в Латинской Америке фотографическим способом сжимали страницу текста в точку диаметром менее 1 миллиметра, а затем прикрепляли эту микроточку поверх обычной точки в конце предложения в на первый взгляд совершенно безобидном письме.

  • В отличие от алгоритма, важность ключа является основополагающим принципом криптографии. Он был сформулирован в 1883 году голландским лингвистом Огюстом Керкхоффом в книге «Военная криптография» («La Cryptographie militaire»); правило Керкхоффа гласит: «Стойкость криптосистемы не должна зависеть от стойкости криптоалгоритма. Она зависит только от стойкости ключа». Помимо того, что ключ должен храниться в секрете, стойкая система шифрования должна также обладать широким набором возможных ключей. Например, если для зашифровывания сообщения отправитель применяет шифр сдвига Цезаря, то такое шифрование является сравнительно слабым, так как существует всего 25 возможных ключей.

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

  • Благодаря достижениям Чарльза Бэббиджа и Фридриха Касиски шифр Виженера более не был безопасным. Теперь, когда криптоаналитики вновь обрели контроль в коммуникационной войне, криптографы не могли гарантировать секретности. Хотя они и пытались разрабатывать новые шифры, но во второй половине девятнадцатого столетия не появилось ничего существенного, и профессиональные криптографы были в смятении. Однако как раз в это же самое время у широкой публики появился огромный интерес к шифрам. Развитие телеграфа, которое вызвало рост интереса коммерческого характера к криптографии, привело также и к формированию общественного интереса к ней.

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

  • В результате совершенного Реевским прорыва передаваемые немцами сообщения больше не представляли секрета. Польша не находилась в состоянии войны с Германией, но существовала угроза вторжениями то, что «Энигма» была покорена, стало для нее огромным облегчением. Если поляки смогут выяснить, что замышляют в отношении них немецкие генералы, то это давало им возможность защитить себя. Судьба Польши зависела от Реевского, и он не подвел свою страну. Атака Реевского на «Энигму» является одним из по-истине величайших достижений криптоанализа.

  • В значительной степени позаимствовав концепцию универсальной машины Алана Тьюринга, Ньюмен спроектировал машину, которая была способна сама настраиваться на решение различных задач — то, что сегодня мы назвали бы программируемым компьютером. Реализация конструкции Ньюмена считалась технически невозможной, так что руководство Блечли даже не стало рассматривать проект. По счастью, Томми Флауэрс, инженер, принимавший участие в обсуждении проекта Ньюмена, решил проигнорировать скептицизм Блечли и приступил к созданию такой машины. В исследовательском центре Управления почт и телеграфа в Доллис Хилл, в Северном Лондоне, Флауэрс взял чертежи Ньюмена и потратил десять месяцев, чтобы создать на его основе машину «Колосс», которую 8 декабря 1943 года передал в Блечли-Парк. Машина состояла из 1500 электронных ламп, которые действовали значительно быстрее медлительных электромеханических релейных переключателей, используемых в «бомбах». Но гораздо важнее скорости «Колосса» являлось то, что эту машину можно было программировать. Благодаря этому-то «Колосс» и стал предшественником современных цифровых ЭВМ.

  • Уитфилд Диффи — один из криптографов-энтузиастов своего поколения. Внешний вид его поражает и создает отчасти противоречивый образ. Его безупречный костюм отражает тот факт, что большую часть 90-х годов он трудился в одной из американских компьютерных корпораций — ныне официально его должность звучит как «Заслуженный инженер компании Сан Микросистеме». В то же время его длинные, до плеч, волосы и белая бородка говорят о том, что сердце его принадлежит 60-м. Он проводит массу времени за компьютером, но выглядит так, словно столь же комфортно он чувствовал бы себя и в ашраме Бомбея.

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

  • Озарение снизошло на Хеллмана глубокой ночью, так что, когда он закончил расчеты, было уже слишком поздно, чтобы звонить Диффи и Мерклю. Ему пришлось ждать утра, когда он смог продемонстрировать свое открытие двум единственным в мире людям, кто верил в возможность решения проблемы распределения ключей. «Осенило меня, — говорит Хеллман, — но в разработке принципов участвовали мы все вместе». Диффи сразу же осознал всю мощь открытия Хеллмана: «Марти объяснил свою систему обмена ключами во всей ее простоте. Когда я слушал его, то понял, что ка-кое-то время эта идея крутилась и у меня в голове, но так и не выкристаллизовалась».

  • Я попросил Рона, чтобы он убрал мое имя из статьи, — вспоминает Адлеман. — Я сказал ему, что это его открытие, а не мое. Но Рон отказался, и в результате завязался спор. Мы порешили, что я отправлюсь домой, поразмышляю над этим ночь и скажу, чего бы мне хотелось. На следующий день я вернулся и предложил Рону, чтобы он поставил меня третьим автором. Как мне сейчас вспоминается, тогда я думал, что эта статья будет самой неинтересной из всех, которые я когда-либо писал». Вряд ли Адлеман мог ошибиться сильнее. Алгоритм, получивший название RSA (Ривест, Шамир, Адлеман), а не ARS, стал важнейшим шифром в современной криптографии.

  • Одним из самых известных случаев связан с Мартином Лютером Кингом-младшим, чьи телефонные разговоры неправомерно прослушивались в течение нескольких лет. Так, в 1963 году ФБР получило информацию на Кинга путем прослушивания телефонных переговоров и предоставило ее сенатору Джеймсу Истланду, чтобы помочь ему в дебатах по законопроекту о гражданских правах. По большей части ФБР собирало подробности о личной жизни Кинга, которые использовались для его дискредитации. Записи о Кинге, рассказывающем скабрезные истории, были посланы его жене и воспроизведены перед президентом Джонсоном. А после того, как Кингу была присуждена Нобелевская премия мира, обескураживающие подробности о жизни Кинга были переданы во все организации, которые, как считалось, поддержали его награждение.

  • Очевидно, что спор ведется между двумя лагерями: борцы за гражданские права и компании выступают за криптостойкое шифрование, в то время как сотрудники правоприменяющих органов высказываются в пользу строгих ограничений. В целом, общественное мнение, на которое повлияли благожелательные средства массовой информации и пара голливудских фильмов, поддерживает альянс, выступающий за шифрование. В начале 1998 года в фильме «Меркурий в опасности» была рассказана история о новом шифре АНБ, который, как полагали, взломать было невозможно, но который был непреднамеренно раскрыт девятилетним, умственно неполноценным, хотя и гениальным в отдельных областях мальчиком. Агент АНБ, чью роль сыграл Алек Болдуин, намеревается убить ребенка, воспринимаемого им в качестве угрозы национальной безопасности. По счастью у мальчика есть защитник, Брюс Уиллис, который спасает его. В том же 1998 году Голливуд выпустил фильм «Враг государства», где речь шла о заговоре АНБ с целью убийства политика, ратующего за стойкое шифрование. Политик убит, но в конечном итоге адвокат, которого сыграл Уилл Смит, и бунтарь из АНБ, сыгранный Джином Хэкманом, отдали убийц из АНБ в руки правосудия. В обоих фильмах АНБ изображается более зловещей, чем ЦРУ, и во многом АНБ унаследовала роль этого ведомства, несущего угрозу.

Переезд на Travis-CI

Post Tag: techit

Когда я только переехал на Hugo, встал вопрос об автоматизации обновления сайта. Не стал ничего выдумывать и просто следовал рекомендациям на офицальном сайте gohugo.io и настроил Wercker. Все отлично работало.

Но однажды сборка сломалась - оказалось в образе debian перестал работать wget. Пришлось немного поправить настройки. В итоге получилось следующее (определенно избыточно):

box: debian
build:
  steps:
    - script:
        name: install git
        code: |
          apt-get update && apt-get install git -y
    - script:
        name: initialize git submodules
        code: |
            git submodule update --init --recursive
    - arjen/hugo-build@1.16.1
deploy:  
  steps:
    - script:
        name: install git
        code: |
          apt-get update && apt-get install git -y
    - lukevivier/gh-pages@0.2.1:
        token: $GIT_TOKEN
        repo: Bege13mot/Bege13mot.github.io
        basedir: public

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

Блог хостится на Github, и первая CI, что приходит на ум, конечно Travis. Благо и инструкций для этого есть немало. Я использовал вот эту.

Единственное что, немного доработал deploy.sh, чтобы деплоить только если есть изменения. Иначе даже при добавлении черновика блог будет пересобираться. За основу взял статью. Итоговый результат:

# !/bin/bash
set -e # Exit with nonzero exit code if anything fails

SOURCE_BRANCH="master"

# Pull requests and commits to other branches shouldn't try to deploy, just build to verify
if [ "$TRAVIS_PULL_REQUEST" != "false" -o "$TRAVIS_BRANCH" != "$SOURCE_BRANCH" ]; then
    echo "Skipping deploy; just doing a build."    
    exit 0
fi

# Save some useful information
REPO="bege13mot.github.io"
GH_REPO="github.com/bege13mot/$REPO.git"
#SHA=`git rev-parse --verify HEAD`
EMAIL="bege13mot@gmail.com"

# Build the project.
hugo # if using a theme, replace by 'hugo -t <yourtheme>'

# Clone the existing gh-pages for this repo into out/
git clone --depth=1 "https://$GH_REPO" out

# Clean out existing contents
rm -rf out/**/* || exit 0

# copy files to commit
cp -R public/* out

# Now let's go have some fun with the cloned repo
cd out
git remote
git config user.name "Travis CI"
git config user.email "$EMAIL"

# If there are no changes to the compiled out (e.g. this is a README update) then just bail.
git status
if git diff-index --quiet HEAD --; then
    echo "No changes to the output on this push; exiting."
    exit 0
fi

# Commit the "changes", i.e. the new version.
# The delta will show diffs between new and old versions.
git add -A .
git commit -m "Deploy to GitHub Pages"

# Now that we're all set up, we can push.
git push "https://$GH_TOKEN@$GH_REPO" $SOURCE_BRANCH

Переезд на более “стабильный” (как минимум более известный и проверенный) CI успешно состоялся. Заодно и процесс деплоя упростился после отказа от сторонних скриптов.

Практическое демоноводство, Кристофер Мур

Post Tag: bookfiction

image

Также смешно как и Ящер страсти из бухты грусти, юмор все также черен, люди все также безумны. Вместо психоаналитиков жертвой сатиры стала религия. Очень приятно читать, но Мура мне пожалуй хватит. Эти две книги в одном стиле, но “ящер” понравился больше.

Thinking in Java by Bruce Eckel

Post Tag: bookittech

image

Как же долго я читал эту книгу, года три, не меньше. Разные заходы, на разных языках. И наконец дочитал.

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

Заметки:

  • finalize() - вызывается только в процессе garbage collection. Т.е может так и не быть вызванным. Его полезно использовать например для обьектов, что открывают файлы - перед уничтожением обьекта файл должен быть закрыт.

  • A package contains a group of classes, organized together under a single namespace.

  • When you compile a .java file, you get an output file for each class in the .java file. Each output file has the name of a class in the .java file, but with an extension of .class. Thus you can end up with quite a few .class files from a small number of .java files.

  • The private keyword means that no one can access that member except the class that contains that member, inside methods of that class. Other classes in the same package cannot access private members, so it’s as if you’re even insulating the class against yourself.

  • The trick is to use the classes without soiling the existing code. In this chapter you’ll see two ways to accomplish this. The first is quite straightforward: you simply create objects of your existing class inside the new class. This is called composition, because the new class is composed of objects of existing classes. You’re simply reusing the functionality of the code, not its form.

  • The second approach is more subtle. It creates a new class as a type of an existing class. You literally take the form of the existing class and add code to it without modifying the existing class. This technique is called inheritance, and the compiler does most of the work. Inheritance is one of the cornerstones of object-oriented programming, and has additional implications that will be explored in the Polymorphism chapter.

  • A third relationship, which is not directly supported by Java, is called delegation. This is midway between inheritance and composition, because you place a member object in the class you’re building (like composition), but at the same time you expose all the methods from the member object in your new class (like inheritance)

  • Wouldn’t it be much nicer if you could just write a single method that takes the base class as its argument, and not any of the specific derived classes? That is, wouldn’t it be nice if you could forget that there are derived classes, and write your code to talk only to the base class? That’s exactly what polymorphism allows you to do. However, most programmers who come from a procedural programming background have a bit of trouble with the way polymorphism works.

  • Once you learn about polymorphism, you can begin to think that everything happens polymorphically. However, only ordinary method calls can be polymorphic. For example, if you access a field directly, that access will be resolved at compile time

  • If a method is static, it doesn’t behave polymorphically. Static methods are associated with the class, and not the individual objects.

  • Each inner class can independently inherit from an implementation. Thus, the inner class is not limited by whether the outer class is already inheriting from an implementation. Without the ability that inner classes provide to inherit—in effect—from more than one concrete or abstract class, some design and programming problems would be intractable. So one way to look at the inner class is as the rest of the solution of the multiple-inheritance problem. Interfaces solve part of the problem, but inner classes effectively allow “multiple implementation inheritance.” That is, inner classes effectively allow you to inherit from more than one non-interface.

  • The Java container library takes the idea of “holding your objects” and divides it into two distinct concepts, expressed as the basic interfaces of the library:

    • Collection: a sequence of individual elements with one or more rules applied to them. A List must hold the elements in the way that they were inserted, a Set cannot have duplicate elements, and a Queue produces the elements in the order determined by a queuing discipline (usually the same order in which they are inserted).
    • Map: a group of key-value object pairs, allowing you to look up a value using a key. An ArrayList allows you to look up an object using a number, so in a sense it associates numbers to objects. A map allows you to look up an object using another object. It’s also called an associative array, because it associates objects with other objects, or a dictionary, because you look up a value object using a key object just like you look up a definition using a word. Maps are powerful programming tools.
  • There are two types of List:

    • The basic ArrayList, which excels at randomly accessing elements, but is slower when inserting and removing elements in the middle of a List.
    • The LinkedList, which provides optimal sequential access, with inexpensive insertions and deletions from the middle of the List. A LinkedList is relatively slow for random access, but it has a larger feature set than the ArrayList.
  • One solution is what I call the Adapter Method idiom. The “Adapter” part comes from design patterns, because you must provide a particular interface to satisfy the foreach statement. When you have one interface and you need another one, writing an adapter solves the problem. Here, I want to add the ability to produce a reverse iterator to the default forward iterator, so I can’t override. Instead, I add a method that produces an Iterable object which can then be used in the foreach statement. As you see here, this allows us to provide multiple ways to use foreach:

  • Exception handling, two methods - Termination vs. resumption

  • Exception guidelines Use exceptions to:

    1. Handle problems at the appropriate level. (Avoid catching exceptions unless you know what to do with them.)
    2. Fix the problem and call the method that caused the exception again.
    3. Patch things up and continue without retrying the method.
    4. Calculate some alternative result instead of what the method was supposed to produce.
    5. Do whatever you can in the current context and rethrow the same exception to a higher context.
    6. Do whatever you can in the current context and throw a different exception to a higher context.
    7. Terminate the program.
    8. Simplify. (If your exception scheme makes things more complicated, then it is painful and annoying to use.)
    9. Make your library and program safer. (This is a short-term investment for debugging, and a long-term investment for application robustness.)

Ящер страсти из бухты грусти, Кристофер Мур

Post Tag: bookfiction

image

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

А между прочим название очень точно отражает происходящее. И ящер, весьма страстный, и бухта, с морем грусти, присутствуют. Присутствуют еще разнообразные горожане, от барменов до ученых, со своими “тараканами”, ирония, черный юмор и пародия почти на все, что есть в современном городе. Сказка, а не книга. Понравилось.

Компьютерные сети. Нисходящий подход, Джеймс Куроуз, Кит Росс

Post Tag: booktheoryit

image

Пожалуй, идеальная книга для знакомства с сетями. В отличие от Компьютерных сетей, Эндрю Таненбаума, здесь упор на практические примеры. Зачем это нужно, как оно помогает решать конкретную задачу. И почти никой теории, в отличии от Таненбаума. Что как раз прекрасно подходит для новичков. А еще в книге есть великолепная глава о том, что происходит при наборе google.com в браузере с точки зрения сети. Со всеми подробностями.

Заметки:

  • В контексте IP-протокола принято говорить, что подобная сеть, соединяющая три интерфейса хост-машин и один интерфейс маршрутизатора, представляет собой подсеть. В технической литературе по Интернету подсеть также иногда называется IP-сеть или просто сеть. В ходе IP- адресации данной подсети присваивается адрес 223.1.1.0/24. Часть адреса /24, иногда называемая маской подсети, указывает, что 24 крайних левых разряда 32-разрядного значения определяют адрес подсети. Соответственно, подсеть 223.1.1.0/24 состоит из трех интерфейсов хостов (223.1.1.1, 223.1.1.2 и 223.1.1.3) и одного интерфейса маршрутизатора (223.1.1.4). Любые дополнительные хосты, подключаемые к подсети 223.1.1.0/24, обязательно должны будут иметь адреса вида 223.1.1.xxx.

  • При передаче дейтаграмм используются и адреса сетевого уровня (например, IP-адреса Интернета), и адреса канального уровня (то есть MAC-адреса), поэтому возникает потребность в преобразовании одних адресов в другие. В Интернете эту работу выполняет протокол разрешения адресов (Address Resolution Protocol, ARP)… Итак, ARP-модуль преобразует IP-адрес в MAC-адрес узла. Во многом это аналогично системе DNS, преобразующей имена хостов в IP-адреса.

  • Ретроспектива: один день из жизни запроса веб-страницы * * Начало: DHCP, UDP, IP и Ethernet

    1. Операционная система на ноутбуке Боба создает сообщение с запросом DHCP и записывает это сообщение в UDP-сегмент. В качестве порта получателя указывается порт 67 (DHCP-сервер), а порт отправителя имеет номер 68 (DHCP-клиент). После этого UDP-сегмент записывается в IP дейтаграмму с широковещательным IP-адресом получателя (255.255.255.255). IP-адрес отправителя будет равен 0.0.0.0, так как у ноутбука Боба еще нет IP-адреса.

    2. IP-дейтаграмма, содержащая сообщение с запросом DHCP, затем помещается в Ethernet-кадр. Ethernet-кадр обладает MAC- адресами назначения FF:FF:FF:FF:FF:FF, поэтому кадр будет широковещательно передаваться всем устройствам, подключенным к коммутатору (остается надеяться, что среди этих устройств окажется и DHCP-сервер). Исходный MAC-адрес кадра совпадает с адресом ноутбука Боба, 00:16:D3:23:68:8A.

    3. Широковещательный Ethernet-кадр, содержащий DHCP-запрос — это первый кадр, отправленный ноутбуком Боба на Ethernet- коммутатор. Коммутатор широковещательно передает этот входящий кадр на все свои выходные порты, в том числе на порт, подключенный к маршрутизатору.

    4. Маршрутизатор получает широковещательный Ethernet-кадр с DHCP- запросом на интерфейс с MAC-адресом 00:22:6B:45:1F:1B, после чего IP-дейтаграмма извлекается из Ethernet-кадра. Широковещательный IP-адрес назначения дейтаграммы указывает, что IP-дейтаграмма должна быть обработана на данном узле более высокоуровневыми протоколами, поэтому полезная нагрузка дейтаграммы (UDP-сегмент) демультиплексируется вплоть до UDP, а сообщение с запросом DHCP извлекается из UDP-сегмента. Итак, теперь у DHCP-сервера есть сообщение с запросом DHCP.

    5. Предположим, что DHCP-сервер, работающий на маршрутизаторе, может выделять адреса из блока CIDR 68.85.2.0/24. Таким образом, в данном примере все IP-адреса университета будут относиться к блоку адресов провайдера Comcast. Далее допустим, что DHCP-сервер выделяет ноутбуку Боба адрес 65.85.2.101. DHCP-сервер создает сообщение DHCP ACK, в котором содержится этот IP-адрес, а также следующая информация: IP-адрес DNS-сервера (68.87.71.226), IP-адрес шлюзового маршрутизатора, задаваемого по умолчанию (68.85.2.1) и, наконец, блок подсети (65.85.2.0/24), он же — «маска сети». DHCP-сообщение записывается в UDP-сегмент, который заключается в IP-дейтаграмму, а она, в свою очередь — в Ethernet-кадр. Ethernet-кадр располагает исходным MAC-адресом (это адрес интерфейса маршрутизатора, соединяющего маршрутизатор с домашней сетью — 00:22:6B:45:1F:1B) и конечным MAC-адресом (это адрес ноутбука Боба 00:16:D3:23:68:8A).

    6. Ethernet-кадр, содержащий сообщение DHCP ACK (одноадресно), передается маршрутизатором на коммутатор. Поскольку коммутатор является самообучающимся, а ранее получил Ethernet-кадр (с DHCP-запросом) с ноутбука Боба, коммутатору уже известно, что кадр, идущий на адрес 00:16:D3:23:68:8A, нужно просто передать на выходной порт, ведущий к ноутбуку Боба.

    7. Ноутбук Боба получает сообщение DHCP ACK, извлекает IP-дейтаграмму из Ethernet-кадра, затем UDP-сегмент из IP-дейтаграммы, после чего — сообщение DHCP ACK из UDP-сегмента. Затем DHCP-клиент с ноутбука Боба записывает его IP-адрес, а также IP-адрес его DNS-сервера. Кроме того, он заносит адрес в свою IP- таблицу маршрутизации. Ноутбук Боба будет отсылать на заданный по умолчанию шлюз все дейтаграммы, чей адрес назначения находится вне его подсети 68.85.2.0/24. На данном этапе ноутбук Боба уже инициализировал свои сетевые компоненты и готов обрабатывать операции выборки веб-страниц.

      • Начало продолжается: DNS и ARP
    8. Когда Боб вводит в браузер адрес www.google.com, начинается длинная цепочка событий. Ее конечный результат — отображение главной страницы Google в браузере. Для этого операционная система на ноутбуке Боба создает сообщение с запросом DNS, помещая строку «www.google.com» в тот раздел DNS-сообщения, где содержится запрос. Затем это DNS-сообщение записывается в UDP-сегмент с портом назначения 53 (это DNS-сервер). После этого данный UDP-сегмент помещается в IP-дейтаграмму, имеющую IP-адрес получателя 68.87.71.226 (это адрес DNS-сервера, который мы приняли в возвращенном сообщении DHCP ACK на этапе 5) и IP-адрес отправителя 68.85.2.101.

    9. После этого ноутбук Боба помещает дейтаграмму, содержащую сообщение с запросом DNS, в Ethernet-кадр. Этот кадр будет отправлен (адресован на сетевом уровне) на шлюзовой маршрутизатор сети того университета, где учится Боб. Однако, хотя ноутбуку Боба и известен IP-адрес шлюзового маршрутизатора университета (65.85.2.1) — эта информация была получена в сообщении DHCP ACK на этапе 5, описанном выше, ему не известен MAC-адрес этого шлюза. Чтобы получить MAC-адрес шлюзового маршрутизатора, на ноутбуке Боба понадобится задействовать протокол ARP.

    10. Ноутбук Боба создает сообщение с запросом ARP, где указывается целевой IP-адрес 68.85.2.1 (адрес шлюзового маршрутизатора). ARP-сообщение помещается в Ethernet-кадр с широковещательным адресом получателя (FF:FF:FF:FF:FF:FF), после чего ноутбук отправляет Ethernet-кадр на коммутатор, который, в свою очередь, доставляет этот кадр на все подключенные к нему устройства, в том числе на шлюзовой маршрутизатор.

    11. Шлюзовой маршрутизатор получает кадр с сообщением c ARPзапросом на интерфейс, ведущий в него из университетской сети, и определяет, что целевой IP-адрес 68.85.2.1 в ARP-сообщении совпадает с IP-адресом его интерфейса. После этого шлюзовой маршрутизатор подготавливает ARP-ответ, указывая, что его MAC-адрес 00:22:6B:45:1F:1B соответствует IP-адресу 68.85.2.1. Сообщение с ARP-ответом записывается в Ethernet-кадр с адресом получателя (это ноутбук Боба). После этого кадр отправляется на коммутатор, который доставляет его на ноутбук Боба.

    12. Ноутбук Боба получает кадр с ответным ARP-сообщением и извлекает MAC-адрес шлюзового маршрутизатора (00:22:6B:45:1F:1B) из этого сообщения.

    13. Теперь ноутбук Боба (наконец-то!) может отправить Ethernet-кадр с DNS-запросом на MAC-адрес шлюзового маршрутизатора. Обратите внимание: IP-дейтаграмма в этом кадре имеет IP-адрес получателя 68.87.71.226 (это адрес DNS-сервера), тогда как адрес получателя кадра — 00:22:6B:45:1F:1B (это шлюзовой маршрутизатор). Ноутбук Боба отправляет кадр на коммутатор, который, в свою очередь, доставляет этот кадр на шлюзовой маршрутизатор.

      • Начало продолжается: внутридоменная маршрутизация на DNS-сервер
    14. Шлюзовой маршрутизатор получает кадр и извлекает из него IP- дейтаграмму, содержащую DNS-запрос. Маршрутизатор уточняет адрес назначения этой дейтаграммы (68.87.71.226) и определяет по своей таблице маршрутизации, что дейтаграмма должна быть отправлена на маршрутизатор сети Comcast. IP-дейтаграмма помещается в кадре канального уровня для перемещения по каналу, который связывает университетский маршрутизатор с маршрутизатором Comcast. Кадр отправляется по этому каналу.

    15. Вышеупомянутый маршрутизатор из сети Comcast получает кадр, извлекает IP-дейтаграмму, проверяет ее адрес получателя (68.87.71.226), а потом по своей таблице маршрутизации определяет выходной интерфейс, через который этот кадр должен быть отправлен на DNS-сервер. Таблица маршрутизации была заполнена при помощи протокола внутридоменной маршрутизации сети Comcast (это может быть протокол RIP, OSPF или IS-IS), а также с применением протокола BGP, обеспечивающего междоменную маршрутизацию в Интернете.

    16. Наконец, IP-дейтаграмма, содержащая DNS-запрос, прибывает на DNS-сервер. DNS-сервер извлекает сообщение с DNS-запросом, ищет в своей базе данных DNS адрес www.google.com, после чего находит запись DNS-ресурса, содержащую IP-адрес (64.233.169.105) сайта www.google.com (предполагается, что эта запись уже кэширована на DNS-сервере). Как вы помните, эти кэшированные данные берутся с авторитетного DNS-сервера, отвечающего за сайт google.com. Сервер формирует ответное DNS-сообщение, в котором содержится отображение данного хост-имени на соответствующий IP-адрес, и помещает это ответное сообщение в UDP-сегмент. Сегмент, находящийся в IP-дейтаграмме, адресуется на ноутбук Боба (68.85.2.101). Эта дейтаграмма будет отправлена обратно в сеть Comcast, а оттуда далее, через Ethernet-коммутатор на ноутбук Боба.

    17. Ноутбук Боба извлекает IP-адрес сервера www.google.com из DNS-сообщения. Наконец, проделав всю эту огромную работу, ноутбук Боба готов подключиться к серверу www.google.com!

      • Клиент-серверное взаимодействие: TCP и HTTP
    18. Теперь, когда ноутбук Боба обладает IP-адресом www.google.com, он может создать TCP-сокет, который будет использоваться для отправки сообщения HTTP GET на сайт www. google.com. Когда Боб создает TCP-сокет, протокол TCP в ноутбуке Боба сперва должен выполнить тройное рукопожатие с протоколом TCP на www.google.com. Поэтому для начала ноутбук Боба создает сегмент TCP SYN с портом назначения 80 (для HTTP), помещает TCP-сегмент в IP-дейтаграмме, задавая IP-адрес получателя 64.233.169.105 (www.google.com). Эта дейтаграмма помещается в кадр с MAC-адресом получателя 00:22:6B:45:1F:1B (шлюзовой маршрутизатор). После всех этих операций кадр отправляется на коммутатор.

    19. Маршрутизаторы из университетской сети, сети Comcast и сети Google шлют дейтаграмму с пакетом TCP SYN на адрес www.google. com. Для этого используются таблицы маршрутизации каждого из них, как описано выше в шагах 14-16. Как вы помните, записи в таблицах маршрутизации, управляющие перемещением пакетов по междоменным связям между сетями Comcast и Google, формируются протоколом BGP.

    20. Наконец, дейтаграмма с пакетом TCP SYN прибывает на www. google.com. Там сообщение TCP SYN извлекается из дейтаграммы и демультиплексируется на нужный сокет, ассоциированный с портом 80. Специальный сокет соединения создается для установления соединения между HTTP-сервером Google и ноутбуком Боба по протоколу TCP. Генерируется сегмент TCP SYNACK, затем этот сегмент помещается в дейтаграмме, адресованной на ноутбук Боба, и, наконец, заключается в кадре канального уровня, подходящем для передачи по каналу, соединяющему www. google.com и его первый транзитный маршрутизатор.

    21. Дейтаграмма, содержащая сегмент TCP SYNACK, направляется через сети Google, Comcast и университета, в итоге оказываясь на сетевой Ethernet-карте ноутбука Боба. Дейтаграмма демультиплексируется в операционной системе на TCP-сокет, созданный в шаге 18, и этот сокет переходит в соединенное состояние.

    22. Когда сокет на ноутбуке Боба (наконец-то!) готов отправлять байты на www.google.com, браузер на ноутбуке создает сообщение с запросом HTTP GET, содержащее адрес URL, откуда требуется взять данные. Затем сообщение HTTP GET записывается на сокет, причем запрос GET становится полезным содержимым TCPсегмента. TCP-сегмент помещается в дейтаграмму, отправляется и доставляется на сайт www.google.com, как описано в шагах 18–20 выше.

    23. HTTP-сервер по адресу www.google.com считывает сообщение HTTP GET с TCP-сокета, создает HTTP-ответ (раздел 2.2), помещает контент запрошенной веб-страницы в тело ответного HTTP-сообщения, после чего отправляет это сообщение на TCP-сокет.

    24. Дейтаграмма, содержащая HTTP-ответ, направляется через сети Google, Comcast и университетскую сеть, после чего прибывает на ноутбук Боба. Браузер на ноутбуке считывает HTTP-сообщение с сокета, извлекает html-код веб-страницы из тела HTTP-ответа и (наконец-то!) отображает веб-страницу.

  • Чтобы решить проблему доставки огромных потоков данных пользователям из разных стран, почти все крупные компании используют сети распространения контента (Content Distribution Network, CDN). Сеть CDN состоит из множества размещенных в разных местах серверов, в которых хранятся видеофайлы (и другие веб-ресурсы, такие как документы, изображения и аудиоданные); каждый пользователь перенаправляется в ту точку сети, которая является для него наиболее подходящей. CDN может принадлежать одной компании, предоставляющей данные (как в случае с компанией Google, которая распространяет видеоролики и другие данные через сервис YouTube), или использоваться сразу нескольки- ми провайдерами (например, компания Akamai предоставляет CDN для многих сервисов, в том числе для Netflix и Hulu)… Большинство сетей CDN выполняют перехват и перенаправление на уровне DNS.

  • Важная область практического применения цифровых подписей — это сертификация с открытым ключом. Такая сертификация удостоверяет, что открытый ключ принадлежит конкретному лицу.Сертификация с открытым ключом применяется во многих популярных сетевых протоколах — в частности, в IPsec и SSL.

  • Чтобы решить проблему неэффективности, будем использовать сеансовый ключ. Во-первых, Алиса случайным образом выбирает симметричный сеансовый ключ KS, во-вторых, зашифровывает этим ключом KS свое сообщение m, в-третьих, зашифровывает сеансовый ключ KS открытым ключом Боба K+B, в-четвертых, формирует из всех зашифрованных данных один пакет и, в-пятых, посылает этот пакет по адресу электронной почты Боба. Получив сообщение, Боб, во-первых, с помощью своего закрытого ключа K–B получает сеансовый ключ KS, во-вторых, с помощью сеансового ключа сеанса KS расшифровывает сообщение m.

Сначала скажите 'НЕТ'. Секреты профессиональных переговорщиков, Джим Кэмп

Post Tag: bookpsychologynon-fiction

image

Эту книгу советуют чуть ли не в каждом посте о “бюро Артёма Горбунова”. Её и ещё “Пиши, сокращай”. На удивление понравилось.

Почему на удивление? Я видел два типа книг о переговорах. Одни больше про психологию, о сбоях, что дает наш логический аппарат и как этим пользуются. Например, “Психология влияния” Чалдини. Другие, про практический опыт переговоров и хитрые трюки. Например, “Договориться можно обо всем!” Кеннеди. Эти, с трюками, книги и статьи не чураются применять собственные приемы на читателях. Множественно повторение одного и того же, “вывернутые” причинно-следственные связи, освещение только одной стороны вопроса и т.д. Несомненно, полезно прочитать об этом один раз, не более.

На первый взгляд, Кэмп должен относиться ко второй категории. Он использует все те же трюки с повторением, однобокое освещение вопросов, одно только постоянное упоминание модели переговоров “win-win” чего стоит. Но так делают многие “американские” авторы. А в методике Кэмпа минимум трюков, максимум подготовки, уважение к оппоненту, некий “стоицизм” - отказывайтесь от всего ненужного, ожидайте худшего. Весьма полезная книга.

Заметки:

  • Любые переговоры — это соглашение между двумя или более сторонами, в котором каждая из сторон имеет право вето — право сказать «нет».

  • Никогда, ни при каких обстоятельствах не «рассыпайте бобы» за столом переговоров или где угодно еще.

  • Никогда не начинайте переговоров — никогда не делайте даже телефонного звонка — без соответствующего плана или заранее подготовленного «регламента».

  • Единственные адекватные цели — те, которыми вы можете управлять: ваше собственное поведение и действия.

  • Наша миссия должна обращаться к миру противника; наш мир должен оставаться на втором плане.

  • Расходуйте как можно больше времени на действия, которые «оплачиваются», и как можно меньше — на те, которые «не оплачиваются».

  • Вы ни в чем не нуждаетесь. Вы просто чего-то хотите.

  • Никогда не спасайте противника. Спасти противника невозможно.

  • Только один человек на переговорах может чувствовать себя «в порядке». И этот человек — ваш противник.

  • Все действия — все решения — начинаются с видения. Без видения они невозможны.

  • Всегда демонстрируйте уважение «блокатору».

  • Все соглашения необходимо прояснить пункт за пунктом и проговорить трижды (при помощи техники «3 +»).

  • Чем яснее видна боль, тем проще процесс принятия решения.

  • Ценность переговоров растет по мере увеличения потраченных на них времени, энергии, денег и эмоций.

  • Избегайте пустых разговоров.

  • Всегда давайте противнику возможность сохранить лицо.

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

  • Переговоры заканчиваются только тогда, когда мы хотим их закончить.

  • «Нет» — хорошо, «да» — плохо, «может быть» — хуже всего.

  • Научитесь описывать боль.

  • Миссия управляет всем.

  • Решения эмоциональны на сто процентов.

  • Открытые вопросы способствуют формированию видения.

  • Проявляйте заботу.

  • Ничего не предполагайте. Ничего не ожидайте. Освободите свое сознание.

  • Кто на самом деле принимает решения? Вы знаете всех этих людей?

  • Платите вперед.

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

  • Миссия должна быть адекватной. Что такое адекватная миссия? Прежде всего, она должна обращаться к миру противника. Вы, конечно, можете спросить: если это — моя миссия, зачем же мне концентрироваться на ком-то другом? Затем что, если только вы не живете в полном одиночестве на необитаемом острове, ваша миссия состоит в том, чтобы концентрироваться на ком-то другом. Этот другой — основа вашей жизни, являетесь ли вы политическим деятелем, врачом, пациентом, бизнесменом или участником переговоров. Никогда не забывайте об этом.

  • Умение задавать хорошие вопросы — самое качественное наше «горючее». Это — основная поведенческая цель. Остальные четыре из пяти других поведенческих целей, которые я называю «горючим» системы Кэмпа, оказывают непосредственную поддержку нашим вопросам Они помогают контролировать то, что мы говорим, и использовать свои слова в собственных же интересах. Я называю эти четыре типа приемов так: «забота», «контрвопрос», «связка» и «3 +». Пятый вид «горючего» не связан с вопросами и называется «травить леску».

  • Хорошо подготовленная повестка дня или мини-повестка включает пять основных пунктов: 1. Проблемы. 2. Наш эмоциональный багаж. 3. Эмоциональный багаж противника. 4. Чего мы хотим от ситуации. 5. Что произойдет потом.

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

Ссылки №10

Link

Остроумие и отвага: как мы много раз ошибались, создавая iFunny

Top of most mentioned books on stackoverflow.com

How Flexbox works — explained with big, colorful, animated gifs

lsof and netstat - поиск открытых файлов и сетевых соединений.

htop Explained Visually

Front-End Developer Handbook 2017

Мобильный опыт Яндекса в трех видеокурсах: дизайн, разработка, интерфейсы

Гормоны счастья. Как приучить мозг вырабатывать серотонин, дофамин, эндорфин и окситоцин. Лоретта Бройнинг

Post Tag: booknon-fictionpsychology

image

Книжку нашел благодаря вот этой, отличной статье, на prometa.pro. Понравилось даже больше книги. Совсем не хочу сказать, что книга плохая, очень даже хорошая. Просто, на мой вкус, слишком “упрощенная”. Это классно для статьи, но недостаточно для нон-фикшена. Хочется больше деталей, “физики” процесса и т.д. Но это я придираюсь, не прочитал бы статью, от всей души рекомендовал бы к прочтению.

Заметки:

  • Одни и те же действия и проявления нового алгоритма вашего поведения вы должны будете повторять в течение 45 дней вне зависимости от того, нравится вам это или нет.

  • Чувство, которое мы описываем как «счастье», обеспечивается наличием в мозге четырех особых нейрохимических веществ: дофамина, эндорфина, окситоцина и серотонина.

  • Каждое из этих нейрохимических веществ «включает» у человека специфическое положительное ощущение:

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

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

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

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

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

  • Когда мне трудно воздержаться от максимализма, я напоминаю себе, что Нобелевская премия за 1978 год по экономике была присуждена Герберту Саймону за математическое доказательство того, что удовлетворенность минимумом лучше, чем стремление к максимализму. Он назвал это «ограниченной рациональностью», показав, что в силу ограниченности мыслительных ресурсов для человека чаще оптимальным является «удовлетворительное решение», а не бесконечный анализ в стремлении к «оптимуму».

  • (prometa.pro) Можно кого у годно классифицировать: д ‘Артаньян – дофаминовый (любил квесты и результаты), Атос – эндорфиновый (любил страдать), Портос – окситоциновый (ценил дружбу и принадлежность к группе), Арамис – серотониновый (гордец и карьерист). Впрочем, Атоса и Арамиса можно поменять местами, потому что Атос был тоже гордецом, помешанном на идее ложной чести, а Арамис имел склонность красиво помучаться.